diff options
author | Eric Anholt <[email protected]> | 2017-12-27 15:38:57 -0800 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2018-01-03 14:25:23 -0800 |
commit | 8e5a0ed95307fed7cb2bbbb86d1c264bbd070ca0 (patch) | |
tree | f5a1a0aa5c8062084d60ed09af8dc88bc37b226c | |
parent | 2056e4a777bd0eed88ff2762977955b2f2bf2f1c (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.
-rw-r--r-- | src/broadcom/cle/v3d_packet_v33.xml | 10 | ||||
-rw-r--r-- | src/broadcom/compiler/v3d_compiler.h | 9 | ||||
-rw-r--r-- | src/broadcom/compiler/vir.c | 8 | ||||
-rw-r--r-- | src/gallium/drivers/vc5/vc5_emit.c | 37 |
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); } } |