llvmpipe: twoside for specular color also
[mesa.git] / src / egl / drivers / dri2 / egl_dri2.c
index f2b532d92c86424b05bff5f065445e44c3d7b6b9..eb8996f7a7551bfc1463024d5ba761554a5c5bf7 100644 (file)
@@ -1659,56 +1659,28 @@ dri2_create_image_mesa_drm_buffer(_EGLDisplay *disp, _EGLContext *ctx,
 {
    struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
    struct dri2_egl_image *dri2_img;
-   EGLint width, height, format, name, stride, pitch, i, err;
+   EGLint format, name, pitch, err;
+   _EGLImageAttribs attrs;
 
    (void) ctx;
 
    name = (EGLint) buffer;
 
-   err = EGL_SUCCESS;
-   width = 0;
-   height = 0;
-   format = 0;
-   stride = 0;
-
-   for (i = 0; attr_list[i] != EGL_NONE; i++) {
-      EGLint attr = attr_list[i++];
-      EGLint val = attr_list[i];
-
-      switch (attr) {
-      case EGL_WIDTH:
-        width = val;
-         break;
-      case EGL_HEIGHT:
-        height = val;
-         break;
-      case EGL_DRM_BUFFER_FORMAT_MESA:
-        format = val;
-         break;
-      case EGL_DRM_BUFFER_STRIDE_MESA:
-        stride = val;
-         break;
-      default:
-         err = EGL_BAD_ATTRIBUTE;
-         break;
-      }
-
-      if (err != EGL_SUCCESS) {
-         _eglLog(_EGL_WARNING, "bad image attribute 0x%04x", attr);
-        return NULL;
-      }
-   }
+   err = _eglParseImageAttribList(&attrs, disp, attr_list);
+   if (err != EGL_SUCCESS)
+      return NULL;
 
-   if (width <= 0 || height <= 0 || stride <= 0) {
+   if (attrs.Width <= 0 || attrs.Height <= 0 ||
+       attrs.DRMBufferStrideMESA <= 0) {
       _eglError(EGL_BAD_PARAMETER,
                "bad width, height or stride");
       return NULL;
    }
 
-   switch (format) {
+   switch (attrs.DRMBufferFormatMESA) {
    case EGL_DRM_BUFFER_FORMAT_ARGB32_MESA:
       format = __DRI_IMAGE_FORMAT_ARGB8888;
-      pitch = stride;
+      pitch = attrs.DRMBufferStrideMESA;
       break;
    default:
       _eglError(EGL_BAD_PARAMETER,
@@ -1729,8 +1701,8 @@ dri2_create_image_mesa_drm_buffer(_EGLDisplay *disp, _EGLContext *ctx,
 
    dri2_img->dri_image =
       dri2_dpy->image->createImageFromName(dri2_dpy->dri_screen,
-                                          width,
-                                          height,
+                                          attrs.Width,
+                                          attrs.Height,
                                           format,
                                           name,
                                           pitch,
@@ -1784,8 +1756,9 @@ dri2_create_drm_image_mesa(_EGLDriver *drv, _EGLDisplay *disp,
 {
    struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
    struct dri2_egl_image *dri2_img;
-   int width, height, format, i;
-   unsigned int use, dri_use, valid_mask;
+   _EGLImageAttribs attrs;
+   unsigned int dri_use, valid_mask;
+   int format;
    EGLint err = EGL_SUCCESS;
 
    (void) drv;
@@ -1806,69 +1779,45 @@ dri2_create_drm_image_mesa(_EGLDriver *drv, _EGLDisplay *disp,
       goto cleanup_img;
    }
 
-   width = 0;
-   height = 0;
-   format = 0;
-   use = 0;
-   for (i = 0; attr_list[i] != EGL_NONE; i++) {
-      EGLint attr = attr_list[i++];
-      EGLint val = attr_list[i];
-
-      switch (attr) {
-      case EGL_WIDTH:
-        width = val;
-         break;
-      case EGL_HEIGHT:
-        height = val;
-         break;
-      case EGL_DRM_BUFFER_FORMAT_MESA:
-        format = val;
-         break;
-      case EGL_DRM_BUFFER_USE_MESA:
-        use = val;
-         break;
-      default:
-         err = EGL_BAD_ATTRIBUTE;
-         break;
-      }
-
-      if (err != EGL_SUCCESS) {
-         _eglLog(_EGL_WARNING, "bad image attribute 0x%04x", attr);
-        goto cleanup_img;
-      }
-   }
+   err = _eglParseImageAttribList(&attrs, disp, attr_list);
+   if (err != EGL_SUCCESS)
+      goto cleanup_img;
 
-   if (width <= 0 || height <= 0) {
-      _eglLog(_EGL_WARNING, "bad width or height (%dx%d)", width, height);
+   if (attrs.Width <= 0 || attrs.Height <= 0) {
+      _eglLog(_EGL_WARNING, "bad width or height (%dx%d)",
+            attrs.Width, attrs.Height);
       goto cleanup_img;
    }
 
-   switch (format) {
+   switch (attrs.DRMBufferFormatMESA) {
    case EGL_DRM_BUFFER_FORMAT_ARGB32_MESA:
       format = __DRI_IMAGE_FORMAT_ARGB8888;
       break;
    default:
-      _eglLog(_EGL_WARNING, "bad image format value 0x%04x", format);
+      _eglLog(_EGL_WARNING, "bad image format value 0x%04x",
+            attrs.DRMBufferFormatMESA);
       goto cleanup_img;
    }
 
    valid_mask =
       EGL_DRM_BUFFER_USE_SCANOUT_MESA |
       EGL_DRM_BUFFER_USE_SHARE_MESA; 
-   if (use & ~valid_mask) {
-      _eglLog(_EGL_WARNING, "bad image use bit 0x%04x", use & ~valid_mask);
+   if (attrs.DRMBufferUseMESA & ~valid_mask) {
+      _eglLog(_EGL_WARNING, "bad image use bit 0x%04x",
+            attrs.DRMBufferUseMESA & ~valid_mask);
       goto cleanup_img;
    }
 
    dri_use = 0;
-   if (use & EGL_DRM_BUFFER_USE_SHARE_MESA)
+   if (attrs.DRMBufferUseMESA & EGL_DRM_BUFFER_USE_SHARE_MESA)
       dri_use |= __DRI_IMAGE_USE_SHARE;
-   if (use & EGL_DRM_BUFFER_USE_SCANOUT_MESA)
+   if (attrs.DRMBufferUseMESA & EGL_DRM_BUFFER_USE_SCANOUT_MESA)
       dri_use |= __DRI_IMAGE_USE_SCANOUT;
 
    dri2_img->dri_image = 
       dri2_dpy->image->createImage(dri2_dpy->dri_screen,
-                                  width, height, format, dri_use, dri2_img);
+                                  attrs.Width, attrs.Height,
+                                   format, dri_use, dri2_img);
    if (dri2_img->dri_image == NULL) {
       err = EGL_BAD_ALLOC;
       goto cleanup_img;