broadcom/vc5: Add support for loading varyings in V3D 4.1.
authorEric Anholt <eric@anholt.net>
Thu, 11 Jan 2018 19:53:13 +0000 (11:53 -0800)
committerEric Anholt <eric@anholt.net>
Sat, 13 Jan 2018 05:57:21 +0000 (21:57 -0800)
The LDVARY signal now writes an arbitrary register, so I took out the
magic src register file and replaced it with an instruction with LDVARY
set so we have somewhere to hang a QFILE_TEMP destination for register
allocation.

src/broadcom/compiler/nir_to_vir.c
src/broadcom/compiler/v3d_compiler.h
src/broadcom/compiler/vir.c
src/broadcom/compiler/vir_dump.c
src/broadcom/compiler/vir_opt_dead_code.c
src/broadcom/compiler/vir_to_qpu.c

index 8f37e3b..955083b 100644 (file)
@@ -395,9 +395,20 @@ static struct qreg
 emit_fragment_varying(struct v3d_compile *c, nir_variable *var,
                       uint8_t swizzle)
 {
-        struct qreg vary = vir_reg(QFILE_VARY, ~0);
+        struct qreg r3 = vir_reg(QFILE_MAGIC, V3D_QPU_WADDR_R3);
         struct qreg r5 = vir_reg(QFILE_MAGIC, V3D_QPU_WADDR_R5);
 
+        struct qreg vary;
+        if (c->devinfo->ver >= 41) {
+                struct qinst *ldvary = vir_add_inst(V3D_QPU_A_NOP, c->undef,
+                                                    c->undef, c->undef);
+                ldvary->qpu.sig.ldvary = true;
+                vary = vir_emit_def(c, ldvary);
+        } else {
+                vir_NOP(c)->qpu.sig.ldvary = true;
+                vary = r3;
+        }
+
         /* For gl_PointCoord input or distance along a line, we'll be called
          * with no nir_variable, and we don't count toward VPM size so we
          * don't track an input slot.
index 1de0bfc..cccb541 100644 (file)
@@ -73,7 +73,6 @@ enum qfile {
          * or physical registers later.
          */
         QFILE_TEMP,
-        QFILE_VARY,
         QFILE_UNIF,
         QFILE_TLB,
         QFILE_TLBU,
index 94593e3..7ea4310 100644 (file)
@@ -110,6 +110,7 @@ vir_has_side_effects(struct v3d_compile *c, struct qinst *inst)
         }
 
         if (inst->qpu.sig.ldtmu ||
+            inst->qpu.sig.ldvary ||
             inst->qpu.sig.wrtmuc ||
             inst->qpu.sig.thrsw) {
                 return true;
@@ -210,7 +211,6 @@ vir_writes_r3(const struct v3d_device_info *devinfo, struct qinst *inst)
 {
         for (int i = 0; i < vir_get_nsrc(inst); i++) {
                 switch (inst->src[i].file) {
-                case QFILE_VARY:
                 case QFILE_VPM:
                         return true;
                 default:
index cdb1928..ef860cb 100644 (file)
@@ -29,7 +29,6 @@ vir_print_reg(struct v3d_compile *c, struct qreg reg)
 {
         static const char *files[] = {
                 [QFILE_TEMP] = "t",
-                [QFILE_VARY] = "v",
                 [QFILE_UNIF] = "u",
                 [QFILE_TLB] = "tlb",
                 [QFILE_TLBU] = "tlbu",
index 9e0ef20..1f9e504 100644 (file)
@@ -78,12 +78,6 @@ has_nonremovable_reads(struct v3d_compile *c, struct qinst *inst)
                         if (total_size == 1)
                                 return true;
                 }
-
-                /* Dead code removal of varyings is tricky, so just assert
-                 * that it all happened at the NIR level.
-                 */
-                if (inst->src[i].file == QFILE_VARY)
-                        return true;
         }
 
         return false;
index 9229fa5..432f156 100644 (file)
@@ -189,12 +189,6 @@ v3d_generate_code_block(struct v3d_compile *c,
 
                                 src[i] = qpu_acc(5);
                                 break;
-                        case QFILE_VARY:
-                                temp = new_qpu_nop_before(qinst);
-                                temp->qpu.sig.ldvary = true;
-
-                                src[i] = qpu_acc(3);
-                                break;
                         case QFILE_SMALL_IMM:
                                 abort(); /* XXX */
 #if 0
@@ -255,7 +249,6 @@ v3d_generate_code_block(struct v3d_compile *c,
                         dst = qpu_magic(V3D_QPU_WADDR_TLBU);
                         break;
 
-                case QFILE_VARY:
                 case QFILE_UNIF:
                 case QFILE_SMALL_IMM:
                 case QFILE_LOAD_IMM: