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.
This commit is contained in:
Kristian Høgsberg
2012-01-18 15:32:35 -05:00
parent 2f868f1ddd
commit 221c678329
5 changed files with 35 additions and 5 deletions

View File

@@ -894,7 +894,7 @@ struct __DRIdri2ExtensionRec {
* extensions. * extensions.
*/ */
#define __DRI_IMAGE "DRI_IMAGE" #define __DRI_IMAGE "DRI_IMAGE"
#define __DRI_IMAGE_VERSION 1 #define __DRI_IMAGE_VERSION 2
/** /**
* These formats correspond to the similarly named MESA_FORMAT_* * 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). * The new __DRIimage will share the content with the old one, see dup(2).
*/ */
__DRIimage *(*dupImage)(__DRIimage *image, void *loaderPrivate); __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);
}; };

View File

@@ -626,7 +626,7 @@ dri2_destroy_image(__DRIimage *img)
} }
static struct __DRIimageExtensionRec dri2ImageExtension = { static struct __DRIimageExtensionRec dri2ImageExtension = {
{ __DRI_IMAGE, __DRI_IMAGE_VERSION }, { __DRI_IMAGE, 1 },
dri2_create_image_from_name, dri2_create_image_from_name,
dri2_create_image_from_renderbuffer, dri2_create_image_from_renderbuffer,
dri2_destroy_image, dri2_destroy_image,

View File

@@ -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_device *dri = gbm_dri_device(gbm);
struct gbm_dri_bo *bo; struct gbm_dri_bo *bo;
unsigned dri_use = 0;
(void) egl_dpy; (void) egl_dpy;
@@ -276,6 +277,16 @@ gbm_dri_bo_create_from_egl_image(struct gbm_device *gbm,
if (bo->image == NULL) if (bo->image == NULL)
return 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, dri->image->queryImage(bo->image, __DRI_IMAGE_ATTRIB_HANDLE,
&bo->base.base.handle.s32); &bo->base.base.handle.s32);
dri->image->queryImage(bo->image, __DRI_IMAGE_ATTRIB_STRIDE, dri->image->queryImage(bo->image, __DRI_IMAGE_ATTRIB_STRIDE,

View File

@@ -324,14 +324,26 @@ intel_dup_image(__DRIimage *orig_image, void *loaderPrivate)
return image; 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 = { static struct __DRIimageExtensionRec intelImageExtension = {
{ __DRI_IMAGE, __DRI_IMAGE_VERSION }, { __DRI_IMAGE, 2 },
intel_create_image_from_name, intel_create_image_from_name,
intel_create_image_from_renderbuffer, intel_create_image_from_renderbuffer,
intel_destroy_image, intel_destroy_image,
intel_create_image, intel_create_image,
intel_query_image, intel_query_image,
intel_dup_image intel_dup_image,
intel_validate_usage
}; };
static const __DRIextension *intelScreenExtensions[] = { static const __DRIextension *intelScreenExtensions[] = {

View File

@@ -375,7 +375,7 @@ radeon_query_image(__DRIimage *image, int attrib, int *value)
} }
static struct __DRIimageExtensionRec radeonImageExtension = { static struct __DRIimageExtensionRec radeonImageExtension = {
{ __DRI_IMAGE, __DRI_IMAGE_VERSION }, { __DRI_IMAGE, 1 },
radeon_create_image_from_name, radeon_create_image_from_name,
radeon_create_image_from_renderbuffer, radeon_create_image_from_renderbuffer,
radeon_destroy_image, radeon_destroy_image,