struct wl_buffer *QWaylandDisplay::createShmBuffer(int fd, int width, int height, uint32_t stride, struct wl_visual *visual) { return wl_shm_create_buffer(mShm, fd, width, height, stride, visual); }
static cairo_surface_t * display_create_shm_surface(struct display *display, struct rectangle *rectangle) { struct shm_surface_data *data; cairo_surface_t *surface; struct wl_visual *visual; int stride, fd; char filename[] = "/tmp/wayland-shm-XXXXXX"; data = malloc(sizeof *data); if (data == NULL) return NULL; stride = cairo_format_stride_for_width (CAIRO_FORMAT_ARGB32, rectangle->width); data->length = stride * rectangle->height; fd = mkstemp(filename); if (fd < 0) { fprintf(stderr, "open %s failed: %m", filename); return NULL; } if (ftruncate(fd, data->length) < 0) { fprintf(stderr, "ftruncate failed: %m"); close(fd); return NULL; } data->map = mmap(NULL, data->length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); unlink(filename); if (data->map == MAP_FAILED) { fprintf(stderr, "mmap failed: %m"); close(fd); return NULL; } surface = cairo_image_surface_create_for_data (data->map, CAIRO_FORMAT_ARGB32, rectangle->width, rectangle->height, stride); cairo_surface_set_user_data (surface, &surface_data_key, data, shm_surface_data_destroy); visual = wl_display_get_premultiplied_argb_visual(display->display); data->data.buffer = wl_shm_create_buffer(display->shm, fd, rectangle->width, rectangle->height, stride, visual); close(fd); return surface; }
static ClutterStageWaylandWaylandBuffer * wayland_create_shm_buffer (ClutterBackendWayland *backend_wayland, ClutterGeometry *geom) { ClutterStageWaylandWaylandBufferSHM *buffer; struct wl_visual *visual; CoglHandle tex; CoglTextureFlags flags = COGL_TEXTURE_NONE; /* XXX: tweak flags? */ CoglPixelFormat format = VISUAL_ARGB_PRE; int fd; gchar tmp[] = "/tmp/clutter-wayland-shm-XXXXXX"; buffer = g_slice_new (ClutterStageWaylandWaylandBufferSHM); buffer->buffer.type = BUFFER_TYPE_SHM; tex = cogl_texture_new_with_size ((unsigned int)geom->width, (unsigned int)geom->height, flags, format); buffer->format = format; buffer->stride = cogl_texture_get_rowstride(tex); buffer->size = cogl_texture_get_data(tex, format, buffer->stride, NULL); buffer->buffer.tex = tex; fd = g_mkstemp_full(tmp, O_RDWR, 0600); ftruncate(fd, buffer->size); buffer->data = mmap(NULL, buffer->size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); g_unlink(tmp); visual = get_visual (backend_wayland->wayland_display, format); buffer->buffer.wayland_buffer = wl_shm_create_buffer (backend_wayland->wayland_shm, fd, geom->width, geom->height, buffer->stride, visual); close(fd); return &buffer->buffer; }
static struct wl_buffer * create_shm_buffer(struct display *display, int width, int height, uint32_t format, void **data_out) { char filename[] = "/tmp/wayland-shm-XXXXXX"; struct wl_buffer *buffer; int fd, size, stride; void *data; fd = mkstemp(filename); if (fd < 0) { fprintf(stderr, "open %s failed: %m\n", filename); return NULL; } stride = width * 4; size = stride * height; if (ftruncate(fd, size) < 0) { fprintf(stderr, "ftruncate failed: %m\n"); close(fd); return NULL; } data = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); unlink(filename); if (data == MAP_FAILED) { fprintf(stderr, "mmap failed: %m\n"); close(fd); return NULL; } buffer = wl_shm_create_buffer(display->shm, fd, width, height, stride, format); close(fd); *data_out = data; return buffer; }