allow independent setting of double buffering

This commit is contained in:
Dave Murphy 2014-12-11 22:23:58 +00:00
parent 20d4e95dfd
commit 1a575891eb
2 changed files with 19 additions and 16 deletions

View File

@ -22,7 +22,7 @@ void gfxExit();
//control stuff //control stuff
void gfxSet3D(bool enable); void gfxSet3D(bool enable);
void gfxSetScreenFormat(gfxScreen_t screen, GSP_FramebufferFormats format); void gfxSetScreenFormat(gfxScreen_t screen, GSP_FramebufferFormats format);
void gfxSetDoubleBuffering(bool doubleBuffering); void gfxSetDoubleBuffering(gfxScreen_t screen, bool doubleBuffering);
void gfxFlushBuffers(); void gfxFlushBuffers();
void gfxSwapBuffers(); void gfxSwapBuffers();
void gfxSwapBuffersGpu(); void gfxSwapBuffersGpu();

View File

@ -12,9 +12,9 @@ u8* gfxTopLeftFramebuffers[2];
u8* gfxTopRightFramebuffers[2]; u8* gfxTopRightFramebuffers[2];
u8* gfxBottomFramebuffers[2]; u8* gfxBottomFramebuffers[2];
static u8 currentBuffer;
static bool enable3d; static bool enable3d;
static int doubleBuf = 1; static u8 currentBuffer[2];
static int doubleBuf[2] = {1,1};
Handle gspEvent, gspSharedMemHandle; Handle gspEvent, gspSharedMemHandle;
@ -33,8 +33,8 @@ void gfxSetScreenFormat(gfxScreen_t screen, GSP_FramebufferFormats format) {
botFormat = format; botFormat = format;
} }
void gfxSetDoubleBuffering(bool doubleBuffering) { void gfxSetDoubleBuffering( gfxScreen_t screen, bool doubleBuffering) {
doubleBuf = doubleBuffering ? 1 : 0; // make sure they're the integer values '1' and '0' doubleBuf[screen] = doubleBuffering ? 1 : 0; // make sure they're the integer values '1' and '0'
} }
static u32 __get_bytes_per_pixel(GSP_FramebufferFormats format) { static u32 __get_bytes_per_pixel(GSP_FramebufferFormats format) {
@ -81,7 +81,7 @@ void gfxWriteFramebufferInfo(gfxScreen_t screen)
u8* framebufferInfoHeader=gfxSharedMemory+0x200+gfxThreadID*0x80; u8* framebufferInfoHeader=gfxSharedMemory+0x200+gfxThreadID*0x80;
if(screen==GFX_BOTTOM)framebufferInfoHeader+=0x40; if(screen==GFX_BOTTOM)framebufferInfoHeader+=0x40;
GSP_FramebufferInfo* framebufferInfo=(GSP_FramebufferInfo*)&framebufferInfoHeader[0x4]; GSP_FramebufferInfo* framebufferInfo=(GSP_FramebufferInfo*)&framebufferInfoHeader[0x4];
framebufferInfoHeader[0x0]^=doubleBuf; framebufferInfoHeader[0x0]^=doubleBuf[0x0];
framebufferInfo[framebufferInfoHeader[0x0]]=(screen==GFX_TOP)?(topFramebufferInfo):(bottomFramebufferInfo); framebufferInfo[framebufferInfoHeader[0x0]]=(screen==GFX_TOP)?(topFramebufferInfo):(bottomFramebufferInfo);
framebufferInfoHeader[0x1]=1; framebufferInfoHeader[0x1]=1;
} }
@ -124,7 +124,8 @@ void gfxInit()
//GSP shared mem : 0x2779F000 //GSP shared mem : 0x2779F000
gxCmdBuf=(u32*)(gfxSharedMemory+0x800+gfxThreadID*0x200); gxCmdBuf=(u32*)(gfxSharedMemory+0x800+gfxThreadID*0x200);
currentBuffer=0; currentBuffer[0]=0;
currentBuffer[1]=0;
// Initialize event handler and wait for VBlank // Initialize event handler and wait for VBlank
gspInitEventHandler(gspEvent, (vu8*)gfxSharedMemory, gfxThreadID); gspInitEventHandler(gspEvent, (vu8*)gfxSharedMemory, gfxThreadID);
@ -153,7 +154,7 @@ void gfxExit()
svcCloseHandle(gspEvent); svcCloseHandle(gspEvent);
GSPGPU_ReleaseRight(NULL); GSPGPU_ReleaseRight(NULL);
gspExit(); gspExit();
} }
@ -164,10 +165,10 @@ u8* gfxGetFramebuffer(gfxScreen_t screen, gfx3dSide_t side, u16* width, u16* hei
if(screen==GFX_TOP) if(screen==GFX_TOP)
{ {
if(height)*height=400; if(height)*height=400;
return (side==GFX_LEFT || !enable3d)?(gfxTopLeftFramebuffers[currentBuffer^doubleBuf]):(gfxTopRightFramebuffers[currentBuffer^doubleBuf]); return (side==GFX_LEFT || !enable3d)?(gfxTopLeftFramebuffers[currentBuffer[0]^doubleBuf[0]]):(gfxTopRightFramebuffers[currentBuffer[0]^doubleBuf[0]]);
}else{ }else{
if(height)*height=320; if(height)*height=320;
return gfxBottomFramebuffers[currentBuffer^doubleBuf]; return gfxBottomFramebuffers[currentBuffer[1]^doubleBuf[1]];
} }
} }
@ -180,18 +181,20 @@ void gfxFlushBuffers()
void gfxSwapBuffers() void gfxSwapBuffers()
{ {
currentBuffer^=doubleBuf; currentBuffer[0]^=doubleBuf[0];
gfxSetFramebufferInfo(GFX_TOP, currentBuffer); currentBuffer[1]^=doubleBuf[1];
gfxSetFramebufferInfo(GFX_BOTTOM, currentBuffer); gfxSetFramebufferInfo(GFX_TOP, currentBuffer[0]);
gfxSetFramebufferInfo(GFX_BOTTOM, currentBuffer[1]);
GSPGPU_SetBufferSwap(NULL, GFX_TOP, &topFramebufferInfo); GSPGPU_SetBufferSwap(NULL, GFX_TOP, &topFramebufferInfo);
GSPGPU_SetBufferSwap(NULL, GFX_BOTTOM, &bottomFramebufferInfo); GSPGPU_SetBufferSwap(NULL, GFX_BOTTOM, &bottomFramebufferInfo);
} }
void gfxSwapBuffersGpu() void gfxSwapBuffersGpu()
{ {
currentBuffer^=doubleBuf; currentBuffer[0]^=doubleBuf[0];
gfxSetFramebufferInfo(GFX_TOP, currentBuffer); currentBuffer[1]^=doubleBuf[1];
gfxSetFramebufferInfo(GFX_BOTTOM, currentBuffer); gfxSetFramebufferInfo(GFX_TOP, currentBuffer[0]);
gfxSetFramebufferInfo(GFX_BOTTOM, currentBuffer[1]);
gfxWriteFramebufferInfo(GFX_TOP); gfxWriteFramebufferInfo(GFX_TOP);
gfxWriteFramebufferInfo(GFX_BOTTOM); gfxWriteFramebufferInfo(GFX_BOTTOM);
} }