summaryrefslogtreecommitdiffstats
path: root/src/broadcom
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2017-09-28 14:02:05 -0700
committerEric Anholt <[email protected]>2017-10-10 11:42:05 -0700
commit361c5f28bdc6858618e9de85a340adce1b217e2c (patch)
treef2a93b771d1c949b1208753eda296d0d1cbe5c09 /src/broadcom
parentd0dfc4bd5f3711ac48de88aa51fc6f442eaa0b20 (diff)
broadcom/vc5: Fix handling of interp qualifiers on builtin color inputs.
The interpolation qualifier, if specified, is supposed to take precedence over glShadeModel().
Diffstat (limited to 'src/broadcom')
-rw-r--r--src/broadcom/compiler/nir_to_vir.c15
-rw-r--r--src/broadcom/compiler/v3d_compiler.h12
-rw-r--r--src/broadcom/compiler/vir.c18
3 files changed, 28 insertions, 17 deletions
diff --git a/src/broadcom/compiler/nir_to_vir.c b/src/broadcom/compiler/nir_to_vir.c
index 89d18f85061..acfeba4cb71 100644
--- a/src/broadcom/compiler/nir_to_vir.c
+++ b/src/broadcom/compiler/nir_to_vir.c
@@ -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,
diff --git a/src/broadcom/compiler/v3d_compiler.h b/src/broadcom/compiler/v3d_compiler.h
index 84957b75124..a29b08ac1ab 100644
--- a/src/broadcom/compiler/v3d_compiler.h
+++ b/src/broadcom/compiler/v3d_compiler.h
@@ -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;
diff --git a/src/broadcom/compiler/vir.c b/src/broadcom/compiler/vir.c
index 1c25da6193c..227f2e39a6b 100644
--- a/src/broadcom/compiler/vir.c
+++ b/src/broadcom/compiler/vir.c
@@ -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,