Sorry, that commit message ended up a mess.
On Tue, Nov 12, 2013 at 8:45 PM, Chris Forbes <chr...@ijw.co.nz> wrote: > Will be used to implement interpolateAtCentroid(), interpolateAtOffset() > and interpolateAtSample() from ARB_gpu_shader5 > Will be used to implement interpolateAtCentroid() from ARB_gpu_shader5. > > Signed-off-by: Chris Forbes <chr...@ijw.co.nz> > --- > src/glsl/ir.cpp | 6 ++++++ > src/glsl/ir.h | 27 +++++++++++++++++++++++++-- > src/glsl/ir_builder.cpp | 18 ++++++++++++++++++ > src/glsl/ir_builder.h | 4 ++++ > src/glsl/ir_constant_expression.cpp | 2 ++ > src/glsl/ir_validate.cpp | 18 ++++++++++++++++++ > src/mesa/program/ir_to_mesa.cpp | 3 +++ > src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 3 +++ > 8 files changed, 79 insertions(+), 2 deletions(-) > > diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp > index 1b49736..8a5f9e7 100644 > --- a/src/glsl/ir.cpp > +++ b/src/glsl/ir.cpp > @@ -251,6 +251,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; > > @@ -405,6 +406,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; > > @@ -527,6 +530,7 @@ static const char *const operator_strs[] = { > "find_msb", > "find_lsb", > "noise", > + "interpolate_at_centroid", > "+", > "-", > "*", > @@ -560,6 +564,8 @@ static const char *const operator_strs[] = { > "ubo_load", > "ldexp", > "vector_extract", > + "interpolate_at_offset", > + "interpolate_at_sample", > "fma", > "lrp", > "csel", > diff --git a/src/glsl/ir.h b/src/glsl/ir.h > index 7b905ef..2a5b612 100644 > --- a/src/glsl/ir.h > +++ b/src/glsl/ir.h > @@ -1199,9 +1199,16 @@ 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, > @@ -1320,9 +1327,25 @@ 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. > diff --git a/src/glsl/ir_builder.cpp b/src/glsl/ir_builder.cpp > index 6c49734..791b280 100644 > --- a/src/glsl/ir_builder.cpp > +++ b/src/glsl/ir_builder.cpp > @@ -496,6 +496,24 @@ b2f(operand 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) > { > return expr(ir_triop_fma, a, b, c); > diff --git a/src/glsl/ir_builder.h b/src/glsl/ir_builder.h > index 1f07788..3c8780a 100644 > --- a/src/glsl/ir_builder.h > +++ b/src/glsl/ir_builder.h > @@ -184,6 +184,10 @@ ir_expression *i2b(operand a); > ir_expression *f2b(operand a); > ir_expression *b2f(operand a); > > +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); > diff --git a/src/glsl/ir_constant_expression.cpp > b/src/glsl/ir_constant_expression.cpp > index 0efd1d5..ca92768 100644 > --- a/src/glsl/ir_constant_expression.cpp > +++ b/src/glsl/ir_constant_expression.cpp > @@ -415,6 +415,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: > diff --git a/src/glsl/ir_validate.cpp b/src/glsl/ir_validate.cpp > index 13e41a0..4ed8d35 100644 > --- a/src/glsl/ir_validate.cpp > +++ b/src/glsl/ir_validate.cpp > @@ -410,6 +410,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: > @@ -546,6 +551,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); > diff --git a/src/mesa/program/ir_to_mesa.cpp b/src/mesa/program/ir_to_mesa.cpp > index c833a12..5fc4340 100644 > --- a/src/mesa/program/ir_to_mesa.cpp > +++ b/src/mesa/program/ir_to_mesa.cpp > @@ -1501,6 +1501,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; > > diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp > b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp > index 0eaf746..f1017ee 100644 > --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp > +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp > @@ -2007,6 +2007,9 @@ glsl_to_tgsi_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: > /* This operation is not supported, or should have already been > handled. > */ > assert(!"Invalid ir opcode in glsl_to_tgsi_visitor::visit()"); > -- > 1.8.4.2 > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev