spirv: preserve the explicit stride for untyped pointers with matrices

Make sure to cast with the deref type that contains more information
than the returned type because it's valid in SPIR-V.

This fixes dEQP-VK.binding_model.descriptor_heap.graphics.*_vectors and
also the PositiveGpuAV.HeapWithUntypedPointers VVL test.

Cc: mesa-stable
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
(cherry picked from commit 975ae01208)

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/41540>
This commit is contained in:
Samuel Pitoiset 2026-05-11 09:29:53 +02:00 committed by Eric Engestrom
parent dcb7739057
commit 4945cf1b44
2 changed files with 13 additions and 2 deletions

View file

@ -904,7 +904,7 @@
"description": "spirv: preserve the explicit stride for untyped pointers with matrices",
"nominated": true,
"nomination_type": 1,
"resolution": 0,
"resolution": 1,
"main_sha": null,
"because_sha": null,
"notes": null

View file

@ -2665,9 +2665,20 @@ vtn_cast_pointer(struct vtn_builder *b, struct vtn_pointer *p,
vtn_assert(pointed == casted->type->pointed);
if (p->deref) {
const struct glsl_type *deref_type = pointed->type;
/* Preserve the explicit stride when casting an untyped pointer to a raw
* SPIR-V matrix type because the raw type lacks it.
*/
if (glsl_type_is_matrix(p->deref->type) &&
glsl_type_is_matrix(deref_type) &&
glsl_get_explicit_stride(p->deref->type) > 0 &&
glsl_get_explicit_stride(deref_type) == 0)
deref_type = p->deref->type;
casted->deref = nir_build_deref_cast(&b->nb, &p->deref->def,
p->deref->modes,
pointed->type, 0);
deref_type, 0);
} else if (p->desc_index != NULL) {
/* Nothing to do for descriptor index pointers. */
} else if (p->var != NULL) {