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 <airlied@redhat.com>
Reviewed-by: Oded Gabbay <oded.gabbay@gmail.com>
Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com>
This commit is contained in:
Dave Airlie 2015-12-09 16:06:46 +10:00 committed by Timothy Arceri
parent 9fbcd8e847
commit d97b060e6f
2 changed files with 9 additions and 9 deletions

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

View 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
*/