diff options
-rw-r--r-- | include/pool-buffer.h | 6 | ||||
-rw-r--r-- | main.c | 17 | ||||
-rw-r--r-- | pool-buffer.c | 50 |
3 files changed, 13 insertions, 60 deletions
diff --git a/include/pool-buffer.h b/include/pool-buffer.h index a3930e0..8c6f4dd 100644 --- a/include/pool-buffer.h +++ b/include/pool-buffer.h @@ -9,14 +9,12 @@ struct pool_buffer { struct wl_buffer *buffer; cairo_surface_t *surface; cairo_t *cairo; - uint32_t width, height; void *data; size_t size; - bool busy; }; -struct pool_buffer *get_next_buffer(struct wl_shm *shm, - struct pool_buffer pool[static 2], uint32_t width, uint32_t height); +bool create_buffer(struct pool_buffer *buffer, struct wl_shm *shm, + int32_t width, int32_t height, uint32_t format); void destroy_buffer(struct pool_buffer *buffer); #endif @@ -72,8 +72,6 @@ struct swaybg_output { struct wl_surface *surface; struct zwlr_layer_surface_v1 *layer_surface; - struct pool_buffer buffers[2]; - struct pool_buffer *current_buffer; uint32_t width, height; int32_t scale; @@ -105,12 +103,13 @@ bool is_valid_color(const char *color) { static void render_frame(struct swaybg_output *output) { int buffer_width = output->width * output->scale, buffer_height = output->height * output->scale; - output->current_buffer = get_next_buffer(output->state->shm, - output->buffers, buffer_width, buffer_height); - if (!output->current_buffer) { + struct pool_buffer buffer; + if (!create_buffer(&buffer, output->state->shm, + buffer_width, buffer_height, WL_SHM_FORMAT_ARGB8888)) { return; } - cairo_t *cairo = output->current_buffer->cairo; + + cairo_t *cairo = buffer.cairo; cairo_save(cairo); cairo_set_operator(cairo, CAIRO_OPERATOR_CLEAR); cairo_paint(cairo); @@ -130,9 +129,11 @@ static void render_frame(struct swaybg_output *output) { } wl_surface_set_buffer_scale(output->surface, output->scale); - wl_surface_attach(output->surface, output->current_buffer->buffer, 0, 0); + wl_surface_attach(output->surface, buffer.buffer, 0, 0); wl_surface_damage_buffer(output->surface, 0, 0, INT32_MAX, INT32_MAX); wl_surface_commit(output->surface); + // we will not reuse the buffer, so destroy it immediately + destroy_buffer(&buffer); } static void destroy_swaybg_image(struct swaybg_image *image) { @@ -168,8 +169,6 @@ static void destroy_swaybg_output(struct swaybg_output *output) { } zxdg_output_v1_destroy(output->xdg_output); wl_output_destroy(output->wl_output); - destroy_buffer(&output->buffers[0]); - destroy_buffer(&output->buffers[1]); free(output->name); free(output->identifier); free(output); diff --git a/pool-buffer.c b/pool-buffer.c index 428ef51..0016c1f 100644 --- a/pool-buffer.c +++ b/pool-buffer.c @@ -57,18 +57,8 @@ static int create_pool_file(size_t size, char **name) { return fd; } -static void buffer_release(void *data, struct wl_buffer *wl_buffer) { - struct pool_buffer *buffer = data; - buffer->busy = false; -} - -static const struct wl_buffer_listener buffer_listener = { - .release = buffer_release -}; - -static struct pool_buffer *create_buffer(struct wl_shm *shm, - struct pool_buffer *buf, int32_t width, int32_t height, - uint32_t format) { +bool create_buffer(struct pool_buffer *buf, struct wl_shm *shm, + int32_t width, int32_t height, uint32_t format) { uint32_t stride = width * 4; size_t size = stride * height; @@ -86,15 +76,11 @@ static struct pool_buffer *create_buffer(struct wl_shm *shm, fd = -1; buf->size = size; - buf->width = width; - buf->height = height; buf->data = data; buf->surface = cairo_image_surface_create_for_data(data, CAIRO_FORMAT_ARGB32, width, height, stride); buf->cairo = cairo_create(buf->surface); - - wl_buffer_add_listener(buf->buffer, &buffer_listener, buf); - return buf; + return true; } void destroy_buffer(struct pool_buffer *buffer) { @@ -110,34 +96,4 @@ void destroy_buffer(struct pool_buffer *buffer) { if (buffer->data) { munmap(buffer->data, buffer->size); } - memset(buffer, 0, sizeof(struct pool_buffer)); -} - -struct pool_buffer *get_next_buffer(struct wl_shm *shm, - struct pool_buffer pool[static 2], uint32_t width, uint32_t height) { - struct pool_buffer *buffer = NULL; - - for (size_t i = 0; i < 2; ++i) { - if (pool[i].busy) { - continue; - } - buffer = &pool[i]; - } - - if (!buffer) { - return NULL; - } - - if (buffer->width != width || buffer->height != height) { - destroy_buffer(buffer); - } - - if (!buffer->buffer) { - if (!create_buffer(shm, buffer, width, height, - WL_SHM_FORMAT_ARGB8888)) { - return NULL; - } - } - buffer->busy = true; - return buffer; } |