gbm_dri: Fix DRIimage lookup callback
[mesa.git] / src / gbm / backends / dri / gbm_dri.c
index 6bb7848d8302fba86d815619c72eca0fb4008420..98f14cd53439b60d028bcf6177cfe86e8a02aa37 100644 (file)
@@ -54,11 +54,11 @@ dri_lookup_egl_image(__DRIscreen *screen, void *image, void *data)
    return dri->lookup_image(screen, image, dri->lookup_user_data);
 }
 
-const __DRIuseInvalidateExtension use_invalidate = {
+static const __DRIuseInvalidateExtension use_invalidate = {
    { __DRI_USE_INVALIDATE, 1 }
 };
 
-const __DRIimageLookupExtension image_lookup_extension = {
+static const __DRIimageLookupExtension image_lookup_extension = {
    { __DRI_IMAGE_LOOKUP, 1 },
    dri_lookup_egl_image
 };
@@ -194,6 +194,8 @@ dri_screen_create(struct gbm_dri_device *dri)
    dri->screen = dri->dri2->createNewScreen(0, dri->base.base.fd,
                                             dri->extensions,
                                             &dri->driver_configs, dri);
+   if (dri->screen == NULL)
+      return -1;
 
    extensions = dri->core->getExtensions(dri->screen);
    if (dri_bind_extensions(dri, dri_core_extensions, extensions) < 0) {
@@ -214,13 +216,15 @@ free_screen:
 
 static int
 gbm_dri_is_format_supported(struct gbm_device *gbm,
-                            enum gbm_bo_format format,
+                            uint32_t format,
                             uint32_t usage)
 {
    switch (format) {
    case GBM_BO_FORMAT_XRGB8888:
+   case GBM_FORMAT_XRGB8888:
       break;
    case GBM_BO_FORMAT_ARGB8888:
+   case GBM_FORMAT_ARGB8888:
       if (usage & GBM_BO_USE_SCANOUT)
          return 0;
       break;
@@ -245,6 +249,32 @@ gbm_dri_bo_destroy(struct gbm_bo *_bo)
    free(bo);
 }
 
+static uint32_t
+gbm_dri_to_gbm_format(uint32_t dri_format)
+{
+   uint32_t ret = 0;
+
+   switch (dri_format) {
+   case __DRI_IMAGE_FORMAT_RGB565:
+      ret = GBM_FORMAT_RGB565;
+      break;
+   case __DRI_IMAGE_FORMAT_XRGB8888:
+      ret = GBM_FORMAT_XRGB8888;
+      break;
+   case __DRI_IMAGE_FORMAT_ARGB8888:
+      ret = GBM_FORMAT_ARGB8888;
+      break;
+   case __DRI_IMAGE_FORMAT_ABGR8888:
+      ret = GBM_FORMAT_ABGR8888;
+      break;
+   default:
+      ret = 0;
+      break;
+   }
+
+   return ret;
+}
+
 static struct gbm_bo *
 gbm_dri_bo_create_from_egl_image(struct gbm_device *gbm,
                                  void *egl_dpy, void *egl_img,
@@ -253,6 +283,8 @@ gbm_dri_bo_create_from_egl_image(struct gbm_device *gbm,
 {
    struct gbm_dri_device *dri = gbm_dri_device(gbm);
    struct gbm_dri_bo *bo;
+   int dri_format;
+   unsigned dri_use = 0;
 
    (void) egl_dpy;
 
@@ -274,10 +306,24 @@ gbm_dri_bo_create_from_egl_image(struct gbm_device *gbm,
    if (bo->image == NULL)
       return 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;
+   }
+
    dri->image->queryImage(bo->image, __DRI_IMAGE_ATTRIB_HANDLE,
                           &bo->base.base.handle.s32);
    dri->image->queryImage(bo->image, __DRI_IMAGE_ATTRIB_STRIDE,
                           (int *) &bo->base.base.pitch);
+   dri->image->queryImage(bo->image, __DRI_IMAGE_ATTRIB_FORMAT,
+                         &dri_format);
+
+   bo->base.base.format = gbm_dri_to_gbm_format(dri_format);
 
    return &bo->base.base;
 }
@@ -285,7 +331,7 @@ gbm_dri_bo_create_from_egl_image(struct gbm_device *gbm,
 static struct gbm_bo *
 gbm_dri_bo_create(struct gbm_device *gbm,
                   uint32_t width, uint32_t height,
-                  enum gbm_bo_format format, uint32_t usage)
+                  uint32_t format, uint32_t usage)
 {
    struct gbm_dri_device *dri = gbm_dri_device(gbm);
    struct gbm_dri_bo *bo;
@@ -301,12 +347,20 @@ gbm_dri_bo_create(struct gbm_device *gbm,
    bo->base.base.height = height;
 
    switch (format) {
+   case GBM_FORMAT_RGB565:
+      dri_format =__DRI_IMAGE_FORMAT_RGB565;
+      break;
+   case GBM_FORMAT_XRGB8888:
    case GBM_BO_FORMAT_XRGB8888:
       dri_format = __DRI_IMAGE_FORMAT_XRGB8888;
       break;
+   case GBM_FORMAT_ARGB8888:
    case GBM_BO_FORMAT_ARGB8888:
       dri_format = __DRI_IMAGE_FORMAT_ARGB8888;
       break;
+   case GBM_FORMAT_ABGR8888:
+      dri_format = __DRI_IMAGE_FORMAT_ABGR8888;
+      break;
    default:
       return NULL;
    }