gl,dx9,dx11: only render frame when Renderer::present() has been called

Issue #511
This commit is contained in:
Flyinghead 2022-02-14 18:38:58 +01:00
parent 3929fe64a3
commit 8f01ef90cf
9 changed files with 44 additions and 7 deletions

View File

@ -20,6 +20,7 @@
#include "rend/imgui_driver.h" #include "rend/imgui_driver.h"
#include "imgui_impl_dx11.h" #include "imgui_impl_dx11.h"
#include "dx11context.h" #include "dx11context.h"
#include "rend/gui.h"
class DX11Driver final : public ImGuiDriver class DX11Driver final : public ImGuiDriver
{ {
@ -30,9 +31,20 @@ public:
void renderDrawData(ImDrawData *drawData) override { void renderDrawData(ImDrawData *drawData) override {
theDX11Context.EndImGuiFrame(); theDX11Context.EndImGuiFrame();
if (gui_is_open())
frameRendered = true;
} }
void present() override { void present() override {
theDX11Context.Present(); if (frameRendered)
theDX11Context.Present();
frameRendered = false;
} }
void setFrameRendered() override {
frameRendered = true;
}
private:
bool frameRendered = false;
}; };

View File

@ -27,6 +27,9 @@
#include "dx11_shaders.h" #include "dx11_shaders.h"
#include "rend/sorter.h" #include "rend/sorter.h"
#include "dx11_renderstate.h" #include "dx11_renderstate.h"
#ifndef LIBRETRO
#include "dx11_driver.h"
#endif
struct DX11Renderer : public Renderer struct DX11Renderer : public Renderer
{ {
@ -41,6 +44,9 @@ struct DX11Renderer : public Renderer
if (!frameRendered) if (!frameRendered)
return false; return false;
frameRendered = false; frameRendered = false;
#ifndef LIBRETRO
imguiDriver->setFrameRendered();
#endif
return true; return true;
} }

View File

@ -26,6 +26,7 @@
#include "d3d_texture.h" #include "d3d_texture.h"
#include "d3d_shaders.h" #include "d3d_shaders.h"
#include "rend/sorter.h" #include "rend/sorter.h"
#include "rend/imgui_driver.h"
class RenderStateCache class RenderStateCache
{ {
@ -108,6 +109,7 @@ struct D3DRenderer : public Renderer
{ {
if (!frameRendered) if (!frameRendered)
return false; return false;
imguiDriver->setFrameRendered();
frameRendered = false; frameRendered = false;
return true; return true;
} }

View File

@ -30,9 +30,20 @@ public:
void renderDrawData(ImDrawData *drawData) override { void renderDrawData(ImDrawData *drawData) override {
theDXContext.EndImGuiFrame(); theDXContext.EndImGuiFrame();
if (gui_is_open())
frameRendered = true;
} }
void present() override { void present() override {
theDXContext.Present(); if (frameRendered)
theDXContext.Present();
frameRendered = false;
} }
void setFrameRendered() override {
frameRendered = true;
}
private:
bool frameRendered = false;
}; };

View File

@ -4,7 +4,6 @@
#include "hw/pvr/ta.h" #include "hw/pvr/ta.h"
#ifndef LIBRETRO #ifndef LIBRETRO
#include "rend/gui.h" #include "rend/gui.h"
#include "opengl_driver.h"
#else #else
#include "vmu_xhair.h" #include "vmu_xhair.h"
#endif #endif
@ -1090,7 +1089,7 @@ void OSD_DRAW(bool clear_screen)
glDrawArrays(GL_TRIANGLE_STRIP, i * 4, 4); glDrawArrays(GL_TRIANGLE_STRIP, i * 4, 4);
glCheck(); glCheck();
((OpenGLDriver *)imguiDriver.get())->setFrameRendered(); imguiDriver->setFrameRendered();
#ifndef GLES2 #ifndef GLES2
if (gl.gl_major >= 3) if (gl.gl_major >= 3)
glBindVertexArray(0); glBindVertexArray(0);

View File

@ -6,6 +6,9 @@
#include "glcache.h" #include "glcache.h"
#include "postprocess.h" #include "postprocess.h"
#include "rend/shader_util.h" #include "rend/shader_util.h"
#ifndef LIBRETRO
#include "rend/imgui_driver.h"
#endif
#include <unordered_map> #include <unordered_map>
#include <glm/glm.hpp> #include <glm/glm.hpp>
@ -286,6 +289,9 @@ struct OpenGLRenderer : Renderer
{ {
if (!frameRendered) if (!frameRendered)
return false; return false;
#ifndef LIBRETRO
imguiDriver->setFrameRendered();
#endif
frameRendered = false; frameRendered = false;
return true; return true;
} }

View File

@ -154,12 +154,12 @@ void OpenGLDriver::newFrame()
void OpenGLDriver::renderDrawData(ImDrawData* drawData) void OpenGLDriver::renderDrawData(ImDrawData* drawData)
{ {
ImGui_ImplOpenGL3_RenderDrawData(drawData); ImGui_ImplOpenGL3_RenderDrawData(drawData);
frameRendered = true; if (gui_is_open())
frameRendered = true;
} }
void OpenGLDriver::present() void OpenGLDriver::present()
{ {
// FIXME we only rely on whether some imgui stuff has been rendered, which is kinda weak
if (frameRendered) if (frameRendered)
theGLContext.swap(); theGLContext.swap();
frameRendered = false; frameRendered = false;

View File

@ -33,7 +33,7 @@ public:
void renderDrawData(ImDrawData* drawData) override; void renderDrawData(ImDrawData* drawData) override;
void present() override; void present() override;
void setFrameRendered() { void setFrameRendered() override {
frameRendered = true; frameRendered = true;
} }

View File

@ -32,6 +32,7 @@ public:
virtual void displayCrosshairs() {} virtual void displayCrosshairs() {}
virtual void present() = 0; virtual void present() = 0;
virtual void setFrameRendered() {}
}; };
extern std::unique_ptr<ImGuiDriver> imguiDriver; extern std::unique_ptr<ImGuiDriver> imguiDriver;