vulkan: Do intersection check for every node
authorBenjamin Otte <otte@redhat.com>
Sun, 11 Jun 2023 01:01:04 +0000 (03:01 +0200)
committerBenjamin Otte <otte@redhat.com>
Sun, 11 Jun 2023 01:54:50 +0000 (03:54 +0200)
This is more expensive, but it finds more cases, and in particular it
catches corner cases like empty nodes or fully clipped nodes that might
otherwise make the kernel throw signals in our direction.

gsk/vulkan/gskvulkanrenderpass.c

index 67338b74cdac2ba3aa7a1e94c9f18d81795ff1ca..c98c3689736bad608ab133287154d90a1ee56529 100644 (file)
@@ -355,9 +355,6 @@ gsk_vulkan_render_pass_add_container_node (GskVulkanRenderPass       *self,
                                            const GskVulkanParseState *state,
                                            GskRenderNode             *node)
 {
-  if (!gsk_vulkan_clip_intersects_rect (&state->clip, &state->offset, &node->bounds))
-    return TRUE;
-
   for (guint i = 0; i < gsk_container_node_get_n_children (node); i++)
     gsk_vulkan_render_pass_add_node (self, render, state, gsk_container_node_get_child (node, i));
 
@@ -1170,6 +1167,11 @@ gsk_vulkan_render_pass_add_node (GskVulkanRenderPass       *self,
   GskRenderNodeType node_type;
   gboolean fallback = FALSE;
 
+  /* This catches the corner cases of empty nodes, so after this check
+   * there's quaranteed to be at least 1 pixel that needs to be drawn */
+  if (!gsk_vulkan_clip_intersects_rect (&state->clip, &state->offset, &node->bounds))
+    return;
+
   node_type = gsk_render_node_get_node_type (node);
   node_func = nodes_vtable[node_type];