glsl: Add support for new fma built-in in ARB_gpu_shader5.
v2: Add constant folding support. Reviewed-by: Paul Berry <stereotype441@gmail.com> Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
@@ -515,6 +515,7 @@ static const char *const operator_strs[] = {
|
||||
"bfm",
|
||||
"ubo_load",
|
||||
"vector_extract",
|
||||
"fma",
|
||||
"lrp",
|
||||
"bfi",
|
||||
"bitfield_extract",
|
||||
|
@@ -1169,6 +1169,13 @@ enum ir_expression_operation {
|
||||
*/
|
||||
ir_last_binop = ir_binop_vector_extract,
|
||||
|
||||
/**
|
||||
* \name Fused floating-point multiply-add, part of ARB_gpu_shader5.
|
||||
*/
|
||||
/*@{*/
|
||||
ir_triop_fma,
|
||||
/*@}*/
|
||||
|
||||
ir_triop_lrp,
|
||||
|
||||
/**
|
||||
|
@@ -1375,6 +1375,17 @@ ir_expression::constant_expression_value(struct hash_table *variable_context)
|
||||
break;
|
||||
}
|
||||
|
||||
case ir_triop_fma:
|
||||
assert(op[0]->type->base_type == GLSL_TYPE_FLOAT);
|
||||
assert(op[1]->type->base_type == GLSL_TYPE_FLOAT);
|
||||
assert(op[2]->type->base_type == GLSL_TYPE_FLOAT);
|
||||
|
||||
for (unsigned c = 0; c < components; c++) {
|
||||
data.f[c] = op[0]->value.f[c] * op[1]->value.f[c]
|
||||
+ op[2]->value.f[c];
|
||||
}
|
||||
break;
|
||||
|
||||
case ir_triop_lrp: {
|
||||
assert(op[0]->type->base_type == GLSL_TYPE_FLOAT);
|
||||
assert(op[1]->type->base_type == GLSL_TYPE_FLOAT);
|
||||
|
@@ -522,6 +522,7 @@ ir_validate::visit_leave(ir_expression *ir)
|
||||
&& ir->operands[1]->type->is_integer());
|
||||
break;
|
||||
|
||||
case ir_triop_fma:
|
||||
case ir_triop_lrp:
|
||||
assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT);
|
||||
assert(ir->operands[0]->type == ir->operands[1]->type);
|
||||
|
@@ -1492,6 +1492,7 @@ ir_to_mesa_visitor::visit(ir_expression *ir)
|
||||
|
||||
case ir_binop_vector_extract:
|
||||
case ir_binop_bfm:
|
||||
case ir_triop_fma:
|
||||
case ir_triop_bfi:
|
||||
case ir_triop_bitfield_extract:
|
||||
case ir_triop_vector_insert:
|
||||
|
@@ -1972,6 +1972,7 @@ glsl_to_tgsi_visitor::visit(ir_expression *ir)
|
||||
case ir_unop_find_msb:
|
||||
case ir_unop_find_lsb:
|
||||
case ir_binop_bfm:
|
||||
case ir_triop_fma:
|
||||
case ir_triop_bfi:
|
||||
case ir_triop_bitfield_extract:
|
||||
case ir_quadop_bitfield_insert:
|
||||
|
Reference in New Issue
Block a user