glsl/linker: properly fix output variable overlap check
[mesa.git] / 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):