don't swap gl buffer until FB_R_SOF is set to the rendered framebuffer
Fixes flashing screens in South Park: Chef's Luv Shack, NFL Quarterback Club 2000 Glitchy videos: The Next Tetris, Nightmare Creatures II, Rune Jade Flashing rear-view mirror in Metropolis Street Racer
This commit is contained in:
parent
8d078a923b
commit
ac43a8c54e
|
@ -85,6 +85,8 @@ bool renderer_changed = false; // Signals the renderer thread to switch renderer
|
|||
cResetEvent rs(false,true);
|
||||
cResetEvent re(false,true);
|
||||
#endif
|
||||
static bool swap_pending;
|
||||
static bool do_swap;
|
||||
|
||||
int max_idx,max_mvo,max_op,max_pt,max_tr,max_vtx,max_modt, ovrn;
|
||||
|
||||
|
@ -282,6 +284,7 @@ bool rend_single_frame()
|
|||
// Use the rendering start event to wait between two frames but save its value
|
||||
if (rs.Wait(17))
|
||||
rs.Set();
|
||||
swap_pending = false;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
|
@ -291,12 +294,18 @@ bool rend_single_frame()
|
|||
|
||||
if (!rs.Wait(100))
|
||||
return false;
|
||||
if (do_swap)
|
||||
{
|
||||
do_swap = false;
|
||||
renderer->Present();
|
||||
}
|
||||
}
|
||||
#else
|
||||
if (gui_is_open())
|
||||
{
|
||||
gui_display_ui();
|
||||
FinishRender(NULL);
|
||||
swap_pending = false;
|
||||
return true;
|
||||
}
|
||||
if (renderer != NULL)
|
||||
|
@ -309,6 +318,7 @@ bool rend_single_frame()
|
|||
}
|
||||
while (!_pvrrc);
|
||||
bool do_swp = rend_frame(_pvrrc, true);
|
||||
swap_pending = do_swp && !_pvrrc->rend.isRenderFramebuffer;
|
||||
|
||||
#if !defined(TARGET_NO_THREADS)
|
||||
if (_pvrrc->rend.isRTT)
|
||||
|
@ -363,6 +373,7 @@ void rend_init_renderer()
|
|||
}
|
||||
printf("Selected renderer initialization failed. Falling back to default renderer.\n");
|
||||
renderer = fallback_renderer;
|
||||
fallback_renderer = NULL; // avoid double-free
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -391,7 +402,13 @@ void* rend_thread(void* p)
|
|||
while (renderer_enabled)
|
||||
{
|
||||
if (rend_single_frame())
|
||||
renderer->Present();
|
||||
{
|
||||
if (FB_R_SOF1 == FB_W_SOF1 || !swap_pending)
|
||||
{
|
||||
renderer->Present();
|
||||
swap_pending = false;
|
||||
}
|
||||
}
|
||||
if (renderer_changed)
|
||||
{
|
||||
renderer_changed = false;
|
||||
|
@ -571,3 +588,12 @@ void rend_cancel_emu_wait()
|
|||
#endif
|
||||
}
|
||||
|
||||
void rend_swap_frame()
|
||||
{
|
||||
if (swap_pending)
|
||||
{
|
||||
swap_pending = false;
|
||||
do_swap = true;
|
||||
rs.Set();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,6 +13,7 @@ void rend_start_render();
|
|||
void rend_end_render();
|
||||
void rend_cancel_emu_wait();
|
||||
bool rend_single_frame();
|
||||
void rend_swap_frame();
|
||||
|
||||
void rend_set_fb_scale(float x,float y);
|
||||
void rend_resize(int width, int height);
|
||||
|
|
|
@ -38,6 +38,8 @@ void pvr_WriteReg(u32 paddr,u32 data)
|
|||
{
|
||||
ta_vtx_ListInit();
|
||||
data=0;
|
||||
TA_NEXT_OPB = TA_NEXT_OPB_INIT;
|
||||
TA_ITP_CURRENT = TA_ISP_BASE;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -84,12 +86,25 @@ void pvr_WriteReg(u32 paddr,u32 data)
|
|||
}
|
||||
return;
|
||||
}
|
||||
if (addr == TA_YUV_TEX_BASE_addr || addr == TA_YUV_TEX_CTRL_addr)
|
||||
if (addr == TA_YUV_TEX_BASE_addr)
|
||||
{
|
||||
PvrReg(addr, u32) = data & 0x00FFFFF8;
|
||||
YUV_init();
|
||||
return;
|
||||
}
|
||||
else if (addr == TA_YUV_TEX_CTRL_addr)
|
||||
{
|
||||
PvrReg(addr, u32) = data;
|
||||
YUV_init();
|
||||
return;
|
||||
}
|
||||
else if (addr == FB_R_SOF1_addr)
|
||||
{
|
||||
if (data == FB_W_SOF1)
|
||||
{
|
||||
rend_swap_frame();
|
||||
}
|
||||
}
|
||||
|
||||
if (addr>=PALETTE_RAM_START_addr && PvrReg(addr,u32)!=data)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue