Module: Mesa Branch: main Commit: e962430e6fe59107a93367ad73683b858cacdae3 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=e962430e6fe59107a93367ad73683b858cacdae3
Author: Faith Ekstrand <faith.ekstr...@collabora.com> Date: Wed Nov 29 19:33:46 2023 -0600 nvk: Rework transform feedback stalling Instead of doing a compute shader invalidate, use SET_REFERENCE to force a command streamer stall. Also, emit a SYSMEMBAR before reading XFB offsets through the MME. Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26408> --- src/nouveau/vulkan/nvk_cmd_draw.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/nouveau/vulkan/nvk_cmd_draw.c b/src/nouveau/vulkan/nvk_cmd_draw.c index 0e92cefad2b..752b0cf7bb5 100644 --- a/src/nouveau/vulkan/nvk_cmd_draw.c +++ b/src/nouveau/vulkan/nvk_cmd_draw.c @@ -2659,7 +2659,8 @@ nvk_CmdBeginTransformFeedbackEXT(VkCommandBuffer commandBuffer, uint64_t cb_addr = nvk_buffer_address(buffer, offset); if (nvk_cmd_buffer_device(cmd)->pdev->info.cls_eng3d >= TURING_A) { - struct nv_push *p = nvk_cmd_buffer_push(cmd, 6); + struct nv_push *p = nvk_cmd_buffer_push(cmd, 8); + P_IMMD(p, NVC597, MME_DMA_SYSMEMBAR, 0); P_IMMD(p, NVC597, SET_MME_DATA_FIFO_CONFIG, FIFO_SIZE_SIZE_4KB); P_1INC(p, NV9097, CALL_MME_MACRO(NVK_MME_XFB_COUNTER_LOAD)); P_INLINE_DATA(p, cb_idx); @@ -2689,6 +2690,10 @@ nvk_CmdEndTransformFeedbackEXT(VkCommandBuffer commandBuffer, { VK_FROM_HANDLE(nvk_cmd_buffer, cmd, commandBuffer); + struct nv_push *p = nvk_cmd_buffer_push(cmd, 5 * counterBufferCount + 6); + + P_IMMD(p, NV9097, SET_STREAM_OUTPUT, ENABLE_FALSE); + for (uint32_t i = 0; i < counterBufferCount; ++i) { if (pCounterBuffers[i] == VK_NULL_HANDLE) continue; @@ -2697,7 +2702,6 @@ nvk_CmdEndTransformFeedbackEXT(VkCommandBuffer commandBuffer, uint64_t offset = pCounterBufferOffsets ? pCounterBufferOffsets[i] : 0; uint64_t cb_addr = nvk_buffer_address(buffer, offset); - struct nv_push *p = nvk_cmd_buffer_push(cmd, 5); P_MTHD(p, NV9097, SET_REPORT_SEMAPHORE_A); P_NV9097_SET_REPORT_SEMAPHORE_A(p, cb_addr >> 32); P_NV9097_SET_REPORT_SEMAPHORE_B(p, cb_addr); @@ -2710,15 +2714,9 @@ nvk_CmdEndTransformFeedbackEXT(VkCommandBuffer commandBuffer, }); } - struct nv_push *p = nvk_cmd_buffer_push(cmd, counterBufferCount ? 4 : 2); - P_IMMD(p, NV9097, SET_STREAM_OUTPUT, ENABLE_FALSE); - - // TODO: this probably needs to move to CmdPipelineBarrier if (counterBufferCount > 0) { - P_MTHD(p, NVA0C0, INVALIDATE_SHADER_CACHES_NO_WFI); - P_NVA0C0_INVALIDATE_SHADER_CACHES_NO_WFI(p, { - .constant = CONSTANT_TRUE - }); + P_IMMD(p, NV9097, WAIT_FOR_IDLE, 0); + __push_immd(p, SUBC_NV9097, NV906F_SET_REFERENCE, 0); } }