From 9ed89c17dee752154c36d71cae93d20cccfc71ef Mon Sep 17 00:00:00 2001 From: Berke Güzel Date: Mon, 12 Oct 2026 14:27:51 +0300 Subject: perf: optimize hot-path loops, data structures, and cache locality --- src/wayland/buffer.c | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) (limited to 'src/wayland/buffer.c') diff --git a/src/wayland/buffer.c b/src/wayland/buffer.c index a1486fa..0561da3 100644 --- a/src/wayland/buffer.c +++ b/src/wayland/buffer.c @@ -322,19 +322,16 @@ int buffer_pick_free_index(const struct buffer *bufs, int cur) return free_buf_lut[(unsigned)cur & 3][busy]; } -struct latency_feedback { - struct wayland_surface *window; - struct wp_presentation_feedback *proxy; - struct latency_feedback *next; -}; - static void feedback_destroy(struct latency_feedback *feedback) { struct latency_feedback **link = &feedback->window->latency_feedbacks; while (*link && *link != feedback) link = &(*link)->next; if (*link) *link = feedback->next; wp_presentation_feedback_destroy(feedback->proxy); - free(feedback); + if (feedback->in_pool) + *feedback = (struct latency_feedback){0}; + else + free(feedback); } void surface_feedback_destroy(struct wayland_surface *w) @@ -386,10 +383,22 @@ void surface_request_presentation_feedback(struct wayland_surface *w) return; struct wp_presentation_feedback *fb = wp_presentation_feedback(w->conn->presentation, w->surface); - struct latency_feedback *feedback = fb ? calloc(1, sizeof(*feedback)) : NULL; - if (!feedback) { - if (fb) wp_presentation_feedback_destroy(fb); + if (!fb) return; + struct latency_feedback *feedback = NULL; + for (int i = 0; i < 8; i++) { + if (!w->latency_pool[i].window) { + feedback = &w->latency_pool[i]; + feedback->in_pool = true; + break; + } + } + if (!feedback) { + feedback = calloc(1, sizeof(*feedback)); + if (!feedback) { + wp_presentation_feedback_destroy(fb); + return; + } } feedback->window = w; feedback->proxy = fb; @@ -449,7 +458,10 @@ bool wayland_surface_present(struct wayland_surface *w, const struct yasl_frameb fb->size.x != w->width || fb->size.y != w->height) return false; - w->damage = *damage; + w->damage.n = damage->n; + w->damage.bounds = damage->bounds; + if (damage->n > 0) + memcpy(w->damage.rects, damage->rects, (size_t)damage->n * sizeof(damage->rects[0])); arm_frame(w); if (w->closed) return false; -- cgit v1.2.3