|
|
|
@ -22,7 +22,7 @@
|
|
|
|
|
#error "Lock-free C11 atomic pointers are required"
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#define SHM_VERSION 1
|
|
|
|
|
#define SHM_VERSION 2
|
|
|
|
|
|
|
|
|
|
struct wlr_shm_pool {
|
|
|
|
|
struct wl_resource *resource; // may be NULL
|
|
|
|
@ -460,8 +460,14 @@ error_fd:
|
|
|
|
|
close(fd);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void shm_handle_release(struct wl_client *client,
|
|
|
|
|
struct wl_resource *resource) {
|
|
|
|
|
wl_resource_destroy(resource);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static const struct wl_shm_interface shm_impl = {
|
|
|
|
|
.create_pool = shm_handle_create_pool,
|
|
|
|
|
.release = shm_handle_release,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static void shm_bind(struct wl_client *client, void *data, uint32_t version,
|
|
|
|
@ -491,6 +497,8 @@ static void handle_display_destroy(struct wl_listener *listener, void *data) {
|
|
|
|
|
|
|
|
|
|
struct wlr_shm *wlr_shm_create(struct wl_display *display, uint32_t version,
|
|
|
|
|
const uint32_t *formats, size_t formats_len) {
|
|
|
|
|
assert(version <= SHM_VERSION);
|
|
|
|
|
|
|
|
|
|
// ARGB8888 and XRGB8888 must be supported per the wl_shm spec
|
|
|
|
|
bool has_argb8888 = false, has_xrgb8888 = false;
|
|
|
|
|
for (size_t i = 0; i < formats_len; i++) {
|
|
|
|
@ -522,7 +530,7 @@ struct wlr_shm *wlr_shm_create(struct wl_display *display, uint32_t version,
|
|
|
|
|
shm->formats[i] = convert_drm_format_to_wl_shm(formats[i]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
shm->global = wl_global_create(display, &wl_shm_interface, SHM_VERSION,
|
|
|
|
|
shm->global = wl_global_create(display, &wl_shm_interface, version,
|
|
|
|
|
shm, shm_bind);
|
|
|
|
|
if (shm->global == NULL) {
|
|
|
|
|
wlr_log(WLR_ERROR, "wl_global_create failed");
|
|
|
|
|