summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEmil Velikov <[email protected]>2017-06-28 21:23:00 +0100
committerEmil Velikov <[email protected]>2017-07-12 15:42:03 +0100
commit9365ff4b885730d76e535edc12445b6f1b72f667 (patch)
treedb1c4bd22135f61af98bc013ad29f0801c78a9d2
parentf7e78abdf45b26f3991dc336120162ae01b208f1 (diff)
egl: move eglCreateDRMImageMESA's malloc later
Don't bother allocating any memory until we're finished parsing and sanitising all the attributes. As a nice side effect we now consistently set eglError when any of the attrib/values are not correct. Strangely enough the spec does not mention _anything_ about what error should be set where, even if the implementation already sets the odd one. Cc: Kristian Høgsberg <[email protected]> Signed-off-by: Emil Velikov <[email protected]> Reviewed-by: Eric Engestrom <[email protected]>
-rw-r--r--src/egl/drivers/dri2/egl_dri2.c52
1 files changed, 23 insertions, 29 deletions
diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
index cf262427020..e55bff6dbbf 100644
--- a/src/egl/drivers/dri2/egl_dri2.c
+++ b/src/egl/drivers/dri2/egl_dri2.c
@@ -2302,27 +2302,20 @@ dri2_create_drm_image_mesa(_EGLDriver *drv, _EGLDisplay *disp,
(void) drv;
- dri2_img = malloc(sizeof *dri2_img);
- if (!dri2_img) {
- _eglError(EGL_BAD_ALLOC, "dri2_create_image_khr");
- return EGL_NO_IMAGE_KHR;
- }
-
if (!attr_list) {
- err = EGL_BAD_PARAMETER;
- goto cleanup_img;
+ _eglError(EGL_BAD_PARAMETER, __func__);
+ return EGL_NO_IMAGE_KHR;
}
- _eglInitImage(&dri2_img->base, disp);
-
err = _eglParseImageAttribList(&attrs, disp, attr_list);
- if (err != EGL_SUCCESS)
- goto cleanup_img;
+ if (err != EGL_SUCCESS) {
+ _eglError(EGL_BAD_PARAMETER, __func__);
+ return EGL_NO_IMAGE_KHR;
+ }
if (attrs.Width <= 0 || attrs.Height <= 0) {
- _eglLog(_EGL_WARNING, "bad width or height (%dx%d)",
- attrs.Width, attrs.Height);
- goto cleanup_img;
+ _eglError(EGL_BAD_PARAMETER, __func__);
+ return EGL_NO_IMAGE_KHR;
}
switch (attrs.DRMBufferFormatMESA) {
@@ -2330,9 +2323,8 @@ dri2_create_drm_image_mesa(_EGLDriver *drv, _EGLDisplay *disp,
format = __DRI_IMAGE_FORMAT_ARGB8888;
break;
default:
- _eglLog(_EGL_WARNING, "bad image format value 0x%04x",
- attrs.DRMBufferFormatMESA);
- goto cleanup_img;
+ _eglError(EGL_BAD_PARAMETER, __func__);
+ return EGL_NO_IMAGE_KHR;
}
valid_mask =
@@ -2340,9 +2332,8 @@ dri2_create_drm_image_mesa(_EGLDriver *drv, _EGLDisplay *disp,
EGL_DRM_BUFFER_USE_SHARE_MESA |
EGL_DRM_BUFFER_USE_CURSOR_MESA;
if (attrs.DRMBufferUseMESA & ~valid_mask) {
- _eglLog(_EGL_WARNING, "bad image use bit 0x%04x",
- attrs.DRMBufferUseMESA & ~valid_mask);
- goto cleanup_img;
+ _eglError(EGL_BAD_PARAMETER, __func__);
+ return EGL_NO_IMAGE_KHR;
}
dri_use = 0;
@@ -2353,22 +2344,25 @@ dri2_create_drm_image_mesa(_EGLDriver *drv, _EGLDisplay *disp,
if (attrs.DRMBufferUseMESA & EGL_DRM_BUFFER_USE_CURSOR_MESA)
dri_use |= __DRI_IMAGE_USE_CURSOR;
+ dri2_img = malloc(sizeof *dri2_img);
+ if (!dri2_img) {
+ _eglError(EGL_BAD_ALLOC, "dri2_create_image_khr");
+ return EGL_NO_IMAGE_KHR;
+ }
+
+ _eglInitImage(&dri2_img->base, disp);
+
dri2_img->dri_image =
dri2_dpy->image->createImage(dri2_dpy->dri_screen,
attrs.Width, attrs.Height,
format, dri_use, dri2_img);
if (dri2_img->dri_image == NULL) {
- err = EGL_BAD_ALLOC;
- goto cleanup_img;
+ free(dri2_img);
+ _eglError(EGL_BAD_ALLOC, "dri2_create_drm_image_mesa");
+ return EGL_NO_IMAGE_KHR;
}
return &dri2_img->base;
-
- cleanup_img:
- free(dri2_img);
- _eglError(err, "dri2_create_drm_image_mesa");
-
- return EGL_NO_IMAGE_KHR;
}
static EGLBoolean