From 6560192d8ef1d89a7646a4cf8e13038ec179dd50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 19 Jul 2020 11:03:46 +0200 Subject: [PATCH] Support full VSync control in SDL OpenGL. (Not yet Qt). Forgot about iOS SDL headless buildfix Additional iOS buildfix --- Common/GraphicsContext.h | 10 ---------- Core/Config.cpp | 2 +- GPU/GPUCommon.cpp | 2 +- GPU/GPUCommon.h | 2 -- Qt/QtMain.h | 7 ++++++- SDL/SDLGLGraphicsContext.cpp | 9 +++++++++ SDL/SDLGLGraphicsContext.h | 7 ++++++- UI/GameSettingsScreen.cpp | 4 ++-- ext/native/thin3d/thin3d_gl.cpp | 2 -- headless/SDLHeadlessHost.cpp | 9 +++++++-- ios/ViewController.mm | 9 ++++++++- 11 files changed, 40 insertions(+), 23 deletions(-) diff --git a/Common/GraphicsContext.h b/Common/GraphicsContext.h index d17d77d726..bf4f493871 100644 --- a/Common/GraphicsContext.h +++ b/Common/GraphicsContext.h @@ -40,13 +40,3 @@ public: virtual Draw::DrawContext *GetDrawContext() = 0; }; - -class DummyGraphicsContext : public GraphicsContext { -public: - void Shutdown() override {} - void SwapInterval(int interval) override {} - void SwapBuffers() override {} - void Resize() override {} - - Draw::DrawContext *GetDrawContext() override { return nullptr; } -}; diff --git a/Core/Config.cpp b/Core/Config.cpp index 1ef4dc5ba2..84e8bcf01e 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -530,7 +530,7 @@ static int DefaultInternalResolution() { } static bool DefaultFrameskipUnthrottle() { -#if !PPSSPP_PLATFORM(WINDOWS) || PPSSPP_PLATFORM(UWP) +#if PPSSPP_PLATFORM(ANDROID) || defined(USING_QT_UI) || PPSSPP_PLATFORM(UWP) || PPSSPP_PLATFORM(IOS) return true; #else return false; diff --git a/GPU/GPUCommon.cpp b/GPU/GPUCommon.cpp index 0a09725677..9c7baedf54 100644 --- a/GPU/GPUCommon.cpp +++ b/GPU/GPUCommon.cpp @@ -467,7 +467,7 @@ void GPUCommon::Reinitialize() { } void GPUCommon::UpdateVsyncInterval(bool force) { -#ifdef _WIN32 +#if !(PPSSPP_PLATFORM(ANDROID) || USING_QT_UI || PPSSPP_PLATFORM(UWP) || PPSSPP_PLATFORM(IOS)) int desiredVSyncInterval = g_Config.bVSync ? 1 : 0; if (PSP_CoreParameter().unthrottle) { desiredVSyncInterval = 0; diff --git a/GPU/GPUCommon.h b/GPU/GPUCommon.h index 27deb1b77b..2dd4d7da1b 100644 --- a/GPU/GPUCommon.h +++ b/GPU/GPUCommon.h @@ -364,9 +364,7 @@ private: double timeSteppingStarted_; double timeSpentStepping_; -#ifdef _WIN32 int lastVsync_ = -1; -#endif }; struct CommonCommandTableEntry { diff --git a/Qt/QtMain.h b/Qt/QtMain.h index 93bf5ccb75..ebb2c03cea 100644 --- a/Qt/QtMain.h +++ b/Qt/QtMain.h @@ -56,6 +56,8 @@ public: renderManager_->SetInflightFrames(g_Config.iInflightFrames); bool success = draw_->CreatePresets(); _assert_msg_(G3D, success, "Failed to compile preset shaders"); + + // TODO: Need to figure out how to implement SetSwapInterval for Qt. } ~QtGLGraphicsContext() { @@ -65,7 +67,10 @@ public: } void Shutdown() override {} - void SwapInterval(int interval) override {} + void SwapInterval(int interval) override { + // See TODO in constructor. + // renderManager_->SwapInterval(interval); + } void SwapBuffers() override {} void Resize() override {} diff --git a/SDL/SDLGLGraphicsContext.cpp b/SDL/SDLGLGraphicsContext.cpp index 7f1a58c66a..772f5c764f 100644 --- a/SDL/SDLGLGraphicsContext.cpp +++ b/SDL/SDLGLGraphicsContext.cpp @@ -423,10 +423,19 @@ int SDLGLGraphicsContext::Init(SDL_Window *&window, int x, int y, int mode, std: SDL_GL_SwapWindow(window_); #endif }); + + renderManager_->SetSwapIntervalFunction([&](int interval) { + ILOG("SDL SwapInterval: %d", interval); + SDL_GL_SetSwapInterval(interval); + }); window_ = window; return 0; } +void SDLGLGraphicsContext::SwapInterval(int interval) { + renderManager_->SwapInterval(interval); +} + void SDLGLGraphicsContext::Shutdown() { } diff --git a/SDL/SDLGLGraphicsContext.h b/SDL/SDLGLGraphicsContext.h index 666aa72774..88c9d8202d 100644 --- a/SDL/SDLGLGraphicsContext.h +++ b/SDL/SDLGLGraphicsContext.h @@ -5,7 +5,7 @@ #include "gfx/gl_common.h" #include "Common/GraphicsContext.h" -class SDLGLGraphicsContext : public DummyGraphicsContext { +class SDLGLGraphicsContext : public GraphicsContext { public: SDLGLGraphicsContext() { } @@ -20,6 +20,11 @@ public: // Do nothing, the render thread takes care of this. } + // Gets forwarded to the render thread. + void SwapInterval(int interval) override; + + void Resize() override {} + Draw::DrawContext *GetDrawContext() override { return draw_; } diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index 1b353d8797..44d6f52151 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -338,7 +338,7 @@ void GameSettingsScreen::CreateViews() { return !g_Config.bSoftwareRendering && g_Config.iRenderingMode != FB_NON_BUFFERED_MODE; }); -#ifdef __ANDROID__ +#if PPSSPP_PLATFORM(ANDROID) if (System_GetPropertyInt(SYSPROP_DEVICE_TYPE) != DEVICE_TYPE_TV) { static const char *deviceResolutions[] = { "Native device resolution", "Auto (same as Rendering)", "1x PSP", "2x PSP", "3x PSP", "4x PSP", "5x PSP" }; int max_res_temp = std::max(System_GetPropertyInt(SYSPROP_DISPLAY_XRES), System_GetPropertyInt(SYSPROP_DISPLAY_YRES)) / 480 + 2; @@ -350,7 +350,7 @@ void GameSettingsScreen::CreateViews() { } #endif -#if !PPSSPP_PLATFORM(ANDROID) +#if !(PPSSPP_PLATFORM(ANDROID) || defined(USING_QT_UI) || PPSSPP_PLATFORM(UWP)) || PPSSPP_PLATFORM(IOS) CheckBox *vSync = graphicsSettings->Add(new CheckBox(&g_Config.bVSync, gr->T("VSync"))); vSync->OnClick.Add([=](EventParams &e) { NativeResized(); diff --git a/ext/native/thin3d/thin3d_gl.cpp b/ext/native/thin3d/thin3d_gl.cpp index bc2eece379..e25535816f 100644 --- a/ext/native/thin3d/thin3d_gl.cpp +++ b/ext/native/thin3d/thin3d_gl.cpp @@ -297,7 +297,6 @@ public: OpenGLPipeline(GLRenderManager *render) : render_(render) { } ~OpenGLPipeline() { - DLOG("OpenGLPipeline released"); for (auto &iter : shaders) { iter->Release(); } @@ -979,7 +978,6 @@ Pipeline *OpenGLContext::CreateGraphicsPipeline(const PipelineDesc &desc) { pipeline->dynamicUniforms = *desc.uniformDesc; pipeline->dynamicUniformLocs_.resize(desc.uniformDesc->uniforms.size()); } - ILOG("Linking shaders."); if (pipeline->LinkShaders()) { // Build the rest of the virtual pipeline object. pipeline->prim = primToGL[(int)desc.prim]; diff --git a/headless/SDLHeadlessHost.cpp b/headless/SDLHeadlessHost.cpp index d0e5757fff..b45b50724d 100644 --- a/headless/SDLHeadlessHost.cpp +++ b/headless/SDLHeadlessHost.cpp @@ -53,7 +53,7 @@ SDL_Window *CreateHiddenWindow() { return SDL_CreateWindow("PPSSPPHeadless", 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, flags); } -class GLDummyGraphicsContext : public DummyGraphicsContext { +class GLDummyGraphicsContext : public GraphicsContext { public: GLDummyGraphicsContext() { } @@ -92,6 +92,11 @@ public: renderManager_->StopThread(); } + void Shutdown() override {} + void Resize() override {} + void SwapInterval(int interval) override {} + void SwapBuffers() override {} + private: Draw::DrawContext *draw_; GLRenderManager *renderManager_ = nullptr; @@ -124,7 +129,7 @@ bool GLDummyGraphicsContext::InitFromRenderThread(std::string *errorMessage) { glContext_ = SDL_GL_CreateContext(screen_); // Ensure that the swap interval is set after context creation (needed for kmsdrm) - SDL_GL_SetSwapInterval(1); + SDL_GL_SetSwapInterval(0); #ifndef USING_GLES2 // Some core profile drivers elide certain extensions from GL_EXTENSIONS/etc. diff --git a/ios/ViewController.mm b/ios/ViewController.mm index 73fd05c7fd..d36ae51b07 100644 --- a/ios/ViewController.mm +++ b/ios/ViewController.mm @@ -38,7 +38,7 @@ #define IS_IPAD() ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) #define IS_IPHONE() ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone) -class IOSGraphicsContext : public DummyGraphicsContext { +class IOSGraphicsContext : public GraphicsContext { public: IOSGraphicsContext() { CheckGLExtensions(); @@ -55,6 +55,12 @@ public: Draw::DrawContext *GetDrawContext() override { return draw_; } + + void SwapInterval(int interval) override {} + void SwapBuffers() override {} + void Resize() override {} + void Shutdown() override {} + void ThreadStart() override { renderManager_->ThreadStart(draw_); } @@ -71,6 +77,7 @@ public: renderManager_->WaitUntilQueueIdle(); renderManager_->StopThread(); } + private: Draw::DrawContext *draw_; GLRenderManager *renderManager_;