[Mesa-dev] [PATCH 2/2] Revert "glsl: check total count of multi-slot double vertex attribs"

Matt Turner mattst88 at gmail.com
Tue Sep 1 15:57:10 PDT 2015


This reverts commit ad208d975a6d3aebe14f7c2c16039ee200d8b30c.

This code attempted to ensure that we didn't use more than the maximum
number of attribute slots, but it did not consider attribute aliasing so
it would miscount slots used by aliased attributes and incorrectly
reject valid shaders.

Worse, the code to handle attribute double slots was just working around
a mistake in count_attribute_slots() (Fixed by previous patch).

Moreover the check seems to be unnecessary, since setting attributes via
ARB_explicit_attrib_location properly checks if the attribute is in
bounds, and the linker properly checks if other attributes fit into the
limits.

Fixes deQP functional.attribute_location.bind_aliasing.max_cond_* tests.
Cc: "10.6 11.0" <mesa-stable at lists.freedesktop.org>

 Conflicts:
	src/glsl/linker.cpp
---
 src/glsl/linker.cpp | 41 +----------------------------------------
 1 file changed, 1 insertion(+), 40 deletions(-)

diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
index 47f7d25..ed28049 100644
--- a/src/glsl/linker.cpp
+++ b/src/glsl/linker.cpp
@@ -2389,7 +2389,6 @@ assign_attribute_or_color_locations(gl_shader_program *prog,
    } to_assign[16];
 
    unsigned num_attr = 0;
-   unsigned total_attribs_size = 0;
 
    foreach_in_list(ir_instruction, node, sh->ir) {
       ir_variable *const var = node->as_variable();
@@ -2450,41 +2449,12 @@ assign_attribute_or_color_locations(gl_shader_program *prog,
          return false;
       }
 
-      const unsigned slots = var->type->count_attribute_slots();
-
-      /* From GL4.5 core spec, section 11.1.1 (Vertex Attributes):
-       *
-       * "A program with more than the value of MAX_VERTEX_ATTRIBS active
-       * attribute variables may fail to link, unless device-dependent
-       * optimizations are able to make the program fit within available
-       * hardware resources. For the purposes of this test, attribute variables
-       * of the type dvec3, dvec4, dmat2x3, dmat2x4, dmat3, dmat3x4, dmat4x3,
-       * and dmat4 may count as consuming twice as many attributes as equivalent
-       * single-precision types. While these types use the same number of
-       * generic attributes as their single-precision equivalents,
-       * implementations are permitted to consume two single-precision vectors
-       * of internal storage for each three- or four-component double-precision
-       * vector."
-       * Until someone has a good reason in Mesa, enforce that now.
-       */
-      if (target_index == MESA_SHADER_VERTEX) {
-	 total_attribs_size += slots;
-	 if (var->type->without_array() == glsl_type::dvec3_type ||
-	     var->type->without_array() == glsl_type::dvec4_type ||
-	     var->type->without_array() == glsl_type::dmat2x3_type ||
-	     var->type->without_array() == glsl_type::dmat2x4_type ||
-	     var->type->without_array() == glsl_type::dmat3_type ||
-	     var->type->without_array() == glsl_type::dmat3x4_type ||
-	     var->type->without_array() == glsl_type::dmat4x3_type ||
-	     var->type->without_array() == glsl_type::dmat4_type)
-	    total_attribs_size += slots;
-      }
-
       /* If the variable is not a built-in and has a location statically
        * assigned in the shader (presumably via a layout qualifier), make sure
        * that it doesn't collide with other assigned locations.  Otherwise,
        * add it to the list of variables that need linker-assigned locations.
        */
+      const unsigned slots = var->type->count_attribute_slots();
       if (var->data.location != -1) {
 	 if (var->data.location >= generic_base && var->data.index < 1) {
 	    /* From page 61 of the OpenGL 4.0 spec:
@@ -2604,15 +2574,6 @@ assign_attribute_or_color_locations(gl_shader_program *prog,
       num_attr++;
    }
 
-   if (target_index == MESA_SHADER_VERTEX) {
-      if (total_attribs_size > max_index) {
-	 linker_error(prog,
-		      "attempt to use %d vertex attribute slots only %d available ",
-		      total_attribs_size, max_index);
-	 return false;
-      }
-   }
-
    /* If all of the attributes were assigned locations by the application (or
     * are built-in attributes with fixed locations), return early.  This should
     * be the common case.
-- 
2.4.6



More information about the mesa-dev mailing list