summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIago Toral Quiroga <itoral@igalia.com>2017-10-25 09:14:22 +0200
committerIago Toral Quiroga <itoral@igalia.com>2017-10-26 08:40:14 +0200
commit13652e7516a3ef75c5ae75ffa5c7f048629bf772 (patch)
tree67ca7c8ffa6410cc0b6f28010e757f5856b569d1
parent7276ccf8edb0a1ba610cc07edf73b1f0cecaa1f6 (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 <imirkin@alum.mit.edu>
-rw-r--r--src/compiler/glsl/link_varyings.cpp22
1 files changed, 19 insertions, 3 deletions
diff --git a/src/compiler/glsl/link_varyings.cpp b/src/compiler/glsl/link_varyings.cpp
index 7b1fe255b6..70e4b8c7f7 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;