From 59a7584386f5ac46ff7a4d27d9c342ed36d2c65e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= Date: Mon, 20 Nov 2017 14:30:46 +0100 Subject: [PATCH] gl renderer: Group render node types by render item creation --- gsk/gskglrenderer.c | 151 +++++++++++++++++++++++--------------------- 1 file changed, 79 insertions(+), 72 deletions(-) diff --git a/gsk/gskglrenderer.c b/gsk/gskglrenderer.c index f11a5d38c9..b36af0f0c1 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;