llvmpipe: Handle floating point selection.
This commit is contained in:
parent
4d7a8194c5
commit
81e7ec485d
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue