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 5958f52f7..5add59e18 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; |
| @@ -622,9 +633,12 @@ void BufferCacheRuntime::BindTransformFeedbackBuffers(VideoCommon::HostBindings< | |||
| 622 | } | 633 | } |
| 623 | 634 | ||
| 624 | void BufferCacheRuntime::ReserveNullBuffer() { | 635 | void BufferCacheRuntime::ReserveNullBuffer() { |
| 625 | if (null_buffer) { | 636 | if (!null_buffer) { |
| 626 | return; | 637 | null_buffer = CreateNullBuffer(); |
| 627 | } | 638 | } |
| 639 | } | ||
| 640 | |||
| 641 | vk::Buffer BufferCacheRuntime::CreateNullBuffer() { | ||
| 628 | VkBufferCreateInfo create_info{ | 642 | VkBufferCreateInfo create_info{ |
| 629 | .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, | 643 | .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, |
| 630 | .pNext = nullptr, | 644 | .pNext = nullptr, |
| @@ -639,15 +653,17 @@ void BufferCacheRuntime::ReserveNullBuffer() { | |||
| 639 | if (device.IsExtTransformFeedbackSupported()) { | 653 | if (device.IsExtTransformFeedbackSupported()) { |
| 640 | create_info.usage |= VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT; | 654 | create_info.usage |= VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT; |
| 641 | } | 655 | } |
| 642 | null_buffer = memory_allocator.CreateBuffer(create_info, MemoryUsage::DeviceLocal); | 656 | vk::Buffer ret = memory_allocator.CreateBuffer(create_info, MemoryUsage::DeviceLocal); |
| 643 | if (device.HasDebuggingToolAttached()) { | 657 | if (device.HasDebuggingToolAttached()) { |
| 644 | null_buffer.SetObjectNameEXT("Null buffer"); | 658 | ret.SetObjectNameEXT("Null buffer"); |
| 645 | } | 659 | } |
| 646 | 660 | ||
| 647 | scheduler.RequestOutsideRenderPassOperationContext(); | 661 | scheduler.RequestOutsideRenderPassOperationContext(); |
| 648 | scheduler.Record([buffer = *null_buffer](vk::CommandBuffer cmdbuf) { | 662 | scheduler.Record([buffer = *ret](vk::CommandBuffer cmdbuf) { |
| 649 | cmdbuf.FillBuffer(buffer, 0, VK_WHOLE_SIZE, 0); | 663 | cmdbuf.FillBuffer(buffer, 0, VK_WHOLE_SIZE, 0); |
| 650 | }); | 664 | }); |
| 665 | |||
| 666 | return ret; | ||
| 651 | } | 667 | } |
| 652 | 668 | ||
| 653 | } // namespace Vulkan | 669 | } // 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; |