fix screenshot taking stuff

This commit is contained in:
dborth 2009-06-15 08:21:53 +00:00
parent 244536f86f
commit 79ca573270
2 changed files with 40 additions and 37 deletions

View File

@ -53,8 +53,6 @@ void FCEUD_Update(uint8 *XBuf, int32 *Buffer, int Count);
static uint8 *xbsave=NULL; static uint8 *xbsave=NULL;
static int fskipc = 0; static int fskipc = 0;
static int videoReset = 0;
static int currentMode = 0;
int ScreenshotRequested = 0; int ScreenshotRequested = 0;
int ConfigRequested = 0; int ConfigRequested = 0;
int ShutdownRequested = 0; int ShutdownRequested = 0;
@ -297,8 +295,6 @@ int main(int argc, char *argv[])
if(currentTiming != GCSettings.timing) if(currentTiming != GCSettings.timing)
FCEUI_SetVidSystem(GCSettings.timing); // causes a small 'pop' in the audio FCEUI_SetVidSystem(GCSettings.timing); // causes a small 'pop' in the audio
videoReset = -1;
currentMode = GCSettings.render;
currentTiming = GCSettings.timing; currentTiming = GCSettings.timing;
ConfigRequested = 0; ConfigRequested = 0;
ScreenshotRequested = 0; ScreenshotRequested = 0;
@ -341,20 +337,9 @@ int main(int argc, char *argv[])
} }
if(ConfigRequested) if(ConfigRequested)
{ {
if((GCSettings.render != 0 && videoReset == -1) || videoReset == 0) ConfigRequested = 0;
{ ResetVideo_Menu();
ResetVideo_Menu(); break;
ConfigRequested = 0;
GCSettings.render = currentMode;
break; // leave emulation loop
}
else if(videoReset == -1)
{
GCSettings.render = 2;
videoReset = 2;
ResetVideo_Emu();
}
videoReset--;
} }
} // emulation loop } // emulation loop
} // main loop } // main loop

View File

