summaryrefslogtreecommitdiffstats
path: root/src/egl/main
diff options
context:
space:
mode:
authorBrian Paul <brian.paul@tungstengraphics.com>2008-05-30 14:50:33 -0600
committerBrian Paul <brian.paul@tungstengraphics.com>2008-05-30 14:50:33 -0600
commite3805cad0d15ed25ce8f6c5a1f1ea913e5d0986a (patch)
tree644f0a12d1142269f63fc541f6aa3d41ac255a6a /src/egl/main
parent6b9b49127e575ecfae08a78b991e89cb484150a4 (diff)
egl: new eglGetProcAddress() code
The idea is to pass the call down to the device driver where an API-specific query can be made. Untested.
Diffstat (limited to 'src/egl/main')
-rw-r--r--src/egl/main/eglapi.c13
-rw-r--r--src/egl/main/eglapi.h11
-rw-r--r--src/egl/main/egldriver.c23
-rw-r--r--src/egl/main/egldriver.h4
-rw-r--r--src/egl/main/eglglobals.h3
-rw-r--r--src/egl/main/egltypedefs.h2
6 files changed, 46 insertions, 10 deletions
diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c
index aacbb6b08e3..49d1f3d0eb4 100644
--- a/src/egl/main/eglapi.c
+++ b/src/egl/main/eglapi.c
@@ -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
}
diff --git a/src/egl/main/eglapi.h b/src/egl/main/eglapi.h
index 555aa5dd9ef..f6163a0c7a8 100644
--- a/src/egl/main/eglapi.h
+++ b/src/egl/main/eglapi.h
@@ -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;
diff --git a/src/egl/main/egldriver.c b/src/egl/main/egldriver.c
index 681be472027..80fa49b7ab5 100644
--- a/src/egl/main/egldriver.c
+++ b/src/egl/main/egldriver.c
@@ -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;
}
@@ -218,6 +227,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.
*/
_EGLDriver *
diff --git a/src/egl/main/egldriver.h b/src/egl/main/egldriver.h
index 09d7755f5de..af028eaf22f 100644
--- a/src/egl/main/egldriver.h
+++ b/src/egl/main/egldriver.h
@@ -57,6 +57,10 @@ extern EGLBoolean
_eglCloseDriver(_EGLDriver *drv, EGLDisplay dpy);
+extern void
+_eglSaveDriver(_EGLDriver *drv);
+
+
extern _EGLDriver *
_eglLookupDriver(EGLDisplay d);
diff --git a/src/egl/main/eglglobals.h b/src/egl/main/eglglobals.h
index ac85f8b8a4f..14d8ea487af 100644
--- a/src/egl/main/eglglobals.h
+++ b/src/egl/main/eglglobals.h
@@ -35,6 +35,9 @@ struct _egl_global
/* XXX temporary - should be thread-specific data (TSD) */
_EGLThreadInfo *ThreadInfo;
+
+ EGLint NumDrivers;
+ _EGLDriver *Drivers[10];
};
diff --git a/src/egl/main/egltypedefs.h b/src/egl/main/egltypedefs.h
index b1c8ec1f02e..efbb17a4dc1 100644
--- a/src/egl/main/egltypedefs.h
+++ b/src/egl/main/egltypedefs.h
@@ -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);