diff options
| author | 2021-07-09 01:27:47 -0300 | |
|---|---|---|
| committer | 2021-07-09 01:27:47 -0300 | |
| commit | 5a45d295da3f614e3a9243eb324b61d94e39c305 (patch) | |
| tree | 6a4e1503223edfdf92919a78bfff035545b26bac | |
| parent | Merge pull request #6563 from ReinUsesLisp/thread-worker (diff) | |
| download | yuzu-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.
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_buffer_cache.cpp | 24 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_buffer_cache.h | 6 |
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 | ||
| 282 | void BufferCacheRuntime::ReserveNullIndexBuffer() { | 290 | void 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; |