summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2018-03-21 14:18:08 -0700
committerEric Anholt <[email protected]>2018-03-22 15:12:21 -0700
commitba29b89dc7c7555fc6996fee2d08b9cbcd8b9018 (patch)
treeb1a460b4d08f2a2dbd2f94b4e08d9d52f295e153
parent903e9952fbce28677945325fd3ac6f01b3e560ce (diff)
broadcom/vc5: Set up a vertex position if the shader doesn't.
Our backend needs some sort of vertex position value to emit the scaled viewport values and such. Fixes potential segfaults in KHR-GLES3.copy_tex_image_conversions.required.cubemap_negx_cubemap_negx
-rw-r--r--src/broadcom/compiler/nir_to_vir.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/broadcom/compiler/nir_to_vir.c b/src/broadcom/compiler/nir_to_vir.c
index 75e35067f27..893dfa160aa 100644
--- a/src/broadcom/compiler/nir_to_vir.c
+++ b/src/broadcom/compiler/nir_to_vir.c
@@ -1103,9 +1103,31 @@ emit_vpm_write_setup(struct v3d_compile *c)
v3d33_vir_vpm_write_setup(c);
}
+/**
+ * Sets up c->outputs[c->output_position_index] for the vertex shader
+ * epilogue, if an output vertex position wasn't specified in the user's
+ * shader. This may be the case for transform feedback with rasterizer
+ * discard enabled.
+ */
+static void
+setup_default_position(struct v3d_compile *c)
+{
+ if (c->output_position_index != -1)
+ return;
+
+ c->output_position_index = c->outputs_array_size;
+ for (int i = 0; i < 4; i++) {
+ add_output(c,
+ c->output_position_index + i,
+ VARYING_SLOT_POS, i);
+ }
+}
+
static void
emit_vert_end(struct v3d_compile *c)
{
+ setup_default_position(c);
+
uint32_t vpm_index = 0;
struct qreg rcp_w = vir_SFU(c, V3D_QPU_WADDR_RECIP,
c->outputs[c->output_position_index + 3]);