summaryrefslogtreecommitdiff
path: root/src/video_core/renderer_vulkan
diff options
context:
space:
mode:
authorGravatar Fernando S2023-12-22 17:40:47 +0100
committerGravatar GitHub2023-12-22 17:40:47 +0100
commit373a1ff2cedf416f319e3f0cdc9c97475b1d2aaf (patch)
treed9a2b02919c89c3605e5626a7439caaa9c96fb4b /src/video_core/renderer_vulkan
parentMerge pull request #12432 from liamwhite/float-write (diff)
parentrenderer_vulkan: don't pass null view when nullDescriptor is not supported (diff)
downloadyuzu-373a1ff2cedf416f319e3f0cdc9c97475b1d2aaf.tar.gz
yuzu-373a1ff2cedf416f319e3f0cdc9c97475b1d2aaf.tar.xz
yuzu-373a1ff2cedf416f319e3f0cdc9c97475b1d2aaf.zip
Merge pull request #12410 from liamwhite/more-mali-null
renderer_vulkan: don't pass null view when nullDescriptor is not supported
Diffstat (limited to 'src/video_core/renderer_vulkan')
-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 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
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;
@@ -627,9 +638,12 @@ void BufferCacheRuntime::BindTransformFeedbackBuffers(VideoCommon::HostBindings<
627} 638}
628 639
629void BufferCacheRuntime::ReserveNullBuffer() { 640void BufferCacheRuntime::ReserveNullBuffer() {
630 if (null_buffer) { 641 if (!null_buffer) {
631 return; 642 null_buffer = CreateNullBuffer();
632 } 643 }
644}
645
646vk::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
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;