From 2afd0dad693f216676b375e8ae4b10639c26acb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= Date: Tue, 1 May 2018 12:51:04 +0200 Subject: [PATCH] gl renderer: Ignore nodes outside of the clip Pretty sure this will bite me later but for now we avoid rendering nodes that we are not going to see anyway. --- gsk/gl/gskglrenderer.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/gsk/gl/gskglrenderer.c b/gsk/gl/gskglrenderer.c index eca829a18c..ab27264cf9 100644 --- a/gsk/gl/gskglrenderer.c +++ b/gsk/gl/gskglrenderer.c @@ -2055,7 +2055,6 @@ gsk_gl_renderer_add_render_ops (GskGLRenderer *self, const float min_y = builder->dy + node->bounds.origin.y; const float max_x = min_x + node->bounds.size.width; const float max_y = min_y + node->bounds.size.height; - /* Default vertex data */ const GskQuadVertex vertex_data[GL_N_VERTICES] = { { { min_x, min_y }, { 0, 0 }, }, @@ -2072,6 +2071,21 @@ gsk_gl_renderer_add_render_ops (GskGLRenderer *self, if (node->bounds.size.width == 0.0f || node->bounds.size.height == 0.0f) return; + /* Check whether the render node is entirely out of the current + * already transformed clip region */ + { + graphene_rect_t real_node_bounds; + + graphene_matrix_transform_bounds (&builder->current_modelview, + &node->bounds, + &real_node_bounds); + graphene_rect_offset (&real_node_bounds, builder->dx, builder->dy); + + if (!graphene_rect_intersection (&builder->current_clip.bounds, + &real_node_bounds, NULL)) + return; + } + #if DEBUG_OPS if (gsk_render_node_get_node_type (node) != GSK_CONTAINER_NODE) g_message ("Adding ops for node %s with type %u", node->name,