diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_buffer_cache.cpp | 39 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_buffer_cache.h | 5 |
2 files changed, 40 insertions, 4 deletions
diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp index 4f1e4ec28..848eedd66 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp | |||
| @@ -140,16 +140,22 @@ void BufferCacheRuntime::BindIndexBuffer(PrimitiveTopology topology, IndexFormat | |||
| 140 | u32 offset, [[maybe_unused]] u32 size) { | 140 | u32 offset, [[maybe_unused]] u32 size) { |
| 141 | VkIndexType vk_index_type = MaxwellToVK::IndexFormat(index_format); | 141 | VkIndexType vk_index_type = MaxwellToVK::IndexFormat(index_format); |
| 142 | VkDeviceSize vk_offset = offset; | 142 | VkDeviceSize vk_offset = offset; |
| 143 | VkBuffer vk_buffer = buffer; | ||
| 143 | if (topology == PrimitiveTopology::Quads) { | 144 | if (topology == PrimitiveTopology::Quads) { |
| 144 | vk_index_type = VK_INDEX_TYPE_UINT32; | 145 | vk_index_type = VK_INDEX_TYPE_UINT32; |
| 145 | std::tie(buffer, vk_offset) = | 146 | std::tie(vk_buffer, vk_offset) = |
| 146 | quad_index_pass.Assemble(index_format, num_indices, base_vertex, buffer, offset); | 147 | quad_index_pass.Assemble(index_format, num_indices, base_vertex, buffer, offset); |
| 147 | } else if (vk_index_type == VK_INDEX_TYPE_UINT8_EXT && !device.IsExtIndexTypeUint8Supported()) { | 148 | } else if (vk_index_type == VK_INDEX_TYPE_UINT8_EXT && !device.IsExtIndexTypeUint8Supported()) { |
| 148 | vk_index_type = VK_INDEX_TYPE_UINT16; | 149 | vk_index_type = VK_INDEX_TYPE_UINT16; |
| 149 | std::tie(buffer, vk_offset) = uint8_pass.Assemble(num_indices, buffer, offset); | 150 | std::tie(vk_buffer, vk_offset) = uint8_pass.Assemble(num_indices, buffer, offset); |
| 150 | } | 151 | } |
| 151 | scheduler.Record([buffer, vk_offset, vk_index_type](vk::CommandBuffer cmdbuf) { | 152 | if (vk_buffer == VK_NULL_HANDLE) { |
| 152 | cmdbuf.BindIndexBuffer(buffer, vk_offset, vk_index_type); | 153 | // Vulkan doesn't support null index buffers. Replace it with our own null buffer. |
| 154 | ReserveNullIndexBuffer(); | ||
| 155 | vk_buffer = *null_index_buffer; | ||
| 156 | } | ||
| 157 | scheduler.Record([vk_buffer, vk_offset, vk_index_type](vk::CommandBuffer cmdbuf) { | ||
| 158 | cmdbuf.BindIndexBuffer(vk_buffer, vk_offset, vk_index_type); | ||
| 153 | }); | 159 | }); |
| 154 | } | 160 | } |
| 155 | 161 | ||
| @@ -276,4 +282,29 @@ void BufferCacheRuntime::ReserveQuadArrayLUT(u32 num_indices, bool wait_for_idle | |||
| 276 | }); | 282 | }); |
| 277 | } | 283 | } |
| 278 | 284 | ||
| 285 | void BufferCacheRuntime::ReserveNullIndexBuffer() { | ||
| 286 | if (null_index_buffer) { | ||
| 287 | return; | ||
| 288 | } | ||
| 289 | null_index_buffer = device.GetLogical().CreateBuffer(VkBufferCreateInfo{ | ||
| 290 | .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, | ||
| 291 | .pNext = nullptr, | ||
| 292 | .flags = 0, | ||
| 293 | .size = 4, | ||
| 294 | .usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, | ||
| 295 | .sharingMode = VK_SHARING_MODE_EXCLUSIVE, | ||
| 296 | .queueFamilyIndexCount = 0, | ||
| 297 | .pQueueFamilyIndices = nullptr, | ||
| 298 | }); | ||
| 299 | if (device.HasDebuggingToolAttached()) { | ||
| 300 | null_index_buffer.SetObjectNameEXT("Null index buffer"); | ||
| 301 | } | ||
| 302 | null_index_buffer_commit = memory_allocator.Commit(null_index_buffer, MemoryUsage::DeviceLocal); | ||
| 303 | |||
| 304 | scheduler.RequestOutsideRenderPassOperationContext(); | ||
| 305 | scheduler.Record([buffer = *null_index_buffer](vk::CommandBuffer cmdbuf) { | ||
| 306 | cmdbuf.FillBuffer(buffer, 0, VK_WHOLE_SIZE, 0); | ||
| 307 | }); | ||
| 308 | } | ||
| 309 | |||
| 279 | } // namespace Vulkan | 310 | } // 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 7ff7e0d55..041e6515c 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.h +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.h | |||
| @@ -90,6 +90,8 @@ private: | |||
| 90 | 90 | ||
| 91 | void ReserveQuadArrayLUT(u32 num_indices, bool wait_for_idle); | 91 | void ReserveQuadArrayLUT(u32 num_indices, bool wait_for_idle); |
| 92 | 92 | ||
| 93 | void ReserveNullIndexBuffer(); | ||
| 94 | |||
| 93 | const Device& device; | 95 | const Device& device; |
| 94 | MemoryAllocator& memory_allocator; | 96 | MemoryAllocator& memory_allocator; |
| 95 | VKScheduler& scheduler; | 97 | VKScheduler& scheduler; |
| @@ -101,6 +103,9 @@ private: | |||
| 101 | VkIndexType quad_array_lut_index_type{}; | 103 | VkIndexType quad_array_lut_index_type{}; |
| 102 | u32 current_num_indices = 0; | 104 | u32 current_num_indices = 0; |
| 103 | 105 | ||
| 106 | vk::Buffer null_index_buffer; | ||
| 107 | MemoryCommit null_index_buffer_commit; | ||
| 108 | |||
| 104 | Uint8Pass uint8_pass; | 109 | Uint8Pass uint8_pass; |
| 105 | QuadIndexedPass quad_index_pass; | 110 | QuadIndexedPass quad_index_pass; |
| 106 | }; | 111 | }; |