diff options
| author | 2022-02-09 15:00:05 +0100 | |
|---|---|---|
| committer | 2023-01-01 16:43:57 -0500 | |
| commit | a5a94f52ffcbf3119d272a9369021a213ea6dad2 (patch) | |
| tree | ba6d42b142894d0f3f0ac34fb6ce491442bae8fd /src/video_core/renderer_vulkan | |
| parent | Merge pull request #9538 from merryhime/char-concat (diff) | |
| download | yuzu-a5a94f52ffcbf3119d272a9369021a213ea6dad2.tar.gz yuzu-a5a94f52ffcbf3119d272a9369021a213ea6dad2.tar.xz yuzu-a5a94f52ffcbf3119d272a9369021a213ea6dad2.zip | |
MacroHLE: Add MultidrawIndirect HLE Macro.
Diffstat (limited to 'src/video_core/renderer_vulkan')
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.cpp | 57 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.h | 4 |
2 files changed, 47 insertions, 14 deletions
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index ac1eb9895..9b75f33dd 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp | |||
| @@ -180,7 +180,8 @@ RasterizerVulkan::RasterizerVulkan(Core::Frontend::EmuWindow& emu_window_, Tegra | |||
| 180 | 180 | ||
| 181 | RasterizerVulkan::~RasterizerVulkan() = default; | 181 | RasterizerVulkan::~RasterizerVulkan() = default; |
| 182 | 182 | ||
| 183 | void RasterizerVulkan::Draw(bool is_indexed, u32 instance_count) { | 183 | template <typename Func> |
| 184 | void RasterizerVulkan::PrepareDraw(bool is_indexed, Func&& draw_func) { | ||
| 184 | MICROPROFILE_SCOPE(Vulkan_Drawing); | 185 | MICROPROFILE_SCOPE(Vulkan_Drawing); |
| 185 | 186 | ||
| 186 | SCOPE_EXIT({ gpu.TickWork(); }); | 187 | SCOPE_EXIT({ gpu.TickWork(); }); |
| @@ -201,22 +202,50 @@ void RasterizerVulkan::Draw(bool is_indexed, u32 instance_count) { | |||
| 201 | 202 | ||
| 202 | UpdateDynamicStates(); | 203 | UpdateDynamicStates(); |
| 203 | 204 | ||
| 204 | const auto& draw_state = maxwell3d->draw_manager->GetDrawState(); | 205 | draw_func(); |
| 205 | const u32 num_instances{instance_count}; | 206 | |
| 206 | const DrawParams draw_params{MakeDrawParams(draw_state, num_instances, is_indexed)}; | ||
| 207 | scheduler.Record([draw_params](vk::CommandBuffer cmdbuf) { | ||
| 208 | if (draw_params.is_indexed) { | ||
| 209 | cmdbuf.DrawIndexed(draw_params.num_vertices, draw_params.num_instances, | ||
| 210 | draw_params.first_index, draw_params.base_vertex, | ||
| 211 | draw_params.base_instance); | ||
| 212 | } else { | ||
| 213 | cmdbuf.Draw(draw_params.num_vertices, draw_params.num_instances, | ||
| 214 | draw_params.base_vertex, draw_params.base_instance); | ||
| 215 | } | ||
| 216 | }); | ||
| 217 | EndTransformFeedback(); | 207 | EndTransformFeedback(); |
| 218 | } | 208 | } |
| 219 | 209 | ||
| 210 | void RasterizerVulkan::Draw(bool is_indexed, u32 instance_count) { | ||
| 211 | PrepareDraw(is_indexed, [this, is_indexed, instance_count] { | ||
| 212 | const auto& draw_state = maxwell3d->draw_manager->GetDrawState(); | ||
| 213 | const u32 num_instances{instance_count}; | ||
| 214 | const DrawParams draw_params{MakeDrawParams(draw_state, num_instances, is_indexed)}; | ||
| 215 | scheduler.Record([draw_params](vk::CommandBuffer cmdbuf) { | ||
| 216 | if (draw_params.is_indexed) { | ||
| 217 | cmdbuf.DrawIndexed(draw_params.num_vertices, draw_params.num_instances, | ||
| 218 | draw_params.first_index, draw_params.base_vertex, | ||
| 219 | draw_params.base_instance); | ||
| 220 | } else { | ||
| 221 | cmdbuf.Draw(draw_params.num_vertices, draw_params.num_instances, | ||
| 222 | draw_params.base_vertex, draw_params.base_instance); | ||
| 223 | } | ||
| 224 | }); | ||
| 225 | }); | ||
| 226 | } | ||
| 227 | |||
| 228 | void RasterizerVulkan::DrawIndirect(bool is_indexed) { | ||
| 229 | PrepareDraw(is_indexed, [this, is_indexed] { | ||
| 230 | const auto params = maxwell3d->draw_manager->GetIndirectParams(); | ||
| 231 | const auto [buffer, offset] = buffer_cache.ObtainBuffer( | ||
| 232 | params.start_address, static_cast<u32>(params.buffer_size), true, false); | ||
| 233 | scheduler.Record([buffer_obj = buffer->Handle(), offset, | ||
| 234 | max_draw_counts = params.max_draw_counts, stride = params.stride, | ||
| 235 | is_indexed](vk::CommandBuffer cmdbuf) { | ||
| 236 | if (is_indexed) { | ||
| 237 | cmdbuf.DrawIndexedIndirectCount(buffer_obj, offset + 4ULL, buffer_obj, offset, | ||
| 238 | static_cast<u32>(max_draw_counts), | ||
| 239 | static_cast<u32>(stride)); | ||
| 240 | } else { | ||
| 241 | cmdbuf.DrawIndirectCount(buffer_obj, offset + 4ULL, buffer_obj, offset, | ||
| 242 | static_cast<u32>(max_draw_counts), | ||
| 243 | static_cast<u32>(stride)); | ||
| 244 | } | ||
| 245 | }); | ||
| 246 | }); | ||
| 247 | } | ||
| 248 | |||
| 220 | void RasterizerVulkan::Clear(u32 layer_count) { | 249 | void RasterizerVulkan::Clear(u32 layer_count) { |
| 221 | MICROPROFILE_SCOPE(Vulkan_Clearing); | 250 | MICROPROFILE_SCOPE(Vulkan_Clearing); |
| 222 | 251 | ||
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.h b/src/video_core/renderer_vulkan/vk_rasterizer.h index ee483cfd9..bc43a8a1f 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.h +++ b/src/video_core/renderer_vulkan/vk_rasterizer.h | |||
| @@ -65,6 +65,7 @@ public: | |||
| 65 | ~RasterizerVulkan() override; | 65 | ~RasterizerVulkan() override; |
| 66 | 66 | ||
| 67 | void Draw(bool is_indexed, u32 instance_count) override; | 67 | void Draw(bool is_indexed, u32 instance_count) override; |
| 68 | void DrawIndirect(bool is_indexed) override; | ||
| 68 | void Clear(u32 layer_count) override; | 69 | void Clear(u32 layer_count) override; |
| 69 | void DispatchCompute() override; | 70 | void DispatchCompute() override; |
| 70 | void ResetCounter(VideoCore::QueryType type) override; | 71 | void ResetCounter(VideoCore::QueryType type) override; |
| @@ -114,6 +115,9 @@ private: | |||
| 114 | 115 | ||
| 115 | static constexpr VkDeviceSize DEFAULT_BUFFER_SIZE = 4 * sizeof(float); | 116 | static constexpr VkDeviceSize DEFAULT_BUFFER_SIZE = 4 * sizeof(float); |
| 116 | 117 | ||
| 118 | template <typename Func> | ||
| 119 | void PrepareDraw(bool is_indexed, Func&&); | ||
| 120 | |||
| 117 | void FlushWork(); | 121 | void FlushWork(); |
| 118 | 122 | ||
| 119 | void UpdateDynamicStates(); | 123 | void UpdateDynamicStates(); |