summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2017-12-27 15:38:57 -0800
committerEric Anholt <eric@anholt.net>2018-01-03 14:25:23 -0800
commit8e5a0ed95307fed7cb2bbbb86d1c264bbd070ca0 (patch)
treef5a1a0aa5c8062084d60ed09af8dc88bc37b226c /src
parent2056e4a777bd0eed88ff2762977955b2f2bf2f1c (diff)
broadcom/vc5: Emit flat shade flags for varying components > 24.
This means that with no flatshading we'll emit the single-byte ZERO_ALL_FLAT_SHADE_FLAGS, and otherwise emit a set of FLAT_SHADE_FLAGS to get all the bits we need set. There's a _SET enum in the packet we could use to possibly set entire ranges of the bitfield without using another packet, but this at least fixes the conformance failure.
Diffstat (limited to 'src')
-rw-r--r--src/broadcom/cle/v3d_packet_v33.xml10
-rw-r--r--src/broadcom/compiler/v3d_compiler.h9
-rw-r--r--src/broadcom/compiler/vir.c8
-rw-r--r--src/gallium/drivers/vc5/vc5_emit.c37
4 files changed, 52 insertions, 12 deletions
diff --git a/src/broadcom/cle/v3d_packet_v33.xml b/src/broadcom/cle/v3d_packet_v33.xml
index 0402484dd71..6ec5332aeb7 100644
--- a/src/broadcom/cle/v3d_packet_v33.xml
+++ b/src/broadcom/cle/v3d_packet_v33.xml
@@ -92,6 +92,12 @@
<value name="ANISOTROPIC_16_1" value="15"/>
</enum>
+ <enum name="Flat Shade Action" prefix="V3D_FLAT_SHADE_ACTION">
+ <value name="unchanged" value="0"/>
+ <value name="zeroed" value="1"/>
+ <value name="set" value="2"/>
+ </enum>
+
<packet code="0" name="Halt"/>
<packet code="1" name="NOP"/>
<packet code="4" name="Flush"/>
@@ -357,8 +363,8 @@
<packet code="98" name="Flat Shade Flags">
<field name="Flat Shade Flags for varyings V0*24" size="24" start="8" type="uint"/>
- <field name="Action for Flat Shade Flags of higher numbered varyings" size="2" start="6" type="uint"/>
- <field name="Action for Flat Shade Flags of lower numbered varyings" size="2" start="4" type="uint"/>
+ <field name="Action for Flat Shade Flags of higher numbered varyings" size="2" start="6" type="Flat Shade Action"/>
+ <field name="Action for Flat Shade Flags of lower numbered varyings" size="2" start="4" type="Flat Shade Action"/>
<field name="Varying offset V0" size="4" start="0" type="uint"/>
</packet>
diff --git a/src/broadcom/compiler/v3d_compiler.h b/src/broadcom/compiler/v3d_compiler.h
index 99d58e73ae8..85def2cb02c 100644
--- a/src/broadcom/compiler/v3d_compiler.h
+++ b/src/broadcom/compiler/v3d_compiler.h
@@ -421,7 +421,7 @@ struct v3d_compile {
* flat-shaded. This includes gl_FragColor flat-shading, which is
* customized based on the shademodel_flat shader key.
*/
- BITSET_WORD flat_shade_flags[BITSET_WORDS(V3D_MAX_FS_INPUTS)];
+ uint32_t flat_shade_flags[BITSET_WORDS(V3D_MAX_FS_INPUTS)];
struct v3d_ubo_range *ubo_ranges;
bool *ubo_range_used;
@@ -569,9 +569,12 @@ struct v3d_fs_prog_data {
struct v3d_varying_slot input_slots[V3D_MAX_FS_INPUTS];
- /* Bitmask for whether the corresponding input is flat-shaded.
+ /* Array of flat shade flags.
+ *
+ * Each entry is only 24 bits (high 8 bits 0), to match the hardware
+ * packet layout.
*/
- BITSET_WORD flat_shade_flags[BITSET_WORDS(V3D_MAX_FS_INPUTS)];
+ uint32_t flat_shade_flags[((V3D_MAX_FS_INPUTS - 1) / 24) + 1];
bool writes_z;
bool discard;
diff --git a/src/broadcom/compiler/vir.c b/src/broadcom/compiler/vir.c
index 2589c7f554d..4e78a477bd7 100644
--- a/src/broadcom/compiler/vir.c
+++ b/src/broadcom/compiler/vir.c
@@ -714,8 +714,12 @@ 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));
- memcpy(prog_data->flat_shade_flags, c->flat_shade_flags,
- sizeof(c->flat_shade_flags));
+ STATIC_ASSERT(ARRAY_SIZE(prog_data->flat_shade_flags) >
+ (V3D_MAX_FS_INPUTS - 1) / 24);
+ for (int i = 0; i < V3D_MAX_FS_INPUTS; i++) {
+ if (BITSET_TEST(c->flat_shade_flags, i))
+ prog_data->flat_shade_flags[i / 24] |= 1 << (i % 24);
+ }
}
uint64_t *v3d_compile_fs(const struct v3d_compiler *compiler,
diff --git a/src/gallium/drivers/vc5/vc5_emit.c b/src/gallium/drivers/vc5/vc5_emit.c
index 3914a346e9d..321f59d14c4 100644
--- a/src/gallium/drivers/vc5/vc5_emit.c
+++ b/src/gallium/drivers/vc5/vc5_emit.c
@@ -501,12 +501,39 @@ vc5_emit_state(struct pipe_context *pctx)
emit_textures(vc5, &vc5->verttex);
if (vc5->dirty & VC5_DIRTY_FLAT_SHADE_FLAGS) {
- /* XXX: Need to handle more than 24 entries. */
- cl_emit(&job->bcl, FLAT_SHADE_FLAGS, flags) {
- flags.varying_offset_v0 = 0;
+ bool emitted_any = false;
+
+ for (int i = 0; i < ARRAY_SIZE(vc5->prog.fs->prog_data.fs->flat_shade_flags); i++) {
+ if (!vc5->prog.fs->prog_data.fs->flat_shade_flags[i])
+ continue;
+
+ cl_emit(&job->bcl, FLAT_SHADE_FLAGS, flags) {
+ flags.varying_offset_v0 = i;
+
+ if (emitted_any) {
+ flags.action_for_flat_shade_flags_of_lower_numbered_varyings =
+ V3D_FLAT_SHADE_ACTION_UNCHANGED;
+ flags.action_for_flat_shade_flags_of_higher_numbered_varyings =
+ V3D_FLAT_SHADE_ACTION_UNCHANGED;
+ } else {
+ flags.action_for_flat_shade_flags_of_lower_numbered_varyings =
+ ((i == 0) ?
+ V3D_FLAT_SHADE_ACTION_UNCHANGED :
+ V3D_FLAT_SHADE_ACTION_ZEROED);
+
+ flags.action_for_flat_shade_flags_of_higher_numbered_varyings =
+ V3D_FLAT_SHADE_ACTION_ZEROED;
+ }
+
+ flags.flat_shade_flags_for_varyings_v024 =
+ vc5->prog.fs->prog_data.fs->flat_shade_flags[i];
+ }
+
+ emitted_any = true;
+ }
- flags.flat_shade_flags_for_varyings_v024 =
- vc5->prog.fs->prog_data.fs->flat_shade_flags[0] & 0xfffff;
+ if (!emitted_any) {
+ cl_emit(&job->bcl, ZERO_ALL_FLAT_SHADE_FLAGS, flags);
}
}