mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 17:30:12 +01:00
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:
parent
35ca45daba
commit
012391357f
3 changed files with 19 additions and 11 deletions
|
|
@ -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... */
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue