From afa4eb7d354301e21c827ab151970da2c661460b Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Mon, 5 Aug 2024 17:07:01 +0200 Subject: [PATCH] gpu: Make containers check opaque size for early exit Container nodes save their opaque region, so it's quick to access. Use that to check if the largest opaque region even qualifies for culling - and if not, just exit. Speeds up walking node trees by a lot. --- gsk/gpu/gskgpunodeprocessor.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/gsk/gpu/gskgpunodeprocessor.c b/gsk/gpu/gskgpunodeprocessor.c index 71813ac32e..3eb3e201b2 100644 --- a/gsk/gpu/gskgpunodeprocessor.c +++ b/gsk/gpu/gskgpunodeprocessor.c @@ -3596,12 +3596,17 @@ gsk_gpu_node_processor_add_first_container_node (GskGpuNodeProcessor *self, gsize min_occlusion_pixels, GskRenderNode *node) { + graphene_rect_t opaque; int i, n; n = gsk_container_node_get_n_children (node); if (n == 0) return FALSE; + if (!gsk_render_node_get_opaque_rect (node, &opaque) || + !gsk_gpu_node_processor_clip_first_node (self, min_occlusion_pixels, &opaque)) + return FALSE; + for (i = n; i-->0; ) { if (gsk_gpu_node_processor_add_first_node (self, @@ -3614,14 +3619,6 @@ gsk_gpu_node_processor_add_first_container_node (GskGpuNodeProcessor *self, if (i < 0) { - graphene_rect_t opaque; - - if (!gsk_render_node_get_opaque_rect (node, &opaque)) - return FALSE; - - if (!gsk_gpu_node_processor_clip_first_node (self, min_occlusion_pixels, &opaque)) - return FALSE; - gsk_gpu_render_pass_begin_op (self->frame, target, &self->scissor,