#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:
}
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;
}
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;
}
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;
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;
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) {
* 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;
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__);
}