egl: Add checks for EGL_MESA_screen_surface.
authorChia-I Wu <olv@lunarg.com>
Fri, 30 Jul 2010 16:00:49 +0000 (00:00 +0800)
committerChia-I Wu <olv@lunarg.com>
Sat, 31 Jul 2010 09:49:32 +0000 (17:49 +0800)
This allows Mesa EGL to be compiled with eglext.h that does not define
EGL_MESA_screen_surface.

12 files changed:
src/egl/main/eglconfig.c
src/egl/main/eglcurrent.c
src/egl/main/egldriver.c
src/egl/main/eglglobals.c
src/egl/main/eglglobals.h
src/egl/main/eglmode.c
src/egl/main/eglmode.h
src/egl/main/eglscreen.c
src/egl/main/eglscreen.h
src/egl/main/eglsurface.c
src/gallium/state_trackers/egl/common/egl_g3d.c
src/gallium/state_trackers/egl/common/egl_g3d.h

index a9af3200976bf0b1f290ac1e3c34468c23a77798..ea8e47d02bbc4c105c299c275235bfa988301b4c 100644 (file)
@@ -314,8 +314,10 @@ _eglValidateConfig(const _EGLConfig *conf, EGLBoolean for_matching)
                    EGL_VG_ALPHA_FORMAT_PRE_BIT |
                    EGL_MULTISAMPLE_RESOLVE_BOX_BIT |
                    EGL_SWAP_BEHAVIOR_PRESERVED_BIT;
+#ifdef EGL_MESA_screen_surface
             if (conf->Display->Extensions.MESA_screen_surface)
                mask |= EGL_SCREEN_BIT_MESA;
+#endif
             break;
          case EGL_RENDERABLE_TYPE:
          case EGL_CONFORMANT:
index c697bf796dc88f91673ec14dc65bf452e57a15ee..a207159cd89888ba2303831473f2db780f10744f 100644 (file)
@@ -1,6 +1,5 @@
 #include <stdlib.h>
 #include <string.h>
-#include "eglglobals.h"
 #include "egllog.h"
 #include "eglmutex.h"
 #include "eglcurrent.h"
@@ -300,12 +299,14 @@ _eglError(EGLint errCode, const char *msg)
       case EGL_BAD_SURFACE:
          s = "EGL_BAD_SURFACE";
          break;
+#ifdef EGL_MESA_screen_surface
       case EGL_BAD_SCREEN_MESA:
          s = "EGL_BAD_SCREEN_MESA";
          break;
       case EGL_BAD_MODE_MESA:
          s = "EGL_BAD_MODE_MESA";
          break;
+#endif
       default:
          s = "other";
       }
index 1e3d7d24aa7308bd496d2fa3fb309c94a4bc3e60..8fc9e792b061f533c0591967c2689103f7515e56 100644 (file)
@@ -14,7 +14,6 @@
 #include "egldefines.h"
 #include "egldisplay.h"
 #include "egldriver.h"
-#include "eglglobals.h"
 #include "egllog.h"
 #include "eglmisc.h"
 #include "eglmode.h"
