diff --git a/src/broadcom/compiler/v3d40_tex.c b/src/broadcom/compiler/v3d40_tex.c index d47d3c30851..2996313e518 100644 --- a/src/broadcom/compiler/v3d40_tex.c +++ b/src/broadcom/compiler/v3d40_tex.c @@ -213,7 +213,7 @@ v3d40_vir_emit_tex(struct v3d_compile *c, nir_tex_instr *instr) (instr->op == nir_texop_lod || memcmp(&p2_unpacked, &p2_unpacked_default, sizeof(p2_unpacked)) != 0); - if (needs_p2_config || output_type_32_bit || + if (output_type_32_bit || nir_tex_instr_need_sampler(instr)) { struct V3D41_TMU_CONFIG_PARAMETER_1 p1_unpacked = { .output_type_32_bit = output_type_32_bit, @@ -244,6 +244,19 @@ v3d40_vir_emit_tex(struct v3d_compile *c, nir_tex_instr *instr) p1_packed |= unit << 24; vir_WRTMUC(c, QUNIFORM_TMU_CONFIG_P1, p1_packed); + } else if (needs_p2_config) { + /* Configuration parameters need to be set up in + * order, and if P2 is needed, you need to set up P1 + * too even if sampler info is not needed by the + * texture operation. But we can set up default info, + * and avoid asking the driver for the sampler state + * address + */ + uint32_t p1_packed_default; + V3D41_TMU_CONFIG_PARAMETER_1_pack(NULL, + (uint8_t *)&p1_packed_default, + &p1_unpacked_default); + vir_WRTMUC(c, QUNIFORM_CONSTANT, p1_packed_default); } if (needs_p2_config)