~mmach/netext73/mesa-ryzen

« back to all changes in this revision

Viewing changes to src/broadcom/compiler/v3d40_tex.c

  • Committer: mmach
  • Date: 2023-11-02 21:31:35 UTC
  • Revision ID: netbit73@gmail.com-20231102213135-18d4tzh7tj0uz752
2023-11-02 22:11:57

Show diffs side-by-side

added added

removed removed

Lines of Context:
400
400
}
401
401
 
402
402
static uint32_t
 
403
v3d40_image_atomic_tmu_op(nir_intrinsic_instr *instr)
 
404
{
 
405
        nir_atomic_op atomic_op = nir_intrinsic_atomic_op(instr);
 
406
        switch (atomic_op) {
 
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");
 
418
        }
 
419
}
 
420
 
 
421
static uint32_t
403
422
v3d40_image_load_store_tmu_op(nir_intrinsic_instr *instr)
404
423
{
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;
 
428
 
 
429
        case nir_intrinsic_image_atomic:
 
430
        case nir_intrinsic_image_atomic_swap:
 
431
                return v3d40_image_atomic_tmu_op(instr);
 
432
 
429
433
        default:
430
434
                unreachable("unknown image intrinsic");
431
435
        };
496
500
                }
497
501
 
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,
502
507
                                               tmu_writes);
568
573
         * amount to add/sub, as that is implicit.
569
574
         */
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);
574
580
 
575
581
        uint32_t p0_packed;
576
582
        V3D41_TMU_CONFIG_PARAMETER_0_pack(NULL,