summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosé Fonseca <jfonseca@vmware.com>2009-09-10 12:01:42 +0100
committerJosé Fonseca <jfonseca@vmware.com>2009-09-10 12:01:42 +0100
commitc3c80c5c22f9ce7fabba90daa5d5142e5fb1c012 (patch)
tree83f896c8a951f3be3ed1e29202cf8d3a0bb7c30f
parent8e6b925d2a963a2d5a403e106d7d25e3dcca0775 (diff)
llvmpipe: Skip blending when mask is zero.
This increases quake3 timedemo fps another 10%.
-rw-r--r--src/gallium/drivers/llvmpipe/lp_bld_flow.c31
-rw-r--r--src/gallium/drivers/llvmpipe/lp_state_fs.c12
2 files changed, 30 insertions, 13 deletions
diff --git a/src/gallium/drivers/llvmpipe/lp_bld_flow.c b/src/gallium/drivers/llvmpipe/lp_bld_flow.c
index 1252593226..69ed014ff3 100644
--- a/src/gallium/drivers/llvmpipe/lp_bld_flow.c
+++ b/src/gallium/drivers/llvmpipe/lp_bld_flow.c
@@ -386,6 +386,22 @@ lp_build_flow_skip_end(struct lp_build_flow_context *flow)
}
+static void
+lp_build_mask_check(struct lp_build_mask_context *mask)
+{
+ LLVMBuilderRef builder = mask->flow->builder;
+ LLVMValueRef cond;
+
+ cond = LLVMBuildICmp(builder,
+ LLVMIntEQ,
+ LLVMBuildBitCast(builder, mask->value, mask->reg_type, ""),
+ LLVMConstNull(mask->reg_type),
+ "");
+
+ lp_build_flow_skip_cond_break(mask->flow, cond);
+}
+
+
void
lp_build_mask_begin(struct lp_build_mask_context *mask,
struct lp_build_flow_context *flow,
@@ -401,6 +417,8 @@ lp_build_mask_begin(struct lp_build_mask_context *mask,
lp_build_flow_scope_begin(flow);
lp_build_flow_scope_declare(flow, &mask->value);
lp_build_flow_skip_begin(flow);
+
+ lp_build_mask_check(mask);
}
@@ -408,18 +426,9 @@ void
lp_build_mask_update(struct lp_build_mask_context *mask,
LLVMValueRef value)
{
- LLVMBuilderRef builder = mask->flow->builder;
- LLVMValueRef cond;
-
- mask->value = LLVMBuildAnd(builder, mask->value, value, "");
-
- cond = LLVMBuildICmp(builder,
- LLVMIntEQ,
- LLVMBuildBitCast(builder, mask->value, mask->reg_type, ""),
- LLVMConstNull(mask->reg_type),
- "");
+ mask->value = LLVMBuildAnd( mask->flow->builder, mask->value, value, "");
- lp_build_flow_skip_cond_break(mask->flow, cond);
+ lp_build_mask_check(mask);
}
diff --git a/src/gallium/drivers/llvmpipe/lp_state_fs.c b/src/gallium/drivers/llvmpipe/lp_state_fs.c
index 2e60da60cd..354d9916c7 100644
--- a/src/gallium/drivers/llvmpipe/lp_state_fs.c
+++ b/src/gallium/drivers/llvmpipe/lp_state_fs.c
@@ -319,6 +319,8 @@ generate_blend(const struct pipe_blend_state *blend,
LLVMValueRef dst_ptr)
{
struct lp_build_context bld;
+ struct lp_build_flow_context *flow;
+ struct lp_build_mask_context mask_ctx;
LLVMTypeRef vec_type;
LLVMTypeRef int_vec_type;
LLVMValueRef const_ptr;
@@ -327,11 +329,14 @@ generate_blend(const struct pipe_blend_state *blend,
LLVMValueRef res[4];
unsigned chan;
+ lp_build_context_init(&bld, builder, type);
+
+ flow = lp_build_flow_create(builder);
+ lp_build_mask_begin(&mask_ctx, flow, type, mask);
+
vec_type = lp_build_vec_type(type);
int_vec_type = lp_build_int_vec_type(type);
- lp_build_context_init(&bld, builder, type);
-
const_ptr = lp_jit_context_blend_color(builder, context_ptr);
const_ptr = LLVMBuildBitCast(builder, const_ptr,
LLVMPointerType(vec_type, 0), "");
@@ -354,6 +359,9 @@ generate_blend(const struct pipe_blend_state *blend,
res[chan] = lp_build_select(&bld, mask, res[chan], dst[chan]);
LLVMBuildStore(builder, res[chan], LLVMBuildGEP(builder, dst_ptr, &index, 1, ""));
}
+
+ lp_build_mask_end(&mask_ctx);
+ lp_build_flow_destroy(flow);
}