diff options
| author | 2023-12-17 15:45:09 -0500 | |
|---|---|---|
| committer | 2023-12-17 15:45:09 -0500 | |
| commit | fba3fa705d70f99aade208e230ad691d0a0b01cf (patch) | |
| tree | 2df95a38903f61486708a1812049761436fa406d /src | |
| parent | Merge pull request #12378 from liamwhite/offsetof (diff) | |
| download | yuzu-fba3fa705d70f99aade208e230ad691d0a0b01cf.tar.gz yuzu-fba3fa705d70f99aade208e230ad691d0a0b01cf.tar.xz yuzu-fba3fa705d70f99aade208e230ad691d0a0b01cf.zip | |
renderer_vulkan: work around turnip binding bug in a610
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_buffer_cache.cpp | 31 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_device.cpp | 5 |
2 files changed, 23 insertions, 13 deletions
diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp index 5958f52f7..2267069e7 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp | |||
| @@ -563,22 +563,27 @@ void BufferCacheRuntime::BindVertexBuffers(VideoCommon::HostBindings<Buffer>& bi | |||
| 563 | } | 563 | } |
| 564 | buffer_handles.push_back(handle); | 564 | buffer_handles.push_back(handle); |
| 565 | } | 565 | } |
| 566 | const u32 device_max = device.GetMaxVertexInputBindings(); | ||
| 567 | const u32 min_binding = std::min(bindings.min_index, device_max); | ||
| 568 | const u32 max_binding = std::min(bindings.max_index, device_max); | ||
| 569 | const u32 binding_count = max_binding - min_binding; | ||
| 570 | if (binding_count == 0) { | ||
| 571 | return; | ||
| 572 | } | ||
| 566 | if (device.IsExtExtendedDynamicStateSupported()) { | 573 | if (device.IsExtExtendedDynamicStateSupported()) { |
| 567 | scheduler.Record([this, bindings_ = std::move(bindings), | 574 | scheduler.Record([bindings_ = std::move(bindings), |
| 568 | buffer_handles_ = std::move(buffer_handles)](vk::CommandBuffer cmdbuf) { | 575 | buffer_handles_ = std::move(buffer_handles), |
| 569 | cmdbuf.BindVertexBuffers2EXT(bindings_.min_index, | 576 | binding_count](vk::CommandBuffer cmdbuf) { |
| 570 | std::min(bindings_.max_index - bindings_.min_index, | 577 | cmdbuf.BindVertexBuffers2EXT(bindings_.min_index, binding_count, buffer_handles_.data(), |
| 571 | device.GetMaxVertexInputBindings()), | 578 | bindings_.offsets.data(), bindings_.sizes.data(), |
| 572 | buffer_handles_.data(), bindings_.offsets.data(), | 579 | bindings_.strides.data()); |
| 573 | bindings_.sizes.data(), bindings_.strides.data()); | ||
| 574 | }); | 580 | }); |
| 575 | } else { | 581 | } else { |
| 576 | scheduler.Record([this, bindings_ = std::move(bindings), | 582 | scheduler.Record([bindings_ = std::move(bindings), |
| 577 | buffer_handles_ = std::move(buffer_handles)](vk::CommandBuffer cmdbuf) { | 583 | buffer_handles_ = std::move(buffer_handles), |
| 578 | cmdbuf.BindVertexBuffers(bindings_.min_index, | 584 | binding_count](vk::CommandBuffer cmdbuf) { |
| 579 | std::min(bindings_.max_index - bindings_.min_index, | 585 | cmdbuf.BindVertexBuffers(bindings_.min_index, binding_count, buffer_handles_.data(), |
| 580 | device.GetMaxVertexInputBindings()), | 586 | bindings_.offsets.data()); |
| 581 | buffer_handles_.data(), bindings_.offsets.data()); | ||
| 582 | }); | 587 | }); |
| 583 | } | 588 | } |
| 584 | } | 589 | } |
diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index 1fda0042d..a6fbca69e 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp | |||
| @@ -695,6 +695,11 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR | |||
| 695 | std::min(properties.properties.limits.maxVertexInputBindings, 16U); | 695 | std::min(properties.properties.limits.maxVertexInputBindings, 16U); |
| 696 | } | 696 | } |
| 697 | 697 | ||
| 698 | if (is_turnip) { | ||
| 699 | LOG_WARNING(Render_Vulkan, "Turnip requires higher-than-reported binding limits"); | ||
| 700 | properties.properties.limits.maxVertexInputBindings = 32; | ||
| 701 | } | ||
| 702 | |||
| 698 | if (!extensions.extended_dynamic_state && extensions.extended_dynamic_state2) { | 703 | if (!extensions.extended_dynamic_state && extensions.extended_dynamic_state2) { |
| 699 | LOG_INFO(Render_Vulkan, | 704 | LOG_INFO(Render_Vulkan, |
| 700 | "Removing extendedDynamicState2 due to missing extendedDynamicState"); | 705 | "Removing extendedDynamicState2 due to missing extendedDynamicState"); |