From df8767a14e3eae4dcb8241b731b34e9379706795 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Nicolai=20H=C3=A4hnle?= Date: Wed, 20 Sep 2017 21:56:26 +0200 Subject: [PATCH] glsl/linker: properly fix output variable overlap check Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=102904 Fixes: 15cae12804e ("glsl/linker: fix output variable overlap check") Reviewed-by: Kenneth Graunke --- src/compiler/glsl/linker.cpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp index 422b8ecd13e..f352c5385ca 100644 --- a/src/compiler/glsl/linker.cpp +++ b/src/compiler/glsl/linker.cpp @@ -2884,12 +2884,6 @@ assign_attribute_or_color_locations(void *mem_ctx, } } } - - /* At most one variable per fragment output component should - * reach this. */ - assert(assigned_attr < ARRAY_SIZE(assigned)); - assigned[assigned_attr] = var; - assigned_attr++; } else if (target_index == MESA_SHADER_FRAGMENT || (prog->IsES && prog->data->Version >= 300)) { linker_error(prog, "overlapping location is assigned " @@ -2903,6 +2897,18 @@ assign_attribute_or_color_locations(void *mem_ctx, } } + if (target_index == MESA_SHADER_FRAGMENT && !prog->IsES) { + /* Only track assigned variables for non-ES fragment shaders + * to avoid overflowing the array. + * + * At most one variable per fragment output component should + * reach this. + */ + assert(assigned_attr < ARRAY_SIZE(assigned)); + assigned[assigned_attr] = var; + assigned_attr++; + } + used_locations |= (use_mask << attr); /* From the GL 4.5 core spec, section 11.1.1 (Vertex Attributes): -- 2.30.2