From: Eric Anholt Date: Wed, 17 Apr 2019 21:44:44 +0000 (-0700) Subject: v3d: Fix atomic cmpxchg in shaders on hardware. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=12f6c34806cbb1d9e65ee3d070c753b4b47a6e64;p=mesa.git v3d: Fix atomic cmpxchg in shaders on hardware. In what might be my first case of finding a divergence between hardware and simpenrose for v3d 4.x, it seems that despite what the spec claims, you actually need specific values in the TYPE field for atomic ops. Fixes dEQP-GLES31.functional.*.compswap.* --- diff --git a/src/broadcom/compiler/nir_to_vir.c b/src/broadcom/compiler/nir_to_vir.c index 9a4705a3de6..30fd4002ef9 100644 --- a/src/broadcom/compiler/nir_to_vir.c +++ b/src/broadcom/compiler/nir_to_vir.c @@ -266,14 +266,24 @@ ntq_emit_tmu_general(struct v3d_compile *c, nir_intrinsic_instr *instr, 1 : 0])); } + /* The spec says that for atomics, the TYPE field is ignored, but that + * doesn't seem to be the case for CMPXCHG. Just use the number of + * tmud writes we did to decide the type (or choose "32bit" for atomic + * reads, which has been fine). + */ + int num_components; + if (tmu_op == GENERAL_TMU_WRITE_OP_ATOMIC_CMPXCHG) + num_components = 2; + else + num_components = instr->num_components; + uint32_t config = (0xffffff00 | tmu_op | GENERAL_TMU_LOOKUP_PER_PIXEL); - if (instr->num_components == 1) { + if (num_components == 1) { config |= GENERAL_TMU_LOOKUP_TYPE_32BIT_UI; } else { - config |= (GENERAL_TMU_LOOKUP_TYPE_VEC2 + - instr->num_components - 2); + config |= GENERAL_TMU_LOOKUP_TYPE_VEC2 + num_components - 2; } if (vir_in_nonuniform_control_flow(c)) {