From: Dave Airlie Date: Wed, 9 Dec 2015 06:06:46 +0000 (+1000) Subject: glsl/fp64: add helper for dual slot double detection. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d97b060e6f305ce4ad050881944404b920c86edf;p=mesa.git glsl/fp64: add helper for dual slot double detection. 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 Reviewed-by: Oded Gabbay Reviewed-by: Timothy Arceri --- diff --git a/src/glsl/ir_set_program_inouts.cpp b/src/glsl/ir_set_program_inouts.cpp index 70d754f3175..782f1b1ebc8 100644 --- a/src/glsl/ir_set_program_inouts.cpp +++ b/src/glsl/ir_set_program_inouts.cpp @@ -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; diff --git a/src/glsl/nir/glsl_types.h b/src/glsl/nir/glsl_types.h index d8a999ad44e..26f25a1d3f3 100644 --- a/src/glsl/nir/glsl_types.h +++ b/src/glsl/nir/glsl_types.h @@ -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 */