On 04/08/2017 11:51 AM, Boyan Ding wrote:
Implementation of readFirstInvocationARB() on nvidia hardware needs a
ballotARB(true) used to decide the first active thread. This expressed
in gm107 asm as (supposing output is $r0):
        vote any $r0 0x1 0x1

To model the always true input, which corresponds to the second 0x1
above, we make OP_VOTE accept immediate value 0/1 and emit "0x1" and
"not 0x1" in the src field respectively.
---
  .../drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp  | 21 +++++++++++++++++----
  .../drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp  | 19 ++++++++++++++++---
  .../drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp   | 21 +++++++++++++++++----
  3 files changed, 50 insertions(+), 11 deletions(-)

diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp 
b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp
index e82e3684b0..31af6dcc17 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp
@@ -1615,7 +1615,7 @@ CodeEmitterGK110::emitSHFL(const Instruction *i)
  void
  CodeEmitterGK110::emitVOTE(const Instruction *i)
  {
-   assert(i->src(0).getFile() == FILE_PREDICATE);
+   uint32_t imm;
code[0] = 0x00000002;
     code[1] = 0x86c00000 | (i->subOp << 19);
@@ -1640,9 +1640,22 @@ CodeEmitterGK110::emitVOTE(const Instruction *i)
        code[0] |= 255 << 2;
     if (!(rp & 2))
        code[1] |= 7 << 16;
-   if (i->src(0).mod == Modifier(NV50_IR_MOD_NOT))
-      code[1] |= 1 << 13;
-   srcId(i->src(0), 42);
+
+   switch (i->src(0).getFile()) {
+   case FILE_PREDICATE:
+      if (i->src(0).mod == Modifier(NV50_IR_MOD_NOT))
+         code[0] |= 1 << 13;
+      srcId(i->src(0), 42);
+      break;
+   case FILE_IMMEDIATE:
+      imm = i->src(0).get()->asImm()->reg.data.u32;

Usually we check that asImm() is not NULL, like

imm = i->src(0).get->asImm();
assert(imm);

Same in other emitters.

+      assert(imm == 0 || imm == 1);
+      code[1] |= (imm == 1 ? 0x7 : 0xf) << 10;
+      break;
+   default:
+      assert(!"Unhandled src");
+      break;
+   }
  }
void
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp 
b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp
index 4a741bf45b..ee1046fea0 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp
@@ -2930,7 +2930,7 @@ CodeEmitterGM107::emitMEMBAR()
  void
  CodeEmitterGM107::emitVOTE()
  {
-   assert(insn->src(0).getFile() == FILE_PREDICATE);
+   uint32_t imm;
int r = -1, p = -1;
     for (int i = 0; insn->defExists(i); i++) {
@@ -2950,8 +2950,21 @@ CodeEmitterGM107::emitVOTE()
        emitPRED (0x2d, insn->def(p));
     else
        emitPRED (0x2d);
-   emitField(0x2a, 1, insn->src(0).mod == Modifier(NV50_IR_MOD_NOT));
-   emitPRED (0x27, insn->src(0));
+
+   switch (insn->src(0).getFile()) {
+   case FILE_PREDICATE:
+      emitField(0x2a, 1, insn->src(0).mod == Modifier(NV50_IR_MOD_NOT));
+      emitPRED (0x27, insn->src(0));
+      break;
+   case FILE_IMMEDIATE:
+      imm = insn->src(0).get()->asImm()->reg.data.u32;
+      assert(imm == 0 || imm == 1);
+      emitField(0x27, 4, imm == 1 ? 0x7 : 0xf);
+      break;
+   default:
+      assert(!"Unhandled src");
+      break;
+   }
  }
void
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp 
b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp
index 8dd73bd77d..fafb65743e 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp
@@ -2579,7 +2579,7 @@ CodeEmitterNVC0::emitSHFL(const Instruction *i)
  void
  CodeEmitterNVC0::emitVOTE(const Instruction *i)
  {
-   assert(i->src(0).getFile() == FILE_PREDICATE);
+   uint32_t imm;
code[0] = 0x00000004 | (i->subOp << 5);
     code[1] = 0x48000000;
@@ -2604,9 +2604,22 @@ CodeEmitterNVC0::emitVOTE(const Instruction *i)
        code[0] |= 63 << 14;
     if (!(rp & 2))
        code[1] |= 7 << 22;
-   if (i->src(0).mod == Modifier(NV50_IR_MOD_NOT))
-      code[0] |= 1 << 23;
-   srcId(i->src(0), 20);
+
+   switch (i->src(0).getFile()) {
+   case FILE_PREDICATE:
+      if (i->src(0).mod == Modifier(NV50_IR_MOD_NOT))
+         code[0] |= 1 << 23;
+      srcId(i->src(0), 20);
+      break;
+   case FILE_IMMEDIATE:
+      imm = i->src(0).get()->asImm()->reg.data.u32;
+      assert(imm == 0 || imm == 1);
+      code[0] |= (imm == 1 ? 0x7 : 0xf) << 20;
+      break;
+   default:
+      assert(!"Unhandled src");
+      break;
+   }
  }
bool

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to