summaryrefslogtreecommitdiff
path: root/src/video_core/renderer_vulkan
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2022-02-09 15:00:05 +0100
committerGravatar Fernando Sahmkow2023-01-01 16:43:57 -0500
commita5a94f52ffcbf3119d272a9369021a213ea6dad2 (patch)
treeba6d42b142894d0f3f0ac34fb6ce491442bae8fd /src/video_core/renderer_vulkan
parentMerge pull request #9538 from merryhime/char-concat (diff)
downloadyuzu-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.cpp57
-rw-r--r--src/video_core/renderer_vulkan/vk_rasterizer.h4
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
181RasterizerVulkan::~RasterizerVulkan() = default; 181RasterizerVulkan::~RasterizerVulkan() = default;
182 182
183void RasterizerVulkan::Draw(bool is_indexed, u32 instance_count) { 183template <typename Func>
184void 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
210void 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
228void 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
220void RasterizerVulkan::Clear(u32 layer_count) { 249void 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();