summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/vc4/vc4_program.c
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2014-09-25 14:57:01 -0700
committerEric Anholt <[email protected]>2014-10-14 11:29:48 +0100
commitb5fc9d5664d08d2e47ae89bf580e43732346a694 (patch)
treea491d70780565b0908ee273b35875b3565af1934 /src/gallium/drivers/vc4/vc4_program.c
parenta2fd55cfb65d3933c27ed6c2259966a98acc55eb (diff)
vc4: Add support for having 0 vertex elements used.
You have to load at least 1, according to the simulator. Fixes 4 piglit tests and even more ES2 conformance tests.
Diffstat (limited to 'src/gallium/drivers/vc4/vc4_program.c')
-rw-r--r--src/gallium/drivers/vc4/vc4_program.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/gallium/drivers/vc4/vc4_program.c b/src/gallium/drivers/vc4/vc4_program.c
index 3056c6736af..c6034257e42 100644
--- a/src/gallium/drivers/vc4/vc4_program.c
+++ b/src/gallium/drivers/vc4/vc4_program.c
@@ -1619,6 +1619,29 @@ emit_point_size_write(struct vc4_compile *c)
qir_VPM_WRITE(c, point_size);
}
+/**
+ * Emits a VPM read of the stub vertex attribute set up by vc4_draw.c.
+ *
+ * The simulator insists that there be at least one vertex attribute, so
+ * vc4_draw.c will emit one if it wouldn't have otherwise. The simulator also
+ * insists that all vertex attributes loaded get read by the VS/CS, so we have
+ * to consume it here.
+ */
+static void
+emit_stub_vpm_read(struct vc4_compile *c)
+{
+ if (c->num_inputs)
+ return;
+
+ for (int i = 0; i < 4; i++) {
+ qir_emit(c, qir_inst(QOP_VPM_READ,
+ qir_get_temp(c),
+ c->undef,
+ c->undef));
+ c->num_inputs++;
+ }
+}
+
static void
emit_vert_end(struct vc4_compile *c,
struct vc4_varying_semantic *fs_inputs,
@@ -1626,6 +1649,7 @@ emit_vert_end(struct vc4_compile *c,
{
struct qreg rcp_w = qir_RCP(c, c->outputs[3]);
+ emit_stub_vpm_read(c);
emit_scaled_viewport_write(c, rcp_w);
emit_zs_write(c, rcp_w);
emit_rcp_wc_write(c, rcp_w);
@@ -1658,6 +1682,8 @@ emit_coord_end(struct vc4_compile *c)
{
struct qreg rcp_w = qir_RCP(c, c->outputs[3]);
+ emit_stub_vpm_read(c);
+
for (int i = 0; i < 4; i++)
qir_VPM_WRITE(c, c->outputs[i]);