From bab41fb70cc46268a6409f11c72bd2d883d11c5f Mon Sep 17 00:00:00 2001 From: Benjamin Franzke Date: Mon, 7 Mar 2011 18:04:59 +0100 Subject: [PATCH] compositor: Use surface_attached_to list for shm-buffers --- compositor/compositor.c | 4 ++++ compositor/compositor.h | 1 + compositor/shm.c | 26 ++++++++++++++------------ 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/compositor/compositor.c b/compositor/compositor.c index 8104b550..bebf8dcc 100644 --- a/compositor/compositor.c +++ b/compositor/compositor.c @@ -132,6 +132,7 @@ wlsc_surface_create(struct wlsc_compositor *compositor, wl_list_init(&surface->surface.destroy_listener_list); wl_list_init(&surface->link); + wl_list_init(&surface->buffer_link); surface->map_type = WLSC_SURFACE_MAP_UNMAPPED; glGenTextures(1, &surface->texture); @@ -145,6 +146,7 @@ wlsc_surface_create(struct wlsc_compositor *compositor, surface->visual = NULL; surface->image = EGL_NO_IMAGE_KHR; surface->saved_texture = 0; + surface->buffer = NULL; surface->x = x; surface->y = y; surface->width = width; @@ -212,6 +214,8 @@ destroy_surface(struct wl_resource *resource, struct wl_client *client) eglDestroyImageKHR(surface->compositor->display, surface->image); + wl_list_remove(&surface->buffer_link); + time = get_time(); wl_list_for_each_safe(l, next, &surface->surface.destroy_listener_list, link) diff --git a/compositor/compositor.h b/compositor/compositor.h index 8c7ff4c5..ae0e70f5 100644 --- a/compositor/compositor.h +++ b/compositor/compositor.h @@ -160,6 +160,7 @@ struct wlsc_surface { int32_t x, y, width, height; int32_t saved_x, saved_y; struct wl_list link; + struct wl_list buffer_link; struct wlsc_matrix matrix; struct wlsc_matrix matrix_inv; struct wl_visual *visual; diff --git a/compositor/shm.c b/compositor/shm.c index 378af998..d27056a3 100644 --- a/compositor/shm.c +++ b/compositor/shm.c @@ -26,6 +26,7 @@ struct wlsc_shm_buffer { struct wl_buffer buffer; + struct wl_list surfaces_attached_to; int32_t stride; void *data; int mapped; @@ -36,18 +37,18 @@ destroy_buffer(struct wl_resource *resource, struct wl_client *client) { struct wlsc_shm_buffer *buffer = container_of(resource, struct wlsc_shm_buffer, buffer.resource); - struct wlsc_compositor *compositor = - (struct wlsc_compositor *) buffer->buffer.compositor; - struct wlsc_surface *es; + struct wlsc_surface *es, *next; if (buffer->mapped) munmap(buffer->data, buffer->stride * buffer->buffer.height); else free(buffer->data); - wl_list_for_each(es, &compositor->surface_list, link) - if (es->buffer == (struct wl_buffer *) buffer) - es->buffer = NULL; + wl_list_for_each_safe(es, next, &buffer->surfaces_attached_to, + buffer_link) { + es->buffer = NULL; + wl_list_remove(&es->buffer_link); + } free(buffer); } @@ -58,14 +59,9 @@ buffer_damage(struct wl_client *client, struct wl_buffer *buffer_base, { struct wlsc_shm_buffer *buffer = (struct wlsc_shm_buffer *) buffer_base; - struct wlsc_compositor *compositor = - (struct wlsc_compositor *) buffer->buffer.compositor; struct wlsc_surface *es; - wl_list_for_each(es, &compositor->surface_list, link) { - if (es->buffer != buffer_base) - continue; - + wl_list_for_each(es, &buffer->surfaces_attached_to, buffer_link) { glBindTexture(GL_TEXTURE_2D, es->texture); glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT, buffer->buffer.width, buffer->buffer.height, 0, @@ -111,6 +107,10 @@ wlsc_shm_buffer_attach(struct wl_buffer *buffer_base, buffer->buffer.width, buffer->buffer.height, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, buffer->data); es->visual = buffer->buffer.visual; + + if (es->buffer) + wl_list_remove(&es->buffer_link); + wl_list_insert(&buffer->surfaces_attached_to, &es->buffer_link); } static struct wlsc_shm_buffer * @@ -132,6 +132,8 @@ wlsc_shm_buffer_init(struct wlsc_compositor *compositor, buffer->stride = stride; buffer->data = data; + wl_list_init(&buffer->surfaces_attached_to); + buffer->buffer.resource.object.interface = &wl_buffer_interface; buffer->buffer.resource.object.implementation = (void (**)(void)) &buffer_interface;