st/mesa: fix GLSL mix(.., .., bvecN)
authorMarek Olšák <marek.olsak@amd.com>
Mon, 23 Sep 2013 20:43:23 +0000 (22:43 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Sun, 29 Sep 2013 12:42:42 +0000 (14:42 +0200)
v2: use CMP on drivers without native integer support

src/mesa/state_tracker/st_glsl_to_tgsi.cpp

index 271cf052391b80684fbefb7aa87286b3c1818007..53838b391d23c68812f0161e371467be3e8a6aca 100644 (file)
@@ -1944,6 +1944,14 @@ glsl_to_tgsi_visitor::visit(ir_expression *ir)
       /* note: we have to reorder the three args here */
       emit(ir, TGSI_OPCODE_LRP, result_dst, op[2], op[1], op[0]);
       break;
+   case ir_triop_csel:
+      if (this->ctx->Const.NativeIntegers)
+         emit(ir, TGSI_OPCODE_UCMP, result_dst, op[0], op[1], op[2]);
+      else {
+         op[0].negate = ~op[0].negate;
+         emit(ir, TGSI_OPCODE_CMP, result_dst, op[0], op[1], op[2]);
+      }
+      break;
    case ir_unop_pack_snorm_2x16:
    case ir_unop_pack_unorm_2x16:
    case ir_unop_pack_half_2x16:
@@ -1970,7 +1978,6 @@ glsl_to_tgsi_visitor::visit(ir_expression *ir)
    case ir_binop_vector_extract:
    case ir_triop_vector_insert:
    case ir_binop_ldexp:
-   case ir_triop_csel:
       /* This operation is not supported, or should have already been handled.
        */
       assert(!"Invalid ir opcode in glsl_to_tgsi_visitor::visit()");