@ -42,6 +42,7 @@ int screenheight;
int screenwidth; int screenwidth;
bool progressive = false; bool progressive = false;
static int currentVideoMode = -1; // -1 - not set, 0 - automatic, 1 - NTSC (480i), 2 - Progressive (480p), 3 - PAL (50Hz), 4 - PAL (60Hz) static int currentVideoMode = -1; // -1 - not set, 0 - automatic, 1 - NTSC (480i), 2 - Progressive (480p), 3 - PAL (50Hz), 4 - PAL (60Hz)
static int oldRenderMode = -1; // set to GCSettings.render when changing (temporarily) to another mode
/*** 3D GX ***/ /*** 3D GX ***/
#define TEX_WIDTH 256 #define TEX_WIDTH 256
@ -56,7 +57,7 @@ static Mtx GXmodelView2D;
/*** Texture memory ***/ /*** Texture memory ***/
static unsigned char texturemem[TEX_WIDTH * TEX_HEIGHT * 2] ATTRIBUTE_ALIGN (32); static unsigned char texturemem[TEX_WIDTH * TEX_HEIGHT * 2] ATTRIBUTE_ALIGN (32);
static int updateScaling = 1; static int UpdateVideo = 1;
static int vmode_60hz = 0; static int vmode_60hz = 0;
u8 * gameScreenTex = NULL; // a GX texture screen capture of the game u8 * gameScreenTex = NULL; // a GX texture screen capture of the game
@ -219,7 +220,10 @@ static void SyncSpeed()
{ {
now = gettime(); now = gettime();
while (diff_usec(prev, now) < normaldiff) while (diff_usec(prev, now) < normaldiff)
{
now = gettime(); now = gettime();
usleep(50);
}
prev = now; prev = now;
} }
@ -243,7 +247,6 @@ vbgetback (void *arg)
{ {
while (1) while (1)
{ {
VIDEO_WaitVSync();
SyncSpeed(); SyncSpeed();
LWP_SuspendThread (vbthread); LWP_SuspendThread (vbthread);
} }
@ -271,13 +274,6 @@ copy_to_xfb (u32 arg)
{ {
if (copynow == GX_TRUE) if (copynow == GX_TRUE)
{ {
if(ScreenshotRequested)
{
ScreenshotRequested = 0;
TakeScreenshot();
ConfigRequested = 1;
}
GX_CopyDisp (xfb[whichfb], GX_TRUE); GX_CopyDisp (xfb[whichfb], GX_TRUE);
GX_Flush (); GX_Flush ();
copynow = GX_FALSE; copynow = GX_FALSE;
@ -440,9 +436,6 @@ UpdateScaling()
square[7] = square[10] = (-yscale) - GCSettings.yshift; square[7] = square[10] = (-yscale) - GCSettings.yshift;
DCFlushRange (square, 32); // update memory BEFORE the GPU accesses it! DCFlushRange (square, 32); // update memory BEFORE the GPU accesses it!
draw_init (); draw_init ();
if(updateScaling)
updateScaling--;
} }
/**************************************************************************** /****************************************************************************
@ -568,7 +561,7 @@ static void SetupVideoMode()
if(CONF_GetAspectRatio() == CONF_ASPECT_16_9) if(CONF_GetAspectRatio() == CONF_ASPECT_16_9)
{ {
vmode->viWidth = VI_MAX_WIDTH_PAL-12; vmode->viWidth = VI_MAX_WIDTH_PAL-12;
vmode->viXOrigin = ((VI_MAX_WIDTH_PAL - vmode->viWidth) / 2) + 2; vmode->viXOrigin = ((VI_MAX_WIDTH_PAL - vmode->viWidth) / 2);
} }
#endif #endif
@ -676,8 +669,8 @@ ResetVideo_Emu ()
memset(texturemem, 0, TEX_WIDTH * TEX_HEIGHT * 2); // clear texture memory memset(texturemem, 0, TEX_WIDTH * TEX_HEIGHT * 2); // clear texture memory
// set aspect ratio // set aspect ratio
updateScaling = 5;
draw_init (); draw_init ();
UpdateScaling();
} }
/**************************************************************************** /****************************************************************************
@ -695,9 +688,12 @@ void RenderFrame(unsigned char *XBuf)
// swap framebuffers // swap framebuffers
whichfb ^= 1; whichfb ^= 1;
// zoom has changed // video has changed
if(updateScaling) if(UpdateVideo)
UpdateScaling(); {
UpdateVideo = 0;
ResetVideo_Emu(); // reset video to emulator rendering settings
}
int width, height; int width, height;
@ -764,9 +760,31 @@ void RenderFrame(unsigned char *XBuf)
draw_square(view); draw_square(view);
GX_DrawDone(); GX_DrawDone();
if(ScreenshotRequested)
{
if(GCSettings.render == 0) // we can't take a screenshot in Original mode
{
oldRenderMode = 0;
GCSettings.render = 2; // switch to unfiltered mode
UpdateVideo = 1; // request the switch
}
else
{
ScreenshotRequested = 0;
TakeScreenshot();
if(oldRenderMode != -1)
{
GCSettings.render = oldRenderMode;
oldRenderMode = -1;
}
ConfigRequested = 1;
}
}
// EFB is ready to be copied into XFB // EFB is ready to be copied into XFB
VIDEO_SetNextFramebuffer(xfb[whichfb]); VIDEO_SetNextFramebuffer(xfb[whichfb]);
VIDEO_Flush(); VIDEO_Flush();
copynow = GX_TRUE; copynow = GX_TRUE;
// Return to caller, don't waste time waiting for vb // Return to caller, don't waste time waiting for vb
@ -789,14 +807,14 @@ zoom (float speed)
else if (GCSettings.ZoomLevel > 2.0) else if (GCSettings.ZoomLevel > 2.0)
GCSettings.ZoomLevel = 2.0; GCSettings.ZoomLevel = 2.0;
updateScaling = 5; // update video UpdateVideo = 1; // update video
} }
void void
zoom_reset () zoom_reset ()
{ {
GCSettings.ZoomLevel = 1.0; GCSettings.ZoomLevel = 1.0;
updateScaling = 5; // update video UpdateVideo = 1; // update video
} }
/**************************************************************************** /****************************************************************************