broadcom/vc5: Fix handling of interp qualifiers on builtin color inputs.
authorEric Anholt <eric@anholt.net>
Thu, 28 Sep 2017 21:02:05 +0000 (14:02 -0700)
committerEric Anholt <eric@anholt.net>
Tue, 10 Oct 2017 18:42:05 +0000 (11:42 -0700)
The interpolation qualifier, if specified, is supposed to take precedence
over glShadeModel().

src/broadcom/compiler/nir_to_vir.c
src/broadcom/compiler/v3d_compiler.h
src/broadcom/compiler/vir.c
src/gallium/drivers/vc5/vc5_emit.c
src/gallium/drivers/vc5/vc5_program.c

index 89d18f85061771e7efcb829ca2bfe1c68a133514..acfeba4cb715edd4041cdf155ed0492c720eb099 100644 (file)
@@ -564,6 +564,21 @@ emit_fragment_varying(struct v3d_compile *c, nir_variable *var,
 
         switch (var->data.interpolation) {
         case INTERP_MODE_NONE:
+                /* If a gl_FrontColor or gl_BackColor input has no interp
+                 * qualifier, then flag it for glShadeModel() handling by the
+                 * driver.
+                 */
+                switch (var->data.location) {
+                case VARYING_SLOT_COL0:
+                case VARYING_SLOT_COL1:
+                case VARYING_SLOT_BFC0:
+                case VARYING_SLOT_BFC1:
+                        BITSET_SET(c->shade_model_flags, i);
+                        break;
+                default:
+                        break;
+                }
+                /* FALLTHROUGH */
         case INTERP_MODE_SMOOTH:
                 if (var->data.centroid) {
                         return vir_FADD(c, vir_FMUL(c, vary,
index 84957b751241a25c5cf8a9194b98553ca8a8f9bf..a29b08ac1ab47e4614a91419a2703df5bd1df132 100644 (file)
@@ -421,6 +421,11 @@ struct v3d_compile {
          */
         BITSET_WORD flat_shade_flags[BITSET_WORDS(V3D_MAX_FS_INPUTS)];
 
+        /* Booleans for whether the corresponding QFILE_VARY[i] uses the
+         * default glShadeModel() behavior.
+         */
+        BITSET_WORD shade_model_flags[BITSET_WORDS(V3D_MAX_FS_INPUTS)];
+
         struct v3d_ubo_range *ubo_ranges;
         bool *ubo_range_used;
         uint32_t ubo_ranges_array_size;
@@ -570,13 +575,14 @@ struct v3d_fs_prog_data {
 
         struct v3d_varying_slot input_slots[V3D_MAX_FS_INPUTS];
 
-        /** bitmask of which inputs are color inputs, for flat shade handling. */
-        uint32_t color_inputs[BITSET_WORDS(V3D_MAX_FS_INPUTS)];
-
         /* Bitmask for whether the corresponding input is flat-shaded,
          * independent of rasterizer (gl_FragColor) flat-shading.
          */
         BITSET_WORD flat_shade_flags[BITSET_WORDS(V3D_MAX_FS_INPUTS)];
+        /* Bitmask for whether the corresponding input uses the default
+         * glShadeModel() behavior.
+         */
+        BITSET_WORD shade_model_flags[BITSET_WORDS(V3D_MAX_FS_INPUTS)];
 
         bool writes_z;
         bool discard;
index 1c25da6193ccf5930924bc16e1f3c50a3c60b183..227f2e39a6b200a46636a5840d20a64081688cfb 100644 (file)
@@ -705,20 +705,10 @@ v3d_set_fs_prog_data_inputs(struct v3d_compile *c,
         memcpy(prog_data->input_slots, c->input_slots,
                c->num_inputs * sizeof(*c->input_slots));
 
-        for (int i = 0; i < c->num_inputs; i++) {
-                struct v3d_varying_slot v3d_slot = c->input_slots[i];
-                uint8_t slot = v3d_slot_get_slot(v3d_slot);
-
-                if (slot == VARYING_SLOT_COL0 ||
-                    slot == VARYING_SLOT_COL1 ||
-                    slot == VARYING_SLOT_BFC0 ||
-                    slot == VARYING_SLOT_BFC1) {
-                        BITSET_SET(prog_data->color_inputs, i);
-                }
-
-                if (BITSET_TEST(c->flat_shade_flags, i))
-                        BITSET_SET(prog_data->flat_shade_flags, i);
-        }
+        memcpy(prog_data->flat_shade_flags, c->flat_shade_flags,
+               sizeof(c->flat_shade_flags));
+        memcpy(prog_data->shade_model_flags, c->shade_model_flags,
+               sizeof(c->shade_model_flags));
 }
 
 uint64_t *v3d_compile_fs(const struct v3d_compiler *compiler,
index 29ccfcdacdb71647f60d850ef5bbbb597c39b3fb..60883d96d4be90391bb68f7f162137afbcd6aae5 100644 (file)
@@ -408,7 +408,7 @@ vc5_emit_state(struct pipe_context *pctx)
 
                         if (vc5->rasterizer->base.flatshade) {
                                 flags.flat_shade_flags_for_varyings_v024 |=
-                                        vc5->prog.fs->prog_data.fs->color_inputs[0] & 0xfffff;
+                                        vc5->prog.fs->prog_data.fs->shade_model_flags[0] & 0xfffff;
                         }
                 }
         }
index 02625ed192b1cb5d554f5cb209ce9bd54be86858..107c9c0533507816f322bbd89f86a4730b04d797 100644 (file)
@@ -367,8 +367,8 @@ vc5_update_compiled_fs(struct vc5_context *vc5, uint8_t prim_mode)
             (vc5->prog.fs->prog_data.fs->flat_shade_flags !=
              old_fs->prog_data.fs->flat_shade_flags ||
              (vc5->rasterizer->base.flatshade &&
-              vc5->prog.fs->prog_data.fs->color_inputs !=
-              old_fs->prog_data.fs->color_inputs))) {
+              vc5->prog.fs->prog_data.fs->shade_model_flags !=
+              old_fs->prog_data.fs->shade_model_flags))) {
                 vc5->dirty |= VC5_DIRTY_FLAT_SHADE_FLAGS;
         }