index 725a25eca63429ede71947170647be62c3d50861..52eebb07f6c4e3959c45929f659fcabe079ef613 100644 (file)
@@ -11,7 +11,6 @@ struct _egl_global _eglGlobal =
 {
    &_eglGlobalMutex,       /* Mutex */
    NULL,                   /* DisplayList */
-   1,                      /* FreeScreenHandle */
    2,                      /* NumAtExitCalls */
    {
       /* default AtExitCalls, called in reverse order */
index e8bf5416e2a0e90a1f94e9be5233cb68c4dd24c9..c3771a8ef10bebe7feb55968d39aeaf185a4de22 100644 (file)
@@ -16,8 +16,6 @@ struct _egl_global
    /* the list of all displays */
    _EGLDisplay *DisplayList;
 
-   EGLScreenMESA FreeScreenHandle;
-
    EGLint NumAtExitCalls;
    void (*AtExitCalls[10])(void);
 };
index 859e9318b4ad6a0416b2db894a10859b6418d251..37594cdb42d6d058cd00f410e268781863935dd1 100644 (file)
@@ -10,6 +10,9 @@
 #include "eglstring.h"
 
 
+#ifdef EGL_MESA_screen_surface
+
+
 #define MIN2(A, B)  (((A) < (B)) ? (A) : (B))
 
 
@@ -353,3 +356,6 @@ _eglQueryModeStringMESA(_EGLDriver *drv, _EGLDisplay *dpy, _EGLMode *m)
 {
    return m->Name;
 }
+
+
+#endif /* EGL_MESA_screen_surface */
index a089a5e194349770ab45ee9083199468d5a4aefb..9167cbc4b9b93030486769938b24e9c0b29ee23f 100644 (file)
@@ -4,6 +4,9 @@
 #include "egltypedefs.h"
 
 
+#ifdef EGL_MESA_screen_surface
+
+
 #define EGL_NO_MODE_MESA 0
 
 
@@ -54,4 +57,7 @@ extern const char *
 _eglQueryModeStringMESA(_EGLDriver *drv, _EGLDisplay *dpy, _EGLMode *m);
 
 
+#endif /* EGL_MESA_screen_surface */
+
+
 #endif /* EGLMODE_INCLUDED */
index 8f96fd935c7a8a9ea74a85c9e96fea802df61b76..8b8966f3ffd2ba3a2c07699b5a8198c7eebff547 100644 (file)
@@ -16,7 +16,6 @@
 #include <string.h>
 
 #include "egldisplay.h"
-#include "eglglobals.h"
 #include "eglcurrent.h"
 #include "eglmode.h"
 #include "eglconfig.h"
 #include "eglmutex.h"
 
 
+#ifdef EGL_MESA_screen_surface
+
+
+/* ugh, no atomic op? */
+static _EGL_DECLARE_MUTEX(_eglNextScreenHandleMutex);
+static EGLScreenMESA _eglNextScreenHandle = 1;
+
+
 /**
  * Return a new screen handle/ID.
  * NOTE: we never reuse these!
@@ -33,10 +40,10 @@ static EGLScreenMESA
 _eglAllocScreenHandle(void)
 {
    EGLScreenMESA s;
-   
-   _eglLockMutex(_eglGlobal.Mutex);
-   s = _eglGlobal.FreeScreenHandle++;
-   _eglUnlockMutex(_eglGlobal.Mutex);
+
+   _eglLockMutex(&_eglNextScreenHandleMutex);
+   s = _eglNextScreenHandle++;
+   _eglUnlockMutex(&_eglNextScreenHandleMutex);
 
    return s;
 }
@@ -263,3 +270,5 @@ _eglDestroyScreen(_EGLScreen *scrn)
    free(scrn);
 }
 
+
+#endif /* EGL_MESA_screen_surface */
index 0fd71f71fc83cb89ec6c68e3c7ed606f362bc3fd..3db20478ad63c85cf7018badd095587aa5a9b76a 100644 (file)
@@ -5,6 +5,9 @@
 #include "egltypedefs.h"
 
 
+#ifdef EGL_MESA_screen_surface
+
+
 /**
  * Per-screen information.
  * Note that an EGL screen doesn't have a size.  A screen may be set to
@@ -86,4 +89,7 @@ PUBLIC void
 _eglDestroyScreen(_EGLScreen *scrn);
 
 
+#endif /* EGL_MESA_screen_surface */
+
+
 #endif /* EGLSCREEN_INCLUDED */
index d46bdb0672e9659901196ab9b974c9ef433cbd3b..52f5c240c65fe682e3b42c1320bb1f37d8d08b2d 100644 (file)
@@ -30,6 +30,50 @@ _eglClampSwapInterval(_EGLSurface *surf, EGLint interval)
 }
 
 
+#ifdef EGL_MESA_screen_surface
+static EGLint
+_eglParseScreenSurfaceAttribList(_EGLSurface *surf, const EGLint *attrib_list)
+{
+   EGLint i, err = EGL_SUCCESS;
+
+   if (!attrib_list)
+      return EGL_SUCCESS;
+
+   for (i = 0; attrib_list[i] != EGL_NONE; i++) {
+      EGLint attr = attrib_list[i++];
+      EGLint val = attrib_list[i];
+
+      switch (attr) {
+      case EGL_WIDTH:
+         if (val < 0) {
+            err = EGL_BAD_PARAMETER;
+            break;
+         }
+         surf->Width = val;
+         break;
+      case EGL_HEIGHT:
+         if (val < 0) {
+            err = EGL_BAD_PARAMETER;
+            break;
+         }
+         surf->Height = val;
+         break;
+      default:
+         err = EGL_BAD_ATTRIBUTE;
+         break;
+      }
+
+      if (err != EGL_SUCCESS) {
+         _eglLog(_EGL_WARNING, "bad surface attribute 0x%04x", attr);
+         break;
+      }
+   }
+
+   return err;
+}
+#endif /* EGL_MESA_screen_surface */
+
+
 /**
  * Parse the list of surface attributes and return the proper error code.
  */
@@ -44,6 +88,11 @@ _eglParseSurfaceAttribList(_EGLSurface *surf, const EGLint *attrib_list)
    if (!attrib_list)
       return EGL_SUCCESS;
 
+#ifdef EGL_MESA_screen_surface
+   if (type == EGL_SCREEN_BIT_MESA)
+      return _eglParseScreenSurfaceAttribList(surf, attrib_list);
+#endif
+
    if (dpy->Extensions.NOK_texture_from_pixmap)
       texture_type |= EGL_PIXMAP_BIT;
 
