From 81e7ec485d5288bbce8b8e40af57fe4c0392c69f Mon Sep 17 00:00:00 2001 From: José Fonseca Date: Mon, 17 Aug 2009 07:50:45 +0100 Subject: llvmpipe: Handle floating point selection. --- src/gallium/drivers/llvmpipe/lp_bld_swizzle.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) (limited to 'src/gallium/drivers/llvmpipe') diff --git a/src/gallium/drivers/llvmpipe/lp_bld_swizzle.c b/src/gallium/drivers/llvmpipe/lp_bld_swizzle.c index 7fd25e9dd6..185df4a342 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; } -- cgit v1.2.3