diff options
| author | 2021-06-26 17:46:01 -0300 | |
|---|---|---|
| committer | 2021-07-22 21:51:39 -0400 | |
| commit | fba6bd92d456b4d472ed37e663006fafeef154a9 (patch) | |
| tree | d3b18440b2b0a9483e63ea5c520716291c5f04dc /src/video_core/renderer_vulkan | |
| parent | shader: Fix disabled and unwritten attributes and varyings (diff) | |
| download | yuzu-fba6bd92d456b4d472ed37e663006fafeef154a9.tar.gz yuzu-fba6bd92d456b4d472ed37e663006fafeef154a9.tar.xz yuzu-fba6bd92d456b4d472ed37e663006fafeef154a9.zip | |
vk_rasterizer: Workaround bug in VK_EXT_vertex_input_dynamic_state
Workaround potential bug on Nvidia's driver where only updating high
attributes leaves low attributes out dated.
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/vk_rasterizer.cpp | 31 |
2 files changed, 19 insertions, 14 deletions
diff --git a/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp b/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp index d089da8a4..d70153df3 100644 --- a/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp +++ b/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp | |||
| @@ -128,7 +128,7 @@ void FixedPipelineState::Refresh(Tegra::Engines::Maxwell3D& maxwell3d, | |||
| 128 | const auto& input = regs.vertex_attrib_format[index]; | 128 | const auto& input = regs.vertex_attrib_format[index]; |
| 129 | auto& attribute = attributes[index]; | 129 | auto& attribute = attributes[index]; |
| 130 | attribute.raw = 0; | 130 | attribute.raw = 0; |
| 131 | attribute.enabled.Assign(input.IsConstant() ? 0 : 1); | 131 | attribute.enabled.Assign(input.constant ? 0 : 1); |
| 132 | attribute.buffer.Assign(input.buffer); | 132 | attribute.buffer.Assign(input.buffer); |
| 133 | attribute.offset.Assign(input.offset); | 133 | attribute.offset.Assign(input.offset); |
| 134 | attribute.type.Assign(static_cast<u32>(input.type.Value())); | 134 | attribute.type.Assign(static_cast<u32>(input.type.Value())); |
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index bb7301c53..99576b826 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp | |||
| @@ -801,25 +801,30 @@ void RasterizerVulkan::UpdateVertexInput(Tegra::Engines::Maxwell3D::Regs& regs) | |||
| 801 | boost::container::static_vector<VkVertexInputBindingDescription2EXT, 32> bindings; | 801 | boost::container::static_vector<VkVertexInputBindingDescription2EXT, 32> bindings; |
| 802 | boost::container::static_vector<VkVertexInputAttributeDescription2EXT, 32> attributes; | 802 | boost::container::static_vector<VkVertexInputAttributeDescription2EXT, 32> attributes; |
| 803 | 803 | ||
| 804 | // There seems to be a bug on Nvidia's driver where updating only higher attributes ends up | ||
| 805 | // generating dirty state. Track the highest dirty attribute and update all attributes until | ||
| 806 | // that one. | ||
| 807 | size_t highest_dirty_attr{}; | ||
| 804 | for (size_t index = 0; index < Maxwell::NumVertexAttributes; ++index) { | 808 | for (size_t index = 0; index < Maxwell::NumVertexAttributes; ++index) { |
| 805 | if (!dirty[Dirty::VertexAttribute0 + index]) { | 809 | if (dirty[Dirty::VertexAttribute0 + index]) { |
| 806 | continue; | 810 | highest_dirty_attr = index; |
| 807 | } | 811 | } |
| 812 | } | ||
| 813 | for (size_t index = 0; index < highest_dirty_attr; ++index) { | ||
| 808 | const Maxwell::VertexAttribute attribute{regs.vertex_attrib_format[index]}; | 814 | const Maxwell::VertexAttribute attribute{regs.vertex_attrib_format[index]}; |
| 809 | const u32 binding{attribute.buffer}; | 815 | const u32 binding{attribute.buffer}; |
| 810 | dirty[Dirty::VertexAttribute0 + index] = false; | 816 | dirty[Dirty::VertexAttribute0 + index] = false; |
| 811 | dirty[Dirty::VertexBinding0 + static_cast<size_t>(binding)] = true; | 817 | dirty[Dirty::VertexBinding0 + static_cast<size_t>(binding)] = true; |
| 812 | 818 | if (!attribute.constant) { | |
| 813 | attributes.push_back({ | 819 | attributes.push_back({ |
| 814 | .sType = VK_STRUCTURE_TYPE_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION_2_EXT, | 820 | .sType = VK_STRUCTURE_TYPE_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION_2_EXT, |
| 815 | .pNext = nullptr, | 821 | .pNext = nullptr, |
| 816 | .location = static_cast<u32>(index), | 822 | .location = static_cast<u32>(index), |
| 817 | .binding = binding, | 823 | .binding = binding, |
| 818 | .format = attribute.IsConstant() | 824 | .format = MaxwellToVK::VertexFormat(attribute.type, attribute.size), |
| 819 | ? VK_FORMAT_A8B8G8R8_UNORM_PACK32 | 825 | .offset = attribute.offset, |
| 820 | : MaxwellToVK::VertexFormat(attribute.type, attribute.size), | 826 | }); |
| 821 | .offset = attribute.offset, | 827 | } |
| 822 | }); | ||
| 823 | } | 828 | } |
| 824 | for (size_t index = 0; index < Maxwell::NumVertexAttributes; ++index) { | 829 | for (size_t index = 0; index < Maxwell::NumVertexAttributes; ++index) { |
| 825 | if (!dirty[Dirty::VertexBinding0 + index]) { | 830 | if (!dirty[Dirty::VertexBinding0 + index]) { |