Add a shm buffer sharing mechanism
diff --git a/compositor/compositor.c b/compositor/compositor.c
index df75b61..8dadd73 100644
--- a/compositor/compositor.c
+++ b/compositor/compositor.c
@@ -221,14 +221,6 @@
GLuint texture;
const int width = 32, height = 32;
- EGLint image_attribs[] = {
- EGL_WIDTH, 0,
- EGL_HEIGHT, 0,
- EGL_DRM_BUFFER_FORMAT_MESA, EGL_DRM_BUFFER_FORMAT_ARGB32_MESA,
- EGL_DRM_BUFFER_USE_MESA, EGL_DRM_BUFFER_USE_SCANOUT_MESA,
- EGL_NONE
- };
-
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
@@ -236,19 +228,15 @@
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- image_attribs[1] = width;
- image_attribs[3] = height;
count = ARRAY_LENGTH(pointer_images);
ec->pointer_buffers = malloc(count * sizeof *ec->pointer_buffers);
for (i = 0; i < count; i++) {
- ec->pointer_buffers[i].image =
- eglCreateDRMImageMESA(ec->display, image_attribs);
+ ec->pointer_buffers[i] =
+ wlsc_drm_buffer_create(ec, width, height,
+ &ec->argb_visual);
glEGLImageTargetTexture2DOES(GL_TEXTURE_2D,
- ec->pointer_buffers[i].image);
+ ec->pointer_buffers[i]->image);
texture_from_png(pointer_images[i].filename, width, height);
- ec->pointer_buffers[i].visual = &ec->argb_visual;
- ec->pointer_buffers[i].width = width;
- ec->pointer_buffers[i].height = height;
}
}
@@ -413,15 +401,12 @@
static void
surface_attach(struct wl_client *client,
- struct wl_surface *surface, struct wl_buffer *buffer_base)
+ struct wl_surface *surface, struct wl_buffer *buffer)
{
struct wlsc_surface *es = (struct wlsc_surface *) surface;
- struct wlsc_buffer *buffer = (struct wlsc_buffer *) buffer_base;
- glBindTexture(GL_TEXTURE_2D, es->texture);
- glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, buffer->image);
- es->visual = buffer->visual;
- wlsc_compositor_schedule_repaint(es->compositor);
+ buffer->attach(buffer, surface);
+ es->buffer = buffer;
}
static void
@@ -447,6 +432,7 @@
{
struct wlsc_surface *es = (struct wlsc_surface *) surface;
+ es->buffer->damage(es->buffer, surface, x, y, width, height);
wlsc_compositor_schedule_repaint(es->compositor);
}
@@ -459,13 +445,11 @@
static void
wlsc_input_device_attach(struct wlsc_input_device *device,
- struct wlsc_buffer *buffer, int x, int y)
+ struct wl_buffer *buffer, int x, int y)
{
struct wlsc_compositor *ec = device->ec;
- glBindTexture(GL_TEXTURE_2D, device->sprite->texture);
- glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, buffer->image);
- device->sprite->visual = buffer->visual;
+ buffer->attach(buffer, &device->sprite->base);
device->hotspot_x = x;
device->hotspot_y = y;
@@ -486,7 +470,7 @@
struct wlsc_compositor *compositor = device->ec;
wlsc_input_device_attach(device,
- &compositor->pointer_buffers[type],
+ &compositor->pointer_buffers[type]->base,
pointer_images[type].hotspot_x,
pointer_images[type].hotspot_y);
}
@@ -982,11 +966,10 @@
input_device_attach(struct wl_client *client,
struct wl_input_device *device_base,
uint32_t time,
- struct wl_buffer *buffer_base, int32_t x, int32_t y)
+ struct wl_buffer *buffer, int32_t x, int32_t y)
{
struct wlsc_input_device *device =
(struct wlsc_input_device *) device_base;
- struct wlsc_buffer *buffer = (struct wlsc_buffer *) buffer_base;
if (time < device->pointer_focus_time)
return;
@@ -1391,6 +1374,8 @@
if (wl_display_add_global(display, &ec->base.base, NULL))
return -1;
+ wlsc_shm_init(ec);
+
ec->shell.base.interface = &wl_shell_interface;
ec->shell.base.implementation = (void (**)(void)) &shell_interface;
wl_display_add_object(display, &ec->shell.base);