glsl: Add support for new bit built-ins in ARB_gpu_shader5.

v2: Move use of ir_binop_bfm and ir_triop_bfi to a later patch.

Reviewed-by: Chris Forbes <chrisf@ijw.co.nz>
This commit is contained in:
Matt Turner
2013-04-09 17:45:12 -07:00
parent 44d3287ecd
commit 499d8c6545
6 changed files with 71 additions and 5 deletions

View File

@@ -419,7 +419,7 @@ ir_expression::get_num_operands(ir_expression_operation op)
if (op <= ir_last_triop) if (op <= ir_last_triop)
return 3; return 3;
if (op == ir_quadop_vector) if (op <= ir_last_quadop)
return 4; return 4;
assert(false); assert(false);
@@ -477,6 +477,10 @@ static const char *const operator_strs[] = {
"unpackHalf2x16", "unpackHalf2x16",
"unpackHalf2x16_split_x", "unpackHalf2x16_split_x",
"unpackHalf2x16_split_y", "unpackHalf2x16_split_y",
"bitfield_reverse",
"bit_count",
"find_msb",
"find_lsb",
"noise", "noise",
"+", "+",
"-", "-",
@@ -506,6 +510,8 @@ static const char *const operator_strs[] = {
"packHalf2x16_split", "packHalf2x16_split",
"ubo_load", "ubo_load",
"lrp", "lrp",
"bitfield_extract",
"bitfield_insert",
"vector", "vector",
}; };

View File

@@ -1033,6 +1033,16 @@ enum ir_expression_operation {
ir_unop_unpack_half_2x16_split_y, ir_unop_unpack_half_2x16_split_y,
/*@}*/ /*@}*/
/**
* \name Bit operations, part of ARB_gpu_shader5.
*/
/*@{*/
ir_unop_bitfield_reverse,
ir_unop_bit_count,
ir_unop_find_msb,
ir_unop_find_lsb,
/*@}*/
ir_unop_noise, ir_unop_noise,
/** /**
@@ -1123,13 +1133,22 @@ enum ir_expression_operation {
ir_triop_lrp, ir_triop_lrp,
ir_triop_bitfield_extract,
/** /**
* A sentinel marking the last of the ternary operations. * A sentinel marking the last of the ternary operations.
*/ */
ir_last_triop = ir_triop_lrp, ir_last_triop = ir_triop_bitfield_extract,
ir_quadop_bitfield_insert,
ir_quadop_vector, ir_quadop_vector,
/**
* A sentinel marking the last of the ternary operations.
*/
ir_last_quadop = ir_quadop_vector,
/** /**
* A sentinel marking the last of all operations. * A sentinel marking the last of all operations.
*/ */

View File

@@ -361,6 +361,19 @@ ir_validate::visit_leave(ir_expression *ir)
assert(ir->operands[0]->type == glsl_type::uint_type); assert(ir->operands[0]->type == glsl_type::uint_type);
break; break;
case ir_unop_bitfield_reverse:
assert(ir->operands[0]->type == ir->type);
assert(ir->type->is_integer());
break;
case ir_unop_bit_count:
case ir_unop_find_msb:
case ir_unop_find_lsb:
assert(ir->operands[0]->type->vector_elements == ir->type->vector_elements);
assert(ir->operands[0]->type->is_integer());
assert(ir->type->base_type == GLSL_TYPE_INT);
break;
case ir_unop_noise: case ir_unop_noise:
/* XXX what can we assert here? */ /* XXX what can we assert here? */
break; break;
@@ -474,6 +487,19 @@ ir_validate::visit_leave(ir_expression *ir)
assert(ir->operands[2]->type == ir->operands[0]->type || ir->operands[2]->type == glsl_type::float_type); assert(ir->operands[2]->type == ir->operands[0]->type || ir->operands[2]->type == glsl_type::float_type);
break; break;
case ir_triop_bitfield_extract:
assert(ir->operands[0]->type == ir->type);
assert(ir->operands[1]->type == glsl_type::int_type);
assert(ir->operands[2]->type == glsl_type::int_type);
break;
case ir_quadop_bitfield_insert:
assert(ir->operands[0]->type == ir->type);
assert(ir->operands[1]->type == ir->type);
assert(ir->operands[2]->type == glsl_type::int_type);
assert(ir->operands[3]->type == glsl_type::int_type);
break;
case ir_quadop_vector: case ir_quadop_vector:
/* The vector operator collects some number of scalars and generates a /* The vector operator collects some number of scalars and generates a
* vector from them. * vector from them.

View File

@@ -186,12 +186,12 @@ ir_algebraic_visitor::swizzle_if_required(ir_expression *expr,
ir_rvalue * ir_rvalue *
ir_algebraic_visitor::handle_expression(ir_expression *ir) ir_algebraic_visitor::handle_expression(ir_expression *ir)
{ {
ir_constant *op_const[3] = {NULL, NULL, NULL}; ir_constant *op_const[4] = {NULL, NULL, NULL, NULL};
ir_expression *op_expr[3] = {NULL, NULL, NULL}; ir_expression *op_expr[4] = {NULL, NULL, NULL, NULL};
ir_expression *temp; ir_expression *temp;
unsigned int i; unsigned int i;
assert(ir->get_num_operands() <= 3); assert(ir->get_num_operands() <= 4);
for (i = 0; i < ir->get_num_operands(); i++) { for (i = 0; i < ir->get_num_operands(); i++) {
if (ir->operands[i]->type->is_matrix()) if (ir->operands[i]->type->is_matrix())
return ir; return ir;

View File

@@ -1444,6 +1444,10 @@ ir_to_mesa_visitor::visit(ir_expression *ir)
case ir_unop_unpack_half_2x16_split_x: case ir_unop_unpack_half_2x16_split_x:
case ir_unop_unpack_half_2x16_split_y: case ir_unop_unpack_half_2x16_split_y:
case ir_binop_pack_half_2x16_split: case ir_binop_pack_half_2x16_split:
case ir_unop_bitfield_reverse:
case ir_unop_bit_count:
case ir_unop_find_msb:
case ir_unop_find_lsb:
assert(!"not supported"); assert(!"not supported");
break; break;
case ir_binop_min: case ir_binop_min:
@@ -1485,6 +1489,11 @@ ir_to_mesa_visitor::visit(ir_expression *ir)
emit(ir, OPCODE_LRP, result_dst, op[2], op[1], op[0]); emit(ir, OPCODE_LRP, result_dst, op[2], op[1], op[0]);
break; break;
case ir_triop_bitfield_extract:
case ir_quadop_bitfield_insert:
assert(!"not supported");
break;
case ir_quadop_vector: case ir_quadop_vector:
/* This operation should have already been handled. /* This operation should have already been handled.
*/ */

View File

@@ -1969,6 +1969,12 @@ glsl_to_tgsi_visitor::visit(ir_expression *ir)
case ir_unop_unpack_snorm_4x8: case ir_unop_unpack_snorm_4x8:
case ir_unop_unpack_unorm_4x8: case ir_unop_unpack_unorm_4x8:
case ir_binop_pack_half_2x16_split: case ir_binop_pack_half_2x16_split:
case ir_unop_bitfield_reverse:
case ir_unop_bit_count:
case ir_unop_find_msb:
case ir_unop_find_lsb:
case ir_triop_bitfield_extract:
case ir_quadop_bitfield_insert:
case ir_quadop_vector: case ir_quadop_vector:
/* This operation is not supported, or should have already been handled. /* This operation is not supported, or should have already been handled.
*/ */