summaryrefslogtreecommitdiffstats
path: root/src/gallium/auxiliary/draw
diff options
context:
space:
mode:
authorRoland Scheidegger <[email protected]>2013-08-12 18:01:18 +0200
committerRoland Scheidegger <[email protected]>2013-08-12 23:33:00 +0200
commitdfa7b725638bf4b1396516dca732a3720b3625a9 (patch)
tree18746ed11678e24063b2a6509d4cb62bc9f65e93 /src/gallium/auxiliary/draw
parent7147094ff235a1c0550e1bafbd12574feca7fdd8 (diff)
draw: simplify prim mask construction
The code was quite weird, the second comparison was in fact a complete no-op and we can also do the comparison with the vector directly instead of scalar, which should not also be faster but it is way more obvious how that mask is actually going to look like. Reviewed-by: Zack Rusin <[email protected]>
Diffstat (limited to 'src/gallium/auxiliary/draw')
-rw-r--r--src/gallium/auxiliary/draw/draw_llvm.c32
1 files changed, 10 insertions, 22 deletions
diff --git a/src/gallium/auxiliary/draw/draw_llvm.c b/src/gallium/auxiliary/draw/draw_llvm.c
index 68f636957d0..84e33926a2b 100644
--- a/src/gallium/auxiliary/draw/draw_llvm.c
+++ b/src/gallium/auxiliary/draw/draw_llvm.c
@@ -2040,31 +2040,19 @@ generate_mask_value(struct draw_gs_llvm_variant *variant,
{
struct gallivm_state *gallivm = variant->gallivm;
LLVMBuilderRef builder = gallivm->builder;
- LLVMValueRef bits[16];
- struct lp_type mask_type = lp_int_type(gs_type);
- struct lp_type mask_elem_type = lp_elem_type(mask_type);
- LLVMValueRef mask_val = lp_build_const_vec(gallivm,
- mask_type,
- 0);
+ struct lp_type mask_type = lp_int_type(gs_type);
+ LLVMValueRef num_prims;
+ LLVMValueRef mask_val = lp_build_const_vec(gallivm, mask_type, 0);
unsigned i;
- assert(gs_type.length <= Elements(bits));
-
- for (i = gs_type.length; i >= 1; --i) {
- int idx = i - 1;
- LLVMValueRef ind = lp_build_const_int32(gallivm, i);
- bits[idx] = lp_build_compare(gallivm,
- mask_elem_type, PIPE_FUNC_GEQUAL,
- variant->num_prims, ind);
- }
- for (i = 0; i < gs_type.length; ++i) {
- LLVMValueRef ind = lp_build_const_int32(gallivm, i);
- mask_val = LLVMBuildInsertElement(builder, mask_val, bits[i], ind, "");
+ num_prims = lp_build_broadcast(gallivm, lp_build_vec_type(gallivm, mask_type),
+ variant->num_prims);
+ for (i = 0; i <= gs_type.length; i++) {
+ LLVMValueRef idx = lp_build_const_int32(gallivm, i);
+ mask_val = LLVMBuildInsertElement(builder, mask_val, idx, idx, "");
}
- mask_val = lp_build_compare(gallivm,
- mask_type, PIPE_FUNC_NOTEQUAL,
- mask_val,
- lp_build_const_int_vec(gallivm, mask_type, 0));
+ mask_val = lp_build_compare(gallivm, mask_type,
+ PIPE_FUNC_GREATER, num_prims, mask_val);
return mask_val;
}