diff options
Diffstat (limited to 'src/egl/drivers/dri2/egl_dri2.c')
-rw-r--r-- | src/egl/drivers/dri2/egl_dri2.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index c2715528d88..bcafdf9f4c5 100644 --- a/src/egl/drivers/dri2/egl_dri2.c +++ b/src/egl/drivers/dri2/egl_dri2.c @@ -2178,6 +2178,38 @@ dri2_query_dma_buf_formats(_EGLDriver *drv, _EGLDisplay *disp, return EGL_TRUE; } +static EGLBoolean +dri2_query_dma_buf_modifiers(_EGLDriver *drv, _EGLDisplay *disp, EGLint format, + EGLint max, EGLuint64KHR *modifiers, + EGLBoolean *external_only, EGLint *count) +{ + struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); + + if (max < 0) { + _eglError(EGL_BAD_PARAMETER, "invalid value for max count of formats"); + return EGL_FALSE; + } + + if (max > 0 && modifiers == NULL) { + _eglError(EGL_BAD_PARAMETER, "invalid modifiers array"); + return EGL_FALSE; + } + + if (dri2_dpy->image->base.version < 15 || + dri2_dpy->image->queryDmaBufModifiers == NULL) + return EGL_FALSE; + + if (dri2_dpy->image->queryDmaBufModifiers(dri2_dpy->dri_screen, format, + max, modifiers, + (unsigned int *) external_only, + count) == false) { + _eglError(EGL_BAD_PARAMETER, "invalid format"); + return EGL_FALSE; + } + + return EGL_TRUE; +} + /** * The spec says: * @@ -3116,6 +3148,7 @@ _eglBuiltInDriverDRI2(const char *args) dri2_drv->base.API.ExportDMABUFImageQueryMESA = dri2_export_dma_buf_image_query_mesa; dri2_drv->base.API.ExportDMABUFImageMESA = dri2_export_dma_buf_image_mesa; dri2_drv->base.API.QueryDmaBufFormatsEXT = dri2_query_dma_buf_formats; + dri2_drv->base.API.QueryDmaBufModifiersEXT = dri2_query_dma_buf_modifiers; #endif #ifdef HAVE_WAYLAND_PLATFORM dri2_drv->base.API.BindWaylandDisplayWL = dri2_bind_wayland_display_wl; |