summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeil Roberts <neil@linux.intel.com>2011-03-30 16:33:04 +0100
committerRobert Bragg <robert@linux.intel.com>2011-05-05 17:32:30 +0100
commit184527580e38c0227db87011fb38a1b830719fb4 (patch)
treea8b5905a36840056489059db71b8eaf289814bba
parent66c54e04de83b7a5333f9bc1930598a494ac6236 (diff)
downloadcogl-184527580e38c0227db87011fb38a1b830719fb4.tar.gz
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.
-rw-r--r--cogl/cogl-pipeline.c29
1 files changed, 26 insertions, 3 deletions
diff --git a/cogl/cogl-pipeline.c b/cogl/cogl-pipeline.c
index e011f8db..6dec6a01 100644
--- a/cogl/cogl-pipeline.c
+++ b/cogl/cogl-pipeline.c
@@ -3196,12 +3196,30 @@ _cogl_pipeline_layer_filters_equal (CoglPipelineLayer *authority0,
}
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
_cogl_pipeline_layer_wrap_modes_equal (CoglPipelineLayer *authority0,
CoglPipelineLayer *authority1)
{
- if (authority0->wrap_mode_s != authority1->wrap_mode_s ||
- authority0->wrap_mode_t != authority1->wrap_mode_t ||
- authority0->wrap_mode_p != authority1->wrap_mode_p)
+ if (!compare_wrap_mode_equal (authority0->wrap_mode_s,
+ authority1->wrap_mode_s) ||
+ !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 TRUE;
@@ -3684,6 +3702,11 @@ _cogl_pipeline_resolve_authorities (CoglPipeline *pipeline,
* 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
* 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
_cogl_pipeline_equal (CoglPipeline *pipeline0,