1d3e62c67f
The wl_buffers for the background surface only need to be updated when the output dimensions change. Using the fixed pool of two buffers to cache these buffers does not help, since if a new buffer is needed, it will have a different size than whatever buffers were cached. Furthermore, because the pool has fixed size, it is possible to run out of buffers if configure events arrive faster than pool buffers are marked not busy, which can lead to protocol errors when the background surface is committed after acknowledging a new size, but without attaching a buffer that matches that size.
25 lines
615 B
C
25 lines
615 B
C
#ifndef _SWAY_BUFFERS_H
|
|
#define _SWAY_BUFFERS_H
|
|
#include <cairo/cairo.h>
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
#include <wayland-client.h>
|
|
|
|
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 *create_buffer(struct wl_shm *shm, struct pool_buffer *buf,
|
|
int32_t width, int32_t height, uint32_t format);
|
|
struct pool_buffer *get_next_buffer(struct wl_shm *shm,
|
|
struct pool_buffer pool[static 2], uint32_t width, uint32_t height);
|
|
void destroy_buffer(struct pool_buffer *buffer);
|
|
|
|
#endif
|