diff --git a/cogl/cogl-pipeline-layer.c b/cogl/cogl-pipeline-layer.c index 86e075089..76d17e743 100644 --- a/cogl/cogl-pipeline-layer.c +++ b/cogl/cogl-pipeline-layer.c @@ -78,6 +78,7 @@ _cogl_pipeline_layer_has_alpha (CoglPipelineLayer *layer) COGL_PIPELINE_LAYER_STATE_COMBINE); CoglPipelineLayerBigState *big_state = combine_authority->big_state; CoglPipelineLayer *tex_authority; + CoglPipelineLayer *snippets_authority; /* has_alpha maintains the alpha status for the GL_PREVIOUS layer */ @@ -112,6 +113,12 @@ _cogl_pipeline_layer_has_alpha (CoglPipelineLayer *layer) return TRUE; } + /* All bets are off if the layer contains any snippets */ + snippets_authority = _cogl_pipeline_layer_get_authority + (layer, COGL_PIPELINE_LAYER_STATE_FRAGMENT_SNIPPETS); + if (!COGL_LIST_EMPTY (&snippets_authority->big_state->fragment_snippets)) + return TRUE; + return FALSE; } diff --git a/cogl/cogl-pipeline-state-private.h b/cogl/cogl-pipeline-state-private.h index 9a38e1104..2bc162dcd 100644 --- a/cogl/cogl-pipeline-state-private.h +++ b/cogl/cogl-pipeline-state-private.h @@ -37,6 +37,12 @@ _cogl_pipeline_has_vertex_snippets (CoglPipeline *pipeline); gboolean _cogl_pipeline_has_fragment_snippets (CoglPipeline *pipeline); +gboolean +_cogl_pipeline_has_non_layer_vertex_snippets (CoglPipeline *pipeline); + +gboolean +_cogl_pipeline_has_non_layer_fragment_snippets (CoglPipeline *pipeline); + void _cogl_pipeline_set_fog_state (CoglPipeline *pipeline, const CoglPipelineFogState *fog_state); diff --git a/cogl/cogl-pipeline-state.c b/cogl/cogl-pipeline-state.c index 04caa918c..3477820c8 100644 --- a/cogl/cogl-pipeline-state.c +++ b/cogl/cogl-pipeline-state.c @@ -1632,7 +1632,7 @@ cogl_pipeline_add_fragment_hook (CoglPipeline *pipeline, } gboolean -_cogl_pipeline_has_vertex_snippets (CoglPipeline *pipeline) +_cogl_pipeline_has_non_layer_vertex_snippets (CoglPipeline *pipeline) { CoglPipeline *authority = _cogl_pipeline_get_authority (pipeline, @@ -1641,6 +1641,22 @@ _cogl_pipeline_has_vertex_snippets (CoglPipeline *pipeline) return !COGL_LIST_EMPTY (&authority->big_state->vertex_snippets); } +gboolean +_cogl_pipeline_has_vertex_snippets (CoglPipeline *pipeline) +{ + return _cogl_pipeline_has_non_layer_vertex_snippets (pipeline); +} + +gboolean +_cogl_pipeline_has_non_layer_fragment_snippets (CoglPipeline *pipeline) +{ + CoglPipeline *authority = + _cogl_pipeline_get_authority (pipeline, + COGL_PIPELINE_STATE_FRAGMENT_SNIPPETS); + + return !COGL_LIST_EMPTY (&authority->big_state->fragment_snippets); +} + static gboolean check_layer_has_fragment_snippet (CoglPipelineLayer *layer, void *user_data) @@ -1662,12 +1678,9 @@ check_layer_has_fragment_snippet (CoglPipelineLayer *layer, gboolean _cogl_pipeline_has_fragment_snippets (CoglPipeline *pipeline) { - CoglPipeline *authority = - _cogl_pipeline_get_authority (pipeline, - COGL_PIPELINE_STATE_FRAGMENT_SNIPPETS); gboolean found_fragment_snippet = FALSE; - if (!COGL_LIST_EMPTY (&authority->big_state->fragment_snippets)) + if (_cogl_pipeline_has_non_layer_fragment_snippets (pipeline)) return TRUE; _cogl_pipeline_foreach_layer_internal (pipeline, diff --git a/cogl/cogl-pipeline.c b/cogl/cogl-pipeline.c index 2831b55f7..026c9c65b 100644 --- a/cogl/cogl-pipeline.c +++ b/cogl/cogl-pipeline.c @@ -761,6 +761,18 @@ _cogl_pipeline_needs_blending_enabled (CoglPipeline *pipeline, return TRUE; } + if (changes & COGL_PIPELINE_STATE_FRAGMENT_SNIPPETS) + { + if (!_cogl_pipeline_has_non_layer_fragment_snippets (pipeline)) + return TRUE; + } + + if (changes & COGL_PIPELINE_STATE_VERTEX_SNIPPETS) + { + if (!_cogl_pipeline_has_non_layer_vertex_snippets (pipeline)) + return TRUE; + } + /* XXX: we should only need to look at these if lighting is enabled */ if (changes & COGL_PIPELINE_STATE_LIGHTING)