summaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
authorKarol Herbst <[email protected]>2018-01-09 03:22:00 +0100
committerKarol Herbst <[email protected]>2019-03-17 10:33:28 +0100
commite8d9be40cbaf4922adec34a2e8106c04e2c7660d (patch)
treedafe57c69966dc3850a57f82b348804681750940 /src/gallium
parent39929a81645e3f27c3a65faf355f11826043e50b (diff)
nv50/ir/nir: add loadFrom and storeTo helpler
v8: don't require C++11 features Signed-off-by: Karol Herbst <[email protected]>
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp72
1 files changed, 72 insertions, 0 deletions
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp
index a0a36d95b41..d3cba9a63c3 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp
@@ -93,6 +93,13 @@ private:
bool centroid,
unsigned semantics);
+ Instruction *loadFrom(DataFile, uint8_t, DataType, Value *def, uint32_t base,
+ uint8_t c, Value *indirect0 = NULL,
+ Value *indirect1 = NULL, bool patch = false);
+ void storeTo(nir_intrinsic_instr *, DataFile, operation, DataType,
+ Value *src, uint8_t idx, uint8_t c, Value *indirect0 = NULL,
+ Value *indirect1 = NULL);
+
bool isFloatType(nir_alu_type);
bool isSignedType(nir_alu_type);
bool isResultFloat(nir_op);
@@ -969,6 +976,71 @@ Converter::getSlotAddress(nir_intrinsic_instr *insn, uint8_t idx, uint8_t slot)
return vary[idx].slot[slot] * 4;
}
+Instruction *
+Converter::loadFrom(DataFile file, uint8_t i, DataType ty, Value *def,
+ uint32_t base, uint8_t c, Value *indirect0,
+ Value *indirect1, bool patch)
+{
+ unsigned int tySize = typeSizeof(ty);
+
+ if (tySize == 8 &&
+ (file == FILE_MEMORY_CONST || file == FILE_MEMORY_BUFFER || indirect0)) {
+ Value *lo = getSSA();
+ Value *hi = getSSA();
+
+ Instruction *loi =
+ mkLoad(TYPE_U32, lo,
+ mkSymbol(file, i, TYPE_U32, base + c * tySize),
+ indirect0);
+ loi->setIndirect(0, 1, indirect1);
+ loi->perPatch = patch;
+
+ Instruction *hii =
+ mkLoad(TYPE_U32, hi,
+ mkSymbol(file, i, TYPE_U32, base + c * tySize + 4),
+ indirect0);
+ hii->setIndirect(0, 1, indirect1);
+ hii->perPatch = patch;
+
+ return mkOp2(OP_MERGE, ty, def, lo, hi);
+ } else {
+ Instruction *ld =
+ mkLoad(ty, def, mkSymbol(file, i, ty, base + c * tySize), indirect0);
+ ld->setIndirect(0, 1, indirect1);
+ ld->perPatch = patch;
+ return ld;
+ }
+}
+
+void
+Converter::storeTo(nir_intrinsic_instr *insn, DataFile file, operation op,
+ DataType ty, Value *src, uint8_t idx, uint8_t c,
+ Value *indirect0, Value *indirect1)
+{
+ uint8_t size = typeSizeof(ty);
+ uint32_t address = getSlotAddress(insn, idx, c);
+
+ if (size == 8 && indirect0) {
+ Value *split[2];
+ mkSplit(split, 4, src);
+
+ if (op == OP_EXPORT) {
+ split[0] = mkMov(getSSA(), split[0], ty)->getDef(0);
+ split[1] = mkMov(getSSA(), split[1], ty)->getDef(0);
+ }
+
+ mkStore(op, TYPE_U32, mkSymbol(file, 0, TYPE_U32, address), indirect0,
+ split[0])->perPatch = info->out[idx].patch;
+ mkStore(op, TYPE_U32, mkSymbol(file, 0, TYPE_U32, address + 4), indirect0,
+ split[1])->perPatch = info->out[idx].patch;
+ } else {
+ if (op == OP_EXPORT)
+ src = mkMov(getSSA(size), src, ty)->getDef(0);
+ mkStore(op, ty, mkSymbol(file, 0, ty, address), indirect0,
+ src)->perPatch = info->out[idx].patch;
+ }
+}
+
bool
Converter::run()
{