diff options
Diffstat (limited to 'src')
4 files changed, 24 insertions, 24 deletions
diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp index 848eedd66..668633e7b 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp | |||
| @@ -201,10 +201,6 @@ void BufferCacheRuntime::BindTransformFeedbackBuffer(u32 index, VkBuffer buffer, | |||
| 201 | }); | 201 | }); |
| 202 | } | 202 | } |
| 203 | 203 | ||
| 204 | void BufferCacheRuntime::BindBuffer(VkBuffer buffer, u32 offset, u32 size) { | ||
| 205 | update_descriptor_queue.AddBuffer(buffer, offset, size); | ||
| 206 | } | ||
| 207 | |||
| 208 | void BufferCacheRuntime::ReserveQuadArrayLUT(u32 num_indices, bool wait_for_idle) { | 204 | void BufferCacheRuntime::ReserveQuadArrayLUT(u32 num_indices, bool wait_for_idle) { |
| 209 | if (num_indices <= current_num_indices) { | 205 | if (num_indices <= current_num_indices) { |
| 210 | return; | 206 | return; |
diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.h b/src/video_core/renderer_vulkan/vk_buffer_cache.h index 041e6515c..982e92191 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.h +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.h | |||
| @@ -8,6 +8,7 @@ | |||
| 8 | #include "video_core/engines/maxwell_3d.h" | 8 | #include "video_core/engines/maxwell_3d.h" |
| 9 | #include "video_core/renderer_vulkan/vk_compute_pass.h" | 9 | #include "video_core/renderer_vulkan/vk_compute_pass.h" |
| 10 | #include "video_core/renderer_vulkan/vk_staging_buffer_pool.h" | 10 | #include "video_core/renderer_vulkan/vk_staging_buffer_pool.h" |
| 11 | #include "video_core/renderer_vulkan/vk_update_descriptor.h" | ||
| 11 | #include "video_core/vulkan_common/vulkan_memory_allocator.h" | 12 | #include "video_core/vulkan_common/vulkan_memory_allocator.h" |
| 12 | #include "video_core/vulkan_common/vulkan_wrapper.h" | 13 | #include "video_core/vulkan_common/vulkan_wrapper.h" |
| 13 | 14 | ||
| @@ -16,7 +17,6 @@ namespace Vulkan { | |||
| 16 | class Device; | 17 | class Device; |
| 17 | class VKDescriptorPool; | 18 | class VKDescriptorPool; |
| 18 | class VKScheduler; | 19 | class VKScheduler; |
| 19 | class VKUpdateDescriptorQueue; | ||
| 20 | 20 | ||
| 21 | class BufferCacheRuntime; | 21 | class BufferCacheRuntime; |
| 22 | 22 | ||
| @@ -86,7 +86,9 @@ public: | |||
| 86 | } | 86 | } |
| 87 | 87 | ||
| 88 | private: | 88 | private: |
| 89 | void BindBuffer(VkBuffer buffer, u32 offset, u32 size); | 89 | void BindBuffer(VkBuffer buffer, u32 offset, u32 size) { |
| 90 | update_descriptor_queue.AddBuffer(buffer, offset, size); | ||
| 91 | } | ||
| 90 | 92 | ||
| 91 | void ReserveQuadArrayLUT(u32 num_indices, bool wait_for_idle); | 93 | void ReserveQuadArrayLUT(u32 num_indices, bool wait_for_idle); |
| 92 | 94 | ||
diff --git a/src/video_core/renderer_vulkan/vk_update_descriptor.cpp b/src/video_core/renderer_vulkan/vk_update_descriptor.cpp index f99273c6a..dc45fdcb1 100644 --- a/src/video_core/renderer_vulkan/vk_update_descriptor.cpp +++ b/src/video_core/renderer_vulkan/vk_update_descriptor.cpp | |||
| @@ -20,20 +20,20 @@ VKUpdateDescriptorQueue::VKUpdateDescriptorQueue(const Device& device_, VKSchedu | |||
| 20 | VKUpdateDescriptorQueue::~VKUpdateDescriptorQueue() = default; | 20 | VKUpdateDescriptorQueue::~VKUpdateDescriptorQueue() = default; |
| 21 | 21 | ||
| 22 | void VKUpdateDescriptorQueue::TickFrame() { | 22 | void VKUpdateDescriptorQueue::TickFrame() { |
| 23 | payload.clear(); | 23 | payload_cursor = payload.data(); |
| 24 | } | 24 | } |
| 25 | 25 | ||
| 26 | void VKUpdateDescriptorQueue::Acquire() { | 26 | void VKUpdateDescriptorQueue::Acquire() { |
| 27 | // Minimum number of entries required. | 27 | // Minimum number of entries required. |
| 28 | // This is the maximum number of entries a single draw call migth use. | 28 | // This is the maximum number of entries a single draw call migth use. |
| 29 | static constexpr std::size_t MIN_ENTRIES = 0x400; | 29 | static constexpr size_t MIN_ENTRIES = 0x400; |
| 30 | 30 | ||
| 31 | if (payload.size() + MIN_ENTRIES >= payload.max_size()) { | 31 | if (std::distance(payload.data(), payload_cursor) + MIN_ENTRIES >= payload.max_size()) { |
| 32 | LOG_WARNING(Render_Vulkan, "Payload overflow, waiting for worker thread"); | 32 | LOG_WARNING(Render_Vulkan, "Payload overflow, waiting for worker thread"); |
| 33 | scheduler.WaitWorker(); | 33 | scheduler.WaitWorker(); |
| 34 | payload.clear(); | 34 | payload_cursor = payload.data(); |
| 35 | } | 35 | } |
| 36 | upload_start = &*payload.end(); | 36 | upload_start = payload_cursor; |
| 37 | } | 37 | } |
| 38 | 38 | ||
| 39 | void VKUpdateDescriptorQueue::Send(VkDescriptorUpdateTemplateKHR update_template, | 39 | void VKUpdateDescriptorQueue::Send(VkDescriptorUpdateTemplateKHR update_template, |
diff --git a/src/video_core/renderer_vulkan/vk_update_descriptor.h b/src/video_core/renderer_vulkan/vk_update_descriptor.h index e214f7195..d35e77c44 100644 --- a/src/video_core/renderer_vulkan/vk_update_descriptor.h +++ b/src/video_core/renderer_vulkan/vk_update_descriptor.h | |||
| @@ -4,8 +4,7 @@ | |||
| 4 | 4 | ||
| 5 | #pragma once | 5 | #pragma once |
| 6 | 6 | ||
| 7 | #include <variant> | 7 | #include <array> |
| 8 | #include <boost/container/static_vector.hpp> | ||
| 9 | 8 | ||
| 10 | #include "common/common_types.h" | 9 | #include "common/common_types.h" |
| 11 | #include "video_core/vulkan_common/vulkan_wrapper.h" | 10 | #include "video_core/vulkan_common/vulkan_wrapper.h" |
| @@ -16,13 +15,15 @@ class Device; | |||
| 16 | class VKScheduler; | 15 | class VKScheduler; |
| 17 | 16 | ||
| 18 | struct DescriptorUpdateEntry { | 17 | struct DescriptorUpdateEntry { |
| 19 | DescriptorUpdateEntry(VkDescriptorImageInfo image_) : image{image_} {} | 18 | struct Empty {}; |
| 20 | 19 | ||
| 20 | DescriptorUpdateEntry() = default; | ||
| 21 | DescriptorUpdateEntry(VkDescriptorImageInfo image_) : image{image_} {} | ||
| 21 | DescriptorUpdateEntry(VkDescriptorBufferInfo buffer_) : buffer{buffer_} {} | 22 | DescriptorUpdateEntry(VkDescriptorBufferInfo buffer_) : buffer{buffer_} {} |
| 22 | |||
| 23 | DescriptorUpdateEntry(VkBufferView texel_buffer_) : texel_buffer{texel_buffer_} {} | 23 | DescriptorUpdateEntry(VkBufferView texel_buffer_) : texel_buffer{texel_buffer_} {} |
| 24 | 24 | ||
| 25 | union { | 25 | union { |
| 26 | Empty empty{}; | ||
| 26 | VkDescriptorImageInfo image; | 27 | VkDescriptorImageInfo image; |
| 27 | VkDescriptorBufferInfo buffer; | 28 | VkDescriptorBufferInfo buffer; |
| 28 | VkBufferView texel_buffer; | 29 | VkBufferView texel_buffer; |
| @@ -41,39 +42,40 @@ public: | |||
| 41 | void Send(VkDescriptorUpdateTemplateKHR update_template, VkDescriptorSet set); | 42 | void Send(VkDescriptorUpdateTemplateKHR update_template, VkDescriptorSet set); |
| 42 | 43 | ||
| 43 | void AddSampledImage(VkImageView image_view, VkSampler sampler) { | 44 | void AddSampledImage(VkImageView image_view, VkSampler sampler) { |
| 44 | payload.emplace_back(VkDescriptorImageInfo{ | 45 | *(payload_cursor++) = VkDescriptorImageInfo{ |
| 45 | .sampler = sampler, | 46 | .sampler = sampler, |
| 46 | .imageView = image_view, | 47 | .imageView = image_view, |
| 47 | .imageLayout = VK_IMAGE_LAYOUT_GENERAL, | 48 | .imageLayout = VK_IMAGE_LAYOUT_GENERAL, |
| 48 | }); | 49 | }; |
| 49 | } | 50 | } |
| 50 | 51 | ||
| 51 | void AddImage(VkImageView image_view) { | 52 | void AddImage(VkImageView image_view) { |
| 52 | payload.emplace_back(VkDescriptorImageInfo{ | 53 | *(payload_cursor++) = VkDescriptorImageInfo{ |
| 53 | .sampler = VK_NULL_HANDLE, | 54 | .sampler = VK_NULL_HANDLE, |
| 54 | .imageView = image_view, | 55 | .imageView = image_view, |
| 55 | .imageLayout = VK_IMAGE_LAYOUT_GENERAL, | 56 | .imageLayout = VK_IMAGE_LAYOUT_GENERAL, |
| 56 | }); | 57 | }; |
| 57 | } | 58 | } |
| 58 | 59 | ||
| 59 | void AddBuffer(VkBuffer buffer, u64 offset, size_t size) { | 60 | void AddBuffer(VkBuffer buffer, VkDeviceSize offset, VkDeviceSize size) { |
| 60 | payload.emplace_back(VkDescriptorBufferInfo{ | 61 | *(payload_cursor++) = VkDescriptorBufferInfo{ |
| 61 | .buffer = buffer, | 62 | .buffer = buffer, |
| 62 | .offset = offset, | 63 | .offset = offset, |
| 63 | .range = size, | 64 | .range = size, |
| 64 | }); | 65 | }; |
| 65 | } | 66 | } |
| 66 | 67 | ||
| 67 | void AddTexelBuffer(VkBufferView texel_buffer) { | 68 | void AddTexelBuffer(VkBufferView texel_buffer) { |
| 68 | payload.emplace_back(texel_buffer); | 69 | *(payload_cursor++) = texel_buffer; |
| 69 | } | 70 | } |
| 70 | 71 | ||
| 71 | private: | 72 | private: |
| 72 | const Device& device; | 73 | const Device& device; |
| 73 | VKScheduler& scheduler; | 74 | VKScheduler& scheduler; |
| 74 | 75 | ||
| 76 | DescriptorUpdateEntry* payload_cursor = nullptr; | ||
| 75 | const DescriptorUpdateEntry* upload_start = nullptr; | 77 | const DescriptorUpdateEntry* upload_start = nullptr; |
| 76 | boost::container::static_vector<DescriptorUpdateEntry, 0x10000> payload; | 78 | std::array<DescriptorUpdateEntry, 0x10000> payload; |
| 77 | }; | 79 | }; |
| 78 | 80 | ||
| 79 | } // namespace Vulkan | 81 | } // namespace Vulkan |