diff options
| author | 2018-11-28 17:47:28 -0500 | |
|---|---|---|
| committer | 2018-11-28 17:47:28 -0500 | |
| commit | 5a9a84994a31ab72d2caab752ee2a3d02afc8133 (patch) | |
| tree | 7e832b967ca67d9b3d349b1818c718f3731bfce1 /src | |
| parent | Merge pull request #1786 from Tinob/DepthClamp (diff) | |
| parent | remove viewport_transform_enabled as it seems to be inactive when valid trans... (diff) | |
| download | yuzu-5a9a84994a31ab72d2caab752ee2a3d02afc8133.tar.gz yuzu-5a9a84994a31ab72d2caab752ee2a3d02afc8133.tar.xz yuzu-5a9a84994a31ab72d2caab752ee2a3d02afc8133.zip | |
Merge pull request #1808 from Tinob/master
Fix clip distance and viewport
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/engines/maxwell_3d.h | 16 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 28 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_state.h | 2 |
3 files changed, 31 insertions, 15 deletions
diff --git a/src/video_core/engines/maxwell_3d.h b/src/video_core/engines/maxwell_3d.h index 2e896e5f2..d3b3ed1f0 100644 --- a/src/video_core/engines/maxwell_3d.h +++ b/src/video_core/engines/maxwell_3d.h | |||
| @@ -744,7 +744,20 @@ public: | |||
| 744 | 744 | ||
| 745 | u32 vb_element_base; | 745 | u32 vb_element_base; |
| 746 | 746 | ||
| 747 | INSERT_PADDING_WORDS(0x38); | 747 | INSERT_PADDING_WORDS(0x36); |
| 748 | |||
| 749 | union { | ||
| 750 | BitField<0, 1, u32> c0; | ||
| 751 | BitField<1, 1, u32> c1; | ||
| 752 | BitField<2, 1, u32> c2; | ||
| 753 | BitField<3, 1, u32> c3; | ||
| 754 | BitField<4, 1, u32> c4; | ||
| 755 | BitField<5, 1, u32> c5; | ||
| 756 | BitField<6, 1, u32> c6; | ||
| 757 | BitField<7, 1, u32> c7; | ||
| 758 | } clip_distance_enabled; | ||
| 759 | |||
| 760 | INSERT_PADDING_WORDS(0x1); | ||
| 748 | 761 | ||
| 749 | float point_size; | 762 | float point_size; |
| 750 | 763 | ||
| @@ -1208,6 +1221,7 @@ ASSERT_REG_POSITION(stencil_front_mask, 0x4E7); | |||
| 1208 | ASSERT_REG_POSITION(frag_color_clamp, 0x4EA); | 1221 | ASSERT_REG_POSITION(frag_color_clamp, 0x4EA); |
| 1209 | ASSERT_REG_POSITION(screen_y_control, 0x4EB); | 1222 | ASSERT_REG_POSITION(screen_y_control, 0x4EB); |
| 1210 | ASSERT_REG_POSITION(vb_element_base, 0x50D); | 1223 | ASSERT_REG_POSITION(vb_element_base, 0x50D); |
| 1224 | ASSERT_REG_POSITION(clip_distance_enabled, 0x544); | ||
| 1211 | ASSERT_REG_POSITION(point_size, 0x546); | 1225 | ASSERT_REG_POSITION(point_size, 0x546); |
| 1212 | ASSERT_REG_POSITION(zeta_enable, 0x54E); | 1226 | ASSERT_REG_POSITION(zeta_enable, 0x54E); |
| 1213 | ASSERT_REG_POSITION(multisample_control, 0x54F); | 1227 | ASSERT_REG_POSITION(multisample_control, 0x54F); |
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 5c8fe002b..a44bbfae8 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp | |||
| @@ -642,6 +642,7 @@ void RasterizerOpenGL::DrawArrays() { | |||
| 642 | SyncCullMode(); | 642 | SyncCullMode(); |
| 643 | SyncPrimitiveRestart(); | 643 | SyncPrimitiveRestart(); |
| 644 | SyncScissorTest(state); | 644 | SyncScissorTest(state); |
| 645 | SyncClipEnabled(); | ||
| 645 | // Alpha Testing is synced on shaders. | 646 | // Alpha Testing is synced on shaders. |
| 646 | SyncTransformFeedback(); | 647 | SyncTransformFeedback(); |
| 647 | SyncPointState(); | 648 | SyncPointState(); |
| @@ -1006,18 +1007,11 @@ void RasterizerOpenGL::SyncViewport(OpenGLState& current_state) { | |||
| 1006 | for (std::size_t i = 0; i < viewport_count; i++) { | 1007 | for (std::size_t i = 0; i < viewport_count; i++) { |
| 1007 | auto& viewport = current_state.viewports[i]; | 1008 | auto& viewport = current_state.viewports[i]; |
| 1008 | const auto& src = regs.viewports[i]; | 1009 | const auto& src = regs.viewports[i]; |
| 1009 | if (regs.viewport_transform_enabled) { | 1010 | const MathUtil::Rectangle<s32> viewport_rect{regs.viewport_transform[i].GetRect()}; |
| 1010 | const MathUtil::Rectangle<s32> viewport_rect{regs.viewport_transform[i].GetRect()}; | 1011 | viewport.x = viewport_rect.left; |
| 1011 | viewport.x = viewport_rect.left; | 1012 | viewport.y = viewport_rect.bottom; |
| 1012 | viewport.y = viewport_rect.bottom; | 1013 | viewport.width = viewport_rect.GetWidth(); |
| 1013 | viewport.width = viewport_rect.GetWidth(); | 1014 | viewport.height = viewport_rect.GetHeight(); |
| 1014 | viewport.height = viewport_rect.GetHeight(); | ||
| 1015 | } else { | ||
| 1016 | viewport.x = src.x; | ||
| 1017 | viewport.y = src.y; | ||
| 1018 | viewport.width = src.width; | ||
| 1019 | viewport.height = src.height; | ||
| 1020 | } | ||
| 1021 | viewport.depth_range_far = regs.viewports[i].depth_range_far; | 1015 | viewport.depth_range_far = regs.viewports[i].depth_range_far; |
| 1022 | viewport.depth_range_near = regs.viewports[i].depth_range_near; | 1016 | viewport.depth_range_near = regs.viewports[i].depth_range_near; |
| 1023 | } | 1017 | } |
| @@ -1026,7 +1020,15 @@ void RasterizerOpenGL::SyncViewport(OpenGLState& current_state) { | |||
| 1026 | } | 1020 | } |
| 1027 | 1021 | ||
| 1028 | void RasterizerOpenGL::SyncClipEnabled() { | 1022 | void RasterizerOpenGL::SyncClipEnabled() { |
| 1029 | UNREACHABLE(); | 1023 | const auto& regs = Core::System::GetInstance().GPU().Maxwell3D().regs; |
| 1024 | state.clip_distance[0] = regs.clip_distance_enabled.c0 != 0; | ||
| 1025 | state.clip_distance[1] = regs.clip_distance_enabled.c1 != 0; | ||
| 1026 | state.clip_distance[2] = regs.clip_distance_enabled.c2 != 0; | ||
| 1027 | state.clip_distance[3] = regs.clip_distance_enabled.c3 != 0; | ||
| 1028 | state.clip_distance[4] = regs.clip_distance_enabled.c4 != 0; | ||
| 1029 | state.clip_distance[5] = regs.clip_distance_enabled.c5 != 0; | ||
| 1030 | state.clip_distance[6] = regs.clip_distance_enabled.c6 != 0; | ||
| 1031 | state.clip_distance[7] = regs.clip_distance_enabled.c7 != 0; | ||
| 1030 | } | 1032 | } |
| 1031 | 1033 | ||
| 1032 | void RasterizerOpenGL::SyncClipCoef() { | 1034 | void RasterizerOpenGL::SyncClipCoef() { |
diff --git a/src/video_core/renderer_opengl/gl_state.h b/src/video_core/renderer_opengl/gl_state.h index a486d1654..439bfbc98 100644 --- a/src/video_core/renderer_opengl/gl_state.h +++ b/src/video_core/renderer_opengl/gl_state.h | |||
| @@ -190,7 +190,7 @@ public: | |||
| 190 | GLfloat clamp; | 190 | GLfloat clamp; |
| 191 | } polygon_offset; | 191 | } polygon_offset; |
| 192 | 192 | ||
| 193 | std::array<bool, 2> clip_distance; // GL_CLIP_DISTANCE | 193 | std::array<bool, 8> clip_distance; // GL_CLIP_DISTANCE |
| 194 | 194 | ||
| 195 | OpenGLState(); | 195 | OpenGLState(); |
| 196 | 196 | ||