glsl: Add support doubles in optimization passes
Signed-off-by: Dave Airlie <airlied@redhat.com> Reviewed-by: Matt Turner <mattst88@gmail.com> Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
This commit is contained in:
@@ -119,6 +119,8 @@ is_valid_vec_const(ir_constant *ir)
|
|||||||
static inline bool
|
static inline bool
|
||||||
is_less_than_one(ir_constant *ir)
|
is_less_than_one(ir_constant *ir)
|
||||||
{
|
{
|
||||||
|
assert(ir->type->base_type == GLSL_TYPE_FLOAT);
|
||||||
|
|
||||||
if (!is_valid_vec_const(ir))
|
if (!is_valid_vec_const(ir))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -134,6 +136,8 @@ is_less_than_one(ir_constant *ir)
|
|||||||
static inline bool
|
static inline bool
|
||||||
is_greater_than_zero(ir_constant *ir)
|
is_greater_than_zero(ir_constant *ir)
|
||||||
{
|
{
|
||||||
|
assert(ir->type->base_type == GLSL_TYPE_FLOAT);
|
||||||
|
|
||||||
if (!is_valid_vec_const(ir))
|
if (!is_valid_vec_const(ir))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -559,7 +563,9 @@ ir_algebraic_visitor::handle_expression(ir_expression *ir)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case ir_binop_div:
|
case ir_binop_div:
|
||||||
if (is_vec_one(op_const[0]) && ir->type->base_type == GLSL_TYPE_FLOAT) {
|
if (is_vec_one(op_const[0]) && (
|
||||||
|
ir->type->base_type == GLSL_TYPE_FLOAT ||
|
||||||
|
ir->type->base_type == GLSL_TYPE_DOUBLE)) {
|
||||||
return new(mem_ctx) ir_expression(ir_unop_rcp,
|
return new(mem_ctx) ir_expression(ir_unop_rcp,
|
||||||
ir->operands[1]->type,
|
ir->operands[1]->type,
|
||||||
ir->operands[1],
|
ir->operands[1],
|
||||||
@@ -580,7 +586,7 @@ ir_algebraic_visitor::handle_expression(ir_expression *ir)
|
|||||||
unsigned components[4] = { 0 }, count = 0;
|
unsigned components[4] = { 0 }, count = 0;
|
||||||
|
|
||||||
for (unsigned c = 0; c < op_const[i]->type->vector_elements; c++) {
|
for (unsigned c = 0; c < op_const[i]->type->vector_elements; c++) {
|
||||||
if (op_const[i]->value.f[c] == 0.0)
|
if (op_const[i]->is_zero())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
components[count] = c;
|
components[count] = c;
|
||||||
@@ -596,7 +602,7 @@ ir_algebraic_visitor::handle_expression(ir_expression *ir)
|
|||||||
|
|
||||||
/* Swizzle both operands to remove the channels that were zero. */
|
/* Swizzle both operands to remove the channels that were zero. */
|
||||||
return new(mem_ctx)
|
return new(mem_ctx)
|
||||||
ir_expression(op, glsl_type::float_type,
|
ir_expression(op, ir->type,
|
||||||
new(mem_ctx) ir_swizzle(ir->operands[0],
|
new(mem_ctx) ir_swizzle(ir->operands[0],
|
||||||
components, count),
|
components, count),
|
||||||
new(mem_ctx) ir_swizzle(ir->operands[1],
|
new(mem_ctx) ir_swizzle(ir->operands[1],
|
||||||
@@ -833,7 +839,19 @@ ir_algebraic_visitor::handle_expression(ir_expression *ir)
|
|||||||
return mul(ir->operands[1], ir->operands[2]);
|
return mul(ir->operands[1], ir->operands[2]);
|
||||||
} else if (is_vec_zero(op_const[1])) {
|
} else if (is_vec_zero(op_const[1])) {
|
||||||
unsigned op2_components = ir->operands[2]->type->vector_elements;
|
unsigned op2_components = ir->operands[2]->type->vector_elements;
|
||||||
ir_constant *one = new(mem_ctx) ir_constant(1.0f, op2_components);
|
ir_constant *one;
|
||||||
|
|
||||||
|
switch (ir->type->base_type) {
|
||||||
|
case GLSL_TYPE_FLOAT:
|
||||||
|
one = new(mem_ctx) ir_constant(1.0f, op2_components);
|
||||||
|
break;
|
||||||
|
case GLSL_TYPE_DOUBLE:
|
||||||
|
one = new(mem_ctx) ir_constant(1.0, op2_components);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
unreachable("unexpected type");
|
||||||
|
}
|
||||||
|
|
||||||
return mul(ir->operands[0], add(one, neg(ir->operands[2])));
|
return mul(ir->operands[0], add(one, neg(ir->operands[2])));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@@ -194,6 +194,9 @@ ir_constant_propagation_visitor::handle_rvalue(ir_rvalue **rvalue)
|
|||||||
case GLSL_TYPE_FLOAT:
|
case GLSL_TYPE_FLOAT:
|
||||||
data.f[i] = found->constant->value.f[rhs_channel];
|
data.f[i] = found->constant->value.f[rhs_channel];
|
||||||
break;
|
break;
|
||||||
|
case GLSL_TYPE_DOUBLE:
|
||||||
|
data.d[i] = found->constant->value.d[rhs_channel];
|
||||||
|
break;
|
||||||
case GLSL_TYPE_INT:
|
case GLSL_TYPE_INT:
|
||||||
data.i[i] = found->constant->value.i[rhs_channel];
|
data.i[i] = found->constant->value.i[rhs_channel];
|
||||||
break;
|
break;
|
||||||
|
@@ -133,6 +133,14 @@ compare_components(ir_constant *a, ir_constant *b)
|
|||||||
else
|
else
|
||||||
foundequal = true;
|
foundequal = true;
|
||||||
break;
|
break;
|
||||||
|
case GLSL_TYPE_DOUBLE:
|
||||||
|
if (a->value.d[c0] < b->value.d[c1])
|
||||||
|
foundless = true;
|
||||||
|
else if (a->value.d[c0] > b->value.d[c1])
|
||||||
|
foundgreater = true;
|
||||||
|
else
|
||||||
|
foundequal = true;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
unreachable("not reached");
|
unreachable("not reached");
|
||||||
}
|
}
|
||||||
@@ -178,6 +186,11 @@ combine_constant(bool ismin, ir_constant *a, ir_constant *b)
|
|||||||
(!ismin && b->value.f[i] > c->value.f[i]))
|
(!ismin && b->value.f[i] > c->value.f[i]))
|
||||||
c->value.f[i] = b->value.f[i];
|
c->value.f[i] = b->value.f[i];
|
||||||
break;
|
break;
|
||||||
|
case GLSL_TYPE_DOUBLE:
|
||||||
|
if ((ismin && b->value.d[i] < c->value.d[i]) ||
|
||||||
|
(!ismin && b->value.d[i] > c->value.d[i]))
|
||||||
|
c->value.d[i] = b->value.d[i];
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
assert(!"not reached");
|
assert(!"not reached");
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user