glsl: add new expression types for interpolateAt*
authorChris Forbes <chrisf@ijw.co.nz>
Sun, 10 Nov 2013 06:13:54 +0000 (19:13 +1300)
committerChris Forbes <chrisf@ijw.co.nz>
Fri, 11 Jul 2014 23:20:00 +0000 (11:20 +1200)
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>
src/glsl/ir.cpp
src/glsl/ir.h
src/glsl/ir_builder.cpp
src/glsl/ir_builder.h
src/glsl/ir_constant_expression.cpp
src/glsl/ir_validate.cpp
src/mesa/program/ir_to_mesa.cpp
src/mesa/state_tracker/st_glsl_to_tgsi.cpp

index 1d8bb6e7b66c1b5c5a9d3ec6046c7378eb847d85..28fd94b95c9a06bc0de1c0200d94ee441e809734 100644 (file)
@@ -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",
index fa93efd2de128f4336e8792f07735f1b7002ba32..ea19924ab4f93f5427eb8efa8b9cfd75618d34f6 100644 (file)
@@ -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.
index f4a1c6efa0ba1c4ddf6aecaa65822823013853ef..f03941443e09822eccc1b55c6db531880cbef769 100644 (file)
@@ -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)
 {
index 108b53a5e470e7c6060cf4f3dfbfcebc8482c331..573596cf1357ea9888f88ff571ced7132d6df447 100644 (file)
@@ -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);
index 7f83eb134fa31bc64bd6cfb83e5a01ac8b7c8859..5570ed46f8a58ba386d60875750ed9acdec035fb 100644 (file)
@@ -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:
index 271dbe0960a06f3438d7580ee07deeba5b828ea8..42142da02d1e00a9c21660edec8ec8d516e6ed5f 100644 (file)
@@ -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);
index 1109051e98617c581a1d8ba894ed825fe0935130..8aefcf7e2b35842ea7648f795e020100b49d8f5e 100644 (file)
@@ -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;
 
index b5736b2a93555cf084e685d6cf063e5bfd54dd8b..5c51e63d9a810f8d224455d017d7a641d74e6c0a 100644 (file)
@@ -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()");