struct wlsc_surface *es = (struct wlsc_surface *) surface;
struct wlsc_compositor *ec = es->compositor;
- if (buffer->attach) {
- buffer->attach(buffer, surface);
+ if (wlsc_is_shm_buffer(buffer)) {
+ wlsc_shm_buffer_attach(buffer, surface);
} else {
es->image = eglCreateImageKHR(ec->display, NULL,
EGL_WAYLAND_BUFFER_WL,
uint32_t
get_time(void);
+int
+wlsc_is_shm_buffer(struct wl_buffer *buffer);
+
+void
+wlsc_shm_buffer_attach(struct wl_buffer *buffer, struct wl_surface *surface);
+
struct wl_buffer *
wlsc_shm_buffer_create(struct wlsc_compositor *ec,
int32_t width, int32_t height,
buffer_destroy
};
-static void
-shm_buffer_attach(struct wl_buffer *buffer_base, struct wl_surface *surface)
+int
+wlsc_is_shm_buffer(struct wl_buffer *buffer)
+{
+ return buffer->resource.object.implementation ==
+ (void (**)(void)) &buffer_interface;
+}
+
+void
+wlsc_shm_buffer_attach(struct wl_buffer *buffer_base,
+ struct wl_surface *surface)
{
struct wlsc_surface *es = (struct wlsc_surface *) surface;
struct wlsc_shm_buffer *buffer =
buffer->buffer.width = width;
buffer->buffer.height = height;
buffer->buffer.visual = visual;
- buffer->buffer.attach = shm_buffer_attach;
buffer->stride = stride;
buffer->data = data;
+ buffer->buffer.resource.object.interface = &wl_buffer_interface;
+ buffer->buffer.resource.object.implementation = (void (**)(void))
+ &buffer_interface;
+
+ buffer->buffer.resource.destroy = destroy_buffer;
+
return buffer;
}
buffer->mapped = 1;
buffer->buffer.resource.object.id = id;
- buffer->buffer.resource.object.interface = &wl_buffer_interface;
- buffer->buffer.resource.object.implementation = (void (**)(void))
- &buffer_interface;
-
- buffer->buffer.resource.destroy = destroy_buffer;
wl_client_add_resource(client, &buffer->buffer.resource);
}