summaryrefslogtreecommitdiff
path: root/src/wayland/buffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/wayland/buffer.c')
-rw-r--r--src/wayland/buffer.c34
1 files changed, 23 insertions, 11 deletions
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;