llvmpipe: Handle floating point selection.
authorJosé Fonseca <jfonseca@vmware.com>
Mon, 17 Aug 2009 06:50:45 +0000 (07:50 +0100)
committerJosé Fonseca <jfonseca@vmware.com>
Sat, 29 Aug 2009 08:21:33 +0000 (09:21 +0100)
src/gallium/drivers/llvmpipe/lp_bld_swizzle.c

index 7fd25e9dd691200f620e92af5ba9e501a92e395c..185df4a34299855859582f0feddcdc32397ef1ca 100644 (file)
@@ -137,9 +137,18 @@ lp_build_select(struct lp_build_context *bld,
                 LLVMValueRef a,
                 LLVMValueRef b)
 {
+   union lp_type type = bld->type;
+   LLVMValueRef res;
+
    if(a == b)
       return a;
 
+   if(type.floating) {
+      LLVMTypeRef int_vec_type = lp_build_int_vec_type(type);
+      a = LLVMBuildBitCast(bld->builder, a, int_vec_type, "");
+      b = LLVMBuildBitCast(bld->builder, b, int_vec_type, "");
+   }
+
    /* TODO: On SSE4 we could do this with a single instruction -- PBLENDVB */
 
    a = LLVMBuildAnd(bld->builder, a, mask, "");
@@ -151,7 +160,14 @@ lp_build_select(struct lp_build_context *bld,
     */
    b = LLVMBuildAnd(bld->builder, b, LLVMBuildNot(bld->builder, mask, ""), "");
 
-   return LLVMBuildOr(bld->builder, a, b, "");
+   res = LLVMBuildOr(bld->builder, a, b, "");
+
+   if(type.floating) {
+      LLVMTypeRef vec_type = lp_build_vec_type(type);
+      res = LLVMBuildBitCast(bld->builder, res, vec_type, "");
+   }
+
+   return res;
 }