diff --git a/core/rend/dx11/dx11_driver.h b/core/rend/dx11/dx11_driver.h index b7dd7497e..d382f27b7 100644 --- a/core/rend/dx11/dx11_driver.h +++ b/core/rend/dx11/dx11_driver.h @@ -20,6 +20,7 @@ #include "rend/imgui_driver.h" #include "imgui_impl_dx11.h" #include "dx11context.h" +#include "rend/gui.h" class DX11Driver final : public ImGuiDriver { @@ -30,9 +31,20 @@ public: void renderDrawData(ImDrawData *drawData) override { theDX11Context.EndImGuiFrame(); + if (gui_is_open()) + frameRendered = true; } void present() override { - theDX11Context.Present(); + if (frameRendered) + theDX11Context.Present(); + frameRendered = false; } + + void setFrameRendered() override { + frameRendered = true; + } + +private: + bool frameRendered = false; }; diff --git a/core/rend/dx11/dx11_renderer.h b/core/rend/dx11/dx11_renderer.h index 4f1c3f6f8..0489c8c80 100644 --- a/core/rend/dx11/dx11_renderer.h +++ b/core/rend/dx11/dx11_renderer.h @@ -27,6 +27,9 @@ #include "dx11_shaders.h" #include "rend/sorter.h" #include "dx11_renderstate.h" +#ifndef LIBRETRO +#include "dx11_driver.h" +#endif struct DX11Renderer : public Renderer { @@ -41,6 +44,9 @@ struct DX11Renderer : public Renderer if (!frameRendered) return false; frameRendered = false; +#ifndef LIBRETRO + imguiDriver->setFrameRendered(); +#endif return true; } diff --git a/core/rend/dx9/d3d_renderer.h b/core/rend/dx9/d3d_renderer.h index df82c1c6b..5bb610241 100644 --- a/core/rend/dx9/d3d_renderer.h +++ b/core/rend/dx9/d3d_renderer.h @@ -26,6 +26,7 @@ #include "d3d_texture.h" #include "d3d_shaders.h" #include "rend/sorter.h" +#include "rend/imgui_driver.h" class RenderStateCache { @@ -108,6 +109,7 @@ struct D3DRenderer : public Renderer { if (!frameRendered) return false; + imguiDriver->setFrameRendered(); frameRendered = false; return true; } diff --git a/core/rend/dx9/dx9_driver.h b/core/rend/dx9/dx9_driver.h index 0d13079d3..deb27c5cd 100644 --- a/core/rend/dx9/dx9_driver.h +++ b/core/rend/dx9/dx9_driver.h @@ -30,9 +30,20 @@ public: void renderDrawData(ImDrawData *drawData) override { theDXContext.EndImGuiFrame(); + if (gui_is_open()) + frameRendered = true; } void present() override { - theDXContext.Present(); + if (frameRendered) + theDXContext.Present(); + frameRendered = false; } + + void setFrameRendered() override { + frameRendered = true; + } + +private: + bool frameRendered = false; }; diff --git a/core/rend/gles/gles.cpp b/core/rend/gles/gles.cpp index f1de503ab..1c858f870 100644 --- a/core/rend/gles/gles.cpp +++ b/core/rend/gles/gles.cpp @@ -4,7 +4,6 @@ #include "hw/pvr/ta.h" #ifndef LIBRETRO #include "rend/gui.h" -#include "opengl_driver.h" #else #include "vmu_xhair.h" #endif @@ -1090,7 +1089,7 @@ void OSD_DRAW(bool clear_screen) glDrawArrays(GL_TRIANGLE_STRIP, i * 4, 4); glCheck(); - ((OpenGLDriver *)imguiDriver.get())->setFrameRendered(); + imguiDriver->setFrameRendered(); #ifndef GLES2 if (gl.gl_major >= 3) glBindVertexArray(0); diff --git a/core/rend/gles/gles.h b/core/rend/gles/gles.h index 0dc0ab924..fdabbb2c6 100755 --- a/core/rend/gles/gles.h +++ b/core/rend/gles/gles.h @@ -6,6 +6,9 @@ #include "glcache.h" #include "postprocess.h" #include "rend/shader_util.h" +#ifndef LIBRETRO +#include "rend/imgui_driver.h" +#endif #include #include @@ -286,6 +289,9 @@ struct OpenGLRenderer : Renderer { if (!frameRendered) return false; +#ifndef LIBRETRO + imguiDriver->setFrameRendered(); +#endif frameRendered = false; return true; } diff --git a/core/rend/gles/opengl_driver.cpp b/core/rend/gles/opengl_driver.cpp index 924a1bbcc..61c9b6cc2 100644 --- a/core/rend/gles/opengl_driver.cpp +++ b/core/rend/gles/opengl_driver.cpp @@ -154,12 +154,12 @@ void OpenGLDriver::newFrame() void OpenGLDriver::renderDrawData(ImDrawData* drawData) { ImGui_ImplOpenGL3_RenderDrawData(drawData); - frameRendered = true; + if (gui_is_open()) + frameRendered = true; } void OpenGLDriver::present() { - // FIXME we only rely on whether some imgui stuff has been rendered, which is kinda weak if (frameRendered) theGLContext.swap(); frameRendered = false; diff --git a/core/rend/gles/opengl_driver.h b/core/rend/gles/opengl_driver.h index 2a9a4512d..5e6d86136 100644 --- a/core/rend/gles/opengl_driver.h +++ b/core/rend/gles/opengl_driver.h @@ -33,7 +33,7 @@ public: void renderDrawData(ImDrawData* drawData) override; void present() override; - void setFrameRendered() { + void setFrameRendered() override { frameRendered = true; } diff --git a/core/rend/imgui_driver.h b/core/rend/imgui_driver.h index 537ee1176..284fb1800 100644 --- a/core/rend/imgui_driver.h +++ b/core/rend/imgui_driver.h @@ -32,6 +32,7 @@ public: virtual void displayCrosshairs() {} virtual void present() = 0; + virtual void setFrameRendered() {} }; extern std::unique_ptr imguiDriver;