diff options
| author | 2020-04-27 20:50:14 -0300 | |
|---|---|---|
| committer | 2020-04-27 20:50:14 -0300 | |
| commit | bb1ed66d9992883f9657bf2757bd40e70a707e8d (patch) | |
| tree | 250d750cc3c28ea8029caf5535c51b9e1ca94534 /src/video_core/renderer_vulkan | |
| parent | Merge pull request #3766 from ReinUsesLisp/renderpass-cache-key (diff) | |
| download | yuzu-bb1ed66d9992883f9657bf2757bd40e70a707e8d.tar.gz yuzu-bb1ed66d9992883f9657bf2757bd40e70a707e8d.tar.xz yuzu-bb1ed66d9992883f9657bf2757bd40e70a707e8d.zip | |
maxwell_3d: Fix depth clamping register
Using deko3d as reference:
https://github.com/devkitPro/deko3d/blob/4e47ba0013552e592a86ab7a2510d1e7dadf236a/source/maxwell/gpu_3d_state.cpp#L42
We were using bits 3 and 4 to determine depth clamping, but these are
the same both enabled and disabled:
state->depthClampEnable ? 0x101A : 0x181D
The same happens on Nvidia's OpenGL driver, where they do something like
this (default capabilities, GL 4.5 compatibility):
(state & DEPTH_CLAMP) != 0 ? 0x201a : 0x281c
There's always a difference between the first bits in this register, but
bit 11 is consistently disabled on both deko3d/NVN and OpenGL. This
commit changes yuzu's behaviour to use bit 11 to determine depth
clamping.
- Fixes depth issues on Super Mario Odyssey's intro.
Diffstat (limited to 'src/video_core/renderer_vulkan')
| -rw-r--r-- | src/video_core/renderer_vulkan/fixed_pipeline_state.cpp | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/fixed_pipeline_state.h | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp | 2 |
3 files changed, 3 insertions, 3 deletions
diff --git a/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp b/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp index a7f256ff9..648b1e71b 100644 --- a/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp +++ b/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp | |||
| @@ -81,7 +81,7 @@ void FixedPipelineState::Rasterizer::Fill(const Maxwell& regs) noexcept { | |||
| 81 | primitive_restart_enable.Assign(regs.primitive_restart.enabled != 0 ? 1 : 0); | 81 | primitive_restart_enable.Assign(regs.primitive_restart.enabled != 0 ? 1 : 0); |
| 82 | cull_enable.Assign(regs.cull_test_enabled != 0 ? 1 : 0); | 82 | cull_enable.Assign(regs.cull_test_enabled != 0 ? 1 : 0); |
| 83 | depth_bias_enable.Assign(enabled_lut[POLYGON_OFFSET_ENABLE_LUT[topology_index]] != 0 ? 1 : 0); | 83 | depth_bias_enable.Assign(enabled_lut[POLYGON_OFFSET_ENABLE_LUT[topology_index]] != 0 ? 1 : 0); |
| 84 | depth_clamp_enable.Assign(clip.depth_clamp_near == 1 || clip.depth_clamp_far == 1 ? 1 : 0); | 84 | depth_clamp_disabled.Assign(regs.view_volume_clip_control.depth_clamp_disabled.Value()); |
| 85 | ndc_minus_one_to_one.Assign(regs.depth_mode == Maxwell::DepthMode::MinusOneToOne ? 1 : 0); | 85 | ndc_minus_one_to_one.Assign(regs.depth_mode == Maxwell::DepthMode::MinusOneToOne ? 1 : 0); |
| 86 | cull_face.Assign(PackCullFace(regs.cull_face)); | 86 | cull_face.Assign(PackCullFace(regs.cull_face)); |
| 87 | front_face.Assign(packed_front_face); | 87 | front_face.Assign(packed_front_face); |
diff --git a/src/video_core/renderer_vulkan/fixed_pipeline_state.h b/src/video_core/renderer_vulkan/fixed_pipeline_state.h index 77188b862..8652067a7 100644 --- a/src/video_core/renderer_vulkan/fixed_pipeline_state.h +++ b/src/video_core/renderer_vulkan/fixed_pipeline_state.h | |||
| @@ -153,7 +153,7 @@ struct FixedPipelineState { | |||
| 153 | BitField<4, 1, u32> primitive_restart_enable; | 153 | BitField<4, 1, u32> primitive_restart_enable; |
| 154 | BitField<5, 1, u32> cull_enable; | 154 | BitField<5, 1, u32> cull_enable; |
| 155 | BitField<6, 1, u32> depth_bias_enable; | 155 | BitField<6, 1, u32> depth_bias_enable; |
| 156 | BitField<7, 1, u32> depth_clamp_enable; | 156 | BitField<7, 1, u32> depth_clamp_disabled; |
| 157 | BitField<8, 1, u32> ndc_minus_one_to_one; | 157 | BitField<8, 1, u32> ndc_minus_one_to_one; |
| 158 | BitField<9, 2, u32> cull_face; | 158 | BitField<9, 2, u32> cull_face; |
| 159 | BitField<11, 1, u32> front_face; | 159 | BitField<11, 1, u32> front_face; |
diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp index 45bd1fc6c..852a17a70 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp | |||
| @@ -249,7 +249,7 @@ vk::Pipeline VKGraphicsPipeline::CreatePipeline(const RenderPassParams& renderpa | |||
| 249 | rasterization_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; | 249 | rasterization_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; |
| 250 | rasterization_ci.pNext = nullptr; | 250 | rasterization_ci.pNext = nullptr; |
| 251 | rasterization_ci.flags = 0; | 251 | rasterization_ci.flags = 0; |
| 252 | rasterization_ci.depthClampEnable = rs.depth_clamp_enable; | 252 | rasterization_ci.depthClampEnable = rs.depth_clamp_disabled == 0 ? VK_TRUE : VK_FALSE; |
| 253 | rasterization_ci.rasterizerDiscardEnable = VK_FALSE; | 253 | rasterization_ci.rasterizerDiscardEnable = VK_FALSE; |
| 254 | rasterization_ci.polygonMode = VK_POLYGON_MODE_FILL; | 254 | rasterization_ci.polygonMode = VK_POLYGON_MODE_FILL; |
| 255 | rasterization_ci.cullMode = | 255 | rasterization_ci.cullMode = |