From 6ba7058a0eddd0f1f2e6dab8d01546dfc033cb58 Mon Sep 17 00:00:00 2001 From: Misa Date: Tue, 14 Sep 2021 20:23:22 -0700 Subject: [PATCH] Fix VSync renderer workaround SDL just got an API to toggle VSync without having to tear down the renderer ( libsdl-org/SDL#4157 ). We can remove the workaround and use that instead. For now, we are putting it behind an ifdef until SDL 2.0.18 officially releases in November. Fixes #831. --- desktop_version/src/Input.cpp | 5 ++-- desktop_version/src/Render.cpp | 8 +++--- desktop_version/src/Screen.cpp | 48 ++++------------------------------ desktop_version/src/Screen.h | 2 +- 4 files changed, 14 insertions(+), 49 deletions(-) diff --git a/desktop_version/src/Input.cpp b/desktop_version/src/Input.cpp index f3d9dc66..8ebb4d70 100644 --- a/desktop_version/src/Input.cpp +++ b/desktop_version/src/Input.cpp @@ -605,11 +605,12 @@ static void menuactionpress(void) game.savestatsandsettings_menu(); break; case 5: + /* FIXME: Upgrade to SDL 2.0.18 and remove this ifdef when it releases! */ +#if SDL_VERSION_ATLEAST(2, 0, 17) //toggle vsync music.playef(11); -#ifndef __HAIKU__ // FIXME: Remove after SDL VSync bug is fixed! -flibit graphics.screenbuffer->vsync = !graphics.screenbuffer->vsync; - graphics.screenbuffer->resetRendererWorkaround(); + graphics.screenbuffer->toggleVSync(); game.savestatsandsettings_menu(); #endif break; diff --git a/desktop_version/src/Render.cpp b/desktop_version/src/Render.cpp index 41e884a4..2648765a 100644 --- a/desktop_version/src/Render.cpp +++ b/desktop_version/src/Render.cpp @@ -370,10 +370,12 @@ static void menurender(void) break; case 5: graphics.bigprint(-1, 30, "Toggle VSync", tr, tg, tb, true); -#ifdef __HAIKU__ // FIXME: Remove after SDL VSync bug is fixed! -flibit - graphics.Print(-1, 65, "Edit the config file on Haiku!", tr, tg, tb, true); -#else + /* FIXME: Upgrade to SDL 2.0.18 and remove this ifdef when it releases! */ +#if SDL_VERSION_ATLEAST(2, 0, 17) graphics.Print(-1, 65, "Turn VSync on or off.", tr, tg, tb, true); +#else + graphics.Print(-1, 65, "Your SDL version is too old!", tr, tg, tb, true); + graphics.Print(-1, 75, "Edit the config file.", tr, tg, tb, true); #endif if (!graphics.screenbuffer->vsync) diff --git a/desktop_version/src/Screen.cpp b/desktop_version/src/Screen.cpp index d6183190..9b5ab006 100644 --- a/desktop_version/src/Screen.cpp +++ b/desktop_version/src/Screen.cpp @@ -371,48 +371,10 @@ void Screen::toggleLinearFilter(void) ); } -void Screen::resetRendererWorkaround(void) +void Screen::toggleVSync(void) { - SDL_SetHintWithPriority( - SDL_HINT_RENDER_VSYNC, - vsync ? "1" : "0", - SDL_HINT_OVERRIDE - ); - - /* FIXME: This exists because SDL_HINT_RENDER_VSYNC is not dynamic! - * As a result, our only workaround is to tear down the renderer - * and recreate everything so that it can process the variable. - * -flibit - */ - - if (m_renderer == NULL) - { - /* We haven't made it to init yet, don't worry about it */ - return; - } - - SDL_RendererInfo renderInfo; - SDL_GetRendererInfo(m_renderer, &renderInfo); - bool curVsync = (renderInfo.flags & SDL_RENDERER_PRESENTVSYNC) != 0; - if (vsync == curVsync) - { - return; - } - - SDL_DestroyTexture(m_screenTexture); - SDL_DestroyRenderer(m_renderer); - - m_renderer = SDL_CreateRenderer(m_window, -1, 0); - m_screenTexture = SDL_CreateTexture( - m_renderer, - SDL_PIXELFORMAT_ARGB8888, - SDL_TEXTUREACCESS_STREAMING, - 320, - 240 - ); - - /* Ugh, have to make sure to re-apply graphics options after doing the - * above, otherwise letterbox/integer won't be applied... - */ - ResizeScreen(-1, -1); +#if SDL_VERSION_ATLEAST(2, 0, 17) + vsync = !vsync; + SDL_RenderSetVSync(m_renderer, (int) vsync); +#endif } diff --git a/desktop_version/src/Screen.h b/desktop_version/src/Screen.h index 5a7d7b0b..c59da040 100644 --- a/desktop_version/src/Screen.h +++ b/desktop_version/src/Screen.h @@ -27,7 +27,7 @@ public: void toggleFullScreen(void); void toggleStretchMode(void); void toggleLinearFilter(void); - void resetRendererWorkaround(void); + void toggleVSync(void); bool isWindowed; bool isFiltered;