From 3bbf3f782674a25bbca01ca8dee8f58a2c33300c Mon Sep 17 00:00:00 2001 From: Karol Herbst Date: Mon, 20 Oct 2025 15:49:42 +0200 Subject: [PATCH] nak: ensure deref has a ptr_stride in cmat load/store lowering With untyped pointer we might get a deref_cast with a 0 ptr_stride. But we were supposed to ignore the stride information on the pointer anyway, so let's do that properly now. Reviewed-by: Faith Ekstrand Fixes: 05dca161437 ("nak: extract nir_intrinsic_cmat_load lowering into a function") Part-of: --- src/nouveau/compiler/nak_nir_lower_cmat.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/nouveau/compiler/nak_nir_lower_cmat.c b/src/nouveau/compiler/nak_nir_lower_cmat.c index 75ff06dd461..1e4c1e267bf 100644 --- a/src/nouveau/compiler/nak_nir_lower_cmat.c +++ b/src/nouveau/compiler/nak_nir_lower_cmat.c @@ -690,17 +690,22 @@ get_cmat_component_deref(nir_builder *b, nir_intrinsic_instr *intr, &col_offset, &row_offset); row_offset = nir_imul(b, row_offset, stride); - col_offset = nir_u2uN(b, col_offset, deref->def.bit_size); row_offset = nir_u2uN(b, row_offset, deref->def.bit_size); - nir_deref_instr *iter_deref = - nir_build_deref_ptr_as_array(b, deref, row_offset); - iter_deref = nir_build_deref_cast( - b, &iter_deref->def, deref->modes, + /* We have to ignore the incoming stride, but have to choose the type of + * the pointer as the declared stride is in multiple of the pointer type */ + deref = nir_build_deref_cast( + b, &deref->def, deref->modes, + deref->type, + glsl_get_vector_elements(deref->type) * glsl_get_bit_size(deref->type) / 8 + ); + deref = nir_build_deref_ptr_as_array(b, deref, row_offset); + deref = nir_build_deref_cast( + b, &deref->def, deref->modes, glsl_scalar_type(desc.element_type), glsl_base_type_bit_size(desc.element_type) / 8); - return nir_build_deref_ptr_as_array(b, iter_deref, col_offset); + return nir_build_deref_ptr_as_array(b, deref, col_offset); } static void