From 8731a1beb72da8f4165e5596519a56d16299c3f0 Mon Sep 17 00:00:00 2001 From: Rhys Perry Date: Thu, 4 Feb 2021 14:10:59 +0000 Subject: [PATCH] lavapipe: fix initialization of pipe_stream_output with unwritten outputs nir_assign_io_var_locations() does not use outputs_written when assigning driver locations. Use driver_location to avoid incorrectly guessing what locations it assigned. Signed-off-by: Rhys Perry Reviewed-by: Dave Airlie Part-of: --- src/gallium/frontends/lavapipe/lvp_pipeline.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/gallium/frontends/lavapipe/lvp_pipeline.c b/src/gallium/frontends/lavapipe/lvp_pipeline.c index b158419ddde..938b557046b 100644 --- a/src/gallium/frontends/lavapipe/lvp_pipeline.c +++ b/src/gallium/frontends/lavapipe/lvp_pipeline.c @@ -681,13 +681,14 @@ lvp_pipeline_compile(struct lvp_pipeline *pipeline, stage == MESA_SHADER_TESS_EVAL) { xfb_info = nir_gather_xfb_info(pipeline->pipeline_nir[stage], NULL); if (xfb_info) { - unsigned num_outputs = 0; uint8_t output_mapping[VARYING_SLOT_TESS_MAX]; memset(output_mapping, 0, sizeof(output_mapping)); - for (unsigned attr = 0; attr < VARYING_SLOT_MAX; attr++) { - if (pipeline->pipeline_nir[stage]->info.outputs_written & BITFIELD64_BIT(attr)) - output_mapping[attr] = num_outputs++; + nir_foreach_shader_out_variable(var, pipeline->pipeline_nir[stage]) { + unsigned slots = var->data.compact ? DIV_ROUND_UP(glsl_get_length(var->type), 4) + : glsl_count_attribute_slots(var->type, false); + for (unsigned i = 0; i < slots; i++) + output_mapping[var->data.location + i] = var->data.driver_location + i; } shstate.stream_output.num_outputs = xfb_info->output_count;