summaryrefslogtreecommitdiff
path: root/cogl/cogl-framebuffer.c
diff options
context:
space:
mode:
authorNeil Roberts <neil@linux.intel.com>2012-05-19 23:07:17 +0100
committerRobert Bragg <robert@linux.intel.com>2012-08-06 14:27:43 +0100
commit67a095b9ddd2c79e4030955c33d1545601e712bb (patch)
tree963fbae5f7c58968b4e7ed6bf0350be098783638 /cogl/cogl-framebuffer.c
parent1357c4c6a6905978c37dcf373483333d04b02b5c (diff)
downloadcogl-67a095b9ddd2c79e4030955c33d1545601e712bb.tar.gz
Cache the debug wireframe snippet
When rendering the debug wireframe Cogl generates a child pipeline of the application's pipeline to replace the fragment processing. Previously it was creating a new snippet every time something was drawn. Cogl doesn't attempt to compare the contents of snippets when looking in the program cache for a matching pipeline so this would cause it to generate a new program for every primitive. It then quite quickly ends printing the warning about there being more than 50 programs in the cache. To fix that this patch makes it cache the snippet so that Cogl can successfully recognise that it already has a program generated for the new pipeline. Reviewed-by: Robert Bragg <robert@linux.intel.com> (cherry picked from commit c4bb08ee8767b5320980dba10b20921393cb5613)
Diffstat (limited to 'cogl/cogl-framebuffer.c')
-rw-r--r--cogl/cogl-framebuffer.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/cogl/cogl-framebuffer.c b/cogl/cogl-framebuffer.c
index 8865ba9d..f4bb304a 100644
--- a/cogl/cogl-framebuffer.c
+++ b/cogl/cogl-framebuffer.c
@@ -3277,15 +3277,21 @@ draw_wireframe (CoglContext *ctx,
* of the wire color leaving the rest of the state untouched. */
if (cogl_has_feature (framebuffer->context, COGL_FEATURE_ID_GLSL))
{
- CoglSnippet *snippet = cogl_snippet_new (COGL_SNIPPET_HOOK_FRAGMENT,
- NULL,
- NULL);
- cogl_snippet_set_replace (snippet,
- "cogl_color_out = "
- "vec4 (0.0, 1.0, 0.0, 1.0);\n");
+ static CoglSnippet *snippet = NULL;
+
+ /* The snippet is cached so that it will reuse the program
+ * from the pipeline cache if possible */
+ if (snippet == NULL)
+ {
+ snippet = cogl_snippet_new (COGL_SNIPPET_HOOK_FRAGMENT,
+ NULL,
+ NULL);
+ cogl_snippet_set_replace (snippet,
+ "cogl_color_out = "
+ "vec4 (0.0, 1.0, 0.0, 1.0);\n");
+ }
cogl_pipeline_add_snippet (wire_pipeline, snippet);
- cogl_object_unref (snippet);
}
else
{