diff --git a/core/hw/pvr/Renderer_if.cpp b/core/hw/pvr/Renderer_if.cpp index 0e9b2696d..9032d1273 100644 --- a/core/hw/pvr/Renderer_if.cpp +++ b/core/hw/pvr/Renderer_if.cpp @@ -198,7 +198,7 @@ TA_context* read_frame(const char* file, u8* vram_ref) { bool rend_frame(TA_context* ctx, bool draw_osd) { bool proc = renderer->Process(ctx); #if !defined(TARGET_NO_THREADS) - if (!ctx->rend.isRTT) + if (!proc || !ctx->rend.isRTT) // If rendering to texture, continue locking until the frame is rendered re.Set(); #endif diff --git a/core/hw/pvr/ta_ctx.cpp b/core/hw/pvr/ta_ctx.cpp index a092ea844..72cf79f3a 100644 --- a/core/hw/pvr/ta_ctx.cpp +++ b/core/hw/pvr/ta_ctx.cpp @@ -134,17 +134,10 @@ bool QueueRender(TA_context* ctx) } if (rqueue) { - // If the queued frame is for rendering to a texture, we can't skip it, so we wait - if (ctx->rend.isRTT) { - frame_finished.Wait(); - verify(!rqueue); - } - else - { - tactx_Recycle(ctx); - fskip++; - return false; - } + // FIXME if the discarded render is a RTT we'll have a texture missing. But waiting for the current frame to finish kills performance... + tactx_Recycle(ctx); + fskip++; + return false; } frame_finished.Reset();