glsl/fp64: add helper for dual slot double detection.
authorDave Airlie <airlied@redhat.com>
Wed, 9 Dec 2015 06:06:46 +0000 (16:06 +1000)
committerTimothy Arceri <timothy.arceri@collabora.com>
Sat, 19 Dec 2015 00:59:49 +0000 (11:59 +1100)
The old function didn't work for matrices, and we need this
in other places to fix some other problems, so move to a helper
in glsl type and fix the one user so far.

A dual slot double is one that has 3 or 4 components in it's
base type.

Signed-off-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Oded Gabbay <oded.gabbay@gmail.com>
Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com>
src/glsl/ir_set_program_inouts.cpp
src/glsl/nir/glsl_types.h

index 70d754f3175f042e048df09269aa579928071430..782f1b1ebc82508738845e6ccd4a2271c82e72de 100644 (file)
@@ -81,13 +81,6 @@ is_shader_inout(ir_variable *var)
           var->data.mode == ir_var_system_value;
 }
 
-static inline bool
-is_dual_slot(ir_variable *var)
-{
-   const glsl_type *type = var->type->without_array();
-   return type == glsl_type::dvec4_type || type == glsl_type::dvec3_type;
-}
-
 static void
 mark(struct gl_program *prog, ir_variable *var, int offset, int len,
      gl_shader_stage stage)
@@ -101,7 +94,6 @@ mark(struct gl_program *prog, ir_variable *var, int offset, int len,
     */
 
    for (int i = 0; i < len; i++) {
-      bool dual_slot = is_dual_slot(var);
       int idx = var->data.location + var->data.index + offset + i;
       bool is_patch_generic = var->data.patch &&
                               idx != VARYING_SLOT_TESS_LEVEL_INNER &&
@@ -123,7 +115,7 @@ mark(struct gl_program *prog, ir_variable *var, int offset, int len,
          else
             prog->InputsRead |= bitfield;
 
-         if (dual_slot)
+         if (var->type->without_array()->is_dual_slot_double())
             prog->DoubleInputsRead |= bitfield;
          if (stage == MESA_SHADER_FRAGMENT) {
             gl_fragment_program *fprog = (gl_fragment_program *) prog;
index d8a999ad44ec561ac45da51135d93aae33ac200b..26f25a1d3f340bd0d58d4077553a8e4a5168443e 100644 (file)
@@ -470,6 +470,14 @@ struct glsl_type {
       return base_type == GLSL_TYPE_DOUBLE;
    }
 
+   /**
+    * Query whether a double takes two slots.
+    */
+   bool is_dual_slot_double() const
+   {
+      return base_type == GLSL_TYPE_DOUBLE && vector_elements > 2;
+   }
+
    /**
     * Query whether or not a type is a non-array boolean type
     */