gl4: fix invisible framebuffer direct writes with hle bios

Fixes hidden & dangerous black screens in hle bios mode
This commit is contained in:
Flyinghead 2019-09-11 21:10:02 +02:00
parent 8b949e1dca
commit 2bdfdf96c1
3 changed files with 15 additions and 16 deletions

View File

@ -45,7 +45,7 @@ static GLuint texSamplers[2];
static GLuint depth_fbo; static GLuint depth_fbo;
GLuint depthSaveTexId; GLuint depthSaveTexId;
static gl4PipelineShader *gl4GetProgram(u32 cp_AlphaTest, u32 pp_ClipTestMode, static gl4PipelineShader *gl4GetProgram(u32 cp_AlphaTest, s32 pp_ClipTestMode,
u32 pp_Texture, u32 pp_UseAlpha, u32 pp_IgnoreTexA, u32 pp_ShadInstr, u32 pp_Offset, u32 pp_Texture, u32 pp_UseAlpha, u32 pp_IgnoreTexA, u32 pp_ShadInstr, u32 pp_Offset,
u32 pp_FogCtrl, bool pp_TwoVolumes, u32 pp_DepthFunc, bool pp_Gouraud, bool pp_BumpMap, bool fog_clamping, int pass) u32 pp_FogCtrl, bool pp_TwoVolumes, u32 pp_DepthFunc, bool pp_Gouraud, bool pp_BumpMap, bool fog_clamping, int pass)
{ {
@ -56,7 +56,7 @@ static gl4PipelineShader *gl4GetProgram(u32 cp_AlphaTest, u32 pp_ClipTestMode,
} }
u32 rv=0; u32 rv=0;
rv|=pp_ClipTestMode; rv |= (pp_ClipTestMode + 1);
rv<<=1; rv|=cp_AlphaTest; rv<<=1; rv|=cp_AlphaTest;
rv<<=1; rv|=pp_Texture; rv<<=1; rv|=pp_Texture;
rv<<=1; rv|=pp_UseAlpha; rv<<=1; rv|=pp_UseAlpha;
@ -692,7 +692,7 @@ static void gl4_draw_quad_texture(GLuint texture, float w, float h)
glcache.Disable(GL_CULL_FACE); glcache.Disable(GL_CULL_FACE);
glcache.Disable(GL_BLEND); glcache.Disable(GL_BLEND);
ShaderUniforms.trilinear_alpha = 1.0; gl4ShaderUniforms.trilinear_alpha = 1.0;
CurrentShader = gl4GetProgram(0, CurrentShader = gl4GetProgram(0,
0, 0,
@ -722,11 +722,14 @@ static void gl4_draw_quad_texture(GLuint texture, float w, float h)
}; };
GLushort indices[] = { 0, 1, 2, 1, 3 }; GLushort indices[] = { 0, 1, 2, 1, 3 };
gl4SetupMainVBO(); glBindVertexArray(gl4.vbo.main_vao);
glBindBuffer(GL_ARRAY_BUFFER, gl4.vbo.geometry);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, gl4.vbo.idxs);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STREAM_DRAW); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STREAM_DRAW);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STREAM_DRAW); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STREAM_DRAW);
glDrawElements(GL_TRIANGLE_STRIP, 5, GL_UNSIGNED_SHORT, (void *)0); glDrawElements(GL_TRIANGLE_STRIP, 5, GL_UNSIGNED_SHORT, (void *)0);
glCheck();
} }
void gl4DrawFramebuffer(float w, float h) void gl4DrawFramebuffer(float w, float h)

View File

