diff options
| author | 2018-11-26 18:34:09 -0500 | |
|---|---|---|
| committer | 2018-11-26 18:34:09 -0500 | |
| commit | 1856d0ee8a5fbcc1570d5bb073d0e92d74d2a914 (patch) | |
| tree | 7bd759f523dab8055a7c85b8de6d6ec706c2bffb /src | |
| parent | Merge pull request #1723 from degasus/dirty_flags (diff) | |
| parent | Limit the amount of viewports tested for state changes only to the usable ones (diff) | |
| download | yuzu-1856d0ee8a5fbcc1570d5bb073d0e92d74d2a914.tar.gz yuzu-1856d0ee8a5fbcc1570d5bb073d0e92d74d2a914.tar.xz yuzu-1856d0ee8a5fbcc1570d5bb073d0e92d74d2a914.zip | |
Merge pull request #1794 from Tinob/master
Add support for viewport_transfom_enable register
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/engines/maxwell_3d.h | 10 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 30 |
2 files changed, 32 insertions, 8 deletions
diff --git a/src/video_core/engines/maxwell_3d.h b/src/video_core/engines/maxwell_3d.h index e44a23135..9324d9710 100644 --- a/src/video_core/engines/maxwell_3d.h +++ b/src/video_core/engines/maxwell_3d.h | |||
| @@ -896,7 +896,13 @@ public: | |||
| 896 | 896 | ||
| 897 | Cull cull; | 897 | Cull cull; |
| 898 | 898 | ||
| 899 | INSERT_PADDING_WORDS(0x28); | 899 | u32 pixel_center_integer; |
| 900 | |||
| 901 | INSERT_PADDING_WORDS(0x1); | ||
| 902 | |||
| 903 | u32 viewport_transform_enabled; | ||
| 904 | |||
| 905 | INSERT_PADDING_WORDS(0x25); | ||
| 900 | 906 | ||
| 901 | struct { | 907 | struct { |
| 902 | u32 enable; | 908 | u32 enable; |
| @@ -1216,6 +1222,8 @@ ASSERT_REG_POSITION(index_array, 0x5F2); | |||
| 1216 | ASSERT_REG_POSITION(polygon_offset_clamp, 0x61F); | 1222 | ASSERT_REG_POSITION(polygon_offset_clamp, 0x61F); |
| 1217 | ASSERT_REG_POSITION(instanced_arrays, 0x620); | 1223 | ASSERT_REG_POSITION(instanced_arrays, 0x620); |
| 1218 | ASSERT_REG_POSITION(cull, 0x646); | 1224 | ASSERT_REG_POSITION(cull, 0x646); |
| 1225 | ASSERT_REG_POSITION(pixel_center_integer, 0x649); | ||
| 1226 | ASSERT_REG_POSITION(viewport_transform_enabled, 0x64B); | ||
| 1219 | ASSERT_REG_POSITION(logic_op, 0x671); | 1227 | ASSERT_REG_POSITION(logic_op, 0x671); |
| 1220 | ASSERT_REG_POSITION(clear_buffers, 0x674); | 1228 | ASSERT_REG_POSITION(clear_buffers, 0x674); |
| 1221 | ASSERT_REG_POSITION(color_mask, 0x680); | 1229 | ASSERT_REG_POSITION(color_mask, 0x680); |
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 1f9acda36..98fb5a9aa 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp | |||
| @@ -985,13 +985,25 @@ u32 RasterizerOpenGL::SetupTextures(Maxwell::ShaderStage stage, Shader& shader, | |||
| 985 | 985 | ||
| 986 | void RasterizerOpenGL::SyncViewport(OpenGLState& current_state) { | 986 | void RasterizerOpenGL::SyncViewport(OpenGLState& current_state) { |
| 987 | const auto& regs = Core::System::GetInstance().GPU().Maxwell3D().regs; | 987 | const auto& regs = Core::System::GetInstance().GPU().Maxwell3D().regs; |
| 988 | for (std::size_t i = 0; i < Tegra::Engines::Maxwell3D::Regs::NumViewports; i++) { | 988 | const bool geometry_shaders_enabled = |
| 989 | const MathUtil::Rectangle<s32> viewport_rect{regs.viewport_transform[i].GetRect()}; | 989 | regs.IsShaderConfigEnabled(static_cast<size_t>(Maxwell::ShaderProgram::Geometry)); |
| 990 | const std::size_t viewport_count = | ||
| 991 | geometry_shaders_enabled ? Tegra::Engines::Maxwell3D::Regs::NumViewports : 1; | ||
| 992 | for (std::size_t i = 0; i < viewport_count; i++) { | ||
| 990 | auto& viewport = current_state.viewports[i]; | 993 | auto& viewport = current_state.viewports[i]; |
| 991 | viewport.x = viewport_rect.left; | 994 | const auto& src = regs.viewports[i]; |
| 992 | viewport.y = viewport_rect.bottom; | 995 | if (regs.viewport_transform_enabled) { |
| 993 | viewport.width = viewport_rect.GetWidth(); | 996 | const MathUtil::Rectangle<s32> viewport_rect{regs.viewport_transform[i].GetRect()}; |
| 994 | viewport.height = viewport_rect.GetHeight(); | 997 | viewport.x = viewport_rect.left; |
| 998 | viewport.y = viewport_rect.bottom; | ||
| 999 | viewport.width = viewport_rect.GetWidth(); | ||
| 1000 | viewport.height = viewport_rect.GetHeight(); | ||
| 1001 | } else { | ||
| 1002 | viewport.x = src.x; | ||
| 1003 | viewport.y = src.y; | ||
| 1004 | viewport.width = src.width; | ||
| 1005 | viewport.height = src.height; | ||
| 1006 | } | ||
| 995 | viewport.depth_range_far = regs.viewports[i].depth_range_far; | 1007 | viewport.depth_range_far = regs.viewports[i].depth_range_far; |
| 996 | viewport.depth_range_near = regs.viewports[i].depth_range_near; | 1008 | viewport.depth_range_near = regs.viewports[i].depth_range_near; |
| 997 | } | 1009 | } |
| @@ -1165,7 +1177,11 @@ void RasterizerOpenGL::SyncLogicOpState() { | |||
| 1165 | 1177 | ||
| 1166 | void RasterizerOpenGL::SyncScissorTest(OpenGLState& current_state) { | 1178 | void RasterizerOpenGL::SyncScissorTest(OpenGLState& current_state) { |
| 1167 | const auto& regs = Core::System::GetInstance().GPU().Maxwell3D().regs; | 1179 | const auto& regs = Core::System::GetInstance().GPU().Maxwell3D().regs; |
| 1168 | for (std::size_t i = 0; i < Tegra::Engines::Maxwell3D::Regs::NumViewports; i++) { | 1180 | const bool geometry_shaders_enabled = |
| 1181 | regs.IsShaderConfigEnabled(static_cast<size_t>(Maxwell::ShaderProgram::Geometry)); | ||
| 1182 | const std::size_t viewport_count = | ||
| 1183 | geometry_shaders_enabled ? Tegra::Engines::Maxwell3D::Regs::NumViewports : 1; | ||
| 1184 | for (std::size_t i = 0; i < viewport_count; i++) { | ||
| 1169 | const auto& src = regs.scissor_test[i]; | 1185 | const auto& src = regs.scissor_test[i]; |
| 1170 | auto& dst = current_state.viewports[i].scissor; | 1186 | auto& dst = current_state.viewports[i].scissor; |
| 1171 | dst.enabled = (src.enable != 0); | 1187 | dst.enabled = (src.enable != 0); |