From 606fa193afda85727f80d3f24b3dc3b11c35496e Mon Sep 17 00:00:00 2001 From: Mel Henning Date: Mon, 18 Aug 2025 12:58:08 -0400 Subject: [PATCH] nvk: Reduce subc switches in cmd_invalidate_deps Reviewed-by: Faith Ekstrand Part-of: --- src/nouveau/vulkan/nvk_cmd_buffer.c | 39 +++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/src/nouveau/vulkan/nvk_cmd_buffer.c b/src/nouveau/vulkan/nvk_cmd_buffer.c index d2522140807..8cb78d96ad8 100644 --- a/src/nouveau/vulkan/nvk_cmd_buffer.c +++ b/src/nouveau/vulkan/nvk_cmd_buffer.c @@ -648,27 +648,46 @@ nvk_cmd_invalidate_deps(struct nvk_cmd_buffer *cmd, if (barriers & NVK_BARRIER_INVALIDATE_TEX_DATA) { if (pdev->info.cls_eng3d >= MAXWELL_A) { - P_IMMD(p, NVA097, INVALIDATE_TEXTURE_DATA_CACHE_NO_WFI, { - .lines = LINES_ALL, - }); + if (nvk_cmd_buffer_last_subchannel(cmd) == SUBC_NVA097) { + P_IMMD(p, NVA097, INVALIDATE_TEXTURE_DATA_CACHE_NO_WFI, { + .lines = LINES_ALL, + }); + } else { + P_IMMD(p, NVA0C0, INVALIDATE_TEXTURE_DATA_CACHE_NO_WFI, { + .lines = LINES_ALL, + }); + } } else { /* On Kepler, the _NO_WFI form doesn't appear to actually work * properly. It exists in the headers but it doesn't fully * invalidate everything. Even doing a full WFI before hand isn't * sufficient. */ - P_IMMD(p, NVA097, INVALIDATE_TEXTURE_DATA_CACHE, { - .lines = LINES_ALL, - }); + if (nvk_cmd_buffer_last_subchannel(cmd) == SUBC_NVA097) { + P_IMMD(p, NVA097, INVALIDATE_TEXTURE_DATA_CACHE, { + .lines = LINES_ALL, + }); + } else { + P_IMMD(p, NVA0C0, INVALIDATE_TEXTURE_DATA_CACHE, { + .lines = LINES_ALL, + }); + } } } if (barriers & (NVK_BARRIER_INVALIDATE_SHADER_DATA & NVK_BARRIER_INVALIDATE_CONSTANT)) { - P_IMMD(p, NVA097, INVALIDATE_SHADER_CACHES_NO_WFI, { - .global_data = (barriers & NVK_BARRIER_INVALIDATE_SHADER_DATA) != 0, - .constant = (barriers & NVK_BARRIER_INVALIDATE_CONSTANT) != 0, - }); + if (nvk_cmd_buffer_last_subchannel(cmd) == SUBC_NVA097) { + P_IMMD(p, NVA097, INVALIDATE_SHADER_CACHES_NO_WFI, { + .global_data = (barriers & NVK_BARRIER_INVALIDATE_SHADER_DATA) != 0, + .constant = (barriers & NVK_BARRIER_INVALIDATE_CONSTANT) != 0, + }); + } else { + P_IMMD(p, NVA0C0, INVALIDATE_SHADER_CACHES_NO_WFI, { + .global_data = (barriers & NVK_BARRIER_INVALIDATE_SHADER_DATA) != 0, + .constant = (barriers & NVK_BARRIER_INVALIDATE_CONSTANT) != 0, + }); + } } if (barriers & (NVK_BARRIER_INVALIDATE_MME_DATA)) {