cogl_pipeline_equal: Handle COGL_WRAP_MODE_AUTOMATIC better

When comparing the wrap modes of two pipeline layers it now considers
COGL_WRAP_MODE_AUTOMATIC to be equivalent to CLAMP_TO_EDGE. By the
time the pipeline is in the journal, the upper primitive code is
expected to have overridden this wrap mode with something else if it
wants any other behaviour. This is important for getting text to batch
together with textures because the text explicitly sets the wrap mode
to CLAMP_TO_EDGE on its pipeline.
This commit is contained in:
Neil Roberts 2011-03-30 16:33:04 +01:00
parent 41e464fc9e
commit 77cd2ca08e

View File

@ -3195,13 +3195,31 @@ _cogl_pipeline_layer_filters_equal (CoglPipelineLayer *authority0,
return TRUE; return TRUE;
} }
static gboolean
compare_wrap_mode_equal (CoglPipelineWrapMode wrap_mode0,
CoglPipelineWrapMode wrap_mode1)
{
/* We consider AUTOMATIC to be equivalent to CLAMP_TO_EDGE because
the primitives code is expected to override this to something
else if it wants it to be behave any other way */
if (wrap_mode0 == COGL_PIPELINE_WRAP_MODE_AUTOMATIC)
wrap_mode0 = COGL_PIPELINE_WRAP_MODE_CLAMP_TO_EDGE;
if (wrap_mode1 == COGL_PIPELINE_WRAP_MODE_AUTOMATIC)
wrap_mode1 = COGL_PIPELINE_WRAP_MODE_CLAMP_TO_EDGE;
return wrap_mode0 == wrap_mode1;
}
static gboolean static gboolean
_cogl_pipeline_layer_wrap_modes_equal (CoglPipelineLayer *authority0, _cogl_pipeline_layer_wrap_modes_equal (CoglPipelineLayer *authority0,
CoglPipelineLayer *authority1) CoglPipelineLayer *authority1)
{ {
if (authority0->wrap_mode_s != authority1->wrap_mode_s || if (!compare_wrap_mode_equal (authority0->wrap_mode_s,
authority0->wrap_mode_t != authority1->wrap_mode_t || authority1->wrap_mode_s) ||
authority0->wrap_mode_p != authority1->wrap_mode_p) !compare_wrap_mode_equal (authority0->wrap_mode_t,
authority1->wrap_mode_t) ||
!compare_wrap_mode_equal (authority0->wrap_mode_p,
authority1->wrap_mode_p))
return FALSE; return FALSE;
return TRUE; return TRUE;
@ -3684,6 +3702,11 @@ _cogl_pipeline_resolve_authorities (CoglPipeline *pipeline,
* it means that _cogl_pipeline_equal doesn't strictly compare whether the * it means that _cogl_pipeline_equal doesn't strictly compare whether the
* pipelines are the same. If we needed those semantics we could perhaps add * pipelines are the same. If we needed those semantics we could perhaps add
* another function or some flags to control the behaviour. * another function or some flags to control the behaviour.
*
* XXX: Similarly when comparing the wrap modes,
* COGL_PIPELINE_WRAP_MODE_AUTOMATIC is considered to be the same as
* COGL_PIPELINE_WRAP_MODE_CLAMP_TO_EDGE because once they get to the
* journal stage they act exactly the same.
*/ */
gboolean gboolean
_cogl_pipeline_equal (CoglPipeline *pipeline0, _cogl_pipeline_equal (CoglPipeline *pipeline0,