[Mesa-dev] [PATCH v2 10/8] glsl/linker: Fix type checks for location aliasing
Ilia Mirkin
imirkin at alum.mit.edu
Wed Oct 25 12:30:50 UTC 2017
On Wed, Oct 25, 2017 at 5:15 AM, Iago Toral Quiroga <itoral at igalia.com> wrote:
> 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.
> ---
> src/compiler/glsl/link_varyings.cpp | 22 +++++++++++++++++++---
> 1 file changed, 19 insertions(+), 3 deletions(-)
>
> diff --git a/src/compiler/glsl/link_varyings.cpp b/src/compiler/glsl/link_varyings.cpp
> index 8767f00976..26d3157c1e 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)
This is open to interpretation. In my version, I also disallowed
mixing doubles with floats, and int64's with ints (or floats or
doubles).
I don't object to this interpretation, but perhaps you can raise a
question with Khronos regarding what exactly is incompatible.
Either way, this patch is Reviewed-by: Ilia Mirkin <imirkin at alum.mit.edu>
> + */
> + 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;
> --
> 2.11.0
>
More information about the mesa-dev
mailing list