[cogl/wip/rib/cogl-1.12: 107/142] Cache the debug wireframe snippet



commit d695142a80b851dbd3aec93a18537dfa23ff80cf
Author: Neil Roberts <neil linux intel com>
Date:   Sat May 19 23:07:17 2012 +0100

    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)

 cogl/cogl-framebuffer.c |   20 +++++++++++++-------
 1 files changed, 13 insertions(+), 7 deletions(-)
---
diff --git a/cogl/cogl-framebuffer.c b/cogl/cogl-framebuffer.c
index 8865ba9..f4bb304 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
         {



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]