From ba29b89dc7c7555fc6996fee2d08b9cbcd8b9018 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Wed, 21 Mar 2018 14:18:08 -0700 Subject: [PATCH] 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 --- src/broadcom/compiler/nir_to_vir.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) 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]); -- 2.30.2