diff --git a/src/gallium/frontends/dri/dri2.c b/src/gallium/frontends/dri/dri2.c index 6dcbd3365c2..cd9d9ebe577 100644 --- a/src/gallium/frontends/dri/dri2.c +++ b/src/gallium/frontends/dri/dri2.c @@ -2350,6 +2350,15 @@ dri2_init_screen(__DRIscreen * sPriv) screen->broken_invalidate = !sPriv->dri2.useInvalidate; screen->lookup_egl_image = dri2_lookup_egl_image; + const __DRIimageLookupExtension *loader = sPriv->dri2.image; + if (loader && + loader->base.version >= 2 && + loader->validateEGLImage && + loader->lookupEGLImageValidated) { + screen->validate_egl_image = dri2_validate_egl_image; + screen->lookup_egl_image_validated = dri2_lookup_egl_image_validated; + } + return configs; destroy_screen: @@ -2404,6 +2413,15 @@ dri_kms_init_screen(__DRIscreen * sPriv) screen->broken_invalidate = !sPriv->dri2.useInvalidate; screen->lookup_egl_image = dri2_lookup_egl_image; + const __DRIimageLookupExtension *loader = sPriv->dri2.image; + if (loader && + loader->base.version >= 2 && + loader->validateEGLImage && + loader->lookupEGLImageValidated) { + screen->validate_egl_image = dri2_validate_egl_image; + screen->lookup_egl_image_validated = dri2_lookup_egl_image_validated; + } + return configs; destroy_screen: diff --git a/src/gallium/frontends/dri/dri_helpers.c b/src/gallium/frontends/dri/dri_helpers.c index 583ce67978d..a2c864ae101 100644 --- a/src/gallium/frontends/dri/dri_helpers.c +++ b/src/gallium/frontends/dri/dri_helpers.c @@ -253,6 +253,22 @@ dri2_lookup_egl_image(struct dri_screen *screen, void *handle) return img; } +boolean +dri2_validate_egl_image(struct dri_screen *screen, void *handle) +{ + const __DRIimageLookupExtension *loader = screen->sPriv->dri2.image; + + return loader->validateEGLImage(handle, screen->sPriv->loaderPrivate); +} + +__DRIimage * +dri2_lookup_egl_image_validated(struct dri_screen *screen, void *handle) +{ + const __DRIimageLookupExtension *loader = screen->sPriv->dri2.image; + + return loader->lookupEGLImageValidated(handle, screen->sPriv->loaderPrivate); +} + __DRIimage * dri2_create_image_from_renderbuffer2(__DRIcontext *context, int renderbuffer, void *loaderPrivate, diff --git a/src/gallium/frontends/dri/dri_helpers.h b/src/gallium/frontends/dri/dri_helpers.h index d7daad83f18..37a27772a80 100644 --- a/src/gallium/frontends/dri/dri_helpers.h +++ b/src/gallium/frontends/dri/dri_helpers.h @@ -62,6 +62,12 @@ dri2_yuv_dma_buf_supported(struct dri_screen *screen, __DRIimage * dri2_lookup_egl_image(struct dri_screen *screen, void *handle); +boolean +dri2_validate_egl_image(struct dri_screen *screen, void *handle); + +__DRIimage * +dri2_lookup_egl_image_validated(struct dri_screen *screen, void *handle); + __DRIimage * dri2_create_image_from_renderbuffer(__DRIcontext *context, int renderbuffer, void *loaderPrivate); diff --git a/src/gallium/frontends/dri/dri_screen.h b/src/gallium/frontends/dri/dri_screen.h index c6c08f9e3ea..0b60cb68bcc 100644 --- a/src/gallium/frontends/dri/dri_screen.h +++ b/src/gallium/frontends/dri/dri_screen.h @@ -81,6 +81,8 @@ struct dri_screen /* hooks filled in by dri2 & drisw */ __DRIimage * (*lookup_egl_image)(struct dri_screen *ctx, void *handle); + boolean (*validate_egl_image)(struct dri_screen *ctx, void *handle); + __DRIimage * (*lookup_egl_image_validated)(struct dri_screen *ctx, void *handle); /* DRI exts that vary based on gallium pipe_screen caps. */ __DRIimageExtension image_extension; diff --git a/src/gallium/frontends/dri/drisw.c b/src/gallium/frontends/dri/drisw.c index 5f5d475c45f..adb486ceb0b 100644 --- a/src/gallium/frontends/dri/drisw.c +++ b/src/gallium/frontends/dri/drisw.c @@ -541,6 +541,15 @@ drisw_init_screen(__DRIscreen * sPriv) sPriv->extensions = drisw_screen_extensions; screen->lookup_egl_image = dri2_lookup_egl_image; + const __DRIimageLookupExtension *image = sPriv->dri2.image; + if (image && + image->base.version >= 2 && + image->validateEGLImage && + image->lookupEGLImageValidated) { + screen->validate_egl_image = dri2_validate_egl_image; + screen->lookup_egl_image_validated = dri2_lookup_egl_image_validated; + } + return configs; fail: dri_destroy_screen_helper(screen);