broadcom/vc5: Set up a vertex position if the shader doesn't.
authorEric Anholt <eric@anholt.net>
Wed, 21 Mar 2018 21:18:08 +0000 (14:18 -0700)
committerEric Anholt <eric@anholt.net>
Thu, 22 Mar 2018 22:12:21 +0000 (15:12 -0700)
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

src/broadcom/compiler/nir_to_vir.c

index 75e35067f27da4edfb467e00521e906576234542..893dfa160aa1216c372ef5356d0d38bd500545aa 100644 (file)
@@ -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]);