Skip to content

nir/split_64bit_vec3_and_vec4: Use the right number of components

Corentin Noël requested to merge tintou/mesa:tintou/split-64-vec-size into main

What does this MR do and why?

nir/split_64bit_vec3_and_vec4: Use the right number of components

Always make sure to correctly deref and store a 64bits variable from either one of two components.

This fixes the spec@arb_enhanced_layouts@matching_fp64_types_ piglit tests for virgl.

Corrects this validation issue:

        vec1 32 ssa_330 = deref_var &var_7@2 (function_temp dvec2[])
        vec1 32 ssa_331 = deref_var &var_7@3 (function_temp dvec2[])
        vec1 32 ssa_332 = deref_array &(*ssa_330)[ssa_329] (function_temp dvec2) /* &var_7@2[ssa_329] */
        vec1 32 ssa_333 = deref_array &(*ssa_331)[ssa_329] (function_temp dvec2) /* &var_7@3[ssa_329] */
        vec1 64 ssa_334 = mov ssa_123.z
        intrinsic store_deref (ssa_333, ssa_334) (wrmask=x, access=0)
error: instr->num_components == glsl_get_vector_elements(dst->type) (../src/compiler/nir/nir_validate.c:632)

        vec4 64 ssa_124 = vec4 ssa_2, ssa_1, ssa_0, ssa_122
        vec1 32 ssa_335 = load_const (0x00000000 = 0.000000)
        vec1 32 ssa_336 = iadd ssa_335, ssa_69
        vec1 32 ssa_337 = deref_var &var_7@2 (function_temp dvec2[])
        vec1 32 ssa_338 = deref_var &var_7@3 (function_temp dvec2[])
        vec1 32 ssa_339 = deref_array &(*ssa_337)[ssa_336] (function_temp dvec2) /* &var_7@2[ssa_336] */
        vec1 32 ssa_340 = deref_array &(*ssa_338)[ssa_336] (function_temp dvec2) /* &var_7@3[ssa_336] */
        vec1 64 ssa_341 = mov ssa_124.w
        intrinsic store_deref (ssa_340, ssa_341) (wrmask=, access=0)
error: (nir_intrinsic_write_mask(instr) & ~component_mask) == 0 (../src/compiler/nir/nir_validate.c:803)
Edited by Corentin Noël

Merge request reports