diff options
| author | 2023-08-04 03:33:04 +0200 | |
|---|---|---|
| committer | 2023-09-23 23:05:29 +0200 | |
| commit | 57401589c2e94d49b03fd68ae0ad5b2e36aac795 (patch) | |
| tree | 5ce446785bbcc09bb956be65c066c8aa54342297 /src/video_core/macro | |
| parent | Query Cachge: Fully rework Vulkan's query cache (diff) | |
| download | yuzu-57401589c2e94d49b03fd68ae0ad5b2e36aac795.tar.gz yuzu-57401589c2e94d49b03fd68ae0ad5b2e36aac795.tar.xz yuzu-57401589c2e94d49b03fd68ae0ad5b2e36aac795.zip | |
Macro HLE: Add DrawIndirectByteCount
Diffstat (limited to 'src/video_core/macro')
| -rw-r--r-- | src/video_core/macro/macro_hle.cpp | 35 |
1 files changed, 30 insertions, 5 deletions
diff --git a/src/video_core/macro/macro_hle.cpp b/src/video_core/macro/macro_hle.cpp index e980af171..046c8085e 100644 --- a/src/video_core/macro/macro_hle.cpp +++ b/src/video_core/macro/macro_hle.cpp | |||
| @@ -67,6 +67,7 @@ public: | |||
| 67 | } | 67 | } |
| 68 | 68 | ||
| 69 | auto& params = maxwell3d.draw_manager->GetIndirectParams(); | 69 | auto& params = maxwell3d.draw_manager->GetIndirectParams(); |
| 70 | params.is_byte_count = false; | ||
| 70 | params.is_indexed = false; | 71 | params.is_indexed = false; |
| 71 | params.include_count = false; | 72 | params.include_count = false; |
| 72 | params.count_start_address = 0; | 73 | params.count_start_address = 0; |
| @@ -161,6 +162,7 @@ public: | |||
| 161 | 0, 0x644, Maxwell3D::HLEReplacementAttributeType::BaseInstance); | 162 | 0, 0x644, Maxwell3D::HLEReplacementAttributeType::BaseInstance); |
| 162 | } | 163 | } |
| 163 | auto& params = maxwell3d.draw_manager->GetIndirectParams(); | 164 | auto& params = maxwell3d.draw_manager->GetIndirectParams(); |
| 165 | params.is_byte_count = false; | ||
| 164 | params.is_indexed = true; | 166 | params.is_indexed = true; |
| 165 | params.include_count = false; | 167 | params.include_count = false; |
| 166 | params.count_start_address = 0; | 168 | params.count_start_address = 0; |
| @@ -256,6 +258,7 @@ public: | |||
| 256 | const u32 estimate = static_cast<u32>(maxwell3d.EstimateIndexBufferSize()); | 258 | const u32 estimate = static_cast<u32>(maxwell3d.EstimateIndexBufferSize()); |
| 257 | maxwell3d.dirty.flags[VideoCommon::Dirty::IndexBuffer] = true; | 259 | maxwell3d.dirty.flags[VideoCommon::Dirty::IndexBuffer] = true; |
| 258 | auto& params = maxwell3d.draw_manager->GetIndirectParams(); | 260 | auto& params = maxwell3d.draw_manager->GetIndirectParams(); |
| 261 | params.is_byte_count = false; | ||
| 259 | params.is_indexed = true; | 262 | params.is_indexed = true; |
| 260 | params.include_count = true; | 263 | params.include_count = true; |
| 261 | params.count_start_address = maxwell3d.GetMacroAddress(4); | 264 | params.count_start_address = maxwell3d.GetMacroAddress(4); |
| @@ -324,17 +327,39 @@ public: | |||
| 324 | explicit HLE_DrawIndirectByteCount(Maxwell3D& maxwell3d_) : HLEMacroImpl(maxwell3d_) {} | 327 | explicit HLE_DrawIndirectByteCount(Maxwell3D& maxwell3d_) : HLEMacroImpl(maxwell3d_) {} |
| 325 | 328 | ||
| 326 | void Execute(const std::vector<u32>& parameters, [[maybe_unused]] u32 method) override { | 329 | void Execute(const std::vector<u32>& parameters, [[maybe_unused]] u32 method) override { |
| 330 | auto topology = static_cast<Maxwell3D::Regs::PrimitiveTopology>(parameters[0] & 0xFFFFU); | ||
| 331 | if (!maxwell3d.AnyParametersDirty() || !IsTopologySafe(topology)) { | ||
| 332 | Fallback(parameters); | ||
| 333 | return; | ||
| 334 | } | ||
| 335 | |||
| 336 | auto& params = maxwell3d.draw_manager->GetIndirectParams(); | ||
| 337 | params.is_byte_count = true; | ||
| 338 | params.is_indexed = false; | ||
| 339 | params.include_count = false; | ||
| 340 | params.count_start_address = 0; | ||
| 341 | params.indirect_start_address = maxwell3d.GetMacroAddress(2); | ||
| 342 | params.buffer_size = 4; | ||
| 343 | params.max_draw_counts = 1; | ||
| 344 | params.stride = parameters[1]; | ||
| 345 | maxwell3d.regs.draw.begin = parameters[0]; | ||
| 346 | maxwell3d.regs.draw_auto_stride = parameters[1]; | ||
| 347 | maxwell3d.regs.draw_auto_byte_count = parameters[2]; | ||
| 348 | |||
| 349 | maxwell3d.draw_manager->DrawArrayIndirect(topology); | ||
| 350 | } | ||
| 351 | |||
| 352 | private: | ||
| 353 | void Fallback(const std::vector<u32>& parameters) { | ||
| 327 | maxwell3d.RefreshParameters(); | 354 | maxwell3d.RefreshParameters(); |
| 328 | 355 | ||
| 329 | maxwell3d.regs.draw.begin = parameters[0]; | 356 | maxwell3d.regs.draw.begin = parameters[0]; |
| 330 | maxwell3d.regs.draw_auto_stride = parameters[1]; | 357 | maxwell3d.regs.draw_auto_stride = parameters[1]; |
| 331 | maxwell3d.regs.draw_auto_byte_count = parameters[2]; | 358 | maxwell3d.regs.draw_auto_byte_count = parameters[2]; |
| 332 | 359 | ||
| 333 | if (maxwell3d.ShouldExecute()) { | 360 | maxwell3d.draw_manager->DrawArray( |
| 334 | maxwell3d.draw_manager->DrawArray( | 361 | maxwell3d.regs.draw.topology, 0, |
| 335 | maxwell3d.regs.draw.topology, 0, | 362 | maxwell3d.regs.draw_auto_byte_count / maxwell3d.regs.draw_auto_stride, 0, 1); |
| 336 | maxwell3d.regs.draw_auto_byte_count / maxwell3d.regs.draw_auto_stride, 0, 1); | ||
| 337 | } | ||
| 338 | } | 363 | } |
| 339 | }; | 364 | }; |
| 340 | 365 | ||