v3d: Fix undefined results for a swap_color_rb RT from a float shader output.
authorEric Anholt <eric@anholt.net>
Thu, 7 Jun 2018 04:06:44 +0000 (21:06 -0700)
committerEric Anholt <eric@anholt.net>
Thu, 14 Jun 2018 23:52:25 +0000 (16:52 -0700)
Fixes segfaults and undefined behavior in
dEQP-GLES3.functional.fragment_out.basic.fixed.srgb8_alpha8_lowp_float

src/broadcom/compiler/nir_to_vir.c

index 0f7e47689dc38782b93bbfc3442f790160440dd1..23b5975a3344b085c48918712400f2529e0fdd23 100644 (file)
@@ -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);