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>
This commit is contained in:
Iago Toral Quiroga
2017-10-25 09:14:22 +02:00
parent 7276ccf8ed
commit 13652e7516

View File

@@ -405,13 +405,28 @@ compute_variable_location_slot(ir_variable *var, gl_shader_stage stage)
struct explicit_location_info { struct explicit_location_info {
ir_variable *var; ir_variable *var;
unsigned base_type; unsigned numerical_type;
unsigned interpolation; unsigned interpolation;
bool centroid; bool centroid;
bool sample; bool sample;
bool patch; 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 static bool
check_location_aliasing(struct explicit_location_info explicit_locations[][4], check_location_aliasing(struct explicit_location_info explicit_locations[][4],
ir_variable *var, 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 /* For all other used components we need to have matching
* types, interpolation and auxiliary storage * 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, linker_error(prog,
"Varyings sharing the same location must " "Varyings sharing the same location must "
"have the same underlying numerical type. " "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) { } else if (comp >= component && comp < last_comp) {
info->var = var; info->var = var;
info->base_type = type->without_array()->base_type; info->numerical_type = get_numerical_type(type->without_array());
info->interpolation = interpolation; info->interpolation = interpolation;
info->centroid = centroid; info->centroid = centroid;
info->sample = sample; info->sample = sample;