diff options
| author | 2023-01-05 18:31:55 -0500 | |
|---|---|---|
| committer | 2023-01-05 18:31:55 -0500 | |
| commit | eaca61e07366023d2a770173b851f034f47c3719 (patch) | |
| tree | c6b9a78746b16d16bbc92ed3094160c175a7260a | |
| parent | Merge pull request #9536 from liamwhite/debug-utils (diff) | |
| parent | renderer_vulkan: implement fallback path for null descriptors (diff) | |
| download | yuzu-eaca61e07366023d2a770173b851f034f47c3719.tar.gz yuzu-eaca61e07366023d2a770173b851f034f47c3719.tar.xz yuzu-eaca61e07366023d2a770173b851f034f47c3719.zip | |
Merge pull request #9528 from liamwhite/mvk-nulldesc
renderer_vulkan: implement fallback path for null buffer descriptors
Diffstat (limited to '')
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_buffer_cache.cpp | 11 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_device.cpp | 3 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_device.h | 5 |
3 files changed, 19 insertions, 0 deletions
diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp index 487d8b416..b0153a502 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp | |||
| @@ -336,6 +336,9 @@ void BufferCacheRuntime::Finish() { | |||
| 336 | 336 | ||
| 337 | void BufferCacheRuntime::CopyBuffer(VkBuffer dst_buffer, VkBuffer src_buffer, | 337 | void BufferCacheRuntime::CopyBuffer(VkBuffer dst_buffer, VkBuffer src_buffer, |
| 338 | std::span<const VideoCommon::BufferCopy> copies, bool barrier) { | 338 | std::span<const VideoCommon::BufferCopy> copies, bool barrier) { |
| 339 | if (dst_buffer == VK_NULL_HANDLE || src_buffer == VK_NULL_HANDLE) { | ||
| 340 | return; | ||
| 341 | } | ||
| 339 | static constexpr VkMemoryBarrier READ_BARRIER{ | 342 | static constexpr VkMemoryBarrier READ_BARRIER{ |
| 340 | .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER, | 343 | .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER, |
| 341 | .pNext = nullptr, | 344 | .pNext = nullptr, |
| @@ -394,6 +397,9 @@ void BufferCacheRuntime::PostCopyBarrier() { | |||
| 394 | } | 397 | } |
| 395 | 398 | ||
| 396 | void BufferCacheRuntime::ClearBuffer(VkBuffer dest_buffer, u32 offset, size_t size, u32 value) { | 399 | void BufferCacheRuntime::ClearBuffer(VkBuffer dest_buffer, u32 offset, size_t size, u32 value) { |
| 400 | if (dest_buffer == VK_NULL_HANDLE) { | ||
| 401 | return; | ||
| 402 | } | ||
| 397 | static constexpr VkMemoryBarrier READ_BARRIER{ | 403 | static constexpr VkMemoryBarrier READ_BARRIER{ |
| 398 | .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER, | 404 | .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER, |
| 399 | .pNext = nullptr, | 405 | .pNext = nullptr, |
| @@ -473,6 +479,11 @@ void BufferCacheRuntime::BindVertexBuffer(u32 index, VkBuffer buffer, u32 offset | |||
| 473 | cmdbuf.BindVertexBuffers2EXT(index, 1, &buffer, &vk_offset, &vk_size, &vk_stride); | 479 | cmdbuf.BindVertexBuffers2EXT(index, 1, &buffer, &vk_offset, &vk_size, &vk_stride); |
| 474 | }); | 480 | }); |
| 475 | } else { | 481 | } else { |
| 482 | if (!device.HasNullDescriptor() && buffer == VK_NULL_HANDLE) { | ||
| 483 | ReserveNullBuffer(); | ||
| 484 | buffer = *null_buffer; | ||
| 485 | offset = 0; | ||
| 486 | } | ||
| 476 | scheduler.Record([index, buffer, offset](vk::CommandBuffer cmdbuf) { | 487 | scheduler.Record([index, buffer, offset](vk::CommandBuffer cmdbuf) { |
| 477 | cmdbuf.BindVertexBuffer(index, buffer, offset); | 488 | cmdbuf.BindVertexBuffer(index, buffer, offset); |
| 478 | }); | 489 | }); |
diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index 5c5bfa18d..8e77f5aa3 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp | |||
| @@ -1487,6 +1487,9 @@ std::vector<const char*> Device::LoadExtensions(bool requires_surface) { | |||
| 1487 | 1487 | ||
| 1488 | max_push_descriptors = push_descriptor.maxPushDescriptors; | 1488 | max_push_descriptors = push_descriptor.maxPushDescriptors; |
| 1489 | } | 1489 | } |
| 1490 | |||
| 1491 | has_null_descriptor = true; | ||
| 1492 | |||
| 1490 | return extensions; | 1493 | return extensions; |
| 1491 | } | 1494 | } |
| 1492 | 1495 | ||
diff --git a/src/video_core/vulkan_common/vulkan_device.h b/src/video_core/vulkan_common/vulkan_device.h index 920a8f4e3..6042046e1 100644 --- a/src/video_core/vulkan_common/vulkan_device.h +++ b/src/video_core/vulkan_common/vulkan_device.h | |||
| @@ -397,6 +397,10 @@ public: | |||
| 397 | return must_emulate_bgr565; | 397 | return must_emulate_bgr565; |
| 398 | } | 398 | } |
| 399 | 399 | ||
| 400 | bool HasNullDescriptor() const { | ||
| 401 | return has_null_descriptor; | ||
| 402 | } | ||
| 403 | |||
| 400 | u32 GetMaxVertexInputAttributes() const { | 404 | u32 GetMaxVertexInputAttributes() const { |
| 401 | return max_vertex_input_attributes; | 405 | return max_vertex_input_attributes; |
| 402 | } | 406 | } |
| @@ -511,6 +515,7 @@ private: | |||
| 511 | bool supports_d24_depth{}; ///< Supports D24 depth buffers. | 515 | bool supports_d24_depth{}; ///< Supports D24 depth buffers. |
| 512 | bool cant_blit_msaa{}; ///< Does not support MSAA<->MSAA blitting. | 516 | bool cant_blit_msaa{}; ///< Does not support MSAA<->MSAA blitting. |
| 513 | bool must_emulate_bgr565{}; ///< Emulates BGR565 by swizzling RGB565 format. | 517 | bool must_emulate_bgr565{}; ///< Emulates BGR565 by swizzling RGB565 format. |
| 518 | bool has_null_descriptor{}; ///< Has support for null descriptors. | ||
| 514 | u32 max_vertex_input_attributes{}; ///< Max vertex input attributes in pipeline | 519 | u32 max_vertex_input_attributes{}; ///< Max vertex input attributes in pipeline |
| 515 | u32 max_vertex_input_bindings{}; ///< Max vertex input buffers in pipeline | 520 | u32 max_vertex_input_bindings{}; ///< Max vertex input buffers in pipeline |
| 516 | 521 | ||