summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKenneth Graunke <[email protected]>2013-06-18 04:22:31 -0700
committerKenneth Graunke <[email protected]>2013-06-26 11:25:12 -0700
commit4530ed4f26bb887413a4ed4a5b6df7bf9ff9fc9e (patch)
treeb263f00b849f465a781d854c4de9430458e2e62b
parentd367a1cbdb816bcc50fb1fd10121de6eba53f7ab (diff)
glsl: Stop being clever with pointer arithmetic when fetching types.
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 <[email protected]> Reviewed-by: Eric Anholt <[email protected]>
-rw-r--r--src/glsl/glsl_types.cpp8
1 files changed, 4 insertions, 4 deletions
diff --git a/src/glsl/glsl_types.cpp b/src/glsl/glsl_types.cpp
index a5491c58a47..d1d609ae6f1 100644
--- a/src/glsl/glsl_types.cpp
+++ b/src/glsl/glsl_types.cpp
@@ -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;
}