vc4: Consume the implicit varyings for points and lines.
authorEric Anholt <eric@anholt.net>
Tue, 12 Aug 2014 22:50:53 +0000 (15:50 -0700)
committerEric Anholt <eric@anholt.net>
Fri, 15 Aug 2014 19:00:32 +0000 (12:00 -0700)
We were triggering simulator assertion failures for not consuming these,
and presumably we want to actually make use of them some day (for things
like point/line antialiasing)

Note that this has the qreg index as 0, which is the same index as the
first GL varyings read.  This doesn't matter currently, since that number
isn't used for anything except dumping.

src/gallium/drivers/vc4/vc4_context.h
src/gallium/drivers/vc4/vc4_draw.c
src/gallium/drivers/vc4/vc4_program.c

index bdd174cd365de15e0a07135db237f5453ba5a620..641609b65e9eedf8f3305ef8f05efef48dbd92c4 100644 (file)
@@ -227,6 +227,6 @@ void vc4_flush(struct pipe_context *pctx);
 void vc4_flush_for_bo(struct pipe_context *pctx, struct vc4_bo *bo);
 void vc4_emit_state(struct pipe_context *pctx);
 void vc4_generate_code(struct qcompile *c);
-void vc4_update_compiled_shaders(struct vc4_context *vc4);
+void vc4_update_compiled_shaders(struct vc4_context *vc4, uint8_t prim_mode);
 
 #endif /* VC4_CONTEXT_H */
index ec218d379e99a6c96c759a5ca846a07ea18a60b2..3f19862f5ea1c47a2047f10778dc8e89b24219a7 100644 (file)
@@ -99,7 +99,7 @@ vc4_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info)
         }
 
         vc4_start_draw(vc4);
-        vc4_update_compiled_shaders(vc4);
+        vc4_update_compiled_shaders(vc4, info->mode);
 
         vc4_emit_state(pctx);
 
index c87ea52c25e5b428899b56d5a47cad7bb627233f..e99abc6d3bd3575e63dd95b0fa37d47f6c48cd58 100644 (file)
@@ -47,6 +47,8 @@ struct tgsi_to_qir {
         struct qreg *outputs;
         struct qreg *uniforms;
         struct qreg *consts;
+        struct qreg line_x, point_x, point_y;
+
         uint32_t num_consts;
 
         struct pipe_shader_state *shader_state;
@@ -68,6 +70,8 @@ struct vc4_fs_key {
         struct vc4_key base;
         enum pipe_format color_format;
         bool depth_enabled;
+        bool is_points;
+        bool is_lines;
 };
 
 struct vc4_vs_key {
@@ -600,20 +604,28 @@ emit_fragcoord_input(struct tgsi_to_qir *trans, int attr)
         trans->inputs[attr * 4 + 3] = qir_FRAG_RCP_W(c);
 }
 
+static struct qreg
+emit_fragment_varying(struct tgsi_to_qir *trans, int index)
+{
+        struct qcompile *c = trans->c;
+
+        struct qreg vary = {
+                QFILE_VARY,
+                index
+        };
+
+        /* XXX: multiply by W */
+        return qir_VARY_ADD_C(c, qir_MOV(c, vary));
+}
+
 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));
+                        emit_fragment_varying(trans, attr * 4 + i);
                 c->num_inputs++;
         }
 }
@@ -906,6 +918,12 @@ vc4_shader_tgsi_to_qir(struct vc4_compiled_shader *shader, enum qstage stage,
         switch (stage) {
         case QSTAGE_FRAG:
                 trans->fs_key = (struct vc4_fs_key *)key;
+                if (trans->fs_key->is_points) {
+                        trans->point_x = emit_fragment_varying(trans, 0);
+                        trans->point_y = emit_fragment_varying(trans, 0);
+                } else if (trans->fs_key->is_lines) {
+                        trans->line_x = emit_fragment_varying(trans, 0);
+                }
                 break;
         case QSTAGE_VERT:
                 trans->vs_key = (struct vc4_vs_key *)key;
@@ -1047,13 +1065,16 @@ vc4_vs_compile(struct vc4_context *vc4, struct vc4_compiled_shader *shader,
 }
 
 static void
-vc4_update_compiled_fs(struct vc4_context *vc4)
+vc4_update_compiled_fs(struct vc4_context *vc4, uint8_t prim_mode)
 {
         struct vc4_fs_key local_key;
         struct vc4_fs_key *key = &local_key;
 
         memset(key, 0, sizeof(*key));
         key->base.shader_state = vc4->prog.bind_fs;
+        key->is_points = (prim_mode == PIPE_PRIM_POINTS);
+        key->is_lines = (prim_mode >= PIPE_PRIM_LINES &&
+                         prim_mode <= PIPE_PRIM_LINE_STRIP);
 
         if (vc4->framebuffer.cbufs[0])
                 key->color_format = vc4->framebuffer.cbufs[0]->format;
@@ -1101,9 +1122,9 @@ vc4_update_compiled_vs(struct vc4_context *vc4)
 }
 
 void
-vc4_update_compiled_shaders(struct vc4_context *vc4)
+vc4_update_compiled_shaders(struct vc4_context *vc4, uint8_t prim_mode)
 {
-        vc4_update_compiled_fs(vc4);
+        vc4_update_compiled_fs(vc4, prim_mode);
         vc4_update_compiled_vs(vc4);
 }