v3: and load_output
v4: use smarter getIndirect helper
use new getSlotAddress helper
v5: don't use const_offset directly
fix for indirects
Signed-off-by: Karol Herbst <[email protected]>
---
.../drivers/nouveau/codegen/nv50_ir_from_nir.cpp | 46 ++++++++++++++++++++++
1 file changed, 46 insertions(+)
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 fb1ee33138..ebcb5e4e9c 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp
@@ -1501,6 +1501,52 @@ Converter::visit(nir_intrinsic_instr *insn)
}
break;
}
+ case nir_intrinsic_load_input:
+ case nir_intrinsic_load_output: {
+ const DataType dType = getDType(insn);
+ Value *indirect;
+ bool input = op == nir_intrinsic_load_input;
+
+ LValues &newDefs = convert(&insn->dest);
+ auto idx = getIndirect(insn, 0, 0, &indirect);
+ nv50_ir_varying& vary = input ? info->in[idx] : info->out[idx];
+
+ for (auto i = 0u; i < insn->num_components; ++i) {
+ uint32_t address = getSlotAddress(insn, idx, i);
+ Symbol *sym = mkSymbol(input ? FILE_SHADER_INPUT :
FILE_SHADER_OUTPUT, 0, dType, address);
+ switch(prog->getType()) {
+ case Program::TYPE_FRAGMENT: {
+ operation op;
+ auto mode = translateInterpMode(&vary, op);
+ if (typeSizeof(dType) == 8) {
+ Value *lo = getSSA();
+ Value *hi = getSSA();
+ Instruction *interp;
+
+ interp = mkOp2(op, TYPE_U32, lo, sym, op == OP_PINTERP ?
fp.position : nullptr);
+ interp->setInterpolate(mode);
+ interp->setIndirect(0, 0, indirect);
+
+ Symbol *sym1 = mkSymbol(input ? FILE_SHADER_INPUT :
FILE_SHADER_OUTPUT, 0, dType, address + 4);
+ interp = mkOp2(op, TYPE_U32, hi, sym1, op == OP_PINTERP ?
fp.position : nullptr);
+ interp->setInterpolate(mode);
+ interp->setIndirect(0, 0, indirect);
+
+ mkOp2(OP_MERGE, dType, newDefs[i], lo, hi);
+ } else {
+ Instruction *interp = mkOp2(op, dType, newDefs[i], sym, op ==
OP_PINTERP ? fp.position : nullptr);
+ interp->setInterpolate(mode);
+ interp->setIndirect(0, 0, indirect);
+ }
+ break;
+ }
+ default:
+ mkLoad(dType, newDefs[i], sym, indirect)->perPatch = vary.patch;
+ break;
+ }
+ }
+ break;
+ }
default:
ERROR("unknown nir_intrinsic_op %s\n", nir_intrinsic_infos[op].name);
return false;
--
2.14.3
_______________________________________________
mesa-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-dev