window: destroy the 2nd shm buffer, if both released
Handle the case when we the compositor somehow migrates from requiring double buffering into working on single buffering, so we release the extra shm buffer. Currently, I do not think this can happen in practice, but in the future it may happen with sub-surfaces. Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
This commit is contained in:
committed by
Kristian Høgsberg
parent
33a68eaaf4
commit
550d66bcb1
+12
-10
@@ -807,6 +807,8 @@ shm_surface_leaf_release(struct shm_surface_leaf *leaf)
|
|||||||
|
|
||||||
if (leaf->resize_pool)
|
if (leaf->resize_pool)
|
||||||
shm_pool_destroy(leaf->resize_pool);
|
shm_pool_destroy(leaf->resize_pool);
|
||||||
|
|
||||||
|
memset(leaf, 0, sizeof *leaf);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct shm_surface {
|
struct shm_surface {
|
||||||
@@ -829,17 +831,17 @@ to_shm_surface(struct toysurface *base)
|
|||||||
static void
|
static void
|
||||||
shm_surface_buffer_release(void *data, struct wl_buffer *buffer)
|
shm_surface_buffer_release(void *data, struct wl_buffer *buffer)
|
||||||
{
|
{
|
||||||
struct shm_surface_leaf *leaf = data;
|
struct shm_surface *surface = data;
|
||||||
|
|
||||||
leaf->busy = 0;
|
if (surface->leaf[0].data->buffer == buffer)
|
||||||
|
surface->leaf[0].busy = 0;
|
||||||
|
else if (surface->leaf[1].data->buffer == buffer)
|
||||||
|
surface->leaf[1].busy = 0;
|
||||||
|
else
|
||||||
|
assert(0 && "shm_surface_buffer_release: unknown buffer");
|
||||||
|
|
||||||
/* If both leaves are now free, we should call
|
if (!surface->leaf[0].busy && !surface->leaf[1].busy)
|
||||||
* shm_surface_leaf_release(shm_surface::leaf[1]).
|
shm_surface_leaf_release(&surface->leaf[1]);
|
||||||
* However, none of Weston's backends switch dynamically
|
|
||||||
* between early buffer release and requiring double-buffering,
|
|
||||||
* so if both leaves are free, we never used the second
|
|
||||||
* leaf to begin with.
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct wl_buffer_listener shm_surface_buffer_listener = {
|
static const struct wl_buffer_listener shm_surface_buffer_listener = {
|
||||||
@@ -908,7 +910,7 @@ shm_surface_prepare(struct toysurface *base, int dx, int dy,
|
|||||||
leaf->resize_pool,
|
leaf->resize_pool,
|
||||||
&leaf->data);
|
&leaf->data);
|
||||||
wl_buffer_add_listener(leaf->data->buffer,
|
wl_buffer_add_listener(leaf->data->buffer,
|
||||||
&shm_surface_buffer_listener, leaf);
|
&shm_surface_buffer_listener, surface);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
surface->current = leaf;
|
surface->current = leaf;
|
||||||
|
|||||||
Reference in New Issue
Block a user