From df93c2a39a6415b4a5b15221930a8b5700c8aa34 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Sat, 4 Jan 2025 13:11:53 +0200 Subject: [PATCH] Skip also rendering of frame if frame was skipped --- od-win32/direct3d.cpp | 10 +++++++--- od-win32/direct3d11.cpp | 31 ++++++++++++++++++++++++------- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/od-win32/direct3d.cpp b/od-win32/direct3d.cpp index ae495d98..7ee8c6d7 100644 --- a/od-win32/direct3d.cpp +++ b/od-win32/direct3d.cpp @@ -183,6 +183,7 @@ struct d3dstruct bool renderdisabled; HANDLE filenotificationhandle; int frames_since_init; + bool turbo_skip; volatile bool fakemode; uae_u8 *fakebitmap; @@ -3853,7 +3854,7 @@ static void xD3D_unlocktexture(int monid, int y_start, int y_end) if (currprefs.leds_on_screen & (STATUSLINE_CHIPSET | STATUSLINE_RTG)) updateleds(d3d); hr = tex->UnlockRect(0); - if (y_start >= 0) + if (y_start >= 0 && !d3d->turbo_skip) xD3D_flushtexture(monid, y_start, y_end); } d3d->locked = 0; @@ -3956,7 +3957,7 @@ static bool xD3D_renderframe(int monid, int mode, bool immediate) d3d->frames_since_init++; - if (d3d->fakemode) + if (d3d->fakemode || d3d->turbo_skip) return true; if (!isd3d (d3d) || !d3d->texture1 || !d3d->texture2) @@ -3992,13 +3993,16 @@ static void xD3D_showframe (int monid) { struct d3dstruct *d3d = &d3ddata[monid]; + d3d->turbo_skip = false; if (!isd3d (d3d)) return; if (currprefs.turbo_emulation) { static int frameskip; static int toggle; - if (frameskip-- > 0) + if (frameskip-- > 0) { + d3d->turbo_skip = true; return; + } frameskip = 10 + toggle; toggle = !toggle; D3D_showframe2 (d3d, false); diff --git a/od-win32/direct3d11.cpp b/od-win32/direct3d11.cpp index e843796d..73a15f98 100644 --- a/od-win32/direct3d11.cpp +++ b/od-win32/direct3d11.cpp @@ -284,6 +284,7 @@ struct d3d11struct bool blackscreen; int framecount; UINT syncinterval; + bool turbo_skip; float vblank; DWM_FRAME_COUNT lastframe; int frames_since_init; @@ -3372,11 +3373,14 @@ static void do_present(struct d3d11struct *d3d) syncinterval = 0; } d3d->syncinterval = syncinterval; + d3d->turbo_skip = false; if (currprefs.turbo_emulation) { static int skip; static int toggle; - if (--skip > 0) + if (--skip > 0) { + d3d->turbo_skip = true; return; + } skip = 10 + toggle; toggle = !toggle; if (os_win8) @@ -4842,27 +4846,36 @@ static bool xD3D11_renderframe(int monid, int mode, bool immediate) d3d->frames_since_init++; - if (mode > 0 && (mode & 2)) + if (mode > 0 && (mode & 2)) { slicecnt = 0; - else if (mode < 0) + } else if (mode < 0) { slicecnt = slicecnt == 2 ? 0 : slicecnt; + } - if (!d3d->m_swapChain) + if (!d3d->m_swapChain) { return false; + } - if (d3d->fsmodechange) + if (d3d->fsmodechange) { D3D_resize(monid, 0); + } - if (d3d->invalidmode) + if (d3d->invalidmode) { return false; + } if (d3d->delayedrestore) { d3d->delayedrestore = false; restore(d3d); } - if (d3d->delayedfs || !d3d->texture2d || !d3d->d3dinit_done) + if (d3d->delayedfs || !d3d->texture2d || !d3d->d3dinit_done) { return false; + } + + if (d3d->turbo_skip) { + return true; + } GraphicsClass_Render(d3d, mode < 0 || (mode & 1), monid); @@ -5122,6 +5135,10 @@ static void xD3D11_unlocktexture(int monid, int y_start, int y_end) return; } + if (d3d->turbo_skip) { + return; + } + bool rtg = WIN32GFX_IsPicassoScreen(mon); if (((currprefs.leds_on_screen & STATUSLINE_CHIPSET) && !rtg) || ((currprefs.leds_on_screen & STATUSLINE_RTG) && rtg)) { d3d->osd.enabled = true; -- 2.47.3