gl renderer: Ignore nodes outside of the clip
authorTimm Bäder <mail@baedert.org>
Tue, 1 May 2018 10:51:04 +0000 (12:51 +0200)
committerTimm Bäder <mail@baedert.org>
Tue, 1 May 2018 13:13:11 +0000 (15:13 +0200)
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

index eca829a18c2c0876424904c8b89d952190ab06a9..613862cccb419a8e1001e85ef9a386c53a845eeb 100644 (file)
@@ -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 transformed_node_bounds;
+
+    graphene_matrix_transform_bounds (&builder->current_modelview,
+                                      &node->bounds,
+                                      &transformed_node_bounds);
+    graphene_rect_offset (&transformed_node_bounds, builder->dx, builder->dy);
+
+    if (!graphene_rect_intersection (&builder->current_clip.bounds,
+                                     &transformed_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,