@@ -52,12 +101,8 @@ _eglParseSurfaceAttribList(_EGLSurface *surf, const EGLint *attrib_list)
       EGLint val = attrib_list[i];
 
       switch (attr) {
-      /* common (except for screen surfaces) attributes */
+      /* common attributes */
       case EGL_VG_COLORSPACE:
-         if (type == EGL_SCREEN_BIT_MESA) {
-            err = EGL_BAD_ATTRIBUTE;
-            break;
-         }
          switch (val) {
          case EGL_VG_COLORSPACE_sRGB:
          case EGL_VG_COLORSPACE_LINEAR:
@@ -71,10 +116,6 @@ _eglParseSurfaceAttribList(_EGLSurface *surf, const EGLint *attrib_list)
          surf->VGColorspace = val;
          break;
       case EGL_VG_ALPHA_FORMAT:
-         if (type == EGL_SCREEN_BIT_MESA) {
-            err = EGL_BAD_ATTRIBUTE;
-            break;
-         }
          switch (val) {
          case EGL_VG_ALPHA_FORMAT_NONPRE:
          case EGL_VG_ALPHA_FORMAT_PRE:
@@ -101,7 +142,7 @@ _eglParseSurfaceAttribList(_EGLSurface *surf, const EGLint *attrib_list)
          break;
       /* pbuffer surface attributes */
       case EGL_WIDTH:
-         if (type != EGL_PBUFFER_BIT && type != EGL_SCREEN_BIT_MESA) {
+         if (type != EGL_PBUFFER_BIT) {
             err = EGL_BAD_ATTRIBUTE;
             break;
          }
@@ -112,7 +153,7 @@ _eglParseSurfaceAttribList(_EGLSurface *surf, const EGLint *attrib_list)
          surf->Width = val;
          break;
       case EGL_HEIGHT:
-         if (type != EGL_PBUFFER_BIT && type != EGL_SCREEN_BIT_MESA) {
+         if (type != EGL_PBUFFER_BIT) {
             err = EGL_BAD_ATTRIBUTE;
             break;
          }
@@ -129,6 +170,7 @@ _eglParseSurfaceAttribList(_EGLSurface *surf, const EGLint *attrib_list)
          }
          surf->LargestPbuffer = !!val;
          break;
+      /* for eglBindTexImage */
       case EGL_TEXTURE_FORMAT:
          if (!(type & texture_type)) {
             err = EGL_BAD_ATTRIBUTE;
@@ -210,10 +252,12 @@ _eglInitSurface(_EGLSurface *surf, _EGLDisplay *dpy, EGLint type,
    case EGL_PBUFFER_BIT:
       func = "eglCreatePBufferSurface";
       break;
+#ifdef EGL_MESA_screen_surface
    case EGL_SCREEN_BIT_MESA:
       func = "eglCreateScreenSurface";
       renderBuffer = EGL_SINGLE_BUFFER; /* XXX correct? */
       break;
+#endif
    default:
       _eglLog(_EGL_WARNING, "Bad type in _eglInitSurface");
       return EGL_FALSE;
index b6321e6b437589c84a6f7fb1361a2ed5c0c26667..56d575ffe08c4f7884612b8d9bea88061e5eb8f5 100644 (file)
@@ -434,9 +434,11 @@ egl_g3d_free_config(void *conf)
 static void
 egl_g3d_free_screen(void *scr)
 {
+#ifdef EGL_MESA_screen_surface
    struct egl_g3d_screen *gscr = egl_g3d_screen((_EGLScreen *) scr);
    FREE(gscr->native_modes);
    FREE(gscr);
+#endif
 }
 
 static EGLBoolean
index ed2b0409bb995aabe3e40c60edf06ecc928f18d5..f33dc91cf9076c756fce5ac949e0be2a28309f5e 100644 (file)
@@ -95,15 +95,19 @@ struct egl_g3d_image {
    unsigned zslice;
 };
 
+/* standard typecasts */
+_EGL_DRIVER_STANDARD_TYPECASTS(egl_g3d)
+_EGL_DRIVER_TYPECAST(egl_g3d_image, _EGLImage, obj)
+
+#ifdef EGL_MESA_screen_surface
+
 struct egl_g3d_screen {
    _EGLScreen base;
    const struct native_connector *native;
    const struct native_mode **native_modes;
 };
-
-/* standard typecasts */
-_EGL_DRIVER_STANDARD_TYPECASTS(egl_g3d)
 _EGL_DRIVER_TYPECAST(egl_g3d_screen, _EGLScreen, obj)
-_EGL_DRIVER_TYPECAST(egl_g3d_image, _EGLImage, obj)
+
+#endif /* EGL_MESA_screen_surface */
 
 #endif /* _EGL_G3D_H_ */