- case nir_intrinsic_image_deref_atomic_add:
- case nir_intrinsic_image_deref_atomic_and:
- case nir_intrinsic_image_deref_atomic_comp_swap:
- case nir_intrinsic_image_deref_atomic_exchange:
- case nir_intrinsic_image_deref_atomic_imax:
- case nir_intrinsic_image_deref_atomic_umax:
- case nir_intrinsic_image_deref_atomic_imin:
- case nir_intrinsic_image_deref_atomic_umin:
- case nir_intrinsic_image_deref_atomic_or:
- case nir_intrinsic_image_deref_atomic_xor:
- case nir_intrinsic_image_deref_load:
- case nir_intrinsic_image_deref_samples:
- case nir_intrinsic_image_deref_size:
- case nir_intrinsic_image_deref_store: {
- const nir_variable *tex;
- std::vector<Value*> srcs, defs;
- Value *indirect;
- DataType ty;
-
- uint32_t mask = 0;
- nir_deref_instr *deref = nir_src_as_deref(insn->src[0]);
- const glsl_type *type = deref->type;
- TexInstruction::Target target =
- convert((glsl_sampler_dim)type->sampler_dimensionality,
- type->sampler_array, type->sampler_shadow);
- unsigned int argCount = getNIRArgCount(target);
- uint16_t location = handleDeref(deref, indirect, tex);
-
- if (opInfo.has_dest) {
- LValues &newDefs = convert(&insn->dest);
- for (uint8_t i = 0u; i < newDefs.size(); ++i) {
- defs.push_back(newDefs[i]);
- mask |= 1 << i;
- }
- }
-
- switch (op) {
- case nir_intrinsic_image_deref_atomic_add:
- case nir_intrinsic_image_deref_atomic_and:
- case nir_intrinsic_image_deref_atomic_comp_swap:
- case nir_intrinsic_image_deref_atomic_exchange:
- case nir_intrinsic_image_deref_atomic_imax:
- case nir_intrinsic_image_deref_atomic_umax:
- case nir_intrinsic_image_deref_atomic_imin:
- case nir_intrinsic_image_deref_atomic_umin:
- case nir_intrinsic_image_deref_atomic_or:
- case nir_intrinsic_image_deref_atomic_xor:
- ty = getDType(insn);
- mask = 0x1;
- info->io.globalAccess |= 0x2;
- break;
- case nir_intrinsic_image_deref_load:
- ty = TYPE_U32;
- info->io.globalAccess |= 0x1;
- break;
- case nir_intrinsic_image_deref_store:
- ty = TYPE_U32;
- mask = 0xf;
- info->io.globalAccess |= 0x2;
- break;
- case nir_intrinsic_image_deref_samples:
- mask = 0x8;
- ty = TYPE_U32;
- break;
- case nir_intrinsic_image_deref_size:
- ty = TYPE_U32;
- break;
- default:
- unreachable("unhandled image opcode");
- break;
- }
-
- // coords
- if (opInfo.num_srcs >= 2)
- for (unsigned int i = 0u; i < argCount; ++i)
- srcs.push_back(getSrc(&insn->src[1], i));
-
- // the sampler is just another src added after coords
- if (opInfo.num_srcs >= 3 && target.isMS())
- srcs.push_back(getSrc(&insn->src[2], 0));
-
- if (opInfo.num_srcs >= 4) {
- unsigned components = opInfo.src_components[3] ? opInfo.src_components[3] : insn->num_components;
- for (uint8_t i = 0u; i < components; ++i)
- srcs.push_back(getSrc(&insn->src[3], i));
- }
-
- if (opInfo.num_srcs >= 5)
- // 1 for aotmic swap
- for (uint8_t i = 0u; i < opInfo.src_components[4]; ++i)
- srcs.push_back(getSrc(&insn->src[4], i));
-
- TexInstruction *texi = mkTex(getOperation(op), target.getEnum(), location, 0, defs, srcs);
- texi->tex.bindless = false;
- texi->tex.format = nv50_ir::TexInstruction::translateImgFormat(tex->data.image.format);
- texi->tex.mask = mask;
- texi->cache = getCacheModeFromVar(tex);
- texi->setType(ty);
- texi->subOp = getSubOp(op);
-
- if (indirect)
- texi->setIndirectR(indirect);
-
- break;
- }