vc4: Refactor shader input setup again.
authorEric Anholt <eric@anholt.net>
Tue, 5 Aug 2014 21:23:40 +0000 (14:23 -0700)
committerEric Anholt <eric@anholt.net>
Mon, 11 Aug 2014 21:47:54 +0000 (14:47 -0700)
This makes some space for handling special inputs like fragcoords.

src/gallium/drivers/vc4/vc4_program.c

index 82526300879624aeb2dcff90394b2adc9fc77fb6..8109f635e3b3968a3e008ec904badb2efaa3d994 100644 (file)
@@ -569,6 +569,24 @@ emit_vertex_input(struct tgsi_to_qir *trans, int attr)
         }
 }
 
+static void
+emit_fragment_input(struct tgsi_to_qir *trans, int attr)
+{
+        struct qcompile *c = trans->c;
+
+        for (int i = 0; i < 4; i++) {
+                struct qreg vary = {
+                        QFILE_VARY,
+                        attr * 4 + i
+                };
+
+                /* XXX: multiply by W */
+                trans->inputs[attr * 4 + i] =
+                        qir_VARY_ADD_C(c, qir_MOV(c, vary));
+                c->num_inputs++;
+        }
+}
+
 static void
 emit_tgsi_declaration(struct tgsi_to_qir *trans,
                       struct tgsi_full_declaration *decl)
@@ -577,23 +595,12 @@ emit_tgsi_declaration(struct tgsi_to_qir *trans,
 
         switch (decl->Declaration.File) {
         case TGSI_FILE_INPUT:
-                if (c->stage == QSTAGE_FRAG) {
-                        for (int i = decl->Range.First * 4;
-                             i < (decl->Range.Last + 1) * 4;
-                             i++) {
-                                struct qreg vary = {
-                                        QFILE_VARY,
-                                        i
-                                };
-                                trans->inputs[i] =
-                                        qir_VARY_ADD_C(c, qir_MOV(c, vary));
-
-                                c->num_inputs++;
-                        }
-                } else {
-                        for (int i = decl->Range.First;
-                             i <= decl->Range.Last;
-                             i++) {
+                for (int i = decl->Range.First;
+                     i <= decl->Range.Last;
+                     i++) {
+                        if (c->stage == QSTAGE_FRAG) {
+                                emit_fragment_input(trans, i);
+                        } else {
                                 emit_vertex_input(trans, i);
                         }
                 }