From d6ae8c689eafafae6287a865d3cb5d2775b3db67 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Mon, 27 May 2024 10:34:39 +0200 Subject: [PATCH] radv: emit SQ_NON_EVENT packets after drawing with streamout on GFX12 Signed-off-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/radv_cmd_buffer.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index 9026d4e3b28..81b34eda820 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -13233,6 +13233,8 @@ radv_CmdDrawIndirectByteCountEXT(VkCommandBuffer commandBuffer, uint32_t instanc { VK_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer); VK_FROM_HANDLE(radv_buffer, counterBuffer, _counterBuffer); + struct radv_device *device = radv_cmd_buffer_device(cmd_buffer); + const struct radv_physical_device *pdev = radv_device_physical(device); struct radv_draw_info info; info.count = 0; @@ -13249,6 +13251,15 @@ radv_CmdDrawIndirectByteCountEXT(VkCommandBuffer commandBuffer, uint32_t instanc struct VkMultiDrawInfoEXT minfo = {0, 0}; radv_emit_strmout_buffer(cmd_buffer, &info); radv_emit_direct_draw_packets(cmd_buffer, &info, 1, &minfo, S_0287F0_USE_OPAQUE(1), 0); + + if (pdev->info.gfx_level == GFX12) { + /* DrawTransformFeedback requires 3 SQ_NON_EVENTs after the packet. */ + for (unsigned i = 0; i < 3; i++) { + radeon_emit(cmd_buffer->cs, PKT3(PKT3_EVENT_WRITE, 0, 0)); + radeon_emit(cmd_buffer->cs, EVENT_TYPE(V_028A90_SQ_NON_EVENT) | EVENT_INDEX(0)); + } + } + radv_after_draw(cmd_buffer, false); }