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:
@@ -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;
|
||||||
|
Reference in New Issue
Block a user