mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 17:58:26 +02:00
glsl: add new expression types for interpolateAt*
Will be used to implement interpolateAt*() from ARB_gpu_shader5 Signed-off-by: Chris Forbes <chrisf@ijw.co.nz> Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
This commit is contained in:
parent
8b7a323596
commit
1d5b06664f
8 changed files with 79 additions and 2 deletions
|
|
@ -250,6 +250,7 @@ ir_expression::ir_expression(int op, ir_rvalue *op0)
|
|||
case ir_unop_dFdx:
|
||||
case ir_unop_dFdy:
|
||||
case ir_unop_bitfield_reverse:
|
||||
case ir_unop_interpolate_at_centroid:
|
||||
this->type = op0->type;
|
||||
break;
|
||||
|
||||
|
|
@ -403,6 +404,8 @@ ir_expression::ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1)
|
|||
case ir_binop_rshift:
|
||||
case ir_binop_bfm:
|
||||
case ir_binop_ldexp:
|
||||
case ir_binop_interpolate_at_offset:
|
||||
case ir_binop_interpolate_at_sample:
|
||||
this->type = op0->type;
|
||||
break;
|
||||
|
||||
|
|
@ -524,6 +527,7 @@ static const char *const operator_strs[] = {
|
|||
"find_msb",
|
||||
"find_lsb",
|
||||
"noise",
|
||||
"interpolate_at_centroid",
|
||||
"+",
|
||||
"-",
|
||||
"*",
|
||||
|
|
@ -557,6 +561,8 @@ static const char *const operator_strs[] = {
|
|||
"ubo_load",
|
||||
"ldexp",
|
||||
"vector_extract",
|
||||
"interpolate_at_offset",
|
||||
"interpolate_at_sample",
|
||||
"fma",
|
||||
"lrp",
|
||||
"csel",
|
||||
|
|
|
|||
|
|
@ -1239,10 +1239,17 @@ enum ir_expression_operation {
|
|||
|
||||
ir_unop_noise,
|
||||
|
||||
/**
|
||||
* Interpolate fs input at centroid
|
||||
*
|
||||
* operand0 is the fs input.
|
||||
*/
|
||||
ir_unop_interpolate_at_centroid,
|
||||
|
||||
/**
|
||||
* A sentinel marking the last of the unary operations.
|
||||
*/
|
||||
ir_last_unop = ir_unop_noise,
|
||||
ir_last_unop = ir_unop_interpolate_at_centroid,
|
||||
|
||||
ir_binop_add,
|
||||
ir_binop_sub,
|
||||
|
|
@ -1360,10 +1367,26 @@ enum ir_expression_operation {
|
|||
*/
|
||||
ir_binop_vector_extract,
|
||||
|
||||
/**
|
||||
* Interpolate fs input at offset
|
||||
*
|
||||
* operand0 is the fs input
|
||||
* operand1 is the offset from the pixel center
|
||||
*/
|
||||
ir_binop_interpolate_at_offset,
|
||||
|
||||
/**
|
||||
* Interpolate fs input at sample position
|
||||
*
|
||||
* operand0 is the fs input
|
||||
* operand1 is the sample ID
|
||||
*/
|
||||
ir_binop_interpolate_at_sample,
|
||||
|
||||
/**
|
||||
* A sentinel marking the last of the binary operations.
|
||||
*/
|
||||
ir_last_binop = ir_binop_vector_extract,
|
||||
ir_last_binop = ir_binop_interpolate_at_sample,
|
||||
|
||||
/**
|
||||
* \name Fused floating-point multiply-add, part of ARB_gpu_shader5.
|
||||
|
|
|
|||
|
|
@ -500,6 +500,24 @@ b2f(operand a)
|
|||
return expr(ir_unop_b2f, a);
|
||||
}
|
||||
|
||||
ir_expression *
|
||||
interpolate_at_centroid(operand a)
|
||||
{
|
||||
return expr(ir_unop_interpolate_at_centroid, a);
|
||||
}
|
||||
|
||||
ir_expression *
|
||||
interpolate_at_offset(operand a, operand b)
|
||||
{
|
||||
return expr(ir_binop_interpolate_at_offset, a, b);
|
||||
}
|
||||
|
||||
ir_expression *
|
||||
interpolate_at_sample(operand a, operand b)
|
||||
{
|
||||
return expr(ir_binop_interpolate_at_sample, a, b);
|
||||
}
|
||||
|
||||
ir_expression *
|
||||
fma(operand a, operand b, operand c)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -186,6 +186,10 @@ ir_expression *b2f(operand a);
|
|||
ir_expression *min2(operand a, operand b);
|
||||
ir_expression *max2(operand a, operand b);
|
||||
|
||||
ir_expression *interpolate_at_centroid(operand a);
|
||||
ir_expression *interpolate_at_offset(operand a, operand b);
|
||||
ir_expression *interpolate_at_sample(operand a, operand b);
|
||||
|
||||
ir_expression *fma(operand a, operand b, operand c);
|
||||
ir_expression *lrp(operand x, operand y, operand a);
|
||||
ir_expression *csel(operand a, operand b, operand c);
|
||||
|
|
|
|||
|
|
@ -510,6 +510,8 @@ ir_expression::constant_expression_value(struct hash_table *variable_context)
|
|||
case ir_binop_lshift:
|
||||
case ir_binop_rshift:
|
||||
case ir_binop_ldexp:
|
||||
case ir_binop_interpolate_at_offset:
|
||||
case ir_binop_interpolate_at_sample:
|
||||
case ir_binop_vector_extract:
|
||||
case ir_triop_csel:
|
||||
case ir_triop_bitfield_extract:
|
||||
|
|
|
|||
|
|
@ -371,6 +371,11 @@ ir_validate::visit_leave(ir_expression *ir)
|
|||
/* XXX what can we assert here? */
|
||||
break;
|
||||
|
||||
case ir_unop_interpolate_at_centroid:
|
||||
assert(ir->operands[0]->type == ir->type);
|
||||
assert(ir->operands[0]->type->is_float());
|
||||
break;
|
||||
|
||||
case ir_binop_add:
|
||||
case ir_binop_sub:
|
||||
case ir_binop_mul:
|
||||
|
|
@ -510,6 +515,19 @@ ir_validate::visit_leave(ir_expression *ir)
|
|||
&& ir->operands[1]->type->is_integer());
|
||||
break;
|
||||
|
||||
case ir_binop_interpolate_at_offset:
|
||||
assert(ir->operands[0]->type == ir->type);
|
||||
assert(ir->operands[0]->type->is_float());
|
||||
assert(ir->operands[1]->type->components() == 2);
|
||||
assert(ir->operands[1]->type->is_float());
|
||||
break;
|
||||
|
||||
case ir_binop_interpolate_at_sample:
|
||||
assert(ir->operands[0]->type == ir->type);
|
||||
assert(ir->operands[0]->type->is_float());
|
||||
assert(ir->operands[1]->type == glsl_type::int_type);
|
||||
break;
|
||||
|
||||
case ir_triop_fma:
|
||||
assert(ir->type->base_type == GLSL_TYPE_FLOAT);
|
||||
assert(ir->type == ir->operands[0]->type);
|
||||
|
|
|
|||
|
|
@ -1456,6 +1456,9 @@ ir_to_mesa_visitor::visit(ir_expression *ir)
|
|||
case ir_binop_carry:
|
||||
case ir_binop_borrow:
|
||||
case ir_binop_imul_high:
|
||||
case ir_unop_interpolate_at_centroid:
|
||||
case ir_binop_interpolate_at_offset:
|
||||
case ir_binop_interpolate_at_sample:
|
||||
assert(!"not supported");
|
||||
break;
|
||||
|
||||
|
|
|
|||
|
|
@ -2049,6 +2049,9 @@ glsl_to_tgsi_visitor::visit(ir_expression *ir)
|
|||
case ir_binop_ldexp:
|
||||
case ir_binop_carry:
|
||||
case ir_binop_borrow:
|
||||
case ir_unop_interpolate_at_centroid:
|
||||
case ir_binop_interpolate_at_offset:
|
||||
case ir_binop_interpolate_at_sample:
|
||||
/* This operation is not supported, or should have already been handled.
|
||||
*/
|
||||
assert(!"Invalid ir opcode in glsl_to_tgsi_visitor::visit()");
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue