Mesa (master): gbm: Validate usage flags in gbm_bo_create_from_egl_image()

Kristian Høgsberg krh at kemper.freedesktop.org
Wed Jan 18 20:48:30 UTC 2012


Module: Mesa
Branch: master
Commit: 221c678329fd1c073d5f8dcf387129cd426ecf07
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=221c678329fd1c073d5f8dcf387129cd426ecf07

Author: Kristian Høgsberg <krh at bitplanet.net>
Date:   Wed Jan 18 15:32:35 2012 -0500

gbm: Validate usage flags in gbm_bo_create_from_egl_image()

The entry point is supposed to validate that the EGLImage is suitable for
the passed in usage flags, but that was never implemented.

---

 include/GL/internal/dri_interface.h         |    9 ++++++++-
 src/gallium/state_trackers/dri/drm/dri2.c   |    2 +-
 src/gbm/backends/dri/gbm_dri.c              |   11 +++++++++++
 src/mesa/drivers/dri/intel/intel_screen.c   |   16 ++++++++++++++--
 src/mesa/drivers/dri/radeon/radeon_screen.c |    2 +-
 5 files changed, 35 insertions(+), 5 deletions(-)

diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
index b21445f..701e83e 100644
--- a/include/GL/internal/dri_interface.h
+++ b/include/GL/internal/dri_interface.h
@@ -894,7 +894,7 @@ struct __DRIdri2ExtensionRec {
  * extensions.
  */
 #define __DRI_IMAGE "DRI_IMAGE"
-#define __DRI_IMAGE_VERSION 1
+#define __DRI_IMAGE_VERSION 2
 
 /**
  * These formats correspond to the similarly named MESA_FORMAT_*
@@ -946,6 +946,13 @@ struct __DRIimageExtensionRec {
     * The new __DRIimage will share the content with the old one, see dup(2).
     */
    __DRIimage *(*dupImage)(__DRIimage *image, void *loaderPrivate);
+
+   /**
+    * Validate that a __DRIimage can be used a certain way.
+    *
+    * \since 2
+    */
+   GLboolean (*validateUsage)(__DRIimage *image, unsigned int use);
 };
 
 
diff --git a/src/gallium/state_trackers/dri/drm/dri2.c b/src/gallium/state_trackers/dri/drm/dri2.c
index 2f7f1cb..afd91ee 100644
--- a/src/gallium/state_trackers/dri/drm/dri2.c
+++ b/src/gallium/state_trackers/dri/drm/dri2.c
@@ -626,7 +626,7 @@ dri2_destroy_image(__DRIimage *img)
 }
 
 static struct __DRIimageExtensionRec dri2ImageExtension = {
-    { __DRI_IMAGE, __DRI_IMAGE_VERSION },
+    { __DRI_IMAGE, 1 },
     dri2_create_image_from_name,
     dri2_create_image_from_renderbuffer,
     dri2_destroy_image,
diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c
index 9de8cb6..ddd153a 100644
--- a/src/gbm/backends/dri/gbm_dri.c
+++ b/src/gbm/backends/dri/gbm_dri.c
@@ -255,6 +255,7 @@ 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;
+   unsigned dri_use = 0;
 
    (void) egl_dpy;
 
@@ -276,6 +277,16 @@ 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,
diff --git a/src/mesa/drivers/dri/intel/intel_screen.c b/src/mesa/drivers/dri/intel/intel_screen.c
index 0566907..094ff56 100644
--- a/src/mesa/drivers/dri/intel/intel_screen.c
+++ b/src/mesa/drivers/dri/intel/intel_screen.c
@@ -324,14 +324,26 @@ intel_dup_image(__DRIimage *orig_image, void *loaderPrivate)
    return image;
 }
 
+static GLboolean
+intel_validate_usage(__DRIimage *image, unsigned int use)
+{
+   if (use & __DRI_IMAGE_USE_CURSOR) {
+      if (image->region->width != 64 || image->region->height != 64)
+	 return GL_FALSE;
+   }
+
+   return GL_TRUE;
+}
+
 static struct __DRIimageExtensionRec intelImageExtension = {
-    { __DRI_IMAGE, __DRI_IMAGE_VERSION },
+    { __DRI_IMAGE, 2 },
     intel_create_image_from_name,
     intel_create_image_from_renderbuffer,
     intel_destroy_image,
     intel_create_image,
     intel_query_image,
-    intel_dup_image
+    intel_dup_image,
+    intel_validate_usage
 };
 
 static const __DRIextension *intelScreenExtensions[] = {
diff --git a/src/mesa/drivers/dri/radeon/radeon_screen.c b/src/mesa/drivers/dri/radeon/radeon_screen.c
index 2e364d0..a5dff98 100644
--- a/src/mesa/drivers/dri/radeon/radeon_screen.c
+++ b/src/mesa/drivers/dri/radeon/radeon_screen.c
@@ -375,7 +375,7 @@ radeon_query_image(__DRIimage *image, int attrib, int *value)
 }
 
 static struct __DRIimageExtensionRec radeonImageExtension = {
-    { __DRI_IMAGE, __DRI_IMAGE_VERSION },
+    { __DRI_IMAGE, 1 },
    radeon_create_image_from_name,
    radeon_create_image_from_renderbuffer,
    radeon_destroy_image,




More information about the mesa-commit mailing list