bool swc_shm_initialize() { if (!(swc.shm->context = wld_pixman_create_context())) goto error0; if (!(swc.shm->renderer = wld_create_renderer(swc.shm->context))) goto error1; shm.global = wl_global_create(swc.display, &wl_shm_interface, 1, NULL, &bind_shm); if (!shm.global) goto error2; return true; error2: wld_destroy_renderer(swc.shm->renderer); error1: wld_destroy_context(swc.shm->context); error0: return false; }
bool swc_drm_initialize() { struct stat master, render; if (!find_primary_drm_device(drm.path, sizeof drm.path)) { ERROR("Could not find DRM device\n"); goto error0; } drm.taken_ids = 0; swc.drm->fd = launch_open_device(drm.path, O_RDWR | O_CLOEXEC); if (swc.drm->fd == -1) { ERROR("Could not open DRM device at %s\n", drm.path); goto error0; } if (fstat(swc.drm->fd, &master) != 0) { ERROR("Could not fstat DRM FD: %s\n", strerror(errno)); goto error1; } if (snprintf(drm.path, sizeof drm.path, "/dev/dri/renderD%d", minor(master.st_rdev) + 0x80) >= sizeof drm.path) { ERROR("Render node path is too long"); goto error1; } if (stat(drm.path, &render) != 0) { ERROR("Could not stat render node for primary DRM device: %s\n", strerror(errno)); goto error1; } if (master.st_mode != render.st_mode || minor(master.st_rdev) + 0x80 != minor(render.st_rdev)) { ERROR("Render node does not have expected mode or minor number\n"); goto error1; } if (!(swc.drm->context = wld_drm_create_context(swc.drm->fd))) { ERROR("Could not create WLD DRM context\n"); goto error1; } if (!(swc.drm->renderer = wld_create_renderer(swc.drm->context))) { ERROR("Could not create WLD DRM renderer\n"); goto error2; } drm.event_source = wl_event_loop_add_fd (swc.event_loop, swc.drm->fd, WL_EVENT_READABLE, &handle_data, NULL); if (!drm.event_source) { ERROR("Could not create DRM event source\n"); goto error3; } if (!wld_drm_is_dumb(swc.drm->context)) { drm.global = wl_global_create(swc.display, &wl_drm_interface, 2, NULL, &bind_drm); if (!drm.global) { ERROR("Could not create wl_drm global\n"); goto error4; } } return true; error4: wl_event_source_remove(drm.event_source); error3: wld_destroy_renderer(swc.drm->renderer); error2: wld_destroy_context(swc.drm->context); error1: close(swc.drm->fd); error0: return false; }