mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-06-07 21:18:18 +02:00
nvc0: don't enable early-z if alpha test is enabled
Depth values are also written before the shader is executed, so if early tests are enabled, fragments that failed the alpha test were modifying the depth buffer, but they shouldn't.
This commit is contained in:
parent
d9f1310e51
commit
f0ee7d8bb4
4 changed files with 20 additions and 12 deletions
|
|
@ -79,6 +79,7 @@ struct nvc0_context {
|
|||
uint32_t instance_base;
|
||||
int32_t index_bias;
|
||||
boolean prim_restart;
|
||||
boolean early_z;
|
||||
uint8_t num_vtxbufs;
|
||||
uint8_t num_vtxelts;
|
||||
uint8_t num_textures[5];
|
||||
|
|
|
|||
|
|
@ -111,8 +111,6 @@ nvc0_fragprog_validate(struct nvc0_context *nvc0)
|
|||
return;
|
||||
nvc0_program_update_context_state(nvc0, fp, 4);
|
||||
|
||||
BEGIN_RING(chan, RING_3D(EARLY_FRAGMENT_TESTS), 1);
|
||||
OUT_RING (chan, fp->fp.early_z);
|
||||
BEGIN_RING(chan, RING_3D(SP_SELECT(5)), 2);
|
||||
OUT_RING (chan, 0x51);
|
||||
OUT_RING (chan, fp->code_base);
|
||||
|
|
|
|||
|
|
@ -276,14 +276,11 @@ nvc0_zsa_state_create(struct pipe_context *pipe,
|
|||
|
||||
so->pipe = *cso;
|
||||
|
||||
SB_IMMED_3D(so, DEPTH_WRITE_ENABLE, cso->depth.writemask);
|
||||
SB_BEGIN_3D(so, DEPTH_TEST_ENABLE, 1);
|
||||
SB_IMMED_3D(so, DEPTH_TEST_ENABLE, cso->depth.enabled);
|
||||
if (cso->depth.enabled) {
|
||||
SB_DATA (so, 1);
|
||||
SB_IMMED_3D(so, DEPTH_WRITE_ENABLE, cso->depth.writemask);
|
||||
SB_BEGIN_3D(so, DEPTH_TEST_FUNC, 1);
|
||||
SB_DATA (so, nvgl_comparison_op(cso->depth.func));
|
||||
} else {
|
||||
SB_DATA (so, 0);
|
||||
}
|
||||
|
||||
if (cso->stencil[0].enabled) {
|
||||
|
|
@ -315,15 +312,12 @@ nvc0_zsa_state_create(struct pipe_context *pipe,
|
|||
if (cso->stencil[0].enabled) {
|
||||
SB_IMMED_3D(so, STENCIL_TWO_SIDE_ENABLE, 0);
|
||||
}
|
||||
|
||||
SB_BEGIN_3D(so, ALPHA_TEST_ENABLE, 1);
|
||||
|
||||
SB_IMMED_3D(so, ALPHA_TEST_ENABLE, cso->alpha.enabled);
|
||||
if (cso->alpha.enabled) {
|
||||
SB_DATA (so, 1);
|
||||
SB_BEGIN_3D(so, ALPHA_TEST_REF, 2);
|
||||
SB_DATA (so, fui(cso->alpha.ref_value));
|
||||
SB_DATA (so, nvgl_comparison_op(cso->alpha.func));
|
||||
} else {
|
||||
SB_DATA (so, 0);
|
||||
}
|
||||
|
||||
assert(so->size < (sizeof(so->state) / sizeof(so->state[0])));
|
||||
|
|
|
|||
|
|
@ -387,6 +387,20 @@ nvc0_constbufs_validate(struct nvc0_context *nvc0)
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
nvc0_validate_derived_1(struct nvc0_context *nvc0)
|
||||
{
|
||||
struct nouveau_channel *chan = nvc0->screen->base.channel;
|
||||
boolean early_z;
|
||||
|
||||
early_z = nvc0->fragprog->fp.early_z && !nvc0->zsa->pipe.alpha.enabled;
|
||||
|
||||
if (early_z != nvc0->state.early_z) {
|
||||
nvc0->state.early_z = early_z;
|
||||
IMMED_RING(chan, RING_3D(EARLY_FRAGMENT_TESTS), early_z);
|
||||
}
|
||||
}
|
||||
|
||||
static struct state_validate {
|
||||
void (*func)(struct nvc0_context *);
|
||||
uint32_t states;
|
||||
|
|
@ -406,6 +420,7 @@ static struct state_validate {
|
|||
{ nvc0_tevlprog_validate, NVC0_NEW_TEVLPROG },
|
||||
{ nvc0_gmtyprog_validate, NVC0_NEW_GMTYPROG },
|
||||
{ nvc0_fragprog_validate, NVC0_NEW_FRAGPROG },
|
||||
{ nvc0_validate_derived_1, NVC0_NEW_FRAGPROG | NVC0_NEW_ZSA },
|
||||
{ nvc0_constbufs_validate, NVC0_NEW_CONSTBUF },
|
||||
{ nvc0_validate_textures, NVC0_NEW_TEXTURES },
|
||||
{ nvc0_validate_samplers, NVC0_NEW_SAMPLERS },
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue