summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2021-07-09 01:27:47 -0300
committerGravatar ReinUsesLisp2021-07-09 01:27:47 -0300
commit5a45d295da3f614e3a9243eb324b61d94e39c305 (patch)
tree6a4e1503223edfdf92919a78bfff035545b26bac
parentMerge pull request #6563 from ReinUsesLisp/thread-worker (diff)
downloadyuzu-5a45d295da3f614e3a9243eb324b61d94e39c305.tar.gz
yuzu-5a45d295da3f614e3a9243eb324b61d94e39c305.tar.xz
yuzu-5a45d295da3f614e3a9243eb324b61d94e39c305.zip
vk_buffer_cache: Use emulated null buffers for transform feedback
Vulkan does not support null buffers on transform feedback bindings. Emulate these using the same null buffer we were using for index buffers.
Diffstat (limited to '')
-rw-r--r--src/video_core/renderer_vulkan/vk_buffer_cache.cpp24
-rw-r--r--src/video_core/renderer_vulkan/vk_buffer_cache.h6
2 files changed, 19 insertions, 11 deletions
diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp
index 0df4e1a1c..79876dfd0 100644
--- a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp
+++ b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp
@@ -152,8 +152,8 @@ void BufferCacheRuntime::BindIndexBuffer(PrimitiveTopology topology, IndexFormat
152 } 152 }
153 if (vk_buffer == VK_NULL_HANDLE) { 153 if (vk_buffer == VK_NULL_HANDLE) {
154 // Vulkan doesn't support null index buffers. Replace it with our own null buffer. 154 // Vulkan doesn't support null index buffers. Replace it with our own null buffer.
155 ReserveNullIndexBuffer(); 155 ReserveNullBuffer();
156 vk_buffer = *null_index_buffer; 156 vk_buffer = *null_buffer;
157 } 157 }
158 scheduler.Record([vk_buffer, vk_offset, vk_index_type](vk::CommandBuffer cmdbuf) { 158 scheduler.Record([vk_buffer, vk_offset, vk_index_type](vk::CommandBuffer cmdbuf) {
159 cmdbuf.BindIndexBuffer(vk_buffer, vk_offset, vk_index_type); 159 cmdbuf.BindIndexBuffer(vk_buffer, vk_offset, vk_index_type);
@@ -195,6 +195,14 @@ void BufferCacheRuntime::BindTransformFeedbackBuffer(u32 index, VkBuffer buffer,
195 // Already logged in the rasterizer 195 // Already logged in the rasterizer
196 return; 196 return;
197 } 197 }
198 if (buffer == VK_NULL_HANDLE) {
199 // Vulkan doesn't support null transform feedback buffers.
200 // Replace it with our own null buffer.
201 ReserveNullBuffer();
202 buffer = *null_buffer;
203 offset = 0;
204 size = 0;
205 }
198 scheduler.Record([index, buffer, offset, size](vk::CommandBuffer cmdbuf) { 206 scheduler.Record([index, buffer, offset, size](vk::CommandBuffer cmdbuf) {
199 const VkDeviceSize vk_offset = offset; 207 const VkDeviceSize vk_offset = offset;
200 const VkDeviceSize vk_size = size; 208 const VkDeviceSize vk_size = size;
@@ -279,11 +287,11 @@ void BufferCacheRuntime::ReserveQuadArrayLUT(u32 num_indices, bool wait_for_idle
279 }); 287 });
280} 288}
281 289
282void BufferCacheRuntime::ReserveNullIndexBuffer() { 290void BufferCacheRuntime::ReserveNullBuffer() {
283 if (null_index_buffer) { 291 if (null_buffer) {
284 return; 292 return;
285 } 293 }
286 null_index_buffer = device.GetLogical().CreateBuffer(VkBufferCreateInfo{ 294 null_buffer = device.GetLogical().CreateBuffer(VkBufferCreateInfo{
287 .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, 295 .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
288 .pNext = nullptr, 296 .pNext = nullptr,
289 .flags = 0, 297 .flags = 0,
@@ -294,12 +302,12 @@ void BufferCacheRuntime::ReserveNullIndexBuffer() {
294 .pQueueFamilyIndices = nullptr, 302 .pQueueFamilyIndices = nullptr,
295 }); 303 });
296 if (device.HasDebuggingToolAttached()) { 304 if (device.HasDebuggingToolAttached()) {
297 null_index_buffer.SetObjectNameEXT("Null index buffer"); 305 null_buffer.SetObjectNameEXT("Null index buffer");
298 } 306 }
299 null_index_buffer_commit = memory_allocator.Commit(null_index_buffer, MemoryUsage::DeviceLocal); 307 null_buffer_commit = memory_allocator.Commit(null_buffer, MemoryUsage::DeviceLocal);
300 308
301 scheduler.RequestOutsideRenderPassOperationContext(); 309 scheduler.RequestOutsideRenderPassOperationContext();
302 scheduler.Record([buffer = *null_index_buffer](vk::CommandBuffer cmdbuf) { 310 scheduler.Record([buffer = *null_buffer](vk::CommandBuffer cmdbuf) {
303 cmdbuf.FillBuffer(buffer, 0, VK_WHOLE_SIZE, 0); 311 cmdbuf.FillBuffer(buffer, 0, VK_WHOLE_SIZE, 0);
304 }); 312 });
305} 313}
diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.h b/src/video_core/renderer_vulkan/vk_buffer_cache.h
index 982e92191..6ea8448d7 100644
--- a/src/video_core/renderer_vulkan/vk_buffer_cache.h
+++ b/src/video_core/renderer_vulkan/vk_buffer_cache.h
@@ -92,7 +92,7 @@ private:
92 92
93 void ReserveQuadArrayLUT(u32 num_indices, bool wait_for_idle); 93 void ReserveQuadArrayLUT(u32 num_indices, bool wait_for_idle);
94 94
95 void ReserveNullIndexBuffer(); 95 void ReserveNullBuffer();
96 96
97 const Device& device; 97 const Device& device;
98 MemoryAllocator& memory_allocator; 98 MemoryAllocator& memory_allocator;
@@ -105,8 +105,8 @@ private:
105 VkIndexType quad_array_lut_index_type{}; 105 VkIndexType quad_array_lut_index_type{};
106 u32 current_num_indices = 0; 106 u32 current_num_indices = 0;
107 107
108 vk::Buffer null_index_buffer; 108 vk::Buffer null_buffer;
109 MemoryCommit null_index_buffer_commit; 109 MemoryCommit null_buffer_commit;
110 110
111 Uint8Pass uint8_pass; 111 Uint8Pass uint8_pass;
112 QuadIndexedPass quad_index_pass; 112 QuadIndexedPass quad_index_pass;