403
v3d40_image_atomic_tmu_op(nir_intrinsic_instr *instr)
405
nir_atomic_op atomic_op = nir_intrinsic_atomic_op(instr);
407
case nir_atomic_op_iadd: return v3d_get_op_for_atomic_add(instr, 3);
408
case nir_atomic_op_imin: return V3D_TMU_OP_WRITE_SMIN;
409
case nir_atomic_op_umin: return V3D_TMU_OP_WRITE_UMIN_FULL_L1_CLEAR;
410
case nir_atomic_op_imax: return V3D_TMU_OP_WRITE_SMAX;
411
case nir_atomic_op_umax: return V3D_TMU_OP_WRITE_UMAX;
412
case nir_atomic_op_iand: return V3D_TMU_OP_WRITE_AND_READ_INC;
413
case nir_atomic_op_ior: return V3D_TMU_OP_WRITE_OR_READ_DEC;
414
case nir_atomic_op_ixor: return V3D_TMU_OP_WRITE_XOR_READ_NOT;
415
case nir_atomic_op_xchg: return V3D_TMU_OP_WRITE_XCHG_READ_FLUSH;
416
case nir_atomic_op_cmpxchg: return V3D_TMU_OP_WRITE_CMPXCHG_READ_FLUSH;
417
default: unreachable("unknown atomic op");
403
422
v3d40_image_load_store_tmu_op(nir_intrinsic_instr *instr)
405
424
switch (instr->intrinsic) {
406
425
case nir_intrinsic_image_load:
407
426
case nir_intrinsic_image_store:
408
427
return V3D_TMU_OP_REGULAR;
409
case nir_intrinsic_image_atomic_add:
410
return v3d_get_op_for_atomic_add(instr, 3);
411
case nir_intrinsic_image_atomic_imin:
412
return V3D_TMU_OP_WRITE_SMIN;
413
case nir_intrinsic_image_atomic_umin:
414
return V3D_TMU_OP_WRITE_UMIN_FULL_L1_CLEAR;
415
case nir_intrinsic_image_atomic_imax:
416
return V3D_TMU_OP_WRITE_SMAX;
417
case nir_intrinsic_image_atomic_umax:
418
return V3D_TMU_OP_WRITE_UMAX;
419
case nir_intrinsic_image_atomic_and:
420
return V3D_TMU_OP_WRITE_AND_READ_INC;
421
case nir_intrinsic_image_atomic_or:
422
return V3D_TMU_OP_WRITE_OR_READ_DEC;
423
case nir_intrinsic_image_atomic_xor:
424
return V3D_TMU_OP_WRITE_XOR_READ_NOT;
425
case nir_intrinsic_image_atomic_exchange:
426
return V3D_TMU_OP_WRITE_XCHG_READ_FLUSH;
427
case nir_intrinsic_image_atomic_comp_swap:
428
return V3D_TMU_OP_WRITE_CMPXCHG_READ_FLUSH;
429
case nir_intrinsic_image_atomic:
430
case nir_intrinsic_image_atomic_swap:
431
return v3d40_image_atomic_tmu_op(instr);
430
434
unreachable("unknown image intrinsic");
498
502
/* Second atomic argument */
499
if (instr->intrinsic == nir_intrinsic_image_atomic_comp_swap) {
503
if (instr->intrinsic == nir_intrinsic_image_atomic_swap &&
504
nir_intrinsic_atomic_op(instr) == nir_atomic_op_cmpxchg) {
500
505
struct qreg src_4_0 = ntq_get_src(c, instr->src[4], 0);
501
506
vir_TMU_WRITE_or_count(c, V3D_QPU_WADDR_TMUD, src_4_0,
568
573
* amount to add/sub, as that is implicit.
570
575
bool atomic_add_replaced =
571
(instr->intrinsic == nir_intrinsic_image_atomic_add &&
572
(p2_unpacked.op == V3D_TMU_OP_WRITE_AND_READ_INC ||
573
p2_unpacked.op == V3D_TMU_OP_WRITE_OR_READ_DEC));
576
instr->intrinsic == nir_intrinsic_image_atomic &&
577
nir_intrinsic_atomic_op(instr) == nir_atomic_op_iadd &&
578
(p2_unpacked.op == V3D_TMU_OP_WRITE_AND_READ_INC ||
579
p2_unpacked.op == V3D_TMU_OP_WRITE_OR_READ_DEC);
575
581
uint32_t p0_packed;
576
582
V3D41_TMU_CONFIG_PARAMETER_0_pack(NULL,