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 "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 {
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 "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;
}

View File

@ -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;
}

View File

@ -30,9 +30,20 @@ public:
void renderDrawData(ImDrawData *drawData) override {
theDXContext.EndImGuiFrame();
if (gui_is_open())
frameRendered = true;
}
void present() override {
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"
#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);

View File

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

View File

@ -154,12 +154,12 @@ void OpenGLDriver::newFrame()
void OpenGLDriver::renderDrawData(ImDrawData* drawData)
{
ImGui_ImplOpenGL3_RenderDrawData(drawData);
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;

View File

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

View File

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