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);
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;
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)
struct wlsc_shm_buffer {
struct wl_buffer buffer;
+ struct wl_list surfaces_attached_to;
int32_t stride;
void *data;
int mapped;
{
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);
}
{
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,
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 *
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;