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:
Matt Turner
2013-04-23 17:19:06 -07:00
parent 6829c18609
commit d55c543c36
6 changed files with 22 additions and 0 deletions

View File

@@ -515,6 +515,7 @@ static const char *const operator_strs[] = {
"bfm",
"ubo_load",
"vector_extract",
"fma",
"lrp",
"bfi",
"bitfield_extract",

View File

@@ -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,
/**

View File

@@ -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);

View File

@@ -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);

View File

@@ -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:

View File

@@ -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: