vulkan: fix determining the heap ptr

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/40729>
This commit is contained in:
Samuel Pitoiset 2026-03-31 17:09:11 +02:00 committed by Marge Bot
parent 521b1c9584
commit 61c85c8d31

View file

@ -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: {