From: José Fonseca Date: Mon, 17 Aug 2009 06:50:45 +0000 (+0100) Subject: llvmpipe: Handle floating point selection. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=81e7ec485d5288bbce8b8e40af57fe4c0392c69f;p=mesa.git llvmpipe: Handle floating point selection. --- diff --git a/src/gallium/drivers/llvmpipe/lp_bld_swizzle.c b/src/gallium/drivers/llvmpipe/lp_bld_swizzle.c index 7fd25e9dd69..185df4a3429 100644 --- a/src/gallium/drivers/llvmpipe/lp_bld_swizzle.c +++ b/src/gallium/drivers/llvmpipe/lp_bld_swizzle.c @@ -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; }