egl: move eglChooseConfig() fallback to eglapi.c
[mesa.git] / src / egl / main / eglimage.c
index b361a2d02428ee0f76a6b6c9d96ca6355bd25bc9..9df6b6511d57755ef4705809b4d665eea5e47d97 100644 (file)
 #include "egllog.h"
 
 static EGLint
-_eglParseKHRImageAttribs(_EGLImageAttribs *attrs, _EGLDisplay *dpy,
+_eglParseKHRImageAttribs(_EGLImageAttribs *attrs, _EGLDisplay *disp,
                          EGLint attr, EGLint val)
 {
    switch (attr) {
-   /* EGL_KHR_image_base */
    case EGL_IMAGE_PRESERVED_KHR:
+      if (!disp->Extensions.KHR_image_base)
+         return EGL_BAD_PARAMETER;
+
       attrs->ImagePreserved = val;
       break;
 
-   /* EGL_KHR_gl_image */
    case EGL_GL_TEXTURE_LEVEL_KHR:
+      if (!disp->Extensions.KHR_gl_texture_2D_image)
+         return EGL_BAD_PARAMETER;
+
       attrs->GLTextureLevel = val;
       break;
    case EGL_GL_TEXTURE_ZOFFSET_KHR:
+      if (!disp->Extensions.KHR_gl_texture_3D_image)
+         return EGL_BAD_PARAMETER;
+
       attrs->GLTextureZOffset = val;
       break;
    default:
@@ -59,11 +66,13 @@ _eglParseKHRImageAttribs(_EGLImageAttribs *attrs, _EGLDisplay *dpy,
 }
 
 static EGLint
-_eglParseMESADrmImageAttribs(_EGLImageAttribs *attrs, _EGLDisplay *dpy,
+_eglParseMESADrmImageAttribs(_EGLImageAttribs *attrs, _EGLDisplay *disp,
                              EGLint attr, EGLint val)
 {
+   if (!disp->Extensions.MESA_drm_image)
+      return EGL_BAD_PARAMETER;
+
    switch (attr) {
-   /* EGL_MESA_drm_image */
    case EGL_WIDTH:
       attrs->Width = val;
       break;
@@ -87,11 +96,13 @@ _eglParseMESADrmImageAttribs(_EGLImageAttribs *attrs, _EGLDisplay *dpy,
 }
 
 static EGLint
-_eglParseWLBindWaylandDisplayAttribs(_EGLImageAttribs *attrs, _EGLDisplay *dpy,
+_eglParseWLBindWaylandDisplayAttribs(_EGLImageAttribs *attrs, _EGLDisplay *disp,
                                      EGLint attr, EGLint val)
 {
+   if (!disp->Extensions.WL_bind_wayland_display)
+      return EGL_BAD_PARAMETER;
+
    switch (attr) {
-   /* EGL_WL_bind_wayland_display */
    case EGL_WAYLAND_PLANE_WL:
       attrs->PlaneWL = val;
       break;
@@ -103,9 +114,12 @@ _eglParseWLBindWaylandDisplayAttribs(_EGLImageAttribs *attrs, _EGLDisplay *dpy,
 }
 
 static EGLint
-_eglParseEXTImageDmaBufImportAttribs(_EGLImageAttribs *attrs, _EGLDisplay *dpy,
+_eglParseEXTImageDmaBufImportAttribs(_EGLImageAttribs *attrs, _EGLDisplay *disp,
                                      EGLint attr, EGLint val)
 {
+   if (!disp->Extensions.EXT_image_dma_buf_import)
+      return EGL_BAD_PARAMETER;
+
    switch (attr) {
    case EGL_WIDTH:
       attrs->Width = val;
@@ -130,9 +144,9 @@ _eglParseEXTImageDmaBufImportAttribs(_EGLImageAttribs *attrs, _EGLDisplay *dpy,
       attrs->DMABufPlanePitches[0].IsPresent = EGL_TRUE;
       break;
    case EGL_DMA_BUF_PLANE1_FD_EXT:
-       attrs->DMABufPlaneFds[1].Value = val;
-       attrs->DMABufPlaneFds[1].IsPresent = EGL_TRUE;
-       break;
+      attrs->DMABufPlaneFds[1].Value = val;
+      attrs->DMABufPlaneFds[1].IsPresent = EGL_TRUE;
+      break;
    case EGL_DMA_BUF_PLANE1_OFFSET_EXT:
       attrs->DMABufPlaneOffsets[1].Value = val;
       attrs->DMABufPlaneOffsets[1].IsPresent = EGL_TRUE;
@@ -193,10 +207,10 @@ _eglParseEXTImageDmaBufImportAttribs(_EGLImageAttribs *attrs, _EGLDisplay *dpy,
 
 static EGLint
 _eglParseEXTImageDmaBufImportModifiersAttribs(_EGLImageAttribs *attrs,
-                                              _EGLDisplay *dpy,
+                                              _EGLDisplay *disp,
                                               EGLint attr, EGLint val)
 {
-   if (!dpy->Extensions.EXT_image_dma_buf_import_modifiers)
+   if (!disp->Extensions.EXT_image_dma_buf_import_modifiers)
       return EGL_BAD_PARAMETER;
 
    switch (attr) {
@@ -258,7 +272,7 @@ _eglParseEXTImageDmaBufImportModifiersAttribs(_EGLImageAttribs *attrs,
  * Function calls _eglError to set the correct error code.
  */
 EGLBoolean
-_eglParseImageAttribList(_EGLImageAttribs *attrs, _EGLDisplay *dpy,
+_eglParseImageAttribList(_EGLImageAttribs *attrs, _EGLDisplay *disp,
                          const EGLint *attrib_list)
 {
    EGLint i, err;
@@ -272,25 +286,32 @@ _eglParseImageAttribList(_EGLImageAttribs *attrs, _EGLDisplay *dpy,
       EGLint attr = attrib_list[i++];
       EGLint val = attrib_list[i];
 
-      err = _eglParseKHRImageAttribs(attrs, dpy, attr, val);
+      err = _eglParseKHRImageAttribs(attrs, disp, attr, val);
       if (err == EGL_SUCCESS)
-          continue;
+         continue;
 
-      err = _eglParseMESADrmImageAttribs(attrs, dpy, attr, val);
+      err = _eglParseMESADrmImageAttribs(attrs, disp, attr, val);
       if (err == EGL_SUCCESS)
-          continue;
+         continue;
 
-      err = _eglParseWLBindWaylandDisplayAttribs(attrs, dpy, attr, val);
+      err = _eglParseWLBindWaylandDisplayAttribs(attrs, disp, attr, val);
       if (err == EGL_SUCCESS)
-          continue;
+         continue;
 
-      err = _eglParseEXTImageDmaBufImportAttribs(attrs, dpy, attr, val);
+      err = _eglParseEXTImageDmaBufImportAttribs(attrs, disp, attr, val);
       if (err == EGL_SUCCESS)
-          continue;
+         continue;
+
+      /* EXT_image_dma_buf_import states that if invalid value is provided for
+       * its attributes, we should return EGL_BAD_ATTRIBUTE.
+       * Bail out ASAP, since follow-up calls can return another EGL_BAD error.
+       */
+      if (err == EGL_BAD_ATTRIBUTE)
+         return _eglError(err, __func__);
 
-      err = _eglParseEXTImageDmaBufImportModifiersAttribs(attrs, dpy, attr, val);
+      err = _eglParseEXTImageDmaBufImportModifiersAttribs(attrs, disp, attr, val);
       if (err == EGL_SUCCESS)
-          continue;
+         continue;
 
       return _eglError(err, __func__);
    }