nv/codegen: Vector store ssbo/global/shared/scratc

Reviewed-by: Karol Herbst <kherbst@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24984>
This commit is contained in:
M Henning 2023-08-26 16:51:52 -04:00 committed by Marge Bot
parent 710f5703cd
commit 3dbb28dc89

View file

@ -146,6 +146,9 @@ private:
void storeTo(nir_intrinsic_instr *, DataFile, operation, DataType, void storeTo(nir_intrinsic_instr *, DataFile, operation, DataType,
Value *src, uint8_t idx, uint8_t c, Value *indirect0 = NULL, Value *src, uint8_t idx, uint8_t c, Value *indirect0 = NULL,
Value *indirect1 = NULL); Value *indirect1 = NULL);
Instruction *storeVector(nir_intrinsic_instr *insn,
uint8_t buffer, Value *indirectBuffer,
uint32_t offset, Value *indirectOffset);
static nir_mem_access_size_align static nir_mem_access_size_align
getMemAccessSizeAlign(nir_intrinsic_op intrin, getMemAccessSizeAlign(nir_intrinsic_op intrin,
uint8_t bytes, uint8_t bytes,
@ -1336,6 +1339,36 @@ Converter::storeTo(nir_intrinsic_instr *insn, DataFile file, operation op,
} }
} }
Instruction *
Converter::storeVector(nir_intrinsic_instr *insn,
uint8_t buffer, Value *indirectBuffer,
uint32_t offset, Value *indirectOffset)
{
const uint8_t num_components = insn->src[0].ssa->num_components;
uint32_t bytes = insn->src[0].ssa->bit_size / 8 * num_components;
DataType ty = typeOfSize(bytes, false, false);
DataFile file = getFile(insn->intrinsic);
assert(nir_intrinsic_write_mask(insn) == nir_component_mask(num_components));
Value* src;
if (num_components == 1) {
src = getSrc(&insn->src[0], 0);
} else {
src = getSSA(bytes);
Instruction *merge = mkOp(OP_MERGE, ty, src);
for (int i = 0; i < num_components; i++) {
merge->setSrc(i, getSrc(&insn->src[0], i));
}
}
Instruction *st = mkStore(OP_STORE, ty, mkSymbol(file, buffer, ty, offset),
indirectOffset, src);
st->setIndirect(0, 1, indirectBuffer);
return st;
}
nir_mem_access_size_align nir_mem_access_size_align
Converter::getMemAccessSizeAlign(nir_intrinsic_op intrin, Converter::getMemAccessSizeAlign(nir_intrinsic_op intrin,
uint8_t original_bytes, uint8_t original_bytes,
@ -2142,7 +2175,6 @@ Converter::visit(nir_intrinsic_instr *insn)
break; break;
} }
case nir_intrinsic_store_ssbo: { case nir_intrinsic_store_ssbo: {
DataType sType = getSType(insn->src[0], false, false);
Value *indirectBuffer; Value *indirectBuffer;
Value *indirectOffset; Value *indirectOffset;
uint32_t buffer = getIndirect(&insn->src[1], 0, indirectBuffer); uint32_t buffer = getIndirect(&insn->src[1], 0, indirectBuffer);
@ -2150,15 +2182,8 @@ Converter::visit(nir_intrinsic_instr *insn)
CacheMode cache = convert(nir_intrinsic_access(insn)); CacheMode cache = convert(nir_intrinsic_access(insn));
for (uint8_t i = 0u; i < nir_intrinsic_src_components(insn, 0); ++i) { storeVector(insn, buffer, indirectBuffer, offset, indirectOffset)->cache = cache;
if (!((1u << i) & nir_intrinsic_write_mask(insn)))
continue;
Symbol *sym = mkSymbol(getFile(op), buffer, sType,
offset + i * typeSizeof(sType));
Instruction *st = mkStore(OP_STORE, sType, sym, indirectOffset, getSrc(&insn->src[0], i));
st->setIndirect(0, 1, indirectBuffer);
st->cache = cache;
}
info_out->io.globalAccess |= 0x2; info_out->io.globalAccess |= 0x2;
break; break;
} }
@ -2360,18 +2385,12 @@ Converter::visit(nir_intrinsic_instr *insn)
} }
case nir_intrinsic_store_scratch: case nir_intrinsic_store_scratch:
case nir_intrinsic_store_shared: { case nir_intrinsic_store_shared: {
DataType sType = getSType(insn->src[0], false, false);
Value *indirectOffset; Value *indirectOffset;
uint32_t offset = getIndirect(&insn->src[1], 0, indirectOffset); uint32_t offset = getIndirect(&insn->src[1], 0, indirectOffset);
if (indirectOffset) if (indirectOffset)
indirectOffset = mkOp1v(OP_MOV, TYPE_U32, getSSA(4, FILE_ADDRESS), indirectOffset); indirectOffset = mkOp1v(OP_MOV, TYPE_U32, getSSA(4, FILE_ADDRESS), indirectOffset);
for (uint8_t i = 0u; i < nir_intrinsic_src_components(insn, 0); ++i) { storeVector(insn, 0, nullptr, offset, indirectOffset);
if (!((1u << i) & nir_intrinsic_write_mask(insn)))
continue;
Symbol *sym = mkSymbol(getFile(op), 0, sType, offset + i * typeSizeof(sType));
mkStore(OP_STORE, sType, sym, indirectOffset, getSrc(&insn->src[0], i));
}
break; break;
} }
case nir_intrinsic_load_kernel_input: { case nir_intrinsic_load_kernel_input: {
@ -2445,25 +2464,10 @@ Converter::visit(nir_intrinsic_instr *insn)
break; break;
} }
case nir_intrinsic_store_global: { case nir_intrinsic_store_global: {
DataType sType = getSType(insn->src[0], false, false); Value *indirectOffset;
uint32_t offset = getIndirect(&insn->src[1], 0, indirectOffset);
for (auto i = 0u; i < nir_intrinsic_src_components(insn, 0); ++i) { storeVector(insn, 0, nullptr, offset, indirectOffset);
if (!((1u << i) & nir_intrinsic_write_mask(insn)))
continue;
if (typeSizeof(sType) == 8) {
Value *split[2];
mkSplit(split, 4, getSrc(&insn->src[0], i));
Symbol *sym = mkSymbol(getFile(op), 0, TYPE_U32, i * typeSizeof(sType));
mkStore(OP_STORE, TYPE_U32, sym, getSrc(&insn->src[1], 0), split[0]);
sym = mkSymbol(getFile(op), 0, TYPE_U32, i * typeSizeof(sType) + 4);
mkStore(OP_STORE, TYPE_U32, sym, getSrc(&insn->src[1], 0), split[1]);
} else {
Symbol *sym = mkSymbol(getFile(op), 0, sType, i * typeSizeof(sType));
mkStore(OP_STORE, sType, sym, getSrc(&insn->src[1], 0), getSrc(&insn->src[0], i));
}
}
info_out->io.globalAccess |= 0x2; info_out->io.globalAccess |= 0x2;
break; break;