diff options
Diffstat (limited to 'src/broadcom/compiler')
-rw-r--r-- | src/broadcom/compiler/v3d_compiler.h | 9 | ||||
-rw-r--r-- | src/broadcom/compiler/vir.c | 8 |
2 files changed, 12 insertions, 5 deletions
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, |