summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/video_core/renderer_vulkan/vk_buffer_cache.cpp32
-rw-r--r--src/video_core/renderer_vulkan/vk_buffer_cache.h2
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
81Buffer::Buffer(BufferCacheRuntime&, VideoCommon::NullBufferParams null_params) 81Buffer::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
84Buffer::Buffer(BufferCacheRuntime& runtime, VideoCore::RasterizerInterface& rasterizer_, 91Buffer::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
94VkBufferView Buffer::View(u32 offset, u32 size, VideoCore::Surface::PixelFormat format) { 101VkBufferView 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
624void BufferCacheRuntime::ReserveNullBuffer() { 635void BufferCacheRuntime::ReserveNullBuffer() {
625 if (null_buffer) { 636 if (!null_buffer) {
626 return; 637 null_buffer = CreateNullBuffer();
627 } 638 }
639}
640
641vk::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
68class QuadArrayIndexBuffer; 69class 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;