summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSND\ckain_cp <SND\ckain_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2014-04-17 21:26:36 +0000
committerSND\ckain_cp <SND\ckain_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2014-04-17 21:26:36 +0000
commit9a7b4084da6349adca6c1387f390da9bc813d09a (patch)
tree7c29303fd4bfaf2e964d22fa3c9fd81aaa0cecb4
parent158718f939810dbfedeb49e178db4fe781d9918e (diff)
downloadpcsxr-9a7b4084da6349adca6c1387f390da9bc813d09a.tar.gz
GPU picture fix. This should be also easy to implement on others archs as well.
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@90038 e17a0e51-4ae3-4d35-97c3-1a29b211df97
-rwxr-xr-xgui/Plugin.c73
-rwxr-xr-xlibpcsxcore/psxcommon.c11
-rwxr-xr-xlibpcsxcore/psxcommon.h5
3 files changed, 35 insertions, 54 deletions
diff --git a/gui/Plugin.c b/gui/Plugin.c
index 1887fa6d..6727e9b1 100755
--- a/gui/Plugin.c
+++ b/gui/Plugin.c
@@ -44,66 +44,35 @@ unsigned long gpuDisp;
int StatesC = 0;
extern int UseGui;
-pthread_t ThreadID = 0;
-boolean start = FALSE;
-boolean restart = FALSE;
-
-void gpuHidePic()
-{
- GPU_showScreenPic(NULL);
-}
-
-static void *HidePicAfter(void *param)
-{
- while (1)
- {
- //TODO use pthread_cond_wait
- while (!start) usleep(100000);
-
- while (1) {
- usleep(3000000);
- if (!restart)
- break;
- restart = FALSE;
- };
-
- gpuHidePic();
- start = FALSE;
- }
-}
-
void gpuShowPic() {
gchar *state_filename;
gzFile f;
+ unsigned char *pMem;
- unsigned char *pMem;
+ pMem = (unsigned char *) malloc(128*96*3);
+ if (pMem == NULL) return;
- pMem = (unsigned char *) malloc(128*96*3);
- if (pMem == NULL) return;
+ state_filename = get_state_filename (StatesC);
- state_filename = get_state_filename (StatesC);
+ GPU_freeze(2, (GPUFreeze_t *)&StatesC);
- GPU_freeze(2, (GPUFreeze_t *)&StatesC);
+ f = gzopen(state_filename, "rb");
+ if (f != NULL) {
+ gzseek(f, 32, SEEK_SET); // skip header
+ gzseek(f, sizeof(u32), SEEK_CUR);
+ gzseek(f, sizeof(boolean), SEEK_CUR);
+ gzread(f, pMem, 128*96*3);
+ gzclose(f);
+ } else {
+ memcpy(pMem, NoPic_Image.pixel_data, 128*96*3);
+ DrawNumBorPic(pMem, StatesC+1);
+ }
+ GPU_showScreenPic(pMem);
- f = gzopen(state_filename, "rb");
- if (f != NULL) {
- gzseek(f, 32, SEEK_SET); // skip header
- gzseek(f, sizeof(u32), SEEK_CUR);
- gzseek(f, sizeof(boolean), SEEK_CUR);
- gzread(f, pMem, 128*96*3);
- gzclose(f);
- } else {
- memcpy(pMem, NoPic_Image.pixel_data, 128*96*3);
- DrawNumBorPic(pMem, StatesC+1);
- }
- GPU_showScreenPic(pMem);
-
- free(pMem);
- g_free (state_filename);
-
- if (!ThreadID) pthread_create(&ThreadID, NULL, HidePicAfter, NULL);
- if (start) restart = TRUE;
- start = TRUE;
+ free(pMem);
+ g_free (state_filename);
+
+ vblank_count_hideafter = 2*50; // show pic for about 2 seconds
}
void KeyStateSave(int i) {
diff --git a/libpcsxcore/psxcommon.c b/libpcsxcore/psxcommon.c
index b7f547f0..753222d2 100755
--- a/libpcsxcore/psxcommon.c
+++ b/libpcsxcore/psxcommon.c
@@ -29,7 +29,10 @@ boolean NetOpened = FALSE;
int Log = 0;
FILE *emuLog = NULL;
-u32 rewind_counter=0; // It is safe if this overflows
+
+// It is safe if these overflow
+u32 rewind_counter=0;
+u8 vblank_count_hideafter=0;
int EmuInit() {
return psxInit();
@@ -61,6 +64,12 @@ void EmuUpdate() {
ApplyCheats();
+ if (vblank_count_hideafter) {
+ if (!(--vblank_count_hideafter)) {
+ GPU_showScreenPic(NULL);
+ }
+ }
+
if (Config.RewindInterval > 0 && !(++rewind_counter%Config.RewindInterval)) {
CreateRewindState();
}
diff --git a/libpcsxcore/psxcommon.h b/libpcsxcore/psxcommon.h
index 8def3612..1eaffc1d 100755
--- a/libpcsxcore/psxcommon.h
+++ b/libpcsxcore/psxcommon.h
@@ -166,7 +166,10 @@ typedef struct {
extern PcsxConfig Config;
extern boolean NetOpened;
-extern u32 rewind_counter; // It is safe if this overflows
+
+// It is safe if these overflow
+extern u32 rewind_counter;
+extern u8 vblank_count_hideafter;
#define gzfreeze(ptr, size) { \
if (Mode == 1) gzwrite(f, ptr, size); \