v4: use smarter getIndirect helper use new getSlotAddress helper Signed-off-by: Karol Herbst <kher...@redhat.com> --- .../drivers/nouveau/codegen/nv50_ir_from_nir.cpp | 25 ++++++++++++++++++++++ 1 file changed, 25 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 aeeca94f4c..0a78c6a593 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp @@ -1870,6 +1870,31 @@ Converter::visit(nir_intrinsic_instr *insn) } break; } + case nir_intrinsic_load_per_vertex_output: { + const DataType dType = getDType(insn); + LValues &newDefs = convert(&insn->dest); + Value *indirectVertex; + Value *indirectOffset; + auto baseVertex = getIndirect(&insn->src[0], 0, &indirectVertex); + auto idx = getIndirect(insn, 1, 0, 16, &indirectOffset); + Value *vtxBase = nullptr; + + if (indirectVertex) + vtxBase = indirectVertex; + else + vtxBase = loadImm(nullptr, baseVertex); + + vtxBase = mkOp2v(OP_ADD, TYPE_U32, getSSA(4, FILE_ADDRESS), outBase, vtxBase); + + for (auto i = 0u; i < insn->num_components; ++i) { + uint32_t address = getSlotAddress(false, idx, nir_intrinsic_component(insn) + i, dType, 4); + Symbol *sym = mkSymbol(FILE_SHADER_OUTPUT, 0, dType, address); + Instruction *ld = mkLoad(dType, newDefs[i], sym, indirectOffset); + ld->setIndirect(0, 1, vtxBase); + ld->perPatch = info->in[idx].patch; + } + break; + } case nir_intrinsic_emit_vertex: case nir_intrinsic_end_primitive: { auto idx = nir_intrinsic_stream_id(insn); -- 2.14.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev