]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Skip also rendering of frame if frame was skipped
authorToni Wilen <twilen@winuae.net>
Sat, 4 Jan 2025 11:11:53 +0000 (13:11 +0200)
committerToni Wilen <twilen@winuae.net>
Sat, 4 Jan 2025 11:11:53 +0000 (13:11 +0200)
od-win32/direct3d.cpp
od-win32/direct3d11.cpp

index ae495d98998c8ea710b5d07a03ac9a13dd7fcf10..7ee8c6d71963bd6d29f780847a75063c9284ce2b 100644 (file)
@@ -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);
index e843796d97395aa9a997a279e2d7ad7e053ae7ee..73a15f983343d312ef665d2403e1bbcf85bb0d97 100644 (file)
@@ -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;