[Mesa-dev] [PATCH v3 17/30] nvir/nir: implement nir_intrinsic_load_input
Karol Herbst
kherbst at redhat.com
Sun Jan 7 20:42:35 UTC 2018
v3: and load_output
Signed-off-by: Karol Herbst <kherbst at redhat.com>
---
.../drivers/nouveau/codegen/nv50_ir_from_nir.cpp | 32 ++++++++++++++++++++++
1 file changed, 32 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 74edec0c97..34dbe86551 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp
@@ -1393,6 +1393,38 @@ 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 = nir_intrinsic_base(insn) + getIndirect(&insn->src[0], 0, &indirect);
+ uint8_t offset = insn->const_index[1];
+ nv50_ir_varying& vary = input ? info->in[idx] : info->out[idx];
+
+ if (indirect)
+ indirect = mkOp2v(OP_SHL, TYPE_U32, getSSA(4, FILE_ADDRESS), indirect, mkImm(4));
+
+ for (auto i = 0u; i < insn->num_components; ++i) {
+ assert(i + offset < 4);
+ uint32_t address = vary.slot[i + offset];
+ Symbol *sym = mkSymbol(input ? FILE_SHADER_INPUT : FILE_SHADER_OUTPUT, 0, dType, address * 4);
+ switch(prog->getType()) {
+ case Program::TYPE_FRAGMENT: {
+ operation op;
+ auto mode = translateInterpMode(&vary, op);
+ mkOp2(op, TYPE_F32, newDefs[i], sym, op == OP_PINTERP ? fp.position : nullptr)->setInterpolate(mode);
+ 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
More information about the mesa-dev
mailing list