Builder bld(ctx->program, ctx->block);
unsigned num_bytes = dst.size() * 4;
+ bool dlc = glc && ctx->options->chip_class >= GFX10;
aco_opcode op;
if (dst.type() == RegType::vgpr || (glc && ctx->options->chip_class < GFX8)) {
mubuf->operands[2] = soffset;
mubuf->offen = (offset.type() == RegType::vgpr);
mubuf->glc = glc;
+ mubuf->dlc = dlc;
mubuf->barrier = barrier_buffer;
bld.insert(std::move(mubuf));
emit_split_vector(ctx, lower, 2);
mubuf->operands[2] = soffset;
mubuf->offen = (offset.type() == RegType::vgpr);
mubuf->glc = glc;
+ mubuf->dlc = dlc;
mubuf->barrier = barrier_buffer;
mubuf->offset = const_offset;
aco_ptr<Instruction> instr = std::move(mubuf);
assert(load->operands[1].getTemp().type() == RegType::sgpr);
load->definitions[0] = Definition(dst);
load->glc = glc;
+ load->dlc = dlc;
load->barrier = barrier_buffer;
assert(ctx->options->chip_class >= GFX8 || !glc);
load->operands[1] = Operand(fmask_desc_ptr);
load->definitions[0] = Definition(fmask);
load->glc = false;
+ load->dlc = false;
load->dmask = 0x1;
load->unrm = true;
load->da = da;
store->operands[3] = Operand(data);
store->idxen = true;
store->glc = glc;
+ store->dlc = false;
store->disable_wqm = true;
store->barrier = barrier_image;
ctx->program->needs_exact = true;
store->operands[2] = Operand(s4);
store->operands[3] = Operand(data);
store->glc = glc;
+ store->dlc = false;
store->dmask = (1 << data.size()) - 1;
store->unrm = true;
store->da = should_declare_array(ctx, dim, glsl_sampler_type_is_array(type));
mubuf->offset = 0;
mubuf->idxen = true;
mubuf->glc = return_previous;
+ mubuf->dlc = false; /* Not needed for atomics */
mubuf->disable_wqm = true;
mubuf->barrier = barrier_image;
ctx->program->needs_exact = true;
if (return_previous)
mimg->definitions[0] = Definition(dst);
mimg->glc = return_previous;
+ mimg->dlc = false; /* Not needed for atomics */
mimg->dmask = (1 << data.size()) - 1;
mimg->unrm = true;
mimg->da = should_declare_array(ctx, dim, glsl_sampler_type_is_array(type));
store->operands[1].setFixed(m0);
store->operands[2] = Operand(write_data);
store->glc = nir_intrinsic_access(instr) & (ACCESS_VOLATILE | ACCESS_COHERENT | ACCESS_NON_READABLE);
+ store->dlc = false;
store->disable_wqm = true;
store->barrier = barrier_buffer;
ctx->block->instructions.emplace_back(std::move(store));
store->offset = start * elem_size_bytes;
store->offen = (offset.type() == RegType::vgpr);
store->glc = nir_intrinsic_access(instr) & (ACCESS_VOLATILE | ACCESS_COHERENT | ACCESS_NON_READABLE);
+ store->dlc = false;
store->disable_wqm = true;
store->barrier = barrier_buffer;
ctx->program->needs_exact = true;
mubuf->offset = 0;
mubuf->offen = (offset.type() == RegType::vgpr);
mubuf->glc = return_previous;
+ mubuf->dlc = false; /* Not needed for atomics */
mubuf->disable_wqm = true;
mubuf->barrier = barrier_buffer;
ctx->program->needs_exact = true;
Temp addr = get_ssa_temp(ctx, instr->src[0].ssa);
bool glc = nir_intrinsic_access(instr) & (ACCESS_VOLATILE | ACCESS_COHERENT);
+ bool dlc = glc && ctx->options->chip_class >= GFX10;
aco_opcode op;
if (dst.type() == RegType::vgpr || (glc && ctx->options->chip_class < GFX8)) {
bool global = ctx->options->chip_class >= GFX9;
flat->operands[0] = Operand(addr);
flat->operands[1] = Operand(s1);
flat->glc = glc;
+ flat->dlc = dlc;
if (dst.type() == RegType::sgpr) {
Temp vec = bld.tmp(RegType::vgpr, dst.size());
load->operands[1] = Operand(0u);
load->definitions[0] = Definition(dst);
load->glc = glc;
+ load->dlc = dlc;
load->barrier = barrier_buffer;
assert(ctx->options->chip_class >= GFX8 || !glc);
flat->operands[1] = Operand(s1);
flat->operands[2] = Operand(data);
flat->glc = glc;
+ flat->dlc = false;
flat->offset = offset;
ctx->block->instructions.emplace_back(std::move(flat));
}
}
store->offen = true;
store->glc = true;
+ store->dlc = false;
store->slc = true;
store->can_reorder = true;
ctx->block->instructions.emplace_back(std::move(store));