Fix depth testing, write enable bug

This fixes a bug in _cogl_pipeline_flush_color_blend_alpha_depth_state
whereby we were only calling flush_depth_state if we knew that at least
depth testing was enabled. This didn't take into account that enabling
and disabling depth writing is a useful change to make even if depth
testing is disabled. It also seemed a bit messy to flush the
depth-testing enable separately from the other depth state.

_cogl_pipeline_flush_color_blend_alpha_depth_state now simply calls
flush_depth_state() if there is a _DEPTH_STATE difference and
flush_depth_state() also handles flushing the depth-testing enable
in along with all the other depth state.

Reviewed-by: Neil Roberts <neil@linux.intel.com>

(cherry picked from commit 6a9dfc55b8f55d7023cb592e5bef2118d0f3d50c)
This commit is contained in:
Robert Bragg 2012-04-29 22:14:43 +01:00
parent fb636008ad
commit 3f2cb89a76

View File

@ -401,11 +401,20 @@ blend_factor_uses_constant (GLenum blend_factor)
#endif #endif
static void static void
flush_depth_state (CoglDepthState *depth_state) flush_depth_state (CoglContext *ctx,
CoglDepthState *depth_state)
{ {
_COGL_GET_CONTEXT (ctx, NO_RETVAL); if (ctx->depth_test_enabled_cache != depth_state->test_enabled)
{
if (depth_state->test_enabled == TRUE)
GE (ctx, glEnable (GL_DEPTH_TEST));
else
GE (ctx, glDisable (GL_DEPTH_TEST));
ctx->depth_test_enabled_cache = depth_state->test_enabled;
}
if (ctx->depth_test_function_cache != depth_state->test_function) if (ctx->depth_test_function_cache != depth_state->test_function &&
depth_state->test_enabled == TRUE)
{ {
GE (ctx, glDepthFunc (depth_state->test_function)); GE (ctx, glDepthFunc (depth_state->test_function));
ctx->depth_test_function_cache = depth_state->test_function; ctx->depth_test_function_cache = depth_state->test_function;
@ -571,20 +580,7 @@ _cogl_pipeline_flush_color_blend_alpha_depth_state (
_cogl_pipeline_get_authority (pipeline, COGL_PIPELINE_STATE_DEPTH); _cogl_pipeline_get_authority (pipeline, COGL_PIPELINE_STATE_DEPTH);
CoglDepthState *depth_state = &authority->big_state->depth_state; CoglDepthState *depth_state = &authority->big_state->depth_state;
if (depth_state->test_enabled) flush_depth_state (ctx, depth_state);
{
if (ctx->depth_test_enabled_cache != TRUE)
{
GE (ctx, glEnable (GL_DEPTH_TEST));
ctx->depth_test_enabled_cache = depth_state->test_enabled;
}
flush_depth_state (depth_state);
}
else if (ctx->depth_test_enabled_cache != FALSE)
{
GE (ctx, glDisable (GL_DEPTH_TEST));
ctx->depth_test_enabled_cache = depth_state->test_enabled;
}
} }
if (pipelines_difference & COGL_PIPELINE_STATE_LOGIC_OPS) if (pipelines_difference & COGL_PIPELINE_STATE_LOGIC_OPS)