From 3e3665a13b179ae52a76491ffacaaca6653004d2 Mon Sep 17 00:00:00 2001 From: raven02 Date: Tue, 30 Dec 2014 23:33:43 +0800 Subject: [PATCH] RSX: refactor glEnable cmd --- rpcs3/Emu/RSX/GL/GLGSRender.cpp | 139 ++++++++++++++++++++---------- rpcs3/Emu/RSX/GL/GLGSRender.h | 2 +- rpcs3/Emu/RSX/Null/NullGSRender.h | 4 + rpcs3/Emu/RSX/RSXThread.cpp | 45 ++++------ rpcs3/Emu/RSX/RSXThread.h | 1 + 5 files changed, 118 insertions(+), 73 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index 88d6029e2b..a301e249b5 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -797,18 +797,6 @@ GLGSRender::~GLGSRender() m_frame->DeleteContext(m_context); } -void GLGSRender::Enable(bool enable, const u32 cap) -{ - if (enable) - { - glEnable(cap); - } - else - { - glDisable(cap); - } -} - extern CellGcmContextData current_context; void GLGSRender::Close() @@ -1640,6 +1628,99 @@ void GLGSRender::InitDrawBuffers() } } +void GLGSRender::Enable(u32 cmd, u32 enable) +{ + switch (cmd) { + case NV4097_SET_DITHER_ENABLE: + enable ? glEnable(GL_DITHER) : glDisable(GL_DITHER); + break; + + case NV4097_SET_ALPHA_TEST_ENABLE: + enable ? glEnable(GL_ALPHA_TEST) : glDisable(GL_ALPHA_TEST); + break; + + case NV4097_SET_STENCIL_TEST_ENABLE: + enable ? glEnable(GL_STENCIL_TEST) : glDisable(GL_STENCIL_TEST); + break; + + case NV4097_SET_DEPTH_TEST_ENABLE: + enable ? glEnable(GL_DEPTH_TEST) : glDisable(GL_DEPTH_TEST); + break; + + case NV4097_SET_CULL_FACE_ENABLE: + enable ? glEnable(GL_CULL_FACE) : glDisable(GL_CULL_FACE); + break; + + case NV4097_SET_BLEND_ENABLE: + enable ? glEnable(GL_BLEND) : glDisable(GL_BLEND); + break; + + case NV4097_SET_POLY_OFFSET_FILL_ENABLE: + enable ? glEnable(GL_POLYGON_OFFSET_FILL) : glDisable(GL_POLYGON_OFFSET_FILL); + break; + + case NV4097_SET_POLY_OFFSET_LINE_ENABLE: + enable ? glEnable(GL_POLYGON_OFFSET_LINE) : glDisable(GL_POLYGON_OFFSET_LINE); + break; + + case NV4097_SET_POLY_OFFSET_POINT_ENABLE: + enable ? glEnable(GL_POLYGON_OFFSET_POINT) : glDisable(GL_POLYGON_OFFSET_POINT); + break; + + case NV4097_SET_LOGIC_OP_ENABLE: + enable ? glEnable(GL_LOGIC_OP) : glDisable(GL_LOGIC_OP); + break; + + case NV4097_SET_SPECULAR_ENABLE: + enable ? glEnable(GL_LIGHTING) : glDisable(GL_LIGHTING); + break; + + case NV4097_SET_LINE_SMOOTH_ENABLE: + enable ? glEnable(GL_LINE_SMOOTH) : glDisable(GL_LINE_SMOOTH); + break; + + case NV4097_SET_POLY_SMOOTH_ENABLE: + enable ? glEnable(GL_POLYGON_SMOOTH) : glDisable(GL_POLYGON_SMOOTH); + break; + + case NV4097_SET_RESTART_INDEX: + enable ? glEnable(GL_PRIMITIVE_RESTART) : glDisable(GL_PRIMITIVE_RESTART); + break; + + case NV4097_SET_POINT_SPRITE_CONTROL: + enable ? glEnable(GL_POINT_SPRITE) : glDisable(GL_POINT_SPRITE); + break; + + case NV4097_SET_LINE_STIPPLE: + enable ? glEnable(GL_LINE_STIPPLE) : glDisable(GL_LINE_STIPPLE); + break; + + case NV4097_SET_POLYGON_STIPPLE: + enable ? glEnable(GL_POLYGON_STIPPLE) : glDisable(GL_POLYGON_STIPPLE); + break; + + case NV4097_SET_DEPTH_BOUNDS_TEST_ENABLE: + enable ? glEnable(GL_DEPTH_BOUNDS_TEST_EXT) : glDisable(GL_DEPTH_BOUNDS_TEST_EXT); + break; + + case NV4097_SET_USER_CLIP_PLANE_CONTROL: + u32 clip_plane_0 = enable & 0xf; + u32 clip_plane_1 = (enable >> 4) & 0xf; + u32 clip_plane_2 = (enable >> 8) & 0xf; + u32 clip_plane_3 = (enable >> 12) & 0xf; + u32 clip_plane_4 = (enable >> 16) & 0xf; + u32 clip_plane_5 = enable >> 20; + + clip_plane_0 ? glEnable(GL_CLIP_PLANE0) : glDisable(GL_CLIP_PLANE0); + clip_plane_1 ? glEnable(GL_CLIP_PLANE1) : glDisable(GL_CLIP_PLANE1); + clip_plane_2 ? glEnable(GL_CLIP_PLANE2) : glDisable(GL_CLIP_PLANE2); + clip_plane_3 ? glEnable(GL_CLIP_PLANE3) : glDisable(GL_CLIP_PLANE3); + clip_plane_4 ? glEnable(GL_CLIP_PLANE4) : glDisable(GL_CLIP_PLANE4); + clip_plane_5 ? glEnable(GL_CLIP_PLANE5) : glDisable(GL_CLIP_PLANE5); + break; + } +} + void GLGSRender::ClearColor(u32 a, u32 r, u32 g, u32 b) { glClearColor(r / 255.0f, g / 255.0f, b / 255.0f, a / 255.0f); @@ -1690,40 +1771,6 @@ void GLGSRender::ExecCMD() InitDrawBuffers(); - Enable(m_set_depth_test, GL_DEPTH_TEST); - Enable(m_set_alpha_test, GL_ALPHA_TEST); - Enable(m_set_depth_bounds_test, GL_DEPTH_BOUNDS_TEST_EXT); - Enable(m_set_blend || m_set_blend_mrt1 || m_set_blend_mrt2 || m_set_blend_mrt3, GL_BLEND); - Enable(m_set_scissor_horizontal && m_set_scissor_vertical, GL_SCISSOR_TEST); - Enable(m_set_logic_op, GL_LOGIC_OP); - Enable(m_set_cull_face, GL_CULL_FACE); - Enable(m_set_dither, GL_DITHER); - Enable(m_set_stencil_test, GL_STENCIL_TEST); - Enable(m_set_line_smooth, GL_LINE_SMOOTH); - Enable(m_set_poly_smooth, GL_POLYGON_SMOOTH); - Enable(m_set_point_sprite_control, GL_POINT_SPRITE); - Enable(m_set_specular, GL_LIGHTING); - 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); - Enable(m_set_line_stipple, GL_LINE_STIPPLE); - Enable(m_set_polygon_stipple, GL_POLYGON_STIPPLE); - - if (m_set_clip_plane) - { - Enable(m_clip_plane_0, GL_CLIP_PLANE0); - Enable(m_clip_plane_1, GL_CLIP_PLANE1); - Enable(m_clip_plane_2, GL_CLIP_PLANE2); - Enable(m_clip_plane_3, GL_CLIP_PLANE3); - Enable(m_clip_plane_4, GL_CLIP_PLANE4); - Enable(m_clip_plane_5, GL_CLIP_PLANE5); - - checkForGlError("m_set_clip_plane"); - } - - checkForGlError("glEnable"); - if (m_set_front_polygon_mode) { glPolygonMode(GL_FRONT, m_front_polygon_mode); diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.h b/rpcs3/Emu/RSX/GL/GLGSRender.h index 779f7d27ed..d70ac50f01 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.h +++ b/rpcs3/Emu/RSX/GL/GLGSRender.h @@ -171,7 +171,6 @@ private: void InitVertexData(); void InitFragmentData(); - void Enable(bool enable, const u32 cap); virtual void Close(); bool LoadProgram(); void WriteBuffers(); @@ -191,6 +190,7 @@ protected: virtual void OnExitThread(); virtual void OnReset(); virtual void ExecCMD(); + virtual void Enable(u32 cmd, u32 enable); virtual void ClearColor(u32 a, u32 r, u32 g, u32 b); virtual void ClearStencil(u32 stencil); virtual void ClearDepth(u32 depth); diff --git a/rpcs3/Emu/RSX/Null/NullGSRender.h b/rpcs3/Emu/RSX/Null/NullGSRender.h index 4f37af34f9..1aa24f5862 100644 --- a/rpcs3/Emu/RSX/Null/NullGSRender.h +++ b/rpcs3/Emu/RSX/Null/NullGSRender.h @@ -31,6 +31,10 @@ private: { } + virtual void Enable(u32 cmd, u32 enable) + { + } + virtual void ClearColor(u32 a, u32 r, u32 g, u32 b) { } diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index 83cc338c19..94a38c8962 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -557,7 +557,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const // Alpha testing case NV4097_SET_ALPHA_TEST_ENABLE: { - m_set_alpha_test = ARGS(0) ? true : false; + Enable(cmd, ARGS(0)); } break; @@ -586,7 +586,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const // Cull face case NV4097_SET_CULL_FACE_ENABLE: { - m_set_cull_face = ARGS(0) ? true : false; + Enable(cmd, ARGS(0)); } break; @@ -606,7 +606,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const // Blending case NV4097_SET_BLEND_ENABLE: { - m_set_blend = ARGS(0) ? true : false; + Enable(cmd, ARGS(0)); } break; @@ -680,7 +680,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const // Depth bound testing case NV4097_SET_DEPTH_BOUNDS_TEST_ENABLE: { - m_set_depth_bounds_test = ARGS(0) ? true : false; + Enable(cmd, ARGS(0)); } break; @@ -769,7 +769,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const // Depth testing case NV4097_SET_DEPTH_TEST_ENABLE: { - m_set_depth_test = ARGS(0) ? true : false; + Enable(cmd, ARGS(0)); } break; @@ -804,19 +804,19 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const case NV4097_SET_POLY_OFFSET_FILL_ENABLE: { - m_set_poly_offset_fill = ARGS(0) ? true : false; + Enable(cmd, ARGS(0)); } break; case NV4097_SET_POLY_OFFSET_LINE_ENABLE: { - m_set_poly_offset_line = ARGS(0) ? true : false; + Enable(cmd, ARGS(0)); } break; case NV4097_SET_POLY_OFFSET_POINT_ENABLE: { - m_set_poly_offset_point = ARGS(0) ? true : false; + Enable(cmd, ARGS(0)); } break; @@ -1218,7 +1218,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const // Logic Ops case NV4097_SET_LOGIC_OP_ENABLE: { - m_set_logic_op = ARGS(0) ? true : false; + Enable(cmd, ARGS(0)); } break; @@ -1231,14 +1231,14 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const // Dithering case NV4097_SET_DITHER_ENABLE: { - m_set_dither = ARGS(0) ? true : false; + Enable(cmd, ARGS(0)); } break; // Stencil testing case NV4097_SET_STENCIL_TEST_ENABLE: { - m_set_stencil_test = ARGS(0) ? true : false; + Enable(cmd, ARGS(0)); } break; @@ -1384,7 +1384,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const // Primitive restart index case NV4097_SET_RESTART_INDEX_ENABLE: { - m_set_restart_index = ARGS(0) ? true : false; + Enable(cmd, ARGS(0)); } break; @@ -1415,7 +1415,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const case NV4097_SET_POINT_SPRITE_CONTROL: { - m_set_point_sprite_control = ARGS(0) ? true : false; + Enable(cmd, ARGS(0)); // TODO: //(cmd)[1] = CELL_GCM_ENDIAN_SWAP((enable) | ((rmode) << 1) | (texcoordMask)); @@ -1425,7 +1425,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const // Lighting case NV4097_SET_SPECULAR_ENABLE: { - m_set_specular = ARGS(0) ? true : false; + Enable(cmd, ARGS(0)); } break; @@ -1683,13 +1683,13 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const // Line/Polygon smoothing case NV4097_SET_LINE_SMOOTH_ENABLE: { - m_set_line_smooth = ARGS(0) ? true : false; + Enable(cmd, ARGS(0)); } break; case NV4097_SET_POLY_SMOOTH_ENABLE: { - m_set_poly_smooth = ARGS(0) ? true : false; + Enable(cmd, ARGS(0)); } break; @@ -1705,7 +1705,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const // Line/Polygon stipple case NV4097_SET_LINE_STIPPLE: { - m_set_line_stipple = ARGS(0) ? true : false; + Enable(cmd, ARGS(0)); } break; @@ -1720,7 +1720,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const case NV4097_SET_POLYGON_STIPPLE: { - m_set_polygon_stipple = ARGS(0) ? true : false; + Enable(cmd, ARGS(0)); } break; @@ -1836,14 +1836,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const // Clip Plane case NV4097_SET_USER_CLIP_PLANE_CONTROL: { - const u32 a0 = ARGS(0); - m_set_clip_plane = true; - m_clip_plane_0 = (a0 & 0xf) ? true : false; - m_clip_plane_1 = ((a0 >> 4)) & 0xf ? true : false; - m_clip_plane_2 = ((a0 >> 8)) & 0xf ? true : false; - m_clip_plane_3 = ((a0 >> 12)) & 0xf ? true : false; - m_clip_plane_4 = ((a0 >> 16)) & 0xf ? true : false; - m_clip_plane_5 = (a0 >> 20) ? true : false; + Enable(cmd, ARGS(0)); } break; diff --git a/rpcs3/Emu/RSX/RSXThread.h b/rpcs3/Emu/RSX/RSXThread.h index 3de6308146..a5664a037b 100644 --- a/rpcs3/Emu/RSX/RSXThread.h +++ b/rpcs3/Emu/RSX/RSXThread.h @@ -632,6 +632,7 @@ protected: virtual void OnExitThread() = 0; virtual void OnReset() = 0; virtual void ExecCMD() = 0; + virtual void Enable(u32 cmd, u32 enable) = 0; virtual void ClearColor(u32 a, u32 r, u32 g, u32 b) = 0; virtual void ClearStencil(u32 stencil) = 0; virtual void ClearDepth(u32 depth) = 0;