glsl: Stop being clever with pointer arithmetic when fetching types.
authorKenneth Graunke <kenneth@whitecape.org>
Tue, 18 Jun 2013 11:22:31 +0000 (04:22 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Wed, 26 Jun 2013 18:25:12 +0000 (11:25 -0700)
Currently, vector types are linked together closely: the glsl_type
objects for float, vec2, vec3, and vec4 are all elements of the same
array, in that exact order.  This makes it possible to obtain vector
types via pointer arithmetic on the scalar type's convenience pointer.
For example, float_type + (3 - 1) = vec3.

However, relying on this is extremely fragile.  There's no particular
reason the underlying type objects need to be stored in an array.  They
could be individual class members, possibly with padding between them.
Then the pointer arithmetic would break, and we'd get bad pointers to
non-heap allocated data, causing subtle breakage that can't be detected
by valgrind.  Cue insanity.

Or someone could simply reorder the type variables, causing us to get
the wrong type entirely.  Also cue insanity.

Writing this explicitly is much safer.  With the new helper functions,
it's a bit less code even.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Eric Anholt <eric@anholt.net>
src/glsl/glsl_types.cpp

index a5491c58a47e2f6a9cf852ffe47372ff4dc7ee89..d1d609ae6f1ce86a61ffb097d8252f45407b84d4 100644 (file)
@@ -600,13 +600,13 @@ glsl_type::get_instance(unsigned base_type, unsigned rows, unsigned columns)
    if (columns == 1) {
       switch (base_type) {
       case GLSL_TYPE_UINT:
-        return uint_type + (rows - 1);
+        return uvec(rows);
       case GLSL_TYPE_INT:
-        return int_type + (rows - 1);
+        return ivec(rows);
       case GLSL_TYPE_FLOAT:
-        return float_type + (rows - 1);
+        return vec(rows);
       case GLSL_TYPE_BOOL:
-        return bool_type + (rows - 1);
+        return bvec(rows);
       default:
         return error_type;
       }