From 57a03137799d0e66bb635cc2b1b18b18dcaa92cc Mon Sep 17 00:00:00 2001 From: Alexander Orzechowski Date: Thu, 29 Jun 2023 01:43:15 -0400 Subject: [PATCH] wlr_scene: Don't recompute node location during rendering We already compute it during the render list creation, we should cache it and re-use the value. --- types/scene/wlr_scene.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/types/scene/wlr_scene.c b/types/scene/wlr_scene.c index 9394b5c9..d8987fca 100644 --- a/types/scene/wlr_scene.c +++ b/types/scene/wlr_scene.c @@ -1089,11 +1089,14 @@ struct wlr_scene_node *wlr_scene_node_at(struct wlr_scene_node *node, return NULL; } -static void scene_node_render(struct wlr_scene_node *node, const struct render_data *data) { +struct render_list_entry { + struct wlr_scene_node *node; + bool sent_dmabuf_feedback; int x, y; - wlr_scene_node_coords(node, &x, &y); - x -= data->logical.x; - y -= data->logical.y; +}; + +static void scene_entry_render(struct render_list_entry *entry, const struct render_data *data) { + struct wlr_scene_node *node = entry->node; pixman_region32_t render_region; pixman_region32_init(&render_region); @@ -1107,15 +1110,15 @@ static void scene_node_render(struct wlr_scene_node *node, const struct render_d } struct wlr_box dst_box = { - .x = x, - .y = y, + .x = entry->x - data->logical.x, + .y = entry->y - data->logical.y, }; scene_node_get_size(node, &dst_box.width, &dst_box.height); scale_box(&dst_box, data->scale); pixman_region32_t opaque; pixman_region32_init(&opaque); - scene_node_opaque_region(node, x, y, &opaque); + scene_node_opaque_region(node, dst_box.x, dst_box.y, &opaque); scale_output_damage(&opaque, data->scale); pixman_region32_subtract(&opaque, &render_region, &opaque); @@ -1394,11 +1397,6 @@ struct render_list_constructor_data { bool calculate_visibility; }; -struct render_list_entry { - struct wlr_scene_node *node; - bool sent_dmabuf_feedback; -}; - static bool construct_render_list_iterator(struct wlr_scene_node *node, int lx, int ly, void *_data) { struct render_list_constructor_data *data = _data; @@ -1438,6 +1436,8 @@ static bool construct_render_list_iterator(struct wlr_scene_node *node, *entry = (struct render_list_entry){ .node = node, + .x = lx, + .y = ly, }; return false; @@ -1801,7 +1801,7 @@ bool wlr_scene_output_build_state(struct wlr_scene_output *scene_output, for (int i = list_len - 1; i >= 0; i--) { struct render_list_entry *entry = &list_data[i]; - scene_node_render(entry->node, &render_data); + scene_entry_render(entry, &render_data); if (entry->node->type == WLR_SCENE_NODE_BUFFER) { struct wlr_scene_buffer *buffer = wlr_scene_buffer_from_node(entry->node);