3DS: GUI fixes when game on top screen

This commit is contained in:
Jeffrey Pfau 2015-09-18 00:21:41 -07:00
parent 0090928465
commit 91fb4407b9
1 changed files with 17 additions and 7 deletions

View File

@ -48,7 +48,12 @@ static int16_t* audioLeft = 0;
static int16_t* audioRight = 0; static int16_t* audioRight = 0;
static size_t audioPos = 0; static size_t audioPos = 0;
static struct ctrTexture gbaOutputTexture; static struct ctrTexture gbaOutputTexture;
static bool guiDrawn; static int guiDrawn;
enum {
GUI_ACTIVE = 1,
GUI_THIS_FRAME = 2
};
extern bool allocateRomBuffer(void); extern bool allocateRomBuffer(void);
@ -56,27 +61,32 @@ static void _postAudioBuffer(struct GBAAVStream* stream, struct GBAAudio* audio)
static void _drawStart(void) { static void _drawStart(void) {
ctrGpuBeginFrame(); ctrGpuBeginFrame();
if (screenMode < SM_PA_TOP) { if (screenMode < SM_PA_TOP || (guiDrawn & GUI_ACTIVE)) {
ctrSetViewportSize(320, 240); ctrSetViewportSize(320, 240);
} else { } else {
ctrSetViewportSize(400, 240); ctrSetViewportSize(400, 240);
} }
guiDrawn = false; guiDrawn &= ~GUI_THIS_FRAME;
} }
static void _drawEnd(void) { static void _drawEnd(void) {
if (!guiDrawn) { int screen = screenMode < SM_PA_TOP ? GFX_BOTTOM : GFX_TOP;
int screen = screenMode < SM_PA_TOP ? GFX_BOTTOM : GFX_TOP; u16 width = 0, height = 0;
u16 width = 0, height = 0; if (guiDrawn & GUI_ACTIVE) {
screen = GFX_BOTTOM;
}
if (!(guiDrawn & GUI_THIS_FRAME) || screen == GFX_BOTTOM) {
void* outputFramebuffer = gfxGetFramebuffer(screen, GFX_LEFT, &height, &width); void* outputFramebuffer = gfxGetFramebuffer(screen, GFX_LEFT, &height, &width);
ctrGpuEndFrame(outputFramebuffer, width, height); ctrGpuEndFrame(outputFramebuffer, width, height);
} }
gfxSwapBuffersGpu(); gfxSwapBuffersGpu();
gspWaitForEvent(GSPEVENT_VBlank0, false); gspWaitForEvent(GSPEVENT_VBlank0, false);
} }
static void _guiPrepare(void) { static void _guiPrepare(void) {
guiDrawn = GUI_ACTIVE | GUI_THIS_FRAME;
int screen = screenMode < SM_PA_TOP ? GFX_BOTTOM : GFX_TOP; int screen = screenMode < SM_PA_TOP ? GFX_BOTTOM : GFX_TOP;
if (screen == GFX_BOTTOM) { if (screen == GFX_BOTTOM) {
return; return;
@ -86,13 +96,13 @@ static void _guiPrepare(void) {
void* outputFramebuffer = gfxGetFramebuffer(screen, GFX_LEFT, &height, &width); void* outputFramebuffer = gfxGetFramebuffer(screen, GFX_LEFT, &height, &width);
ctrGpuEndFrame(outputFramebuffer, width, height); ctrGpuEndFrame(outputFramebuffer, width, height);
guiDrawn = true;
ctrGpuBeginFrame(); ctrGpuBeginFrame();
ctrSetViewportSize(320, 240); ctrSetViewportSize(320, 240);
} }
static void _guiFinish(void) { static void _guiFinish(void) {
guiDrawn &= ~GUI_ACTIVE;
int screen = screenMode < SM_PA_TOP ? GFX_BOTTOM : GFX_TOP; int screen = screenMode < SM_PA_TOP ? GFX_BOTTOM : GFX_TOP;
if (screen == GFX_BOTTOM) { if (screen == GFX_BOTTOM) {
return; return;