diff options
-rwxr-xr-x | README.md | 2 | ||||
-rwxr-xr-x | src/video_core/renderer_vulkan/vk_buffer_cache.cpp | 4 | ||||
-rwxr-xr-x | src/video_core/renderer_vulkan/vk_buffer_cache.h | 6 | ||||
-rwxr-xr-x | src/video_core/renderer_vulkan/vk_update_descriptor.cpp | 10 | ||||
-rwxr-xr-x | src/video_core/renderer_vulkan/vk_update_descriptor.h | 28 |
5 files changed, 25 insertions, 25 deletions
@@ -1,7 +1,7 @@ | |||
1 | yuzu emulator early access | 1 | yuzu emulator early access |
2 | ============= | 2 | ============= |
3 | 3 | ||
4 | This is the source code for early-access 1463. | 4 | This is the source code for early-access 1464. |
5 | 5 | ||
6 | ## Legal Notice | 6 | ## Legal Notice |
7 | 7 | ||
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 100755 --- 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 100755 --- 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 100755 --- 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 100755 --- 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 |