diff options
Diffstat (limited to 'wayland/buffers.c')
-rw-r--r-- | wayland/buffers.c | 27 |
1 files changed, 10 insertions, 17 deletions
diff --git a/wayland/buffers.c b/wayland/buffers.c index e9780997..3b809e6f 100644 --- a/wayland/buffers.c +++ b/wayland/buffers.c | |||
@@ -50,11 +50,8 @@ static const struct wl_buffer_listener buffer_listener = { | |||
50 | .release = buffer_release | 50 | .release = buffer_release |
51 | }; | 51 | }; |
52 | 52 | ||
53 | static struct buffer *create_buffer(struct window *window, struct buffer *buf, | 53 | static struct buffer *create_buffer(struct wl_shm *shm, struct buffer *buf, |
54 | int32_t width, int32_t height, int32_t scale, uint32_t format) { | 54 | int32_t width, int32_t height, uint32_t format) { |
55 | |||
56 | width *= scale; | ||
57 | height *= scale; | ||
58 | uint32_t stride = width * 4; | 55 | uint32_t stride = width * 4; |
59 | uint32_t size = stride * height; | 56 | uint32_t size = stride * height; |
60 | 57 | ||
@@ -65,7 +62,7 @@ static struct buffer *create_buffer(struct window *window, struct buffer *buf, | |||
65 | return NULL; // never reached | 62 | return NULL; // never reached |
66 | } | 63 | } |
67 | void *data = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); | 64 | void *data = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); |
68 | struct wl_shm_pool *pool = wl_shm_create_pool(window->registry->shm, fd, size); | 65 | struct wl_shm_pool *pool = wl_shm_create_pool(shm, fd, size); |
69 | buf->buffer = wl_shm_pool_create_buffer(pool, 0, | 66 | buf->buffer = wl_shm_pool_create_buffer(pool, 0, |
70 | width, height, stride, format); | 67 | width, height, stride, format); |
71 | wl_shm_pool_destroy(pool); | 68 | wl_shm_pool_destroy(pool); |
@@ -101,34 +98,30 @@ static void destroy_buffer(struct buffer *buffer) { | |||
101 | memset(buffer, 0, sizeof(struct buffer)); | 98 | memset(buffer, 0, sizeof(struct buffer)); |
102 | } | 99 | } |
103 | 100 | ||
104 | struct buffer *get_next_buffer(struct window *window) { | 101 | struct pool_buffer *get_next_buffer(struct wl_shm *shm, |
102 | struct pool_buffer pool[2], uint32_t width, uint32_t height) { | ||
105 | struct buffer *buffer = NULL; | 103 | struct buffer *buffer = NULL; |
106 | 104 | ||
107 | int i; | 105 | for (size_t i = 0; i < sizeof(pool) / sizeof(pool[0]); ++i) { |
108 | for (i = 0; i < 2; ++i) { | 106 | if (buffers[i].busy) { |
109 | if (window->buffers[i].busy) { | ||
110 | continue; | 107 | continue; |
111 | } | 108 | } |
112 | buffer = &window->buffers[i]; | 109 | buffer = &buffers[i]; |
113 | } | 110 | } |
114 | 111 | ||
115 | if (!buffer) { | 112 | if (!buffer) { |
116 | return NULL; | 113 | return NULL; |
117 | } | 114 | } |
118 | 115 | ||
119 | if (buffer->width != window->width || buffer->height != window->height) { | 116 | if (buffer->width != width || buffer->height != height) { |
120 | destroy_buffer(buffer); | 117 | destroy_buffer(buffer); |
121 | } | 118 | } |
122 | 119 | ||
123 | if (!buffer->buffer) { | 120 | if (!buffer->buffer) { |
124 | if (!create_buffer(window, buffer, | 121 | if (!create_buffer(shm, buffer, width, height, |
125 | window->width, window->height, window->scale, | ||
126 | WL_SHM_FORMAT_ARGB8888)) { | 122 | WL_SHM_FORMAT_ARGB8888)) { |
127 | return NULL; | 123 | return NULL; |
128 | } | 124 | } |
129 | } | 125 | } |
130 | |||
131 | window->cairo = buffer->cairo; | ||
132 | window->buffer = buffer; | ||
133 | return buffer; | 126 | return buffer; |
134 | } | 127 | } |