summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Liam2023-12-17 15:45:09 -0500
committerGravatar Liam2023-12-17 15:45:09 -0500
commitfba3fa705d70f99aade208e230ad691d0a0b01cf (patch)
tree2df95a38903f61486708a1812049761436fa406d /src
parentMerge pull request #12378 from liamwhite/offsetof (diff)
downloadyuzu-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.cpp31
-rw-r--r--src/video_core/vulkan_common/vulkan_device.cpp5
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");