diff --git a/desktop_version/src/Graphics.cpp b/desktop_version/src/Graphics.cpp index 67e21239..548fd95f 100644 --- a/desktop_version/src/Graphics.cpp +++ b/desktop_version/src/Graphics.cpp @@ -3106,4 +3106,22 @@ Uint32 Graphics::crewcolourreal(int t) void Graphics::processVsync() { SDL_SetHintWithPriority(SDL_HINT_RENDER_VSYNC, vsync ? "1" : "0", SDL_HINT_OVERRIDE); + + // FIXME: Sigh... work around SDL2 bug where the VSync hint is only listened to at renderer creation + SDL_DestroyRenderer(screenbuffer->m_renderer); + screenbuffer->m_renderer = SDL_CreateRenderer(screenbuffer->m_window, -1, 0); + + // Ugh, have to re-create m_screenTexture as well, otherwise the screen will be black... + SDL_DestroyTexture(screenbuffer->m_screenTexture); + // FIXME: This is duplicated from Screen::init()! + screenbuffer->m_screenTexture = SDL_CreateTexture( + screenbuffer->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... + screenbuffer->ResizeScreen(-1, -1); } diff --git a/desktop_version/src/Screen.cpp b/desktop_version/src/Screen.cpp index cd742de0..6e67ff8f 100644 --- a/desktop_version/src/Screen.cpp +++ b/desktop_version/src/Screen.cpp @@ -34,6 +34,7 @@ void Screen::init() // Uncomment this next line when you need to debug -flibit // SDL_SetHintWithPriority(SDL_HINT_RENDER_DRIVER, "software", SDL_HINT_OVERRIDE); + // FIXME: m_renderer is also created in Graphics::processVsync()! SDL_CreateWindowAndRenderer( 640, 480, @@ -76,6 +77,7 @@ void Screen::init() 0x000000FF, 0xFF000000 ); + // ALSO FIXME: This SDL_CreateTexture() is duplicated in Graphics::processVsync()! m_screenTexture = SDL_CreateTexture( m_renderer, SDL_PIXELFORMAT_ARGB8888, diff --git a/desktop_version/src/main.cpp b/desktop_version/src/main.cpp index d73ad334..91962ce6 100644 --- a/desktop_version/src/main.cpp +++ b/desktop_version/src/main.cpp @@ -217,6 +217,11 @@ int main(int argc, char *argv[]) //Moved screensetting init here from main menu V2.1 game.loadstats(); + + // FIXME: Thanks to having to work around an SDL2 bug, this destroys the + // renderer created by Screen::init(), which is a bit wasteful! + // This is annoying to fix because we'd have to call gameScreen.init() after + // game.loadstats(), but game.loadstats() assumes gameScreen.init() is already called! graphics.processVsync(); if (game.skipfakeload)