egl: new eglGetProcAddress() code
authorBrian Paul <brian.paul@tungstengraphics.com>
Fri, 30 May 2008 20:50:33 +0000 (14:50 -0600)
committerBrian Paul <brian.paul@tungstengraphics.com>
Fri, 30 May 2008 20:50:33 +0000 (14:50 -0600)
The idea is to pass the call down to the device driver where an API-specific
query can be made.  Untested.

src/egl/main/eglapi.c
src/egl/main/eglapi.h
src/egl/main/egldriver.c
src/egl/main/egldriver.h
src/egl/main/eglglobals.h
src/egl/main/egltypedefs.h

index aacbb6b08e35246929c3f7e2ca3233159b84afd1..49d1f3d0eb4e7beaeb1eb310c4b63a1a98889b45 100644 (file)
@@ -385,12 +385,15 @@ void (* EGLAPIENTRY eglGetProcAddress(const char *procname))()
          return (genericFunc) egl_functions[i].function;
       }
    }
-#if 0
-   /* XXX enable this code someday */
-   return (genericFunc) _glapi_get_proc_address(procname);
-#else
+
+   /* now loop over drivers to query their procs */
+   for (i = 0; i < _eglGlobal.NumDrivers; i++) {
+      _EGLProc p = _eglGlobal.Drivers[i]->API.GetProcAddress(procname);
+      if (p)
+         return p;
+   }
+
    return NULL;
-#endif
 }
 
 
index 555aa5dd9ef6aa9de4ed51c6250bff36d9a9e59f..f6163a0c7a8955125961293695df2c55c1bbf19b 100644 (file)
@@ -2,10 +2,15 @@
 #define EGLAPI_INCLUDED
 
 /**
- * Typedefs for all EGL API entrypoint functions.
+ * A generic function ptr type
  */
+typedef void (*_EGLProc)();
 
 
+/**
+ * Typedefs for all EGL API entrypoint functions.
+ */
+
 /* driver funcs */
 typedef EGLBoolean (*Initialize_t)(_EGLDriver *, EGLDisplay dpy, EGLint *major, EGLint *minor);
 typedef EGLBoolean (*Terminate_t)(_EGLDriver *, EGLDisplay dpy);
@@ -39,6 +44,9 @@ typedef const char *(*QueryString_t)(_EGLDriver *drv, EGLDisplay dpy, EGLint nam
 typedef EGLBoolean (*WaitGL_t)(_EGLDriver *drv, EGLDisplay dpy);
 typedef EGLBoolean (*WaitNative_t)(_EGLDriver *drv, EGLDisplay dpy, EGLint engine);
 
+typedef _EGLProc (*GetProcAddress_t)(const char *procname);
+
+
 
 #ifdef EGL_MESA_screen_surface
 typedef EGLBoolean (*ChooseModeMESA_t)(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA screen, const EGLint *attrib_list, EGLModeMESA *modes, EGLint modes_size, EGLint *num_modes);
@@ -95,6 +103,7 @@ struct _egl_api
    QueryString_t QueryString;
    WaitGL_t WaitGL;
    WaitNative_t WaitNative;
+   GetProcAddress_t GetProcAddress;
 
    /* EGL_MESA_screen extension */
    ChooseModeMESA_t ChooseModeMESA;
index 681be4720273523ce990d7a662db043278618f55..80fa49b7ab553348cdf3407e58754a572ef9b5c5 100644 (file)
@@ -30,8 +30,8 @@
 #endif
 
 
-const char *DefaultDriverName = ":0";
-const char *SysFS = "/sys/class";
+static const char *DefaultDriverName = ":0";
+static const char *SysFS = "/sys/class";
 
 
 
@@ -72,6 +72,9 @@ _eglChooseDRMDriver(int card)
 
 
 /**
+ * XXX this function is totally subject change!!!
+ *
+ *
  * Determine/return the name of the driver to use for the given _EGLDisplay.
  *
  * Try to be clever and determine if nativeDisplay is an Xlib Display
@@ -92,6 +95,8 @@ _eglChooseDriver(_EGLDisplay *dpy)
    const char *displayString = (const char *) dpy->NativeDisplay;
    const char *driverName = NULL;
 
+   (void) DefaultDriverName;
+
    /* First, if the EGL_DRIVER env var is set, use that */
    driverName = getenv("EGL_DRIVER");
    if (driverName)
@@ -139,6 +144,8 @@ _eglChooseDriver(_EGLDisplay *dpy)
       driverName = _weglChooseDriver(dpy);
 #elif defined(_EGL_PLATFORM_WINCE)
       /* XXX to do */
+#else
+      driverName = DefaultDriverName;
 #endif
    }
 
@@ -195,6 +202,8 @@ _eglOpenDriver(_EGLDisplay *dpy, const char *driverName, const char *args)
    /* update the global notion of supported APIs */
    _eglGlobal.ClientAPIsMask |= drv->ClientAPIsMask;
 
+   _eglSaveDriver(drv);
+
    return drv;
 }
 
@@ -217,6 +226,16 @@ _eglCloseDriver(_EGLDriver *drv, EGLDisplay dpy)
 }
 
 
+/**
+ * Save the given driver pointer in the list of all known drivers.
+ */
+void
+_eglSaveDriver(_EGLDriver *drv)
+{
+   _eglGlobal.Drivers[ _eglGlobal.NumDrivers++ ] = drv;
+}
+
+
 /**
  * Given a display handle, return the _EGLDriver for that display.
  */
index 09d7755f5de7d93a4abc2a721272d1f020a77dde..af028eaf22ffc77c2361cb2d25709e22171b307c 100644 (file)
@@ -57,6 +57,10 @@ extern EGLBoolean
 _eglCloseDriver(_EGLDriver *drv, EGLDisplay dpy);
 
 
+extern void
+_eglSaveDriver(_EGLDriver *drv);
+
+
 extern _EGLDriver *
 _eglLookupDriver(EGLDisplay d);
 
index ac85f8b8a4f6068eaa069dca07bcc9ce403cc3fc..14d8ea487af04467a83ba8d0b0f973642c434421 100644 (file)
@@ -35,6 +35,9 @@ struct _egl_global
 
    /* XXX temporary - should be thread-specific data (TSD) */
    _EGLThreadInfo *ThreadInfo;
+
+   EGLint NumDrivers;
+   _EGLDriver *Drivers[10];
 };
 
 
index b1c8ec1f02ed7d8173929586bb08d17552d757db..efbb17a4dc1e30a6594c61092171cba72bf0d673 100644 (file)
@@ -28,8 +28,6 @@ typedef struct _egl_surface _EGLSurface;
 typedef struct _egl_thread_info _EGLThreadInfo;
 
 
-typedef void (*_EGLProc)();
-
 typedef _EGLDriver *(*_EGLMain_t)(_EGLDisplay *dpy, const char *args);