From a5c660d78a4e3465a544e934629459d45b8aa066 Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Thu, 12 Sep 2024 13:42:32 +0200 Subject: [PATCH] panvk/csf: Fix missing TSD pointer initialization on RUN_IDVS The global thread storage descriptor can be allocated in the dispatch path, which means the test on tsd != NULL might be true when the first RUN_IDVS() happens, and we never set r24 to the TSD address. Fix that by keeping a tsd field in panvk_cmd_graphics_state that's only set in the draw path. Reported-by: Erik Faye-Lund Signed-off-by: Boris Brezillon Reviewed-by: Mary Guillemard Reviewed-by: Lars-Ivar Hesselberg Simonsen Tested-by: Erik Faye-Lund Tested-by: Alexandre ARNOUD Part-of: --- src/panfrost/vulkan/csf/panvk_cmd_buffer.h | 1 + src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c | 12 ++++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/panfrost/vulkan/csf/panvk_cmd_buffer.h b/src/panfrost/vulkan/csf/panvk_cmd_buffer.h index 601198394d2..b6bc089b322 100644 --- a/src/panfrost/vulkan/csf/panvk_cmd_buffer.h +++ b/src/panfrost/vulkan/csf/panvk_cmd_buffer.h @@ -399,6 +399,7 @@ struct panvk_cmd_graphics_state { } render; mali_ptr push_uniforms; + mali_ptr tsd; }; struct panvk_cmd_buffer { diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c index 759a1786ed6..ebb02d5aa8e 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c @@ -446,10 +446,14 @@ update_tls(struct panvk_cmd_buffer *cmdbuf) struct cs_builder *b = panvk_get_cs_builder(cmdbuf, PANVK_SUBQUEUE_VERTEX_TILER); - if (!state->desc.gpu) { - state->desc = panvk_cmd_alloc_desc(cmdbuf, LOCAL_STORAGE); - if (!state->desc.gpu) - return VK_ERROR_OUT_OF_DEVICE_MEMORY; + if (!cmdbuf->state.gfx.tsd) { + if (!state->desc.gpu) { + state->desc = panvk_cmd_alloc_desc(cmdbuf, LOCAL_STORAGE); + if (!state->desc.gpu) + return VK_ERROR_OUT_OF_DEVICE_MEMORY; + } + + cmdbuf->state.gfx.tsd = state->desc.gpu; cs_update_vt_ctx(b) cs_move64_to(b, cs_sr_reg64(b, 24), state->desc.gpu);