+ switch (type) {
+#if HAVE_WAYLAND_PLATFORM
+ case GBM_BO_IMPORT_WL_BUFFER:
+ {
+ struct wl_drm_buffer *wb;
+
+ if (!dri->wl_drm)
+ return NULL;
+
+ wb = wayland_drm_buffer_get(dri->wl_drm, (struct wl_resource *) buffer);
+ if (!wb)
+ return NULL;
+
+ image = wb->driver_buffer;
+
+ switch (wb->format) {
+ case WL_DRM_FORMAT_XRGB8888:
+ gbm_format = GBM_FORMAT_XRGB8888;
+ break;
+ case WL_DRM_FORMAT_ARGB8888:
+ gbm_format = GBM_FORMAT_ARGB8888;
+ break;
+ case WL_DRM_FORMAT_RGB565:
+ gbm_format = GBM_FORMAT_RGB565;
+ break;
+ case WL_DRM_FORMAT_YUYV:
+ gbm_format = GBM_FORMAT_YUYV;
+ break;
+ default:
+ return NULL;
+ }
+ break;
+ }
+#endif
+
+ case GBM_BO_IMPORT_EGL_IMAGE:
+ {
+ int dri_format;
+ if (dri->lookup_image == NULL)
+ return NULL;
+
+ image = dri->lookup_image(dri->screen, buffer, dri->lookup_user_data);
+ dri->image->queryImage(image, __DRI_IMAGE_ATTRIB_FORMAT, &dri_format);
+ gbm_format = gbm_dri_to_gbm_format(dri_format);
+ if (gbm_format == 0)
+ return NULL;
+ break;
+ }
+
+ default:
+ return NULL;
+ }
+
+
+ bo = calloc(1, sizeof *bo);
+ if (bo == NULL)
+ return NULL;
+
+ bo->image = dri->image->dupImage(image, NULL);
+
+ if (usage & GBM_BO_USE_SCANOUT)
+ dri_use |= __DRI_IMAGE_USE_SCANOUT;
+ if (usage & GBM_BO_USE_CURSOR_64X64)
+ dri_use |= __DRI_IMAGE_USE_CURSOR;
+ if (dri->image->base.version >= 2 &&
+ !dri->image->validateUsage(bo->image, dri_use)) {
+ free(bo);
+ return NULL;
+ }
+
+ bo->base.base.gbm = gbm;
+ bo->base.base.format = gbm_format;
+
+ dri->image->queryImage(bo->image, __DRI_IMAGE_ATTRIB_WIDTH,
+ (int*)&bo->base.base.width);
+ dri->image->queryImage(bo->image, __DRI_IMAGE_ATTRIB_HEIGHT,
+ (int*)&bo->base.base.height);
+ dri->image->queryImage(bo->image, __DRI_IMAGE_ATTRIB_STRIDE,
+ (int*)&bo->base.base.stride);
+ dri->image->queryImage(bo->image, __DRI_IMAGE_ATTRIB_HANDLE,
+ &bo->base.base.handle.s32);
+
+ return &bo->base.base;
+}
+
+static struct gbm_bo *
+create_dumb(struct gbm_device *gbm,
+ uint32_t width, uint32_t height,
+ uint32_t format, uint32_t usage)
+{
+ struct gbm_dri_device *dri = gbm_dri_device(gbm);
+ struct drm_mode_create_dumb create_arg;
+ struct drm_mode_map_dumb map_arg;
+ struct gbm_dri_bo *bo;
+ struct drm_mode_destroy_dumb destroy_arg;
+ int ret;
+
+ if (!(usage & GBM_BO_USE_CURSOR_64X64))
+ return NULL;
+ if (format != GBM_FORMAT_ARGB8888)