all repos — mgba @ 8c81fc44a05bd07e62a381bb93fa9e5e34bdcf7f

mGBA Game Boy Advance Emulator

Vita: Fix flickering when using frameskip
Leo chun.huang@student.manchester.ac.uk
Mon, 20 Jul 2020 12:53:17 +0800
commit

8c81fc44a05bd07e62a381bb93fa9e5e34bdcf7f

parent

5b319cfd91fff2fcd3df0e1fce3e498454796da0

1 files changed, 16 insertions(+), 8 deletions(-)

jump to
M src/platform/psp2/psp2-context.csrc/platform/psp2/psp2-context.c

@@ -52,7 +52,7 @@ } screenMode;

static void* outputBuffer; static int currentTex; -static vita2d_texture* tex[4]; +static vita2d_texture* tex[2]; static vita2d_texture* screenshot; static Thread audioThread; static bool interframeBlending = false;

@@ -326,8 +326,6 @@ unsigned width, height;

runner->core->desiredVideoDimensions(runner->core, &width, &height); tex[0] = vita2d_create_empty_texture_format(256, toPow2(height), SCE_GXM_TEXTURE_FORMAT_X8U8U8U8_1BGR); tex[1] = vita2d_create_empty_texture_format(256, toPow2(height), SCE_GXM_TEXTURE_FORMAT_X8U8U8U8_1BGR); - tex[2] = vita2d_create_empty_texture_format(256, toPow2(height), SCE_GXM_TEXTURE_FORMAT_X8U8U8U8_1BGR); - tex[3] = vita2d_create_empty_texture_format(256, toPow2(height), SCE_GXM_TEXTURE_FORMAT_X8U8U8U8_1BGR); currentTex = 0; screenshot = vita2d_create_empty_texture_format(256, toPow2(height), SCE_GXM_TEXTURE_FORMAT_X8U8U8U8_1BGR);

@@ -494,8 +492,6 @@ UNUSED(runner);

CircleBufferDeinit(&rumble.history); vita2d_free_texture(tex[0]); vita2d_free_texture(tex[1]); - vita2d_free_texture(tex[2]); - vita2d_free_texture(tex[3]); vita2d_free_texture(screenshot); mappedMemoryFree(outputBuffer, 256 * 256 * 4); frameLimiter = true;

@@ -588,15 +584,27 @@ tint);

} void mPSP2Swap(struct mGUIRunner* runner) { - currentTex = (currentTex + 1) & 3; - runner->core->setVideoBuffer(runner->core, vita2d_texture_get_datap(tex[currentTex]), 256); + bool frameAvailable; + if (runner->core->platform(runner->core) == PLATFORM_GBA) { + struct GBA* gba = runner->core->board; + frameAvailable = gba->video.frameskipCounter <= 0; + } else if (runner->core->platform(runner->core) == PLATFORM_GB) { + struct GB* gb = runner->core->board; + frameAvailable = gb->video.frameskipCounter <= 0; + } else { + frameAvailable = false; + } + if (frameAvailable) { + currentTex = !currentTex; + runner->core->setVideoBuffer(runner->core, vita2d_texture_get_datap(tex[currentTex]), 256); + } } void mPSP2Draw(struct mGUIRunner* runner, bool faded) { unsigned width, height; runner->core->desiredVideoDimensions(runner->core, &width, &height); if (interframeBlending) { - _drawTex(tex[(currentTex - 1) & 3], width, height, faded, false); + _drawTex(tex[!currentTex], width, height, faded, false); } _drawTex(tex[currentTex], width, height, faded, interframeBlending); }