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:
parent
9fbcd8e847
commit
d97b060e6f
|
@ -81,13 +81,6 @@ is_shader_inout(ir_variable *var)
|
||||||
var->data.mode == ir_var_system_value;
|
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
|
static void
|
||||||
mark(struct gl_program *prog, ir_variable *var, int offset, int len,
|
mark(struct gl_program *prog, ir_variable *var, int offset, int len,
|
||||||
gl_shader_stage stage)
|
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++) {
|
for (int i = 0; i < len; i++) {
|
||||||
bool dual_slot = is_dual_slot(var);
|
|
||||||
int idx = var->data.location + var->data.index + offset + i;
|
int idx = var->data.location + var->data.index + offset + i;
|
||||||
bool is_patch_generic = var->data.patch &&
|
bool is_patch_generic = var->data.patch &&
|
||||||
idx != VARYING_SLOT_TESS_LEVEL_INNER &&
|
idx != VARYING_SLOT_TESS_LEVEL_INNER &&
|
||||||
|
@ -123,7 +115,7 @@ mark(struct gl_program *prog, ir_variable *var, int offset, int len,
|
||||||
else
|
else
|
||||||
prog->InputsRead |= bitfield;
|
prog->InputsRead |= bitfield;
|
||||||
|
|
||||||
if (dual_slot)
|
if (var->type->without_array()->is_dual_slot_double())
|
||||||
prog->DoubleInputsRead |= bitfield;
|
prog->DoubleInputsRead |= bitfield;
|
||||||
if (stage == MESA_SHADER_FRAGMENT) {
|
if (stage == MESA_SHADER_FRAGMENT) {
|
||||||
gl_fragment_program *fprog = (gl_fragment_program *) prog;
|
gl_fragment_program *fprog = (gl_fragment_program *) prog;
|
||||||
|
|
|
@ -470,6 +470,14 @@ struct glsl_type {
|
||||||
return base_type == GLSL_TYPE_DOUBLE;
|
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
|
* Query whether or not a type is a non-array boolean type
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue