From 0543f1fd6da53217343d09cbe765c357d960104c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20Miko=C5=82ajczyk?= Date: Mon, 26 May 2025 22:46:35 +0100 Subject: [PATCH] Handle predication PM4 commands --- src/video_core/amdgpu/liverpool.cpp | 19 ++++++++++++++++++- .../renderer_vulkan/vk_rasterizer.cpp | 9 +++++++++ .../renderer_vulkan/vk_rasterizer.h | 3 +++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/video_core/amdgpu/liverpool.cpp b/src/video_core/amdgpu/liverpool.cpp index 4db7648c6..f6dd954db 100644 --- a/src/video_core/amdgpu/liverpool.cpp +++ b/src/video_core/amdgpu/liverpool.cpp @@ -394,7 +394,24 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::span(header); + if (predication->continue_bit.Value()) { + LOG_WARNING(Render_Vulkan, "unhandled continue bit in predication command"); + } + if (predication->pred_op.Value() == PredicateOperation::Clear) { + if (rasterizer) { + rasterizer->EndPredication(); + } + } + else if (predication->pred_op.Value() == PredicateOperation::Zpass) { + if (rasterizer) { + rasterizer->StartPredication(); + } + } + else { + LOG_WARNING(Render_Vulkan, "unhandled predicate operation {}", + magic_enum::enum_name(predication->pred_op.Value())); + } break; } case PM4ItOpcode::IndexType: { diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 4bdb08bf2..cf0c354c9 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -1263,4 +1263,13 @@ void Rasterizer::ScopedMarkerInsertColor(const std::string_view& str, const u32 (f32)(color & 0xff) / 255.0f, (f32)((color >> 24) & 0xff) / 255.0f})}); } +void Rasterizer::StartPredication() { + +} + +void Rasterizer::EndPredication() { + +} + + } // namespace Vulkan diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.h b/src/video_core/renderer_vulkan/vk_rasterizer.h index fb9ca4bbe..e4b8aefb4 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.h +++ b/src/video_core/renderer_vulkan/vk_rasterizer.h @@ -55,6 +55,9 @@ public: void ScopedMarkerInsertColor(const std::string_view& str, const u32 color, bool from_guest = false); + void StartPredication(); + void EndPredication(); + void InlineData(VAddr address, const void* value, u32 num_bytes, bool is_gds); u32 ReadDataFromGds(u32 gsd_offset); bool InvalidateMemory(VAddr addr, u64 size);