Chia-I Wu wrote:
> This commit introduces a "current" system to manage per-thread info. It
> uses TLS, if GLX_USE_TLS is defined, or pthread, if PTHREADS is defined.
> If none of them are defined, it uses a dummy implementation that is just
> like before.
>
> Signed-off-by: Chia-I Wu <[email protected]>
> ---
> configs/default | 2 +-
> src/egl/main/Makefile | 2 +
> src/egl/main/eglapi.c | 16 ++-
> src/egl/main/eglcontext.c | 14 +--
> src/egl/main/eglcontext.h | 4 -
> src/egl/main/eglcurrent.c | 261
> +++++++++++++++++++++++++++++++++++++++++++++
> src/egl/main/eglcurrent.h | 55 ++++++++++
> src/egl/main/egldisplay.c | 11 --
> src/egl/main/egldisplay.h | 4 -
> src/egl/main/eglglobals.c | 113 +-------------------
> src/egl/main/eglglobals.h | 33 +------
> src/egl/main/eglsurface.c | 18 ---
> src/egl/main/eglsurface.h | 4 -
> 13 files changed, 340 insertions(+), 197 deletions(-)
> create mode 100644 src/egl/main/eglcurrent.c
> create mode 100644 src/egl/main/eglcurrent.h
>
> diff --git a/configs/default b/configs/default
> index a899670..60638d7 100644
> --- a/configs/default
> +++ b/configs/default
> @@ -105,7 +105,7 @@ GALLIUM_STATE_TRACKERS_DIRS = glx
> # Library dependencies
> #EXTRA_LIB_PATH ?=
> GL_LIB_DEPS = $(EXTRA_LIB_PATH) -lX11 -lXext -lm -lpthread
> -EGL_LIB_DEPS = $(EXTRA_LIB_PATH) -lX11 -ldl
> +EGL_LIB_DEPS = $(EXTRA_LIB_PATH) -lX11 -ldl -lpthread
> OSMESA_LIB_DEPS = $(EXTRA_LIB_PATH) -L$(TOP)/$(LIB_DIR) -l$(GL_LIB)
> GLU_LIB_DEPS = $(EXTRA_LIB_PATH) -L$(TOP)/$(LIB_DIR) -l$(GL_LIB) -lm
> GLUT_LIB_DEPS = $(EXTRA_LIB_PATH) -L$(TOP)/$(LIB_DIR) -l$(GLU_LIB)
> -l$(GL_LIB) -lX11 -lXmu -lXi -lm
> diff --git a/src/egl/main/Makefile b/src/egl/main/Makefile
> index cddba9f..3a9c35f 100644
> --- a/src/egl/main/Makefile
> +++ b/src/egl/main/Makefile
> @@ -10,6 +10,7 @@ HEADERS = \
> eglconfig.h \
> eglconfigutil.h \
> eglcontext.h \
> + eglcurrent.h \
> egldefines.h \
> egldisplay.h \
> egldriver.h \
> @@ -28,6 +29,7 @@ SOURCES = \
> eglconfig.c \
> eglconfigutil.c \
> eglcontext.c \
> + eglcurrent.c \
> egldisplay.c \
> egldriver.c \
> eglglobals.c \
> diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c
> index 9df938e..ea4d6e1 100644
> --- a/src/egl/main/eglapi.c
> +++ b/src/egl/main/eglapi.c
> @@ -321,7 +321,8 @@ eglGetError(void)
> {
> _EGLThreadInfo *t = _eglGetCurrentThread();
> EGLint e = t->LastError;
> - t->LastError = EGL_SUCCESS;
> + if (!_eglDummyCurrentThread())
> + t->LastError = EGL_SUCCESS;
> return e;
> }
>
> @@ -546,6 +547,9 @@ eglBindAPI(EGLenum api)
> {
> _EGLThreadInfo *t = _eglGetCurrentThread();
>
> + if (_eglDummyCurrentThread())
> + return _eglError(EGL_BAD_ALLOC, "eglBindAPI");
> +
> switch (api) {
> #ifdef EGL_VERSION_1_4
> case EGL_OPENGL_API:
> @@ -603,15 +607,19 @@ eglCreatePbufferFromClientBuffer(EGLDisplay dpy,
> EGLenum buftype,
> EGLBoolean
> eglReleaseThread(void)
> {
> - _EGLThreadInfo *t = _eglGetCurrentThread();
> - EGLDisplay dpy = eglGetCurrentDisplay();
> + EGLDisplay dpy;
> +
> + if (_eglDummyCurrentThread())
> + return EGL_TRUE;
> +
> + dpy = eglGetCurrentDisplay();
> if (dpy) {
> _EGLDriver *drv = _eglLookupDriver(dpy);
> /* unbind context */
> (void) drv->API.MakeCurrent(drv, dpy, EGL_NO_SURFACE,
> EGL_NO_SURFACE, EGL_NO_CONTEXT);
> }
> - _eglDeleteThreadData(t);
> + _eglPutCurrentThread();
> return EGL_TRUE;
> }
>
> diff --git a/src/egl/main/eglcontext.c b/src/egl/main/eglcontext.c
> index 461679d..1ffad4a 100644
> --- a/src/egl/main/eglcontext.c
> +++ b/src/egl/main/eglcontext.c
> @@ -109,17 +109,6 @@ _eglLookupContext(EGLContext ctx)
>
>
> /**
> - * Return the currently bound _EGLContext object, or NULL.
> - */
> -_EGLContext *
> -_eglGetCurrentContext(void)
> -{
> - _EGLThreadInfo *t = _eglGetCurrentThread();
> - return t->CurrentContext;
> -}
> -
> -
> -/**
> * Just a placeholder/demo function. Real driver will never use this!
> */
> EGLContext
> @@ -219,6 +208,9 @@ _eglMakeCurrent(_EGLDriver *drv, EGLDisplay dpy,
> EGLSurface d,
> _EGLSurface *oldDrawSurface = _eglGetCurrentSurface(EGL_DRAW);
> _EGLSurface *oldReadSurface = _eglGetCurrentSurface(EGL_READ);
>
> + if (_eglDummyCurrentThread())
> + return _eglError(EGL_BAD_ALLOC, "eglMakeCurrent");
> +
> /* error checking */
> if (ctx) {
> if (draw == NULL || read == NULL) {
> diff --git a/src/egl/main/eglcontext.h b/src/egl/main/eglcontext.h
> index 34fee9c..5c84031 100644
> --- a/src/egl/main/eglcontext.h
> +++ b/src/egl/main/eglcontext.h
> @@ -47,10 +47,6 @@ extern _EGLContext *
> _eglLookupContext(EGLContext ctx);
>
>
> -extern _EGLContext *
> -_eglGetCurrentContext(void);
> -
> -
> extern EGLContext
> _eglCreateContext(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config,
> EGLContext share_list, const EGLint *attrib_list);
>
> diff --git a/src/egl/main/eglcurrent.c b/src/egl/main/eglcurrent.c
> new file mode 100644
> index 0000000..7b999ab
> --- /dev/null
> +++ b/src/egl/main/eglcurrent.c
> @@ -0,0 +1,261 @@
> +#include <stdlib.h>
> +#include "eglcurrent.h"
> +#include "eglcontext.h"
> +#include "egllog.h"
> +
> +
> +static _EGLThreadInfo dummy_thread;
What's the story with dummy threads? Please add a comment to explain
this.
> +
> +#ifdef GLX_USE_TLS
> +static __thread const _EGLThreadInfo *_egl_TSD;
> + __attribute__ ((tls_model("initial-exec")));
> +
> +static inline EGLBoolean _eglInitTSD(void) { return EGL_TRUE; }
> +static inline void _eglFiniTSD(void) { }
> +static inline void _eglSetTSD(const _EGLThreadInfo *t) { _egl_TSD = t; }
> +
> +static inline _EGLThreadInfo *_eglGetTSD(void)
> +{
> + return (_EGLThreadInfo *) _egl_TSD;
> +}
> +
> +#elif PTHREADS
> +#include <pthread.h>
> +
> +static pthread_key_t _egl_TSD;
> +
> +static inline EGLBoolean _eglInitTSD(void)
> +{
> + return (pthread_key_create(&_egl_TSD, NULL) == 0);
> +}
> +
> +static inline void _eglFiniTSD(void)
> +{
> + pthread_key_delete(_egl_TSD);
> +}
> +
> +static inline void _eglSetTSD(const _EGLThreadInfo *t)
> +{
> + pthread_setspecific(_egl_TSD, (const void *) t);
> +}
> +
> +static inline _EGLThreadInfo *_eglGetTSD(void)
> +{
> + return (_EGLThreadInfo *) pthread_getspecific(_egl_TSD);
> +}
> +
> +#else /* PTHREADS */
> +static const _EGLThreadInfo *_egl_TSD;
> +
> +static inline EGLBoolean _eglInitTSD(void) { return EGL_TRUE; }
> +static inline void _eglFiniTSD(void) { }
> +static inline void _eglSetTSD(const _EGLThreadInfo *t) { _egl_TSD = t; }
> +
> +static inline _EGLThreadInfo *_eglGetTSD(void)
> +{
> + return (_EGLThreadInfo *) _egl_TSD;
> +}
> +#endif /* !PTHREADS */
> +
> +
> +static void
> +_eglInitThreadInfo(_EGLThreadInfo *t)
> +{
> + t->CurrentContext = NULL;
> + t->LastError = EGL_SUCCESS;
> + t->CurrentAPI = EGL_OPENGL_ES_API; /* default, per EGL spec */
> +}
> +
> +
> +/**
> + * Allocate and init a new _EGLThreadInfo object.
> + */
> +static _EGLThreadInfo *
> +_eglCreateThreadInfo(void)
> +{
> + _EGLThreadInfo *t = (_EGLThreadInfo *) calloc(1, sizeof(_EGLThreadInfo));
> + if (t)
> + _eglInitThreadInfo(t);
> + else
> + t = &dummy_thread;
> + return t;
> +}
> +
> +
> +/**
> + * Delete/free a _EGLThreadInfo object.
> + */
> +static void
> +_eglDestroyThreadInfo(_EGLThreadInfo *t)
> +{
> + if (t != &dummy_thread)
> + free(t);
> +}
> +
> +
> +/**
> + * Initialize "current thread" management.
> + */
> +EGLBoolean
> +_eglInitCurrent(void)
> +{
> + _eglInitThreadInfo(&dummy_thread);
> + return _eglInitTSD();
> +}
> +
> +
> +void
> +_eglFiniCurrent(void)
> +{
> + /* TODO trace and release all threads... */
> + _eglFiniTSD();
> +}
> +
> +
> +/**
> + * Return pointer to calling thread's _EGLThreadInfo object.
> + * Create a new one if needed.
> + * Never return NULL.
> + */
> +_EGLThreadInfo *
> +_eglGetCurrentThread(void)
> +{
> + _EGLThreadInfo *t = _eglGetTSD();
> + if (!t) {
> + t = _eglCreateThreadInfo();
> + _eglSetTSD(t);
> + }
> +
> + return t;
> +}
> +
> +
> +void
> +_eglPutCurrentThread(void)
> +{
> + _EGLThreadInfo *t = _eglGetTSD();
> + if (t) {
> + _eglDestroyThreadInfo(t);
> + _eglSetTSD(NULL);
> + }
> +}
_eglPutCurrentThreads() is a peculiar name. Perhaps
"DestroyCurrentThread"? In any case, the function needs a comment.
> +
> +
> +/**
> + * Return if current thread info is dummy.
> + * A dummy thread info should not be modified.
> + */
> +EGLBoolean
> +_eglDummyCurrentThread(void)
> +{
> + _EGLThreadInfo *t = _eglGetTSD();
> + return (!t || t == &dummy_thread);
> +}
A predicate funciton like this should be named _eglIsDummyCurrentThread().
> +
> +
> +/**
> + * Return the currently bound _EGLContext object, or NULL.
> + */
> +_EGLContext *
> +_eglGetCurrentContext(void)
> +{
> + _EGLThreadInfo *t = _eglGetCurrentThread();
> + return t->CurrentContext;
> +}
> +
> +
> +_EGLDisplay *
> +_eglGetCurrentDisplay(void)
> +{
> + _EGLThreadInfo *t = _eglGetCurrentThread();
> + _EGLContext *ctx = t->CurrentContext;
> + if (ctx)
> + return ctx->Display;
> + else
> + return NULL;
> +}
> +
> +
> +_EGLSurface *
> +_eglGetCurrentSurface(EGLint readdraw)
> +{
> + _EGLThreadInfo *t = _eglGetCurrentThread();
> + _EGLContext *ctx = t->CurrentContext;
> + if (ctx) {
> + switch (readdraw) {
> + case EGL_DRAW:
> + return ctx->DrawSurface;
> + case EGL_READ:
> + return ctx->ReadSurface;
> + default:
> + return NULL;
> + }
> + }
> + return NULL;
> +}
> +
> +
> +/**
> + * Record EGL error code.
> + */
> +EGLBoolean
> +_eglError(EGLint errCode, const char *msg)
> +{
> + _EGLThreadInfo *t = _eglGetCurrentThread();
> + const char *s;
> +
> + if (t->LastError == EGL_SUCCESS) {
> + t->LastError = errCode;
> +
> + switch (errCode) {
> + case EGL_BAD_ACCESS:
> + s = "EGL_BAD_ACCESS";
> + break;
> + case EGL_BAD_ALLOC:
> + s = "EGL_BAD_ALLOC";
> + break;
> + case EGL_BAD_ATTRIBUTE:
> + s = "EGL_BAD_ATTRIBUTE";
> + break;
> + case EGL_BAD_CONFIG:
> + s = "EGL_BAD_CONFIG";
> + break;
> + case EGL_BAD_CONTEXT:
> + s = "EGL_BAD_CONTEXT";
> + break;
> + case EGL_BAD_CURRENT_SURFACE:
> + s = "EGL_BAD_CURRENT_SURFACE";
> + break;
> + case EGL_BAD_DISPLAY:
> + s = "EGL_BAD_DISPLAY";
> + break;
> + case EGL_BAD_MATCH:
> + s = "EGL_BAD_MATCH";
> + break;
> + case EGL_BAD_NATIVE_PIXMAP:
> + s = "EGL_BAD_NATIVE_PIXMAP";
> + break;
> + case EGL_BAD_NATIVE_WINDOW:
> + s = "EGL_BAD_NATIVE_WINDOW";
> + break;
> + case EGL_BAD_PARAMETER:
> + s = "EGL_BAD_PARAMETER";
> + break;
> + case EGL_BAD_SURFACE:
> + s = "EGL_BAD_SURFACE";
> + break;
> + case EGL_BAD_SCREEN_MESA:
> + s = "EGL_BAD_SCREEN_MESA";
> + break;
> + case EGL_BAD_MODE_MESA:
> + s = "EGL_BAD_MODE_MESA";
> + break;
> + default:
> + s = "other";
> + }
> + _eglLog(_EGL_DEBUG, "EGL user error 0x%x (%s) in %s\n", errCode, s,
> msg);
> + }
> +
> + return EGL_FALSE;
> +}
> diff --git a/src/egl/main/eglcurrent.h b/src/egl/main/eglcurrent.h
> new file mode 100644
> index 0000000..14d2923
> --- /dev/null
> +++ b/src/egl/main/eglcurrent.h
> @@ -0,0 +1,55 @@
> +#ifndef EGLCURRENT_INCLUDED
> +#define EGLCURRENT_INCLUDED
> +
> +#include "egltypedefs.h"
> +#include "eglhash.h"
> +
> +
> +/**
> + * Per-thread info
> + */
> +struct _egl_thread_info
> +{
> + EGLint LastError;
> + _EGLContext *CurrentContext;
> + EGLenum CurrentAPI;
> +};
> +
> +
> +extern EGLBoolean
> +_eglInitCurrent(void);
> +
> +
> +extern void
> +_eglFiniCurrent(void);
> +
> +
> +extern _EGLThreadInfo *
> +_eglGetCurrentThread(void);
> +
> +
> +extern void
> +_eglPutCurrentThread(void);
> +
> +
> +extern EGLBoolean
> +_eglDummyCurrentThread(void);
> +
> +
> +extern _EGLContext *
> +_eglGetCurrentContext(void);
> +
> +
> +extern _EGLDisplay *
> +_eglGetCurrentDisplay(void);
> +
> +
> +extern _EGLSurface *
> +_eglGetCurrentSurface(EGLint readdraw);
> +
> +
> +extern EGLBoolean
> +_eglError(EGLint errCode, const char *msg);
> +
> +
> +#endif /* EGLCURRENT_INCLUDED */
> diff --git a/src/egl/main/egldisplay.c b/src/egl/main/egldisplay.c
> index 47a2323..01f67f6 100644
> --- a/src/egl/main/egldisplay.c
> +++ b/src/egl/main/egldisplay.c
> @@ -86,17 +86,6 @@ _eglSaveDisplay(_EGLDisplay *dpy)
> }
>
>
> -_EGLDisplay *
> -_eglGetCurrentDisplay(void)
> -{
> - _EGLContext *ctx = _eglGetCurrentContext();
> - if (ctx)
> - return ctx->Display;
> - else
> - return NULL;
> -}
> -
> -
> /**
> * Free all the data hanging of an _EGLDisplay object, but not
> * the object itself.
> diff --git a/src/egl/main/egldisplay.h b/src/egl/main/egldisplay.h
> index ff623ee..69f0d13 100644
> --- a/src/egl/main/egldisplay.h
> +++ b/src/egl/main/egldisplay.h
> @@ -45,10 +45,6 @@ extern void
> _eglSaveDisplay(_EGLDisplay *dpy);
>
>
> -extern _EGLDisplay *
> -_eglGetCurrentDisplay(void);
> -
> -
> extern void
> _eglCleanupDisplay(_EGLDisplay *disp);
>
> diff --git a/src/egl/main/eglglobals.c b/src/egl/main/eglglobals.c
> index b770e55..55de394 100644
> --- a/src/egl/main/eglglobals.c
> +++ b/src/egl/main/eglglobals.c
> @@ -1,6 +1,6 @@
> -#include <stdio.h>
> #include <stdlib.h>
> #include "eglglobals.h"
> +#include "egllog.h"
>
> struct _egl_global _eglGlobal =
> {
> @@ -22,8 +22,8 @@ _eglInitGlobals(void)
>
> _eglGlobal.ClientAPIsMask = 0x0;
>
> - /* XXX temporary */
> - _eglGlobal.ThreadInfo = _eglNewThreadInfo();
> + if (!_eglInitCurrent())
> + _eglLog(_EGL_FATAL, "failed to initialize \"current\" system");
> }
> }
>
> @@ -34,113 +34,8 @@ _eglInitGlobals(void)
> void
> _eglDestroyGlobals(void)
> {
> + _eglFiniCurrent();
> /* XXX TODO walk over table entries, deleting each */
> _eglDeleteHashTable(_eglGlobal.Displays);
> _eglDeleteHashTable(_eglGlobal.Surfaces);
> }
> -
> -
> -/**
> - * Allocate and init a new _EGLThreadInfo object.
> - */
> -_EGLThreadInfo *
> -_eglNewThreadInfo(void)
> -{
> - _EGLThreadInfo *t = (_EGLThreadInfo *) calloc(1, sizeof(_EGLThreadInfo));
> - if (t) {
> - t->CurrentContext = EGL_NO_CONTEXT;
> - t->LastError = EGL_SUCCESS;
> - t->CurrentAPI = EGL_OPENGL_ES_API; /* default, per EGL spec */
> - }
> - return t;
> -}
> -
> -
> -/**
> - * Delete/free a _EGLThreadInfo object.
> - */
> -void
> -_eglDeleteThreadData(_EGLThreadInfo *t)
> -{
> - free(t);
> -}
> -
> -
> -
> -/**
> - * Return pointer to calling thread's _EGLThreadInfo object.
> - * Create a new one if needed.
> - * Should never return NULL.
> - */
> -_EGLThreadInfo *
> -_eglGetCurrentThread(void)
> -{
> - _eglInitGlobals();
> -
> - /* XXX temporary */
> - return _eglGlobal.ThreadInfo;
> -}
> -
> -
> -/**
> - * Record EGL error code.
> - */
> -void
> -_eglError(EGLint errCode, const char *msg)
> -{
> - _EGLThreadInfo *t = _eglGetCurrentThread();
> - const char *s;
> -
> - if (t->LastError == EGL_SUCCESS) {
> - t->LastError = errCode;
> -
> - switch (errCode) {
> - case EGL_BAD_ACCESS:
> - s = "EGL_BAD_ACCESS";
> - break;
> - case EGL_BAD_ALLOC:
> - s = "EGL_BAD_ALLOC";
> - break;
> - case EGL_BAD_ATTRIBUTE:
> - s = "EGL_BAD_ATTRIBUTE";
> - break;
> - case EGL_BAD_CONFIG:
> - s = "EGL_BAD_CONFIG";
> - break;
> - case EGL_BAD_CONTEXT:
> - s = "EGL_BAD_CONTEXT";
> - break;
> - case EGL_BAD_CURRENT_SURFACE:
> - s = "EGL_BAD_CURRENT_SURFACE";
> - break;
> - case EGL_BAD_DISPLAY:
> - s = "EGL_BAD_DISPLAY";
> - break;
> - case EGL_BAD_MATCH:
> - s = "EGL_BAD_MATCH";
> - break;
> - case EGL_BAD_NATIVE_PIXMAP:
> - s = "EGL_BAD_NATIVE_PIXMAP";
> - break;
> - case EGL_BAD_NATIVE_WINDOW:
> - s = "EGL_BAD_NATIVE_WINDOW";
> - break;
> - case EGL_BAD_PARAMETER:
> - s = "EGL_BAD_PARAMETER";
> - break;
> - case EGL_BAD_SURFACE:
> - s = "EGL_BAD_SURFACE";
> - break;
> - case EGL_BAD_SCREEN_MESA:
> - s = "EGL_BAD_SCREEN_MESA";
> - break;
> - case EGL_BAD_MODE_MESA:
> - s = "EGL_BAD_MODE_MESA";
> - break;
> - default:
> - s = "other";
> - }
> - /* XXX temporary */
> - fprintf(stderr, "EGL user error 0x%x (%s) in %s\n", errCode, s, msg);
> - }
> -}
> diff --git a/src/egl/main/eglglobals.h b/src/egl/main/eglglobals.h
> index 14d8ea4..7384774 100644
> --- a/src/egl/main/eglglobals.h
> +++ b/src/egl/main/eglglobals.h
> @@ -3,17 +3,7 @@
>
> #include "egltypedefs.h"
> #include "eglhash.h"
> -
> -
> -/**
> - * Per-thread info
> - */
> -struct _egl_thread_info
> -{
> - EGLint LastError;
> - _EGLContext *CurrentContext;
> - EGLenum CurrentAPI;
> -};
> +#include "eglcurrent.h"
>
>
> /**
> @@ -33,9 +23,6 @@ struct _egl_global
>
> char ClientAPIs[1000]; /**< updated by eglQueryString */
>
> - /* XXX temporary - should be thread-specific data (TSD) */
> - _EGLThreadInfo *ThreadInfo;
> -
> EGLint NumDrivers;
> _EGLDriver *Drivers[10];
> };
> @@ -48,24 +35,8 @@ extern void
> _eglInitGlobals(void);
>
>
> -extern void
> +void
> _eglDestroyGlobals(void);
>
>
> -extern _EGLThreadInfo *
> -_eglNewThreadInfo(void);
> -
> -
> -extern void
> -_eglDeleteThreadData(_EGLThreadInfo *t);
> -
> -
> -extern _EGLThreadInfo *
> -_eglGetCurrentThread(void);
> -
> -
> -extern void
> -_eglError(EGLint errCode, const char *msg);
> -
> -
> #endif /* EGLGLOBALS_INCLUDED */
> diff --git a/src/egl/main/eglsurface.c b/src/egl/main/eglsurface.c
> index 6905aca..964288a 100644
> --- a/src/egl/main/eglsurface.c
> +++ b/src/egl/main/eglsurface.c
> @@ -259,24 +259,6 @@ _eglLookupSurface(EGLSurface surf)
> }
>
>
> -_EGLSurface *
> -_eglGetCurrentSurface(EGLint readdraw)
> -{
> - _EGLContext *ctx = _eglGetCurrentContext();
> - if (ctx) {
> - switch (readdraw) {
> - case EGL_DRAW:
> - return ctx->DrawSurface;
> - case EGL_READ:
> - return ctx->ReadSurface;
> - default:
> - return NULL;
> - }
> - }
> - return NULL;
> -}
> -
> -
> EGLBoolean
> _eglSwapBuffers(_EGLDriver *drv, EGLDisplay dpy, EGLSurface draw)
> {
> diff --git a/src/egl/main/eglsurface.h b/src/egl/main/eglsurface.h
> index 50f965b..3b54221 100644
> --- a/src/egl/main/eglsurface.h
> +++ b/src/egl/main/eglsurface.h
> @@ -60,10 +60,6 @@ extern _EGLSurface *
> _eglLookupSurface(EGLSurface surf);
>
>
> -extern _EGLSurface *
> -_eglGetCurrentSurface(EGLint readdraw);
> -
> -
> extern EGLBoolean
> _eglSwapBuffers(_EGLDriver *drv, EGLDisplay dpy, EGLSurface draw);
>
> --
> 1.6.2.4
>
>
> ------------------------------------------------------------------------------
> Enter the BlackBerry Developer Challenge
> This is your chance to win up to $100,000 in prizes! For a limited time,
> vendors submitting new applications to BlackBerry App World(TM) will have
> the opportunity to enter the BlackBerry Developer Challenge. See full prize
> details at: http://p.sf.net/sfu/Challenge
> _______________________________________________
> Mesa3d-dev mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/mesa3d-dev
> .
>
------------------------------------------------------------------------------
Enter the BlackBerry Developer Challenge
This is your chance to win up to $100,000 in prizes! For a limited time,
vendors submitting new applications to BlackBerry App World(TM) will have
the opportunity to enter the BlackBerry Developer Challenge. See full prize
details at: http://p.sf.net/sfu/Challenge
_______________________________________________
Mesa3d-dev mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mesa3d-dev