@ -857,24 +857,15 @@ static bool RenderFrame()
} }
} }
bool wide_screen_on = !is_rtt && settings.rend.WideScreen
&& pvrrc.fb_X_CLIP.min == 0
&& lroundf((pvrrc.fb_X_CLIP.max + 1) / scale_x) == 640L
&& pvrrc.fb_Y_CLIP.min == 0
&& lroundf((pvrrc.fb_Y_CLIP.max + 1) / scale_y) == 480L;
//Color is cleared by the background plane
glcache.Disable(GL_SCISSOR_TEST); glcache.Disable(GL_SCISSOR_TEST);
//move vertex to gpu
if (!pvrrc.isRenderFramebuffer) if (!pvrrc.isRenderFramebuffer)
{ {
//Main VBO //Main VBO
glBindBuffer(GL_ARRAY_BUFFER, gl4.vbo.geometry); glCheck(); glBindBuffer(GL_ARRAY_BUFFER, gl4.vbo.geometry); glCheck();
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, gl4.vbo.idxs); glCheck(); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, gl4.vbo.idxs); glCheck();
//move vertex to gpu
glBufferData(GL_ARRAY_BUFFER,pvrrc.verts.bytes(),pvrrc.verts.head(),GL_STREAM_DRAW); glCheck(); glBufferData(GL_ARRAY_BUFFER,pvrrc.verts.bytes(),pvrrc.verts.head(),GL_STREAM_DRAW); glCheck();
glBufferData(GL_ELEMENT_ARRAY_BUFFER,pvrrc.idx.bytes(),pvrrc.idx.head(),GL_STREAM_DRAW); glBufferData(GL_ELEMENT_ARRAY_BUFFER,pvrrc.idx.bytes(),pvrrc.idx.head(),GL_STREAM_DRAW);
@ -901,6 +892,12 @@ static bool RenderFrame()
DEBUG_LOG(RENDERER, "SCI: %f, %f, %f, %f", offs_x+pvrrc.fb_X_CLIP.min/scale_x,(pvrrc.fb_Y_CLIP.min/scale_y)*dc2s_scale_h,(pvrrc.fb_X_CLIP.max-pvrrc.fb_X_CLIP.min+1)/scale_x*dc2s_scale_h,(pvrrc.fb_Y_CLIP.max-pvrrc.fb_Y_CLIP.min+1)/scale_y*dc2s_scale_h); DEBUG_LOG(RENDERER, "SCI: %f, %f, %f, %f", offs_x+pvrrc.fb_X_CLIP.min/scale_x,(pvrrc.fb_Y_CLIP.min/scale_y)*dc2s_scale_h,(pvrrc.fb_X_CLIP.max-pvrrc.fb_X_CLIP.min+1)/scale_x*dc2s_scale_h,(pvrrc.fb_Y_CLIP.max-pvrrc.fb_Y_CLIP.min+1)/scale_y*dc2s_scale_h);
#endif #endif
bool wide_screen_on = !is_rtt && settings.rend.WideScreen
&& pvrrc.fb_X_CLIP.min == 0
&& lroundf((pvrrc.fb_X_CLIP.max + 1) / scale_x) == 640L
&& pvrrc.fb_Y_CLIP.min == 0
&& lroundf((pvrrc.fb_Y_CLIP.max + 1) / scale_y) == 480L;
if (!wide_screen_on) if (!wide_screen_on)
{ {
float width = (pvrrc.fb_X_CLIP.max - pvrrc.fb_X_CLIP.min + 1) / scale_x; float width = (pvrrc.fb_X_CLIP.max - pvrrc.fb_X_CLIP.min + 1) / scale_x;
@ -963,6 +960,7 @@ static bool RenderFrame()
{ {
glBindFramebuffer(GL_FRAMEBUFFER, output_fbo); glBindFramebuffer(GL_FRAMEBUFFER, output_fbo);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glcache.ClearColor(0.f, 0.f, 0.f, 0.f); glcache.ClearColor(0.f, 0.f, 0.f, 0.f);
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);

View File

@ -2052,8 +2052,6 @@ bool RenderFrame()
glcache.ClearColor(0.f, 0.f, 0.f, 0.f); glcache.ClearColor(0.f, 0.f, 0.f, 0.f);
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
DrawFramebuffer(dc_width, dc_height); DrawFramebuffer(dc_width, dc_height);
glBufferData(GL_ARRAY_BUFFER, pvrrc.verts.bytes(), pvrrc.verts.head(), GL_STREAM_DRAW);
upload_vertex_indices();
} }
#ifdef _WIN32 #ifdef _WIN32
//Sleep(40); //to test MT stability //Sleep(40); //to test MT stability