Mesa (master): glsl/linker: Fix type checks for location aliasing

Iago Toral Quiroga itoral at kemper.freedesktop.org
Thu Oct 26 06:45:48 UTC 2017


Module: Mesa
Branch: master
Commit: 13652e7516a3ef75c5ae75ffa5c7f048629bf772
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=13652e7516a3ef75c5ae75ffa5c7f048629bf772

Author: Iago Toral Quiroga <itoral at igalia.com>
Date:   Wed Oct 25 09:14:22 2017 +0200

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 at alum.mit.edu>

---

 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 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;




More information about the mesa-commit mailing list