r300g: improve the ZTOP condition

The real difference here is that ZTOP is now enabled if all stencil ops
are set to KEEP. This improves performance.
This commit is contained in:
Marek Olšák 2010-06-19 04:44:34 +02:00
parent 8ea45a2c0e
commit 371ca689ec
3 changed files with 30 additions and 14 deletions

View File

@ -77,6 +77,8 @@ struct r300_clip_state {
};
struct r300_dsa_state {
struct pipe_depth_stencil_alpha_state dsa;
/* This is actually a command buffer with named dwords. */
uint32_t cb_begin;
uint32_t alpha_function; /* R300_FG_ALPHA_FUNC: 0x4bd4 */

View File

@ -31,27 +31,39 @@
/* The ZTOP state */
/*****************************************************************************/
static boolean r300_dsa_writes_depth_stencil(struct r300_dsa_state* dsa)
static boolean r300_dsa_writes_stencil(
struct pipe_stencil_state *s)
{
/* We are interested only in the cases when a new depth or stencil value
* can be written and changed. */
/* We might optionally check for [Z func: never] and inspect the stencil
* state in a similar fashion, but it's not terribly important. */
return (dsa->z_buffer_control & R300_Z_WRITE_ENABLE) ||
(dsa->stencil_ref_mask & R300_STENCILWRITEMASK_MASK) ||
((dsa->z_buffer_control & R500_STENCIL_REFMASK_FRONT_BACK) &&
(dsa->stencil_ref_bf & R300_STENCILWRITEMASK_MASK));
return s->enabled && s->writemask &&
(s->fail_op != PIPE_STENCIL_OP_KEEP ||
s->zfail_op != PIPE_STENCIL_OP_KEEP ||
s->zpass_op != PIPE_STENCIL_OP_KEEP);
}
static boolean r300_dsa_alpha_test_enabled(struct r300_dsa_state* dsa)
static boolean r300_dsa_writes_depth_stencil(
struct pipe_depth_stencil_alpha_state *dsa)
{
/* We are interested only in the cases when a depth or stencil value
* can be changed. */
if (dsa->depth.enabled && dsa->depth.writemask &&
dsa->depth.func != PIPE_FUNC_NEVER)
return TRUE;
if (r300_dsa_writes_stencil(&dsa->stencil[0]) ||
r300_dsa_writes_stencil(&dsa->stencil[1]))
return TRUE;
return FALSE;
}
static boolean r300_dsa_alpha_test_enabled(
struct pipe_depth_stencil_alpha_state *dsa)
{
/* We are interested only in the cases when alpha testing can kill
* a fragment. */
uint32_t af = dsa->alpha_function;
return (af & R300_FG_ALPHA_FUNC_ENABLE) &&
(af & R300_FG_ALPHA_FUNC_ALWAYS) != R300_FG_ALPHA_FUNC_ALWAYS;
return dsa->alpha.enabled && dsa->alpha.func != PIPE_FUNC_ALWAYS;
}
static void r300_update_ztop(struct r300_context* r300)

View File

@ -465,6 +465,8 @@ static void*
struct r300_dsa_state* dsa = CALLOC_STRUCT(r300_dsa_state);
CB_LOCALS;
dsa->dsa = *state;
/* Depth test setup. */
if (state->depth.enabled) {
dsa->z_buffer_control |= R300_Z_ENABLE;