diff options
author | Iago Toral Quiroga <[email protected]> | 2017-10-25 09:14:22 +0200 |
---|---|---|
committer | Iago Toral Quiroga <[email protected]> | 2017-10-26 08:40:14 +0200 |
commit | 13652e7516a3ef75c5ae75ffa5c7f048629bf772 (patch) | |
tree | 67ca7c8ffa6410cc0b6f28010e757f5856b569d1 /src | |
parent | 7276ccf8edb0a1ba610cc07edf73b1f0cecaa1f6 (diff) |
glsl/linker: Fix type checks for location aliasing
From the OpenGL 4.6 spec, section 4.4.1 Input Layout Qualifiers, Page 68,
(Location aliasing):
"Further, when location aliasing, the aliases sharing the location
must have the same underlying numerical type (floating-point or
integer)."
The current implementation is too strict, since it checks that the
the base types are an exact match instead.
Reviewed-by: Ilia Mirkin <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/glsl/link_varyings.cpp | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/src/compiler/glsl/link_varyings.cpp b/src/compiler/glsl/link_varyings.cpp index 7b1fe255b60..70e4b8c7f70 100644 --- a/src/compiler/glsl/link_varyings.cpp +++ b/src/compiler/glsl/link_varyings.cpp @@ -405,13 +405,28 @@ compute_variable_location_slot(ir_variable *var, gl_shader_stage stage) struct explicit_location_info { ir_variable *var; - unsigned base_type; + unsigned numerical_type; unsigned interpolation; bool centroid; bool sample; bool patch; }; +static inline unsigned +get_numerical_type(const glsl_type *type) +{ + /* From the OpenGL 4.6 spec, section 4.4.1 Input Layout Qualifiers, Page 68, + * (Location aliasing): + * + * "Further, when location aliasing, the aliases sharing the location + * must have the same underlying numerical type (floating-point or + * integer) + */ + if (type->is_float() || type->is_double()) + return GLSL_TYPE_FLOAT; + return GLSL_TYPE_INT; +} + static bool check_location_aliasing(struct explicit_location_info explicit_locations[][4], ir_variable *var, @@ -456,7 +471,8 @@ check_location_aliasing(struct explicit_location_info explicit_locations[][4], /* For all other used components we need to have matching * types, interpolation and auxiliary storage */ - if (info->base_type != type->without_array()->base_type) { + if (info->numerical_type != + get_numerical_type(type->without_array())) { linker_error(prog, "Varyings sharing the same location must " "have the same underlying numerical type. " @@ -486,7 +502,7 @@ check_location_aliasing(struct explicit_location_info explicit_locations[][4], } } else if (comp >= component && comp < last_comp) { info->var = var; - info->base_type = type->without_array()->base_type; + info->numerical_type = get_numerical_type(type->without_array()); info->interpolation = interpolation; info->centroid = centroid; info->sample = sample; |