compositor: Use surface_attached_to list for shm-buffers
This commit is contained in:
parent
0c347f0d72
commit
bab41fb70c
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user