diff --git a/.pick_status.json b/.pick_status.json index 15db624ddef..ad3c440d269 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -64,7 +64,7 @@ "description": "vtn: Fix vtn_mediump_upconvert_value() with transposed matrices", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null, "notes": null diff --git a/src/compiler/spirv/vtn_alu.c b/src/compiler/spirv/vtn_alu.c index 2480f73dc8e..896cc6a8db7 100644 --- a/src/compiler/spirv/vtn_alu.c +++ b/src/compiler/spirv/vtn_alu.c @@ -550,17 +550,26 @@ vtn_mediump_upconvert(struct vtn_builder *b, enum glsl_base_type base_type, nir_ } } -void +struct vtn_ssa_value * vtn_mediump_upconvert_value(struct vtn_builder *b, struct vtn_ssa_value *value) { enum glsl_base_type base_type = glsl_get_base_type(value->type); + if (value->transposed) { + struct vtn_ssa_value *transposed = + vtn_mediump_upconvert_value(b, value->transposed); + return vtn_ssa_transpose(b, transposed); + } + + struct vtn_ssa_value *value_full = vtn_create_ssa_value(b, value->type); if (glsl_type_is_vector_or_scalar(value->type)) { - value->def = vtn_mediump_upconvert(b, base_type, value->def); + value_full->def = vtn_mediump_upconvert(b, base_type, value->def); } else { for (int i = 0; i < glsl_get_matrix_columns(value->type); i++) - value->elems[i]->def = vtn_mediump_upconvert(b, base_type, value->elems[i]->def); + value_full->elems[i]->def = vtn_mediump_upconvert(b, base_type, value->elems[i]->def); } + + return value_full; } static nir_def * @@ -748,7 +757,7 @@ vtn_handle_alu(struct vtn_builder *b, SpvOp opcode, struct vtn_ssa_value *dest = vtn_handle_matrix_alu(b, opcode, vtn_src[0], vtn_src[1]); if (mediump_16bit) - vtn_mediump_upconvert_value(b, dest); + dest = vtn_mediump_upconvert_value(b, dest); vtn_push_ssa_value(b, w[2], dest); b->nb.fp_math_ctrl = b->exact ? nir_fp_exact : nir_fp_fast_math; @@ -1096,7 +1105,7 @@ vtn_handle_alu(struct vtn_builder *b, SpvOp opcode, } if (mediump_16bit) - vtn_mediump_upconvert_value(b, dest); + dest = vtn_mediump_upconvert_value(b, dest); vtn_push_ssa_value(b, w[2], dest); b->nb.fp_math_ctrl = b->exact ? nir_fp_exact : nir_fp_fast_math; diff --git a/src/compiler/spirv/vtn_glsl450.c b/src/compiler/spirv/vtn_glsl450.c index 486f637344e..4c5c58e0002 100644 --- a/src/compiler/spirv/vtn_glsl450.c +++ b/src/compiler/spirv/vtn_glsl450.c @@ -640,7 +640,7 @@ handle_glsl450_alu(struct vtn_builder *b, enum GLSLstd450 entrypoint, b->nb.fp_math_ctrl = b->exact ? nir_fp_exact : nir_fp_fast_math; if (mediump_16bit) - vtn_mediump_upconvert_value(b, dest); + dest = vtn_mediump_upconvert_value(b, dest); vtn_push_ssa_value(b, w[2], dest); } diff --git a/src/compiler/spirv/vtn_private.h b/src/compiler/spirv/vtn_private.h index a8c4988a488..0d613f1425d 100644 --- a/src/compiler/spirv/vtn_private.h +++ b/src/compiler/spirv/vtn_private.h @@ -1065,7 +1065,8 @@ nir_def * vtn_mediump_downconvert(struct vtn_builder *b, enum glsl_base_type base_type, nir_def *def); struct vtn_ssa_value * vtn_mediump_downconvert_value(struct vtn_builder *b, struct vtn_ssa_value *src); -void vtn_mediump_upconvert_value(struct vtn_builder *b, struct vtn_ssa_value *value); +struct vtn_ssa_value * +vtn_mediump_upconvert_value(struct vtn_builder *b, struct vtn_ssa_value *value); static inline int cmp_uint32_t(const void *pa, const void *pb)