egl: propagate EGL_BAD_ATTRIBUTE during EGLImage attr parsing
[mesa.git] / src / egl / main / eglimage.c
index 8f46725be99b4219f14cb6f42e50fd9df8a2ed1a..72a556e8dbdfec44906656d7052a1861571d0f1d 100644 (file)
@@ -39,16 +39,23 @@ _eglParseKHRImageAttribs(_EGLImageAttribs *attrs, _EGLDisplay *dpy,
                          EGLint attr, EGLint val)
 {
    switch (attr) {
-   /* EGL_KHR_image_base */
    case EGL_IMAGE_PRESERVED_KHR:
+      if (!dpy->Extensions.KHR_image_base)
+          return EGL_BAD_PARAMETER;
+
       attrs->ImagePreserved = val;
       break;
 
-   /* EGL_KHR_gl_image */
    case EGL_GL_TEXTURE_LEVEL_KHR:
+      if (!dpy->Extensions.KHR_gl_texture_2D_image)
+         return EGL_BAD_PARAMETER;
+
       attrs->GLTextureLevel = val;
       break;
    case EGL_GL_TEXTURE_ZOFFSET_KHR:
+      if (!dpy->Extensions.KHR_gl_texture_3D_image)
+         return EGL_BAD_PARAMETER;
+
       attrs->GLTextureZOffset = val;
       break;
    default:
@@ -62,8 +69,10 @@ static EGLint
 _eglParseMESADrmImageAttribs(_EGLImageAttribs *attrs, _EGLDisplay *dpy,
                              EGLint attr, EGLint val)
 {
+   if (!dpy->Extensions.MESA_drm_image)
+      return EGL_BAD_PARAMETER;
+
    switch (attr) {
-   /* EGL_MESA_drm_image */
    case EGL_WIDTH:
       attrs->Width = val;
       break;
@@ -90,8 +99,10 @@ static EGLint
 _eglParseWLBindWaylandDisplayAttribs(_EGLImageAttribs *attrs, _EGLDisplay *dpy,
                                      EGLint attr, EGLint val)
 {
+   if (!dpy->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;
@@ -106,9 +117,16 @@ static EGLint
 _eglParseEXTImageDmaBufImportAttribs(_EGLImageAttribs *attrs, _EGLDisplay *dpy,
                                      EGLint attr, EGLint val)
 {
-   EGLint err = EGL_SUCCESS;
+   if (!dpy->Extensions.EXT_image_dma_buf_import)
+      return EGL_BAD_PARAMETER;
 
    switch (attr) {
+   case EGL_WIDTH:
+      attrs->Width = val;
+      break;
+   case EGL_HEIGHT:
+      attrs->Height = val;
+      break;
    case EGL_LINUX_DRM_FOURCC_EXT:
       attrs->DMABufFourCC.Value = val;
       attrs->DMABufFourCC.IsPresent = EGL_TRUE;
@@ -151,45 +169,40 @@ _eglParseEXTImageDmaBufImportAttribs(_EGLImageAttribs *attrs, _EGLDisplay *dpy,
       break;
    case EGL_YUV_COLOR_SPACE_HINT_EXT:
       if (val != EGL_ITU_REC601_EXT && val != EGL_ITU_REC709_EXT &&
-          val != EGL_ITU_REC2020_EXT) {
-         err = EGL_BAD_ATTRIBUTE;
-      } else {
-         attrs->DMABufYuvColorSpaceHint.Value = val;
-         attrs->DMABufYuvColorSpaceHint.IsPresent = EGL_TRUE;
-      }
+          val != EGL_ITU_REC2020_EXT)
+         return EGL_BAD_ATTRIBUTE;
+
+      attrs->DMABufYuvColorSpaceHint.Value = val;
+      attrs->DMABufYuvColorSpaceHint.IsPresent = EGL_TRUE;
       break;
    case EGL_SAMPLE_RANGE_HINT_EXT:
-      if (val != EGL_YUV_FULL_RANGE_EXT && val != EGL_YUV_NARROW_RANGE_EXT) {
-         err = EGL_BAD_ATTRIBUTE;
-      } else {
-         attrs->DMABufSampleRangeHint.Value = val;
-         attrs->DMABufSampleRangeHint.IsPresent = EGL_TRUE;
-      }
+      if (val != EGL_YUV_FULL_RANGE_EXT && val != EGL_YUV_NARROW_RANGE_EXT)
+         return EGL_BAD_ATTRIBUTE;
+
+      attrs->DMABufSampleRangeHint.Value = val;
+      attrs->DMABufSampleRangeHint.IsPresent = EGL_TRUE;
       break;
    case EGL_YUV_CHROMA_HORIZONTAL_SITING_HINT_EXT:
       if (val != EGL_YUV_CHROMA_SITING_0_EXT &&
-          val != EGL_YUV_CHROMA_SITING_0_5_EXT) {
-         err = EGL_BAD_ATTRIBUTE;
-      } else {
-         attrs->DMABufChromaHorizontalSiting.Value = val;
-         attrs->DMABufChromaHorizontalSiting.IsPresent = EGL_TRUE;
-      }
+          val != EGL_YUV_CHROMA_SITING_0_5_EXT)
+         return EGL_BAD_ATTRIBUTE;
+
+      attrs->DMABufChromaHorizontalSiting.Value = val;
+      attrs->DMABufChromaHorizontalSiting.IsPresent = EGL_TRUE;
       break;
    case EGL_YUV_CHROMA_VERTICAL_SITING_HINT_EXT:
       if (val != EGL_YUV_CHROMA_SITING_0_EXT &&
-          val != EGL_YUV_CHROMA_SITING_0_5_EXT) {
-         err = EGL_BAD_ATTRIBUTE;
-      } else {
-         attrs->DMABufChromaVerticalSiting.Value = val;
-         attrs->DMABufChromaVerticalSiting.IsPresent = EGL_TRUE;
-      }
+          val != EGL_YUV_CHROMA_SITING_0_5_EXT)
+         return EGL_BAD_ATTRIBUTE;
+
+      attrs->DMABufChromaVerticalSiting.Value = val;
+      attrs->DMABufChromaVerticalSiting.IsPresent = EGL_TRUE;
       break;
    default:
-      err = EGL_BAD_PARAMETER;
-      break;
+      return EGL_BAD_PARAMETER;
    }
 
-   return err;
+   return EGL_SUCCESS;
 }
 
 static EGLint
@@ -197,81 +210,59 @@ _eglParseEXTImageDmaBufImportModifiersAttribs(_EGLImageAttribs *attrs,
                                               _EGLDisplay *dpy,
                                               EGLint attr, EGLint val)
 {
-   EGLint err = EGL_SUCCESS;
+   if (!dpy->Extensions.EXT_image_dma_buf_import_modifiers)
+      return EGL_BAD_PARAMETER;
 
    switch (attr) {
    case EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT:
-      if (!dpy->Extensions.EXT_image_dma_buf_import_modifiers)
-         err = EGL_BAD_PARAMETER;
       attrs->DMABufPlaneModifiersLo[0].Value = val;
       attrs->DMABufPlaneModifiersLo[0].IsPresent = EGL_TRUE;
       break;
    case EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT:
-      if (!dpy->Extensions.EXT_image_dma_buf_import_modifiers)
-         err = EGL_BAD_PARAMETER;
       attrs->DMABufPlaneModifiersHi[0].Value = val;
       attrs->DMABufPlaneModifiersHi[0].IsPresent = EGL_TRUE;
       break;
    case EGL_DMA_BUF_PLANE1_MODIFIER_LO_EXT:
-      if (!dpy->Extensions.EXT_image_dma_buf_import_modifiers)
-         err = EGL_BAD_PARAMETER;
       attrs->DMABufPlaneModifiersLo[1].Value = val;
       attrs->DMABufPlaneModifiersLo[1].IsPresent = EGL_TRUE;
       break;
    case EGL_DMA_BUF_PLANE1_MODIFIER_HI_EXT:
-      if (!dpy->Extensions.EXT_image_dma_buf_import_modifiers)
-         err = EGL_BAD_PARAMETER;
       attrs->DMABufPlaneModifiersHi[1].Value = val;
       attrs->DMABufPlaneModifiersHi[1].IsPresent = EGL_TRUE;
       break;
    case EGL_DMA_BUF_PLANE2_MODIFIER_LO_EXT:
-      if (!dpy->Extensions.EXT_image_dma_buf_import_modifiers)
-         err = EGL_BAD_PARAMETER;
       attrs->DMABufPlaneModifiersLo[2].Value = val;
       attrs->DMABufPlaneModifiersLo[2].IsPresent = EGL_TRUE;
       break;
    case EGL_DMA_BUF_PLANE2_MODIFIER_HI_EXT:
-      if (!dpy->Extensions.EXT_image_dma_buf_import_modifiers)
-         err = EGL_BAD_PARAMETER;
       attrs->DMABufPlaneModifiersHi[2].Value = val;
       attrs->DMABufPlaneModifiersHi[2].IsPresent = EGL_TRUE;
       break;
    case EGL_DMA_BUF_PLANE3_FD_EXT:
-      if (!dpy->Extensions.EXT_image_dma_buf_import_modifiers)
-         err = EGL_BAD_PARAMETER;
       attrs->DMABufPlaneFds[3].Value = val;
       attrs->DMABufPlaneFds[3].IsPresent = EGL_TRUE;
       break;
    case EGL_DMA_BUF_PLANE3_OFFSET_EXT:
-      if (!dpy->Extensions.EXT_image_dma_buf_import_modifiers)
-         err = EGL_BAD_PARAMETER;
       attrs->DMABufPlaneOffsets[3].Value = val;
       attrs->DMABufPlaneOffsets[3].IsPresent = EGL_TRUE;
       break;
    case EGL_DMA_BUF_PLANE3_PITCH_EXT:
-      if (!dpy->Extensions.EXT_image_dma_buf_import_modifiers)
-         err = EGL_BAD_PARAMETER;
       attrs->DMABufPlanePitches[3].Value = val;
       attrs->DMABufPlanePitches[3].IsPresent = EGL_TRUE;
       break;
    case EGL_DMA_BUF_PLANE3_MODIFIER_LO_EXT:
-      if (!dpy->Extensions.EXT_image_dma_buf_import_modifiers)
-         err = EGL_BAD_PARAMETER;
       attrs->DMABufPlaneModifiersLo[3].Value = val;
       attrs->DMABufPlaneModifiersLo[3].IsPresent = EGL_TRUE;
       break;
    case EGL_DMA_BUF_PLANE3_MODIFIER_HI_EXT:
-      if (!dpy->Extensions.EXT_image_dma_buf_import_modifiers)
-         err = EGL_BAD_PARAMETER;
       attrs->DMABufPlaneModifiersHi[3].Value = val;
       attrs->DMABufPlaneModifiersHi[3].IsPresent = EGL_TRUE;
       break;
    default:
-      err = EGL_BAD_PARAMETER;
-      break;
+      return EGL_BAD_PARAMETER;
    }
 
-   return err;
+   return EGL_SUCCESS;
 }
 
 /**
@@ -311,6 +302,13 @@ _eglParseImageAttribList(_EGLImageAttribs *attrs, _EGLDisplay *dpy,
       if (err == EGL_SUCCESS)
           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);
       if (err == EGL_SUCCESS)
           continue;