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 <kher...@redhat.com> --- .../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 mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev