[gtk+/wip/baedert/gl: 49/96] gl renderer: Group render node types by render item creation



commit c9650351c51fc95238612cc78603af4248a71bc9
Author: Timm Bäder <mail baedert org>
Date:   Mon Nov 20 14:30:46 2017 +0100

    gl renderer: Group render node types by render item creation

 gsk/gskglrenderer.c |  151 +++++++++++++++++++++++++++------------------------
 1 files changed, 79 insertions(+), 72 deletions(-)
---
diff --git a/gsk/gskglrenderer.c b/gsk/gskglrenderer.c
index f11a5d3..b36af0f 100644
--- a/gsk/gskglrenderer.c
+++ b/gsk/gskglrenderer.c
@@ -861,18 +861,85 @@ gsk_gl_renderer_add_render_item (GskGLRenderer           *self,
 {
   RenderItem item;
 
+  /* A few of the render nodes don't actually result in a RenderItem, they just
+   * change the current state and pass it down. */
   /* We handle container nodes here directly */
-  if (gsk_render_node_get_node_type (node) == GSK_CONTAINER_NODE)
+  switch ((guint)gsk_render_node_get_node_type (node))
     {
-      guint i, p;
+    case GSK_CONTAINER_NODE:
+      {
+        guint i, p;
 
-      for (i = 0, p = gsk_container_node_get_n_children (node); i < p; i++)
-        {
-          GskRenderNode *child = gsk_container_node_get_child (node, i);
-          gsk_gl_renderer_add_render_item (self, projection, modelview, render_items,
-                                           child, render_target, parent_clip);
-        }
-      return;
+        for (i = 0, p = gsk_container_node_get_n_children (node); i < p; i++)
+          {
+            GskRenderNode *child = gsk_container_node_get_child (node, i);
+            gsk_gl_renderer_add_render_item (self, projection, modelview, render_items,
+                                             child, render_target, parent_clip);
+          }
+      }
+    return;
+
+    case GSK_TRANSFORM_NODE:
+      {
+        graphene_matrix_t transform, transformed_mv;
+
+        graphene_matrix_init_from_matrix (&transform, gsk_transform_node_peek_transform (node));
+        graphene_matrix_multiply (&transform, modelview, &transformed_mv);
+        gsk_gl_renderer_add_render_item (self, projection, &transformed_mv, render_items,
+                                         gsk_transform_node_get_child (node),
+                                         render_target,
+                                         parent_clip);
+      }
+    return;
+
+    case GSK_CLIP_NODE:
+      {
+        GskRenderNode *child = gsk_clip_node_get_child (node);
+        graphene_rect_t transformed_clip;
+        graphene_rect_t intersection;
+        GskRoundedRect child_clip;
+
+        transformed_clip = *gsk_clip_node_peek_clip (node);
+        graphene_matrix_transform_bounds (modelview, &transformed_clip, &transformed_clip);
+
+        /* Since we do the intersection here, we also need to transform by the modelview matrix.
+         * We can't do it in the shader. Same with rounded clips */
+        graphene_rect_intersection (&transformed_clip,
+                                    &parent_clip->bounds,
+                                    &intersection);
+
+        gsk_rounded_rect_init_from_rect (&child_clip, &intersection, 0.0f);
+
+        gsk_gl_renderer_add_render_item (self, projection, modelview, render_items, child,
+                                         render_target, &child_clip);
+      }
+    return;
+
+    case GSK_ROUNDED_CLIP_NODE:
+      {
+        GskRenderNode *child = gsk_rounded_clip_node_get_child (node);
+        const GskRoundedRect *rounded_clip = gsk_rounded_clip_node_peek_clip (node);
+        graphene_rect_t transformed_clip;
+        graphene_rect_t intersection;
+        GskRoundedRect child_clip;
+
+        transformed_clip = rounded_clip->bounds;
+        graphene_matrix_transform_bounds (modelview, &transformed_clip, &transformed_clip);
+
+        graphene_rect_intersection (&transformed_clip, &parent_clip->bounds,
+                                    &intersection);
+        gsk_rounded_rect_init (&child_clip, &intersection,
+                               &rounded_clip->corner[0],
+                               &rounded_clip->corner[1],
+                               &rounded_clip->corner[2],
+                               &rounded_clip->corner[3]);
+
+        gsk_gl_renderer_add_render_item (self, projection, modelview, render_items, child,
+                                         render_target, &child_clip);
+      }
+    return;
+
+    default: {}
     }
 
   memset (&item, 0, sizeof (RenderItem));
@@ -941,53 +1008,6 @@ gsk_gl_renderer_add_render_item (GskGLRenderer           *self,
       }
       break;
 
-    case GSK_CLIP_NODE:
-      {
-        GskRenderNode *child = gsk_clip_node_get_child (node);
-        graphene_rect_t transformed_clip;
-        graphene_rect_t intersection;
-        GskRoundedRect child_clip;
-
-        transformed_clip = *gsk_clip_node_peek_clip (node);
-        graphene_matrix_transform_bounds (modelview, &transformed_clip, &transformed_clip);
-
-        /* Since we do the intersection here, we also need to transform by the modelview matrix.
-         * We can't do it in the shader. Same with rounded clips */
-        graphene_rect_intersection (&transformed_clip,
-                                    &parent_clip->bounds,
-                                    &intersection);
-
-        gsk_rounded_rect_init_from_rect (&child_clip, &intersection, 0.0f);
-
-        gsk_gl_renderer_add_render_item (self, projection, modelview, render_items, child,
-                                         render_target, &child_clip);
-      }
-      return;
-
-    case GSK_ROUNDED_CLIP_NODE:
-      {
-        GskRenderNode *child = gsk_rounded_clip_node_get_child (node);
-        const GskRoundedRect *rounded_clip = gsk_rounded_clip_node_peek_clip (node);
-        graphene_rect_t transformed_clip;
-        graphene_rect_t intersection;
-        GskRoundedRect child_clip;
-
-        transformed_clip = rounded_clip->bounds;
-        graphene_matrix_transform_bounds (modelview, &transformed_clip, &transformed_clip);
-
-        graphene_rect_intersection (&transformed_clip, &parent_clip->bounds,
-                                    &intersection);
-        gsk_rounded_rect_init (&child_clip, &intersection,
-                               &rounded_clip->corner[0],
-                               &rounded_clip->corner[1],
-                               &rounded_clip->corner[2],
-                               &rounded_clip->corner[3]);
-
-        gsk_gl_renderer_add_render_item (self, projection, modelview, render_items, child,
-                                         render_target, &child_clip);
-      }
-      return;
-
     case GSK_COLOR_MATRIX_NODE:
       {
         GskRenderNode *child = gsk_color_matrix_node_get_child (node);
@@ -1096,22 +1116,6 @@ gsk_gl_renderer_add_render_item (GskGLRenderer           *self,
       }
       break;
 
-    case GSK_TRANSFORM_NODE:
-      {
-        graphene_matrix_t transform, transformed_mv;
-
-        graphene_matrix_init_from_matrix (&transform, gsk_transform_node_peek_transform (node));
-        graphene_matrix_multiply (&transform, modelview, &transformed_mv);
-        gsk_gl_renderer_add_render_item (self,
-                                         projection,
-                                         &transformed_mv,
-                                         render_items,
-                                         gsk_transform_node_get_child (node),
-                                         render_target,
-                                         parent_clip);
-      }
-      return;
-
     case GSK_TEXT_NODE:
       {
         const PangoFont *font = gsk_text_node_peek_font (node);
@@ -1212,6 +1216,9 @@ gsk_gl_renderer_add_render_item (GskGLRenderer           *self,
 
     case GSK_NOT_A_RENDER_NODE:
     case GSK_CONTAINER_NODE:
+    case GSK_TRANSFORM_NODE:
+    case GSK_CLIP_NODE:
+    case GSK_ROUNDED_CLIP_NODE:
       g_assert_not_reached ();
       return;
 


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