diff options
Diffstat (limited to 'src/video_core/renderer_vulkan')
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_buffer_cache.cpp | 54 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_buffer_cache.h | 3 |
2 files changed, 56 insertions, 1 deletions
diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp index daa128399..d72d99899 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp | |||
| @@ -7,7 +7,6 @@ | |||
| 7 | #include <span> | 7 | #include <span> |
| 8 | #include <vector> | 8 | #include <vector> |
| 9 | 9 | ||
| 10 | #include "video_core/buffer_cache/buffer_cache.h" | ||
| 11 | #include "video_core/renderer_vulkan/maxwell_to_vk.h" | 10 | #include "video_core/renderer_vulkan/maxwell_to_vk.h" |
| 12 | #include "video_core/renderer_vulkan/vk_buffer_cache.h" | 11 | #include "video_core/renderer_vulkan/vk_buffer_cache.h" |
| 13 | #include "video_core/renderer_vulkan/vk_scheduler.h" | 12 | #include "video_core/renderer_vulkan/vk_scheduler.h" |
| @@ -502,6 +501,40 @@ void BufferCacheRuntime::BindVertexBuffer(u32 index, VkBuffer buffer, u32 offset | |||
| 502 | } | 501 | } |
| 503 | } | 502 | } |
| 504 | 503 | ||
| 504 | void BufferCacheRuntime::BindVertexBuffers(VideoCommon::HostBindings& bindings) { | ||
| 505 | boost::container::small_vector<VkBuffer, 32> buffer_handles; | ||
| 506 | for (u32 index = 0; index < bindings.buffers.size(); index++) { | ||
| 507 | auto& buffer = *reinterpret_cast<Buffer*>(bindings.buffers[index]); | ||
| 508 | auto handle = buffer.Handle(); | ||
| 509 | if (handle == VK_NULL_HANDLE) { | ||
| 510 | bindings.offsets[index] = 0; | ||
| 511 | bindings.sizes[index] = VK_WHOLE_SIZE; | ||
| 512 | if (!device.HasNullDescriptor()) { | ||
| 513 | ReserveNullBuffer(); | ||
| 514 | handle = *null_buffer; | ||
| 515 | } | ||
| 516 | } | ||
| 517 | buffer_handles.push_back(handle); | ||
| 518 | } | ||
| 519 | if (device.IsExtExtendedDynamicStateSupported()) { | ||
| 520 | scheduler.Record([bindings = bindings, | ||
| 521 | buffer_handles = buffer_handles](vk::CommandBuffer cmdbuf) { | ||
| 522 | cmdbuf.BindVertexBuffers2EXT( | ||
| 523 | bindings.min_index, bindings.max_index - bindings.min_index, buffer_handles.data(), | ||
| 524 | reinterpret_cast<const VkDeviceSize*>(bindings.offsets.data()), | ||
| 525 | reinterpret_cast<const VkDeviceSize*>(bindings.sizes.data()), | ||
| 526 | reinterpret_cast<const VkDeviceSize*>(bindings.strides.data())); | ||
| 527 | }); | ||
| 528 | } else { | ||
| 529 | scheduler.Record([bindings = bindings, | ||
| 530 | buffer_handles = buffer_handles](vk::CommandBuffer cmdbuf) { | ||
| 531 | cmdbuf.BindVertexBuffers( | ||
| 532 | bindings.min_index, bindings.max_index - bindings.min_index, buffer_handles.data(), | ||
| 533 | reinterpret_cast<const VkDeviceSize*>(bindings.offsets.data())); | ||
| 534 | }); | ||
| 535 | } | ||
| 536 | } | ||
| 537 | |||
| 505 | void BufferCacheRuntime::BindTransformFeedbackBuffer(u32 index, VkBuffer buffer, u32 offset, | 538 | void BufferCacheRuntime::BindTransformFeedbackBuffer(u32 index, VkBuffer buffer, u32 offset, |
| 506 | u32 size) { | 539 | u32 size) { |
| 507 | if (!device.IsExtTransformFeedbackSupported()) { | 540 | if (!device.IsExtTransformFeedbackSupported()) { |
| @@ -523,6 +556,25 @@ void BufferCacheRuntime::BindTransformFeedbackBuffer(u32 index, VkBuffer buffer, | |||
| 523 | }); | 556 | }); |
| 524 | } | 557 | } |
| 525 | 558 | ||
| 559 | void BufferCacheRuntime::BindTransformFeedbackBuffers(VideoCommon::HostBindings& bindings) { | ||
| 560 | if (!device.IsExtTransformFeedbackSupported()) { | ||
| 561 | // Already logged in the rasterizer | ||
| 562 | return; | ||
| 563 | } | ||
| 564 | boost::container::small_vector<VkBuffer, 4> buffer_handles; | ||
| 565 | for (u32 index = 0; index < bindings.buffers.size(); index++) { | ||
| 566 | auto& buffer = *reinterpret_cast<Buffer*>(bindings.buffers[index]); | ||
| 567 | buffer_handles.push_back(buffer.Handle()); | ||
| 568 | } | ||
| 569 | scheduler.Record( | ||
| 570 | [bindings = bindings, buffer_handles = buffer_handles](vk::CommandBuffer cmdbuf) { | ||
| 571 | cmdbuf.BindTransformFeedbackBuffersEXT( | ||
| 572 | 0, static_cast<u32>(buffer_handles.size()), buffer_handles.data(), | ||
| 573 | reinterpret_cast<const VkDeviceSize*>(bindings.offsets.data()), | ||
| 574 | reinterpret_cast<const VkDeviceSize*>(bindings.sizes.data())); | ||
| 575 | }); | ||
| 576 | } | ||
| 577 | |||
| 526 | void BufferCacheRuntime::ReserveNullBuffer() { | 578 | void BufferCacheRuntime::ReserveNullBuffer() { |
| 527 | if (null_buffer) { | 579 | if (null_buffer) { |
| 528 | return; | 580 | return; |
diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.h b/src/video_core/renderer_vulkan/vk_buffer_cache.h index 92b4f7859..92d3e9f32 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.h +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.h | |||
| @@ -18,6 +18,7 @@ namespace Vulkan { | |||
| 18 | class Device; | 18 | class Device; |
| 19 | class DescriptorPool; | 19 | class DescriptorPool; |
| 20 | class Scheduler; | 20 | class Scheduler; |
| 21 | struct HostVertexBinding; | ||
| 21 | 22 | ||
| 22 | class BufferCacheRuntime; | 23 | class BufferCacheRuntime; |
| 23 | 24 | ||
| @@ -96,8 +97,10 @@ public: | |||
| 96 | void BindQuadIndexBuffer(PrimitiveTopology topology, u32 first, u32 count); | 97 | void BindQuadIndexBuffer(PrimitiveTopology topology, u32 first, u32 count); |
| 97 | 98 | ||
| 98 | void BindVertexBuffer(u32 index, VkBuffer buffer, u32 offset, u32 size, u32 stride); | 99 | void BindVertexBuffer(u32 index, VkBuffer buffer, u32 offset, u32 size, u32 stride); |
| 100 | void BindVertexBuffers(VideoCommon::HostBindings& bindings); | ||
| 99 | 101 | ||
| 100 | void BindTransformFeedbackBuffer(u32 index, VkBuffer buffer, u32 offset, u32 size); | 102 | void BindTransformFeedbackBuffer(u32 index, VkBuffer buffer, u32 offset, u32 size); |
| 103 | void BindTransformFeedbackBuffers(VideoCommon::HostBindings& bindings); | ||
| 101 | 104 | ||
| 102 | std::span<u8> BindMappedUniformBuffer([[maybe_unused]] size_t stage, | 105 | std::span<u8> BindMappedUniformBuffer([[maybe_unused]] size_t stage, |
| 103 | [[maybe_unused]] u32 binding_index, u32 size) { | 106 | [[maybe_unused]] u32 binding_index, u32 size) { |