gl: don't present a frame if no previous render

This commit is contained in:
Flyinghead 2020-12-16 17:25:33 +01:00
parent 34d86500fa
commit a7a70f9900
4 changed files with 78 additions and 45 deletions

View File

@ -480,7 +480,7 @@ void gl4_delete_shaders()
gl4.modvol_shader.program = 0;
}
static void gles_term(void)
static void gl4_term(void)
{
glDeleteBuffers(1, &gl4.vbo.geometry);
gl4.vbo.geometry = 0;
@ -541,7 +541,7 @@ extern void initABuffer();
void reshapeABuffer(int width, int height);
extern void gl4CreateTextures(int width, int height);
static bool gles_init()
static bool gl4_init()
{
findGLVersion();
if (gl.gl_major < 4 || (gl.gl_major == 4 && gl.gl_minor < 3))
@ -875,15 +875,20 @@ static bool RenderFrame()
void termABuffer();
struct gl4rend : Renderer
struct OpenGL4Renderer : OpenGLRenderer
{
bool Init() override { return gles_init(); }
bool Init() override
{
return gl4_init();
}
void Resize(int w, int h) override
{
screen_width=w;
screen_height=h;
resize((int)lroundf(w * settings.rend.ScreenScaling / 100.f), (int)lroundf(h * settings.rend.ScreenScaling / 100.f));
}
void Term() override
{
termABuffer();
@ -926,29 +931,28 @@ struct gl4rend : Renderer
gl_free_osd_resources();
free_output_framebuffer();
gles_term();
gl4_term();
}
bool Process(TA_context* ctx) override { return ProcessFrame(ctx); }
bool Render() override
{
RenderFrame();
if (!pvrrc.isRTT)
DrawOSD(false);
if (pvrrc.isRTT)
return false;
return !pvrrc.isRTT;
}
bool RenderLastFrame() override { return !theGLContext.IsSwapBufferPreserved() ? gl4_render_output_framebuffer() : false; }
DrawOSD(false);
frameRendered = true;
void DrawOSD(bool clear_screen) override
{
OSD_DRAW(clear_screen);
return true;
}
virtual u64 GetTexture(TSP tsp, TCW tcw) override
bool RenderLastFrame() override
{
return gl_GetTexture(tsp, tcw);
return !theGLContext.IsSwapBufferPreserved() ? gl4_render_output_framebuffer() : false;
}
};
Renderer* rend_GL4() { return new gl4rend(); }
Renderer* rend_GL4()
{
return new OpenGL4Renderer();
}

View File

@ -1343,36 +1343,35 @@ bool RenderFrame()
return !is_rtt;
}
struct glesrend : Renderer
bool OpenGLRenderer::Init()
{
bool Init() override { return gles_init(); }
void Resize(int w, int h) override { screen_width=w; screen_height=h; }
void Term() override
{
TexCache.Clear();
gles_term();
}
return gles_init();
}
bool Process(TA_context* ctx) override { return ProcessFrame(ctx); }
bool Render() override
{
RenderFrame();
if (!pvrrc.isRTT)
DrawOSD(false);
void OpenGLRenderer::Term()
{
TexCache.Clear();
gles_term();
}
return !pvrrc.isRTT;
}
bool RenderLastFrame() override { return !theGLContext.IsSwapBufferPreserved() ? render_output_framebuffer() : false; }
bool OpenGLRenderer::Render()
{
RenderFrame();
if (pvrrc.isRTT)
return false;
void DrawOSD(bool clear_screen) override
{
OSD_DRAW(clear_screen);
}
DrawOSD(false);
frameRendered = true;
virtual u64 GetTexture(TSP tsp, TCW tcw) override
{
return gl_GetTexture(tsp, tcw);
}
};
return true;
}
Renderer* rend_GLES2() { return new glesrend(); }
bool OpenGLRenderer::RenderLastFrame()
{
return !theGLContext.IsSwapBufferPreserved() ? render_output_framebuffer() : false;
}
Renderer* rend_GLES2()
{
return new OpenGLRenderer();
}

View File

@ -233,3 +233,33 @@ extern TextureCache TexCache;
extern const u32 Zfunction[8];
extern const u32 SrcBlendGL[], DstBlendGL[];
struct OpenGLRenderer : Renderer
{
bool Init() override;
void Resize(int w, int h) override { screen_width = w; screen_height = h; }
void Term() override;
bool Process(TA_context* ctx) override { return ProcessFrame(ctx); }
bool Render() override;
bool RenderLastFrame() override;
void DrawOSD(bool clear_screen) override { OSD_DRAW(clear_screen); }
virtual u64 GetTexture(TSP tsp, TCW tcw) override
{
return gl_GetTexture(tsp, tcw);
}
virtual bool Present() override
{
if (!frameRendered)
return false;
frameRendered = false;
return true;
}
bool frameRendered = false;
};

View File

@ -260,7 +260,7 @@ void select_directory_popup(const char *prompt, float scaling, StringCallback ca
select_current_directory = child_path;
}
}
ImGui::PushStyleColor(ImGuiCol_Text, { 1, 1, 1, 0.3});
ImGui::PushStyleColor(ImGuiCol_Text, { 1, 1, 1, 0.3f });
for (auto& name : display_files)
{
ImGui::Text("%s", name.c_str());