glsl/linker: properly fix output variable overlap check
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Wed, 20 Sep 2017 19:56:26 +0000 (21:56 +0200)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Thu, 21 Sep 2017 09:04:21 +0000 (11:04 +0200)
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=102904
Fixes: 15cae12804e ("glsl/linker: fix output variable overlap check")
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/compiler/glsl/linker.cpp

index 422b8ecd13e58993fd324d1653cbc32822e24f2f..f352c5385ca501b52533279bc60915a18018556c 100644 (file)
@@ -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):