From 1f8045ddbeb70547a50d34814723ad95c5348c4e Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sun, 11 Jun 2023 03:01:04 +0200 Subject: [PATCH] vulkan: Do intersection check for every node 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 | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/gsk/vulkan/gskvulkanrenderpass.c b/gsk/vulkan/gskvulkanrenderpass.c index 67338b74cd..c98c368973 100644 --- a/gsk/vulkan/gskvulkanrenderpass.c +++ b/gsk/vulkan/gskvulkanrenderpass.c @@ -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];