|
|
|
@ -36,21 +36,53 @@ 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; |
|
|
|
|
|
|
|
|
|
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; |
|
|
|
|
|
|
|
|
|
free(buffer); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void |
|
|
|
|
buffer_damage(struct wl_client *client, struct wl_buffer *buffer_base, |
|
|
|
|
int32_t x, int32_t y, int32_t width, int32_t height) |
|
|
|
|
{ |
|
|
|
|
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; |
|
|
|
|
|
|
|
|
|
glBindTexture(GL_TEXTURE_2D, es->texture); |
|
|
|
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT, |
|
|
|
|
buffer->buffer.width, buffer->buffer.height, 0, |
|
|
|
|
GL_BGRA_EXT, GL_UNSIGNED_BYTE, buffer->data); |
|
|
|
|
/* Hmm, should use glTexSubImage2D() here but GLES2 doesn't
|
|
|
|
|
* support any unpack attributes except GL_UNPACK_ALIGNMENT. */ |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void |
|
|
|
|
buffer_destroy(struct wl_client *client, struct wl_buffer *buffer) |
|
|
|
|
{ |
|
|
|
|
// wl_resource_destroy(&buffer->base, client);
|
|
|
|
|
wl_resource_destroy(&buffer->resource, client); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const static struct wl_buffer_interface buffer_interface = { |
|
|
|
|
buffer_damage, |
|
|
|
|
buffer_destroy |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
@ -73,24 +105,6 @@ shm_buffer_attach(struct wl_buffer *buffer_base, struct wl_surface *surface) |
|
|
|
|
es->visual = buffer->buffer.visual; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void |
|
|
|
|
shm_buffer_damage(struct wl_buffer *buffer_base, |
|
|
|
|
struct wl_surface *surface, |
|
|
|
|
int32_t x, int32_t y, int32_t width, int32_t height) |
|
|
|
|
{ |
|
|
|
|
struct wlsc_surface *es = (struct wlsc_surface *) surface; |
|
|
|
|
struct wlsc_shm_buffer *buffer = |
|
|
|
|
(struct wlsc_shm_buffer *) buffer_base; |
|
|
|
|
|
|
|
|
|
glBindTexture(GL_TEXTURE_2D, es->texture); |
|
|
|
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT, |
|
|
|
|
buffer->buffer.width, buffer->buffer.height, 0, |
|
|
|
|
GL_BGRA_EXT, GL_UNSIGNED_BYTE, buffer->data); |
|
|
|
|
|
|
|
|
|
/* Hmm, should use glTexSubImage2D() here but GLES2 doesn't
|
|
|
|
|
* support any unpack attributes except GL_UNPACK_ALIGNMENT. */ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static struct wlsc_shm_buffer * |
|
|
|
|
wlsc_shm_buffer_init(struct wlsc_compositor *compositor, |
|
|
|
|
int32_t width, int32_t height, |
|
|
|
@ -108,7 +122,6 @@ wlsc_shm_buffer_init(struct wlsc_compositor *compositor, |
|
|
|
|
buffer->buffer.height = height; |
|
|
|
|
buffer->buffer.visual = visual; |
|
|
|
|
buffer->buffer.attach = shm_buffer_attach; |
|
|
|
|
buffer->buffer.damage = shm_buffer_damage; |
|
|
|
|
buffer->stride = stride; |
|
|
|
|
buffer->data = data; |
|
|
|
|
|
|
|
|
|