summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/llvmpipe/lp_state_fs.c
diff options
context:
space:
mode:
authorJosé Fonseca <jfonseca@vmware.com>2009-08-21 13:49:10 +0100
committerJosé Fonseca <jfonseca@vmware.com>2009-08-29 09:21:39 +0100
commit3d7a88674f9eb3320eeff511968f041426e25023 (patch)
tree277d61dfc0ec2ab6595709b38ff46e09ea16c60a /src/gallium/drivers/llvmpipe/lp_state_fs.c
parent90b5df8d1bbba9b11372d57e524586f28119c06f (diff)
llvmpipe: Early depth testing.
Diffstat (limited to 'src/gallium/drivers/llvmpipe/lp_state_fs.c')
-rw-r--r--src/gallium/drivers/llvmpipe/lp_state_fs.c31
1 files changed, 20 insertions, 11 deletions
diff --git a/src/gallium/drivers/llvmpipe/lp_state_fs.c b/src/gallium/drivers/llvmpipe/lp_state_fs.c
index 51962e6317..521700acd5 100644
--- a/src/gallium/drivers/llvmpipe/lp_state_fs.c
+++ b/src/gallium/drivers/llvmpipe/lp_state_fs.c
@@ -42,6 +42,7 @@
#include "lp_bld_tgsi.h"
#include "lp_bld_alpha.h"
#include "lp_bld_swizzle.h"
+#include "lp_bld_flow.h"
#include "lp_bld_debug.h"
#include "lp_screen.h"
#include "lp_context.h"
@@ -113,7 +114,7 @@ depth_test_generate(struct llvmpipe_context *lp,
LLVMBuilderRef builder,
const struct pipe_depth_state *state,
union lp_type src_type,
- LLVMValueRef *mask,
+ struct lp_build_mask_context *mask,
LLVMValueRef src,
LLVMValueRef dst_ptr)
{
@@ -178,7 +179,8 @@ shader_generate(struct llvmpipe_context *lp,
LLVMBuilderRef builder;
LLVMValueRef pos[NUM_CHANNELS];
LLVMValueRef outputs[PIPE_MAX_SHADER_OUTPUTS][NUM_CHANNELS];
- LLVMValueRef mask;
+ struct lp_build_mask_context mask;
+ boolean early_depth_test;
LLVMValueRef fetch_texel;
unsigned i;
unsigned attrib;
@@ -260,16 +262,20 @@ shader_generate(struct llvmpipe_context *lp,
setup_pos_vector(builder, x, y, a0_ptr, dadx_ptr, dady_ptr, pos);
- mask = LLVMBuildLoad(builder, mask_ptr, "");
+ lp_build_mask_begin(&mask, builder, type,
+ LLVMBuildLoad(builder, mask_ptr, ""));
- /* FIXME:
early_depth_test =
lp->depth_stencil->depth.enabled &&
lp->framebuffer.zsbuf &&
!lp->depth_stencil->alpha.enabled &&
!lp->fs->info.uses_kill &&
!lp->fs->info.writes_z;
- */
+
+ if(early_depth_test)
+ depth_test_generate(lp, builder, &key->depth,
+ type, &mask,
+ pos[2], depth_ptr);
memset(outputs, 0, sizeof outputs);
@@ -294,7 +300,8 @@ shader_generate(struct llvmpipe_context *lp,
/* Alpha test */
/* XXX: should the alpha reference value be passed separately? */
if(cbuf == 0 && chan == 3)
- lp_build_alpha_test(builder, &key->alpha, type, &mask,
+ lp_build_alpha_test(builder, &key->alpha, type,
+ &mask,
outputs[attrib][chan]);
break;
@@ -309,12 +316,14 @@ shader_generate(struct llvmpipe_context *lp,
}
}
- depth_test_generate(lp, builder, &key->depth,
- type, &mask,
- pos[2], depth_ptr);
+ if(!early_depth_test)
+ depth_test_generate(lp, builder, &key->depth,
+ type, &mask,
+ pos[2], depth_ptr);
- if(mask)
- LLVMBuildStore(builder, mask, mask_ptr);
+ lp_build_mask_end(&mask);
+ if(mask.value)
+ LLVMBuildStore(builder, mask.value, mask_ptr);
LLVMBuildRetVoid(builder);;