i965/fs: Implement texelFetch() on Gen4.
[mesa.git] / src / mesa / drivers / dri / i965 / brw_fs_channel_expressions.cpp
index d8d58a9467bcf93e9c86559af062d1be0671efa5..2ba96e0064c008e6a1cac5d7170c42966a7c9791 100644 (file)
@@ -45,9 +45,9 @@ extern "C" {
 #include "main/core.h"
 #include "brw_wm.h"
 }
-#include "../glsl/ir.h"
-#include "../glsl/ir_expression_flattening.h"
-#include "../glsl/glsl_types.h"
+#include "glsl/ir.h"
+#include "glsl/ir_expression_flattening.h"
+#include "glsl/glsl_types.h"
 
 class ir_channel_expressions_visitor : public ir_hierarchical_visitor {
 public:
@@ -83,7 +83,6 @@ channel_expressions_predicate(ir_instruction *ir)
    return false;
 }
 
-extern "C" {
 GLboolean
 brw_do_channel_expressions(exec_list *instructions)
 {
@@ -99,7 +98,6 @@ brw_do_channel_expressions(exec_list *instructions)
 
    return v.progress;
 }
-}
 
 ir_rvalue *
 ir_channel_expressions_visitor::get_element(ir_variable *var, unsigned int elem)
@@ -119,7 +117,6 @@ ir_channel_expressions_visitor::assign(ir_assignment *ir, int elem, ir_rvalue *v
 {
    ir_dereference *lhs = ir->lhs->clone(mem_ctx, NULL);
    ir_assignment *assign;
-   ir_swizzle *val_swiz;
 
    /* This assign-of-expression should have been generated by the
     * expression flattening visitor (since we never short circit to
@@ -128,10 +125,7 @@ ir_channel_expressions_visitor::assign(ir_assignment *ir, int elem, ir_rvalue *v
     */
    assert(ir->write_mask == (1 << ir->lhs->type->components()) - 1);
 
-   /* Smear the float across all the channels for the masked write. */
-   val_swiz = new(mem_ctx) ir_swizzle(val, 0, 0, 0, 0,
-                                     ir->lhs->type->components());
-   assign = new(mem_ctx) ir_assignment(lhs, val_swiz, NULL, (1 << elem));
+   assign = new(mem_ctx) ir_assignment(lhs, val, NULL, (1 << elem));
    ir->insert_before(assign);
 }
 
@@ -147,7 +141,7 @@ ir_channel_expressions_visitor::visit_leave(ir_assignment *ir)
       return visit_continue;
 
    if (!this->mem_ctx)
-      this->mem_ctx = talloc_parent(ir);
+      this->mem_ctx = ralloc_parent(ir);
 
    for (i = 0; i < expr->get_num_operands(); i++) {
       if (expr->operands[i]->type->is_vector()) {
@@ -197,6 +191,8 @@ ir_channel_expressions_visitor::visit_leave(ir_assignment *ir)
    case ir_unop_log:
    case ir_unop_exp2:
    case ir_unop_log2:
+   case ir_unop_i2u:
+   case ir_unop_u2i:
    case ir_unop_f2i:
    case ir_unop_i2f:
    case ir_unop_f2b:
@@ -208,8 +204,11 @@ ir_channel_expressions_visitor::visit_leave(ir_assignment *ir)
    case ir_unop_ceil:
    case ir_unop_floor:
    case ir_unop_fract:
+   case ir_unop_round_even:
    case ir_unop_sin:
    case ir_unop_cos:
+   case ir_unop_sin_reduced:
+   case ir_unop_cos_reduced:
    case ir_unop_dFdx:
    case ir_unop_dFdy:
       for (i = 0; i < vector_elements; i++) {
@@ -235,6 +234,12 @@ ir_channel_expressions_visitor::visit_leave(ir_assignment *ir)
    case ir_binop_bit_and:
    case ir_binop_bit_xor:
    case ir_binop_bit_or:
+   case ir_binop_less:
+   case ir_binop_greater:
+   case ir_binop_lequal:
+   case ir_binop_gequal:
+   case ir_binop_equal:
+   case ir_binop_nequal:
       for (i = 0; i < vector_elements; i++) {
         ir_rvalue *op0 = get_element(op_var[0], i);
         ir_rvalue *op1 = get_element(op_var[1], i);
@@ -287,38 +292,6 @@ ir_channel_expressions_visitor::visit_leave(ir_assignment *ir)
       break;
    }
 
-   case ir_binop_cross: {
-      for (i = 0; i < vector_elements; i++) {
-        int swiz0 = (i + 1) % 3;
-        int swiz1 = (i + 2) % 3;
-        ir_expression *temp1, *temp2;
-
-        temp1 = new(mem_ctx) ir_expression(ir_binop_mul,
-                                           element_type,
-                                           get_element(op_var[0], swiz0),
-                                           get_element(op_var[1], swiz1));
-
-        temp2 = new(mem_ctx) ir_expression(ir_binop_mul,
-                                           element_type,
-                                           get_element(op_var[1], swiz0),
-                                           get_element(op_var[0], swiz1));
-
-        temp2 = new(mem_ctx) ir_expression(ir_unop_neg,
-                                           element_type,
-                                           temp2,
-                                           NULL);
-
-        assign(ir, i, new(mem_ctx) ir_expression(ir_binop_add,
-                                                 element_type,
-                                                 temp1, temp2));
-      }
-      break;
-   }
-
-   case ir_binop_less:
-   case ir_binop_greater:
-   case ir_binop_lequal:
-   case ir_binop_gequal:
    case ir_binop_logic_and:
    case ir_binop_logic_xor:
    case ir_binop_logic_or:
@@ -326,8 +299,8 @@ ir_channel_expressions_visitor::visit_leave(ir_assignment *ir)
       printf("\n");
       assert(!"not reached: expression operates on scalars only");
       break;
-   case ir_binop_equal:
-   case ir_binop_nequal: {
+   case ir_binop_all_equal:
+   case ir_binop_any_nequal: {
       ir_expression *last = NULL;
       for (i = 0; i < vector_elements; i++) {
         ir_rvalue *op0 = get_element(op_var[0], i);
@@ -335,7 +308,7 @@ ir_channel_expressions_visitor::visit_leave(ir_assignment *ir)
         ir_expression *temp;
         ir_expression_operation join;
 
-        if (expr->operation == ir_binop_equal)
+        if (expr->operation == ir_binop_all_equal)
            join = ir_binop_logic_and;
         else
            join = ir_binop_logic_or;
@@ -356,6 +329,12 @@ ir_channel_expressions_visitor::visit_leave(ir_assignment *ir)
       assign(ir, 0, last);
       break;
    }
+   case ir_unop_noise:
+      assert(!"noise should have been broken down to function call");
+      break;
+   case ir_quadop_vector:
+      assert(!"should have been lowered");
+      break;
    }
 
    ir->remove();