[Mesa-dev] [PATCH v5 20/34] nvir/nir: implement nir_intrinsic_load_input

Karol Herbst kherbst at redhat.com
Tue Feb 20 21:02:38 UTC 2018


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 <kherbst at 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



More information about the mesa-dev mailing list