+ struct gbm_import_fd_modifier_data *fd_modifier_data = buffer;
+ uint32_t gbm_format;
+ size_t num_planes, i, num_fds;
+
+ drv_data.use_flags = gbm_convert_usage(usage);
+ switch (type) {
+ case GBM_BO_IMPORT_FD:
+ gbm_format = fd_data->format;
+ drv_data.width = fd_data->width;
+ drv_data.height = fd_data->height;
+ drv_data.format = fd_data->format;
+ drv_data.fds[0] = fd_data->fd;
+ drv_data.strides[0] = fd_data->stride;
+
+ for (i = 0; i < GBM_MAX_PLANES; ++i)
+ drv_data.format_modifiers[i] = DRM_FORMAT_MOD_INVALID;
+ break;
+ case GBM_BO_IMPORT_FD_MODIFIER:
+ gbm_format = fd_modifier_data->format;
+ drv_data.width = fd_modifier_data->width;
+ drv_data.height = fd_modifier_data->height;
+ drv_data.format = fd_modifier_data->format;
+ num_planes = drv_num_planes_from_modifier(gbm->drv, drv_data.format,
+ fd_modifier_data->modifier);
+ assert(num_planes);
+
+ num_fds = fd_modifier_data->num_fds;
+ if (!num_fds || num_fds > num_planes)
+ return NULL;
+
+ for (i = 0; i < num_planes; i++) {
+ if (num_fds != num_planes)
+ drv_data.fds[i] = fd_modifier_data->fds[0];
+ else
+ drv_data.fds[i] = fd_modifier_data->fds[i];
+ drv_data.offsets[i] = fd_modifier_data->offsets[i];
+ drv_data.strides[i] = fd_modifier_data->strides[i];
+ drv_data.format_modifiers[i] = fd_modifier_data->modifier;
+ }
+
+ for (i = num_planes; i < GBM_MAX_PLANES; i++)
+ drv_data.fds[i] = -1;
+
+ break;
+ default: