]> Chaos Git - corbenik/ctrulib.git/commitdiff
allow independent setting of double buffering
authorDave Murphy <davem@devkitpro.org>
Thu, 11 Dec 2014 22:23:58 +0000 (22:23 +0000)
committerDave Murphy <davem@devkitpro.org>
Thu, 11 Dec 2014 22:24:15 +0000 (22:24 +0000)
libctru/include/3ds/gfx.h
libctru/source/gfx.c

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