From a40bc33b116cef0b5723489081f7755ccef68d09 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Wed, 6 Jun 2018 21:06:44 -0700 Subject: v3d: Fix undefined results for a swap_color_rb RT from a float shader output. Fixes segfaults and undefined behavior in dEQP-GLES3.functional.fragment_out.basic.fixed.srgb8_alpha8_lowp_float --- src/broadcom/compiler/nir_to_vir.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/broadcom/compiler/nir_to_vir.c b/src/broadcom/compiler/nir_to_vir.c index 0f7e47689dc..23b5975a334 100644 --- a/src/broadcom/compiler/nir_to_vir.c +++ b/src/broadcom/compiler/nir_to_vir.c @@ -969,6 +969,9 @@ emit_frag_end(struct v3d_compile *c) conf |= TLB_SAMPLE_MODE_PER_PIXEL; conf |= (7 - rt) << TLB_RENDER_TARGET_SHIFT; + if (c->fs_key->swap_color_rb & (1 << rt)) + num_components = MAX2(num_components, 3); + assert(num_components != 0); switch (glsl_get_base_type(var->type)) { case GLSL_TYPE_UINT: @@ -1360,7 +1363,7 @@ ntq_setup_outputs(struct v3d_compile *c) assert(array_len == 1); (void)array_len; - for (int i = 0; i < glsl_get_vector_elements(var->type); i++) { + for (int i = 0; i < 4; i++) { add_output(c, loc + var->data.location_frac + i, var->data.location, var->data.location_frac + i); -- cgit v1.2.3