From b95667563faa2d29f8dfaeecf08aaa97ccc72ffb Mon Sep 17 00:00:00 2001 From: raven02 Date: Thu, 22 May 2014 00:20:13 +0800 Subject: [PATCH 1/3] Code cleanup and added glPolygonOffset --- rpcs3/Emu/GS/GL/GLGSRender.cpp | 29 +++++++++++++++++++++-------- rpcs3/Emu/GS/GL/GLGSRender.h | 2 +- rpcs3/Emu/GS/RSXThread.h | 11 +++++++++++ 3 files changed, 33 insertions(+), 9 deletions(-) diff --git a/rpcs3/Emu/GS/GL/GLGSRender.cpp b/rpcs3/Emu/GS/GL/GLGSRender.cpp index 70c263493a..8ba1410e4c 100644 --- a/rpcs3/Emu/GS/GL/GLGSRender.cpp +++ b/rpcs3/Emu/GS/GL/GLGSRender.cpp @@ -581,7 +581,7 @@ void GLGSRender::WriteColourBufferD() checkForGlError("glReadPixels(GL_RGBA, GL_UNSIGNED_INT_8_8_8_8)"); } -void GLGSRender::WriteBuffers() +void GLGSRender::WriteColorBuffers() { glPixelStorei(GL_PACK_ROW_LENGTH, 0); glPixelStorei(GL_PACK_ALIGNMENT, 4); @@ -641,7 +641,6 @@ void GLGSRender::OnInitThread() InitProcTable(); glEnable(GL_TEXTURE_2D); - glEnable(GL_SCISSOR_TEST); #ifdef _WIN32 glSwapInterval(Ini.GSVSyncEnable.GetValue() ? 1 : 0); @@ -773,8 +772,10 @@ void GLGSRender::ExecCMD() } m_fbo.Bind(); + if(Ini.GSDumpDepthBuffer.GetValue()) WriteDepthBuffer(); + static const GLenum draw_buffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3 }; switch(m_surface_colour_target) @@ -813,8 +814,6 @@ void GLGSRender::ExecCMD() checkForGlError("glColorMask"); } - //glFrontFace(m_front_face); - if(m_set_viewport_horizontal && m_set_viewport_vertical) { //glViewport(m_viewport_x, m_viewport_y, m_viewport_w, m_viewport_h); @@ -859,6 +858,7 @@ void GLGSRender::ExecCMD() Enable(m_set_blend, GL_BLEND); Enable(m_set_logic_op, GL_LOGIC_OP); Enable(m_set_cull_face_enable, GL_CULL_FACE); + //Enable(m_set_front_face, GL_FRONT_FACE); // glEnable : OpenGL error 0x0500 Enable(m_set_dither, GL_DITHER); Enable(m_set_stencil_test, GL_STENCIL_TEST); Enable(m_set_scissor_horizontal && m_set_scissor_vertical, GL_SCISSOR_TEST); @@ -867,7 +867,7 @@ void GLGSRender::ExecCMD() Enable(m_set_poly_offset_fill, GL_POLYGON_OFFSET_FILL); Enable(m_set_poly_offset_line, GL_POLYGON_OFFSET_LINE); Enable(m_set_poly_offset_point, GL_POLYGON_OFFSET_POINT); - //Enable(m_set_restart_index, GL_PRIMITIVE_RESTART); //Requires OpenGL 3.1+ + //Enable(m_set_restart_index, GL_PRIMITIVE_RESTART); // Requires OpenGL 3.1+ if(m_set_clip_plane) { @@ -896,6 +896,12 @@ void GLGSRender::ExecCMD() checkForGlError("glPolygonMode(Back)"); } + if (m_set_poly_offset_scale_factor && m_set_poly_offset_bias) + { + glPolygonOffset(m_set_poly_offset_scale_factor, m_set_poly_offset_bias); + checkForGlError("glPolygonOffset"); + } + if (m_set_logic_op) { glLogicOp(m_logic_op); @@ -907,6 +913,7 @@ void GLGSRender::ExecCMD() glScissor(m_scissor_x, m_scissor_y, m_scissor_w, m_scissor_h); checkForGlError("glScissor"); } + if(m_set_two_sided_stencil_test_enable) { if(m_set_stencil_fail && m_set_stencil_zfail && m_set_stencil_zpass) @@ -1029,6 +1036,12 @@ void GLGSRender::ExecCMD() checkForGlError("glCullFace"); } + if (m_set_front_face) + { + //glFrontFace(m_front_face); // glFrontFace : OpenGL error 0x0500 + checkForGlError("glFrontFace"); + } + if(m_set_alpha_func && m_set_alpha_ref) { glAlphaFunc(m_alpha_func, m_alpha_ref/255.0f); @@ -1052,7 +1065,7 @@ void GLGSRender::ExecCMD() if(m_set_restart_index) { ConLog.Warning("m_set_restart_index requires glPrimitiveRestartIndex()"); - //glPrimitiveRestartIndex(m_restart_index); //Requires OpenGL 3.1+ + //glPrimitiveRestartIndex(m_restart_index); // Requires OpenGL 3.1+ //checkForGlError("glPrimitiveRestartIndex"); } @@ -1117,8 +1130,8 @@ void GLGSRender::ExecCMD() DisableVertexData(); } - if(Ini.GSDumpColorBuffers.GetValue()) - WriteBuffers(); + if (Ini.GSDumpColorBuffers.GetValue()) + WriteColorBuffers(); } void GLGSRender::Flip() diff --git a/rpcs3/Emu/GS/GL/GLGSRender.h b/rpcs3/Emu/GS/GL/GLGSRender.h index 819d95ff1c..8839d578ea 100644 --- a/rpcs3/Emu/GS/GL/GLGSRender.h +++ b/rpcs3/Emu/GS/GL/GLGSRender.h @@ -827,11 +827,11 @@ private: virtual void Close(); bool LoadProgram(); void WriteDepthBuffer(); + void WriteColorBuffers(); void WriteColourBufferA(); void WriteColourBufferB(); void WriteColourBufferC(); void WriteColourBufferD(); - void WriteBuffers(); void DrawObjects(); diff --git a/rpcs3/Emu/GS/RSXThread.h b/rpcs3/Emu/GS/RSXThread.h index 6a4030a89c..1b2a675002 100644 --- a/rpcs3/Emu/GS/RSXThread.h +++ b/rpcs3/Emu/GS/RSXThread.h @@ -175,6 +175,11 @@ public: bool m_set_poly_offset_line; bool m_set_poly_offset_point; + bool m_set_poly_offset_scale_factor; + u32 m_poly_offset_scale_factor; + bool m_set_poly_offset_bias; + u32 m_poly_offset_bias; + bool m_set_restart_index; u32 m_restart_index; @@ -384,6 +389,7 @@ public: u32 m_surface_colour_target; + bool m_set_front_face; u32 m_front_face; u8 m_begin_end; @@ -428,6 +434,9 @@ protected: m_clear_z = 0xffffff; m_clear_s = 0; + m_poly_offset_scale_factor = 0; + m_poly_offset_bias = 0; + m_depth_bounds_min = 0.0; m_depth_bounds_max = 1.0; m_restart_index = 0xffffffff; @@ -500,6 +509,8 @@ protected: m_set_poly_offset_fill = false; m_set_poly_offset_line = false; m_set_poly_offset_point = false; + m_set_poly_offset_scale_factor = false; + m_set_poly_offset_bias = false; m_set_restart_index = false; m_clear_surface_mask = 0; From 3445f8a49f0a4f3ca33fec15123b8504ed879a3f Mon Sep 17 00:00:00 2001 From: raven02 Date: Thu, 22 May 2014 00:48:25 +0800 Subject: [PATCH 2/3] There is no glEnable(GL_FRONT_FACE) --- rpcs3/Emu/GS/GL/GLGSRender.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/rpcs3/Emu/GS/GL/GLGSRender.cpp b/rpcs3/Emu/GS/GL/GLGSRender.cpp index 8ba1410e4c..60a72dcee7 100644 --- a/rpcs3/Emu/GS/GL/GLGSRender.cpp +++ b/rpcs3/Emu/GS/GL/GLGSRender.cpp @@ -858,7 +858,6 @@ void GLGSRender::ExecCMD() Enable(m_set_blend, GL_BLEND); Enable(m_set_logic_op, GL_LOGIC_OP); Enable(m_set_cull_face_enable, GL_CULL_FACE); - //Enable(m_set_front_face, GL_FRONT_FACE); // glEnable : OpenGL error 0x0500 Enable(m_set_dither, GL_DITHER); Enable(m_set_stencil_test, GL_STENCIL_TEST); Enable(m_set_scissor_horizontal && m_set_scissor_vertical, GL_SCISSOR_TEST); From 94393ff4ea0b52f439ffa5857ddd2dd0a90187c3 Mon Sep 17 00:00:00 2001 From: raven02 Date: Thu, 22 May 2014 01:08:46 +0800 Subject: [PATCH 3/3] Re-enable glFrontFace with sanity check --- rpcs3/Emu/GS/GL/GLGSRender.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/GS/GL/GLGSRender.cpp b/rpcs3/Emu/GS/GL/GLGSRender.cpp index 60a72dcee7..26620efacc 100644 --- a/rpcs3/Emu/GS/GL/GLGSRender.cpp +++ b/rpcs3/Emu/GS/GL/GLGSRender.cpp @@ -1037,8 +1037,12 @@ void GLGSRender::ExecCMD() if (m_set_front_face) { - //glFrontFace(m_front_face); // glFrontFace : OpenGL error 0x0500 - checkForGlError("glFrontFace"); + // Sanity check . Disgaea 3 return 0x1d0 here and cause openGL 0x0500 + if (m_front_face == GL_CW || m_front_face == GL_CCW) + { + glFrontFace(m_front_face); + checkForGlError("glFrontFace"); + } } if(m_set_alpha_func && m_set_alpha_ref)