From 61c85c8d316126d6814008868615f206c8da8ff1 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Tue, 31 Mar 2026 17:09:11 +0200 Subject: [PATCH] vulkan: fix determining the heap ptr Signed-off-by: Samuel Pitoiset Part-of: --- .../runtime/vk_nir_lower_descriptor_heaps.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/vulkan/runtime/vk_nir_lower_descriptor_heaps.c b/src/vulkan/runtime/vk_nir_lower_descriptor_heaps.c index fad781c09db..b5f17519fad 100644 --- a/src/vulkan/runtime/vk_nir_lower_descriptor_heaps.c +++ b/src/vulkan/runtime/vk_nir_lower_descriptor_heaps.c @@ -459,6 +459,14 @@ vk_build_descriptor_heap_address(nir_builder *b, } } +static bool +var_is_heap_ptr(nir_variable *var) +{ + return (var->data.mode == nir_var_uniform || var->data.mode == nir_var_image) && + (var->data.location == SYSTEM_VALUE_SAMPLER_HEAP_PTR || + var->data.location == SYSTEM_VALUE_RESOURCE_HEAP_PTR); +} + static nir_deref_instr * deref_get_root_cast(nir_deref_instr *deref) { @@ -470,6 +478,9 @@ deref_get_root_cast(nir_deref_instr *deref) if (!parent) break; + if (parent->deref_type == nir_deref_type_var && var_is_heap_ptr(parent->var)) + break; + deref = parent; } assert(deref->deref_type == nir_deref_type_cast); @@ -482,8 +493,13 @@ deref_cast_is_heap_ptr(nir_deref_instr *deref) { assert(deref->deref_type == nir_deref_type_cast); nir_intrinsic_instr *intrin = nir_src_as_intrinsic(deref->parent); - if (intrin == NULL) + if (intrin == NULL) { + nir_deref_instr *parent_deref = nir_src_as_deref(deref->parent); + if (parent_deref != NULL && parent_deref->deref_type == nir_deref_type_var) + return var_is_heap_ptr(parent_deref->var); + return false; + } switch (intrin->intrinsic) { case nir_intrinsic_load_deref: {