diff options
| author | 2023-09-02 14:42:42 -0400 | |
|---|---|---|
| committer | 2023-09-02 14:42:42 -0400 | |
| commit | 76bddd3673fd960bfb7fd108b0120ae707dde306 (patch) | |
| tree | dd38a2ab05cce71665e15ee7c063b69c90e59650 /src/video_core/renderer_vulkan | |
| parent | Merge pull request #11384 from liamwhite/am-shutdown (diff) | |
| parent | VideoCore: Implement DispatchIndirect (diff) | |
| download | yuzu-76bddd3673fd960bfb7fd108b0120ae707dde306.tar.gz yuzu-76bddd3673fd960bfb7fd108b0120ae707dde306.tar.xz yuzu-76bddd3673fd960bfb7fd108b0120ae707dde306.zip | |
Merge pull request #11383 from FernandoS27/are-you-a-wabbit
Fix regressions that damaged compute indirect & use reinterpret for copies with different byteblocksizes
Diffstat (limited to 'src/video_core/renderer_vulkan')
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_pipeline_cache.cpp | 13 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.cpp | 14 |
2 files changed, 27 insertions, 0 deletions
diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index fe432dfe1..4f83a88e1 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp | |||
| @@ -665,6 +665,19 @@ std::unique_ptr<GraphicsPipeline> PipelineCache::CreateGraphicsPipeline( | |||
| 665 | std::move(modules), infos); | 665 | std::move(modules), infos); |
| 666 | 666 | ||
| 667 | } catch (const Shader::Exception& exception) { | 667 | } catch (const Shader::Exception& exception) { |
| 668 | auto hash = key.Hash(); | ||
| 669 | size_t env_index{0}; | ||
| 670 | for (size_t index = 0; index < Maxwell::MaxShaderProgram; ++index) { | ||
| 671 | if (key.unique_hashes[index] == 0) { | ||
| 672 | continue; | ||
| 673 | } | ||
| 674 | Shader::Environment& env{*envs[env_index]}; | ||
| 675 | ++env_index; | ||
| 676 | |||
| 677 | const u32 cfg_offset{static_cast<u32>(env.StartAddress() + sizeof(Shader::ProgramHeader))}; | ||
| 678 | Shader::Maxwell::Flow::CFG cfg(env, pools.flow_block, cfg_offset, index == 0); | ||
| 679 | env.Dump(hash, key.unique_hashes[index]); | ||
| 680 | } | ||
| 668 | LOG_ERROR(Render_Vulkan, "{}", exception.what()); | 681 | LOG_ERROR(Render_Vulkan, "{}", exception.what()); |
| 669 | return nullptr; | 682 | return nullptr; |
| 670 | } | 683 | } |
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 032f694bc..01e76a82c 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp | |||
| @@ -463,6 +463,20 @@ void RasterizerVulkan::DispatchCompute() { | |||
| 463 | pipeline->Configure(*kepler_compute, *gpu_memory, scheduler, buffer_cache, texture_cache); | 463 | pipeline->Configure(*kepler_compute, *gpu_memory, scheduler, buffer_cache, texture_cache); |
| 464 | 464 | ||
| 465 | const auto& qmd{kepler_compute->launch_description}; | 465 | const auto& qmd{kepler_compute->launch_description}; |
| 466 | auto indirect_address = kepler_compute->GetIndirectComputeAddress(); | ||
| 467 | if (indirect_address) { | ||
| 468 | // DispatchIndirect | ||
| 469 | static constexpr auto sync_info = VideoCommon::ObtainBufferSynchronize::FullSynchronize; | ||
| 470 | const auto post_op = VideoCommon::ObtainBufferOperation::DiscardWrite; | ||
| 471 | const auto [buffer, offset] = | ||
| 472 | buffer_cache.ObtainBuffer(*indirect_address, 12, sync_info, post_op); | ||
| 473 | scheduler.RequestOutsideRenderPassOperationContext(); | ||
| 474 | scheduler.Record([indirect_buffer = buffer->Handle(), | ||
| 475 | indirect_offset = offset](vk::CommandBuffer cmdbuf) { | ||
| 476 | cmdbuf.DispatchIndirect(indirect_buffer, indirect_offset); | ||
| 477 | }); | ||
| 478 | return; | ||
| 479 | } | ||
| 466 | const std::array<u32, 3> dim{qmd.grid_dim_x, qmd.grid_dim_y, qmd.grid_dim_z}; | 480 | const std::array<u32, 3> dim{qmd.grid_dim_x, qmd.grid_dim_y, qmd.grid_dim_z}; |
| 467 | scheduler.RequestOutsideRenderPassOperationContext(); | 481 | scheduler.RequestOutsideRenderPassOperationContext(); |
| 468 | scheduler.Record([dim](vk::CommandBuffer cmdbuf) { cmdbuf.Dispatch(dim[0], dim[1], dim[2]); }); | 482 | scheduler.Record([dim](vk::CommandBuffer cmdbuf) { cmdbuf.Dispatch(dim[0], dim[1], dim[2]); }); |