case nir_tex_src_offset: {
if (nir_src_is_const(instr->src[i].src)) {
p2_unpacked.offset_s = nir_src_comp_as_int(instr->src[i].src, 0);
- if (instr->coord_components >= 2)
+ if (non_array_components >= 2)
p2_unpacked.offset_t =
nir_src_comp_as_int(instr->src[i].src, 1);
if (non_array_components >= 3)
(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,
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)