gallium: disable early Z test if fragment shader contains KIL instruction.

Use tgsi_scan_shader() to determine if the fragment shader uses KIL or
writes fragment.z
This commit is contained in:
Brian 2008-02-23 16:17:17 -07:00
parent 35ca45daba
commit 012391357f
3 changed files with 19 additions and 11 deletions

View file

@ -56,11 +56,12 @@ sp_build_depth_stencil(
void
sp_build_quad_pipeline(struct softpipe_context *sp)
{
boolean early_depth_test =
boolean early_depth_test =
sp->depth_stencil->depth.enabled &&
sp->framebuffer.zsbuf &&
!sp->depth_stencil->alpha.enabled &&
sp->fs->shader.output_semantic_name[0] != TGSI_SEMANTIC_POSITION;
!sp->fs->uses_kill &&
!sp->fs->writes_z;
/* build up the pipeline in reverse order... */

View file

@ -63,6 +63,9 @@ struct tgsi_exec_machine;
struct sp_fragment_shader {
struct pipe_shader_state shader;
boolean uses_kill;
boolean writes_z;
void (*prepare)( const struct sp_fragment_shader *shader,
struct tgsi_exec_machine *machine,
struct tgsi_sampler *samplers);

View file

@ -36,6 +36,7 @@
#include "pipe/p_shader_tokens.h"
#include "draw/draw_context.h"
#include "tgsi/util/tgsi_dump.h"
#include "tgsi/util/tgsi_scan.h"
void *
@ -44,21 +45,24 @@ softpipe_create_fs_state(struct pipe_context *pipe,
{
struct softpipe_context *softpipe = softpipe_context(pipe);
struct sp_fragment_shader *state;
struct tgsi_shader_info info;
tgsi_scan_shader(templ->tokens, &info);
if (softpipe->dump_fs)
tgsi_dump(templ->tokens, 0);
state = softpipe_create_fs_llvm( softpipe, templ );
if (state)
return state;
state = softpipe_create_fs_sse( softpipe, templ );
if (state)
return state;
state = softpipe_create_fs_exec( softpipe, templ );
if (!state) {
state = softpipe_create_fs_sse( softpipe, templ );
if (!state) {
state = softpipe_create_fs_exec( softpipe, templ );
}
}
assert(state);
state->uses_kill = (info.opcode_count[TGSI_OPCODE_KIL] ||
info.opcode_count[TGSI_OPCODE_KILP]);
state->writes_z = info.writes_z;
return state;
}