- bo->priv = dri->image_extension->createImage(dri->device, width, height, dri_format,
- dri_use, NULL);
+ if (dri_format_unavailable) {
+ int stride = drv_stride_from_format(format, width, 0);
+ drv_bo_from_format(bo, stride, height, format);
+ dri_format = __DRI_IMAGE_FORMAT_R8;
+ dri_use |= __DRI_IMAGE_USE_LINEAR;
+ width_ = stride / drv_bytes_per_pixel_from_format(format, 0);
+ height_ = DIV_ROUND_UP(bo->meta.total_size, width_);
+ }
+
+ if (modifier_count == 0) {
+ bo->priv = dri->image_extension->createImage(dri->device, width_, height_,
+ dri_format, dri_use, NULL);
+ } else {
+ if (!dri->image_extension->createImageWithModifiers) {
+ return -ENOENT;
+ }
+ bo->priv = dri->image_extension->createImageWithModifiers(
+ dri->device, width, height, dri_format, modifiers, modifier_count, NULL);
+ }
+