summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/pool-buffer.h6
-rw-r--r--main.c17
-rw-r--r--pool-buffer.c50
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
diff --git a/main.c b/main.c
index e43dbcb..d42c596 100644
--- a/main.c
+++ b/main.c
@@ -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;
}