renderer_vulkan: work around turnip binding bug in a610
This commit is contained in:
		| @@ -563,22 +563,27 @@ void BufferCacheRuntime::BindVertexBuffers(VideoCommon::HostBindings<Buffer>& bi | ||||
|         } | ||||
|         buffer_handles.push_back(handle); | ||||
|     } | ||||
|     const u32 device_max = device.GetMaxVertexInputBindings(); | ||||
|     const u32 min_binding = std::min(bindings.min_index, device_max); | ||||
|     const u32 max_binding = std::min(bindings.max_index, device_max); | ||||
|     const u32 binding_count = max_binding - min_binding; | ||||
|     if (binding_count == 0) { | ||||
|         return; | ||||
|     } | ||||
|     if (device.IsExtExtendedDynamicStateSupported()) { | ||||
|         scheduler.Record([this, bindings_ = std::move(bindings), | ||||
|                           buffer_handles_ = std::move(buffer_handles)](vk::CommandBuffer cmdbuf) { | ||||
|             cmdbuf.BindVertexBuffers2EXT(bindings_.min_index, | ||||
|                                          std::min(bindings_.max_index - bindings_.min_index, | ||||
|                                                   device.GetMaxVertexInputBindings()), | ||||
|                                          buffer_handles_.data(), bindings_.offsets.data(), | ||||
|                                          bindings_.sizes.data(), bindings_.strides.data()); | ||||
|         scheduler.Record([bindings_ = std::move(bindings), | ||||
|                           buffer_handles_ = std::move(buffer_handles), | ||||
|                           binding_count](vk::CommandBuffer cmdbuf) { | ||||
|             cmdbuf.BindVertexBuffers2EXT(bindings_.min_index, binding_count, buffer_handles_.data(), | ||||
|                                          bindings_.offsets.data(), bindings_.sizes.data(), | ||||
|                                          bindings_.strides.data()); | ||||
|         }); | ||||
|     } else { | ||||
|         scheduler.Record([this, bindings_ = std::move(bindings), | ||||
|                           buffer_handles_ = std::move(buffer_handles)](vk::CommandBuffer cmdbuf) { | ||||
|             cmdbuf.BindVertexBuffers(bindings_.min_index, | ||||
|                                      std::min(bindings_.max_index - bindings_.min_index, | ||||
|                                               device.GetMaxVertexInputBindings()), | ||||
|                                      buffer_handles_.data(), bindings_.offsets.data()); | ||||
|         scheduler.Record([bindings_ = std::move(bindings), | ||||
|                           buffer_handles_ = std::move(buffer_handles), | ||||
|                           binding_count](vk::CommandBuffer cmdbuf) { | ||||
|             cmdbuf.BindVertexBuffers(bindings_.min_index, binding_count, buffer_handles_.data(), | ||||
|                                      bindings_.offsets.data()); | ||||
|         }); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -695,6 +695,11 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR | ||||
|             std::min(properties.properties.limits.maxVertexInputBindings, 16U); | ||||
|     } | ||||
|  | ||||
|     if (is_turnip) { | ||||
|         LOG_WARNING(Render_Vulkan, "Turnip requires higher-than-reported binding limits"); | ||||
|         properties.properties.limits.maxVertexInputBindings = 32; | ||||
|     } | ||||
|  | ||||
|     if (!extensions.extended_dynamic_state && extensions.extended_dynamic_state2) { | ||||
|         LOG_INFO(Render_Vulkan, | ||||
|                  "Removing extendedDynamicState2 due to missing extendedDynamicState"); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user