mesa/program: Translate csel operation from GLSL IR.
authorFrancisco Jerez <currojerez@riseup.net>
Tue, 24 Jan 2017 07:53:03 +0000 (23:53 -0800)
committerFrancisco Jerez <currojerez@riseup.net>
Tue, 31 Jan 2017 18:32:42 +0000 (10:32 -0800)
This will be used internally by the GLSL front-end in order to
implement some built-in functions. Plumb it through MESA IR for
back-ends that rely on this translation pass.

v2: Add comment.

Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Juan A. Suarez Romero <jasuarez@igalia.com>
src/mesa/program/ir_to_mesa.cpp

index 0ae797f1ecab41dd81eb53c43a1f61cbd3aad375..dc5f8016f3753128afc5b0c73685713f139455dc 100644 (file)
@@ -1360,13 +1360,20 @@ ir_to_mesa_visitor::visit(ir_expression *ir)
       emit(ir, OPCODE_LRP, result_dst, op[2], op[1], op[0]);
       break;
 
+   case ir_triop_csel:
+      /* We assume that boolean true and false are 1.0 and 0.0.  OPCODE_CMP
+       * selects src1 if src0 is < 0, src2 otherwise.
+       */
+      op[0].negate = ~op[0].negate;
+      emit(ir, OPCODE_CMP, result_dst, op[0], op[1], op[2]);
+      break;
+
    case ir_binop_vector_extract:
    case ir_triop_fma:
    case ir_triop_bitfield_extract:
    case ir_triop_vector_insert:
    case ir_quadop_bitfield_insert:
    case ir_binop_ldexp:
-   case ir_triop_csel:
    case ir_binop_carry:
    case ir_binop_borrow:
    case ir_binop_imul_high: