summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar liamwhite2023-01-05 18:31:55 -0500
committerGravatar GitHub2023-01-05 18:31:55 -0500
commiteaca61e07366023d2a770173b851f034f47c3719 (patch)
treec6b9a78746b16d16bbc92ed3094160c175a7260a
parentMerge pull request #9536 from liamwhite/debug-utils (diff)
parentrenderer_vulkan: implement fallback path for null descriptors (diff)
downloadyuzu-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.cpp11
-rw-r--r--src/video_core/vulkan_common/vulkan_device.cpp3
-rw-r--r--src/video_core/vulkan_common/vulkan_device.h5
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
337void BufferCacheRuntime::CopyBuffer(VkBuffer dst_buffer, VkBuffer src_buffer, 337void 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
396void BufferCacheRuntime::ClearBuffer(VkBuffer dest_buffer, u32 offset, size_t size, u32 value) { 399void 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