diff options
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_buffer_cache.cpp | 32 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_buffer_cache.h | 2 |
2 files changed, 26 insertions, 8 deletions
diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp index 2267069e7..3c61799fa 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp | |||
| @@ -78,8 +78,15 @@ vk::Buffer CreateBuffer(const Device& device, const MemoryAllocator& memory_allo | |||
| 78 | } | 78 | } |
| 79 | } // Anonymous namespace | 79 | } // Anonymous namespace |
| 80 | 80 | ||
| 81 | Buffer::Buffer(BufferCacheRuntime&, VideoCommon::NullBufferParams null_params) | 81 | Buffer::Buffer(BufferCacheRuntime& runtime, VideoCommon::NullBufferParams null_params) |
| 82 | : VideoCommon::BufferBase<VideoCore::RasterizerInterface>(null_params), tracker{4096} {} | 82 | : VideoCommon::BufferBase<VideoCore::RasterizerInterface>(null_params), tracker{4096} { |
| 83 | if (runtime.device.HasNullDescriptor()) { | ||
| 84 | return; | ||
| 85 | } | ||
| 86 | device = &runtime.device; | ||
| 87 | buffer = runtime.CreateNullBuffer(); | ||
| 88 | is_null = true; | ||
| 89 | } | ||
| 83 | 90 | ||
| 84 | Buffer::Buffer(BufferCacheRuntime& runtime, VideoCore::RasterizerInterface& rasterizer_, | 91 | Buffer::Buffer(BufferCacheRuntime& runtime, VideoCore::RasterizerInterface& rasterizer_, |
| 85 | VAddr cpu_addr_, u64 size_bytes_) | 92 | VAddr cpu_addr_, u64 size_bytes_) |
| @@ -93,8 +100,12 @@ Buffer::Buffer(BufferCacheRuntime& runtime, VideoCore::RasterizerInterface& rast | |||
| 93 | 100 | ||
| 94 | VkBufferView Buffer::View(u32 offset, u32 size, VideoCore::Surface::PixelFormat format) { | 101 | VkBufferView Buffer::View(u32 offset, u32 size, VideoCore::Surface::PixelFormat format) { |
| 95 | if (!device) { | 102 | if (!device) { |
| 96 | // Null buffer, return a null descriptor | 103 | // Null buffer supported, return a null descriptor |
| 97 | return VK_NULL_HANDLE; | 104 | return VK_NULL_HANDLE; |
| 105 | } else if (is_null) { | ||
| 106 | // Null buffer not supported, adjust offset and size | ||
| 107 | offset = 0; | ||
| 108 | size = 0; | ||
| 98 | } | 109 | } |
| 99 | const auto it{std::ranges::find_if(views, [offset, size, format](const BufferView& view) { | 110 | const auto it{std::ranges::find_if(views, [offset, size, format](const BufferView& view) { |
| 100 | return offset == view.offset && size == view.size && format == view.format; | 111 | return offset == view.offset && size == view.size && format == view.format; |
| @@ -627,9 +638,12 @@ void BufferCacheRuntime::BindTransformFeedbackBuffers(VideoCommon::HostBindings< | |||
| 627 | } | 638 | } |
| 628 | 639 | ||
| 629 | void BufferCacheRuntime::ReserveNullBuffer() { | 640 | void BufferCacheRuntime::ReserveNullBuffer() { |
| 630 | if (null_buffer) { | 641 | if (!null_buffer) { |
| 631 | return; | 642 | null_buffer = CreateNullBuffer(); |
| 632 | } | 643 | } |
| 644 | } | ||
| 645 | |||
| 646 | vk::Buffer BufferCacheRuntime::CreateNullBuffer() { | ||
| 633 | VkBufferCreateInfo create_info{ | 647 | VkBufferCreateInfo create_info{ |
| 634 | .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, | 648 | .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, |
| 635 | .pNext = nullptr, | 649 | .pNext = nullptr, |
| @@ -644,15 +658,17 @@ void BufferCacheRuntime::ReserveNullBuffer() { | |||
| 644 | if (device.IsExtTransformFeedbackSupported()) { | 658 | if (device.IsExtTransformFeedbackSupported()) { |
| 645 | create_info.usage |= VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT; | 659 | create_info.usage |= VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT; |
| 646 | } | 660 | } |
| 647 | null_buffer = memory_allocator.CreateBuffer(create_info, MemoryUsage::DeviceLocal); | 661 | vk::Buffer ret = memory_allocator.CreateBuffer(create_info, MemoryUsage::DeviceLocal); |
| 648 | if (device.HasDebuggingToolAttached()) { | 662 | if (device.HasDebuggingToolAttached()) { |
| 649 | null_buffer.SetObjectNameEXT("Null buffer"); | 663 | ret.SetObjectNameEXT("Null buffer"); |
| 650 | } | 664 | } |
| 651 | 665 | ||
| 652 | scheduler.RequestOutsideRenderPassOperationContext(); | 666 | scheduler.RequestOutsideRenderPassOperationContext(); |
| 653 | scheduler.Record([buffer = *null_buffer](vk::CommandBuffer cmdbuf) { | 667 | scheduler.Record([buffer = *ret](vk::CommandBuffer cmdbuf) { |
| 654 | cmdbuf.FillBuffer(buffer, 0, VK_WHOLE_SIZE, 0); | 668 | cmdbuf.FillBuffer(buffer, 0, VK_WHOLE_SIZE, 0); |
| 655 | }); | 669 | }); |
| 670 | |||
| 671 | return ret; | ||
| 656 | } | 672 | } |
| 657 | 673 | ||
| 658 | } // namespace Vulkan | 674 | } // namespace Vulkan |
diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.h b/src/video_core/renderer_vulkan/vk_buffer_cache.h index 0b3fbd6d0..dc300d7cb 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.h +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.h | |||
| @@ -63,6 +63,7 @@ private: | |||
| 63 | vk::Buffer buffer; | 63 | vk::Buffer buffer; |
| 64 | std::vector<BufferView> views; | 64 | std::vector<BufferView> views; |
| 65 | VideoCommon::UsageTracker tracker; | 65 | VideoCommon::UsageTracker tracker; |
| 66 | bool is_null{}; | ||
| 66 | }; | 67 | }; |
| 67 | 68 | ||
| 68 | class QuadArrayIndexBuffer; | 69 | class QuadArrayIndexBuffer; |
| @@ -151,6 +152,7 @@ private: | |||
| 151 | } | 152 | } |
| 152 | 153 | ||
| 153 | void ReserveNullBuffer(); | 154 | void ReserveNullBuffer(); |
| 155 | vk::Buffer CreateNullBuffer(); | ||
| 154 | 156 | ||
| 155 | const Device& device; | 157 | const Device& device; |
| 156 | MemoryAllocator& memory_allocator; | 158 | MemoryAllocator& memory_allocator; |