aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Orzechowski <orzechowski.alexander@gmail.com>2022-08-22 10:17:59 -0400
committerAlexander Orzechowski <orzechowski.alexander@gmail.com>2022-08-22 10:17:59 -0400
commit9bba4284e454c72f8269f766069456ad2aa17ad3 (patch)
tree28ca70709d3d13b450b34460dc7daa10ff8b0ad5
parent6d1b8b376d1e4a5e1b4b07e53487533711988136 (diff)
wlr_scene: Cull background
We don't need to worry about the black rect optimization here (that always assumes that there will be a black background) because the background is culled based on the render list. That means if a black rect is removed, the visibility will reach all the way to the bottom forcing the renderer to clear the area not breaking the assumption.
-rw-r--r--types/scene/wlr_scene.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/types/scene/wlr_scene.c b/types/scene/wlr_scene.c
index 5c14aa66..c1d7569a 100644
--- a/types/scene/wlr_scene.c
+++ b/types/scene/wlr_scene.c
@@ -1530,12 +1530,28 @@ bool wlr_scene_output_commit(struct wlr_scene_output *scene_output) {
wlr_renderer_begin(renderer, output->width, output->height);
+ pixman_region32_t background;
+ pixman_region32_copy(&background, &damage);
+
+ // Cull areas of the background that are occluded by opaque regions of
+ // scene nodes above. Those scene nodes will just render atop having us
+ // never see the background.
+ if (scene_output->scene->calculate_visibility) {
+ for (int i = list_len - 1; i >= 0; i--) {
+ struct wlr_scene_node *node = list_data[i];
+ int x, y;
+ wlr_scene_node_coords(node, &x, &y);
+ scene_node_cull_hidden(node, x, y, &background);
+ }
+ }
+
int nrects;
- pixman_box32_t *rects = pixman_region32_rectangles(&damage, &nrects);
+ pixman_box32_t *rects = pixman_region32_rectangles(&background, &nrects);
for (int i = 0; i < nrects; ++i) {
scissor_output(output, &rects[i]);
wlr_renderer_clear(renderer, (float[4]){ 0.0, 0.0, 0.0, 1.0 });
}
+ pixman_region32_fini(&background);
for (int i = list_len - 1; i >= 0; i--) {
struct wlr_scene_node *node = list_data[i];