summaryrefslogtreecommitdiffstats
path: root/src/glx/glxcurrent.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/glx/glxcurrent.c')
-rw-r--r--src/glx/glxcurrent.c53
1 files changed, 48 insertions, 5 deletions
diff --git a/src/glx/glxcurrent.c b/src/glx/glxcurrent.c
index c28360bdde9..115fab4012c 100644
--- a/src/glx/glxcurrent.c
+++ b/src/glx/glxcurrent.c
@@ -33,9 +33,20 @@
* Client-side GLX interface for current context management.
*/
+#ifdef PTHREADS
+#include <pthread.h>
+#endif
+
#include "glxclient.h"
+#ifdef GLX_USE_APPLEGL
+#include <stdlib.h>
+
+#include "apple_glx.h"
+#include "apple_glx_context.h"
+#else
#include "glapi.h"
#include "indirect_init.h"
+#endif
/*
** We setup some dummy structures here so that the API can be used
@@ -59,11 +70,12 @@ static __GLXcontext dummyContext = {
};
+#ifndef GLX_USE_APPLEGL
/*
** All indirect rendering contexts will share the same indirect dispatch table.
*/
static __GLapi *IndirectAPI = NULL;
-
+#endif
/*
* Current context management and locking
@@ -156,10 +168,12 @@ _X_HIDDEN void
__glXSetCurrentContextNull(void)
{
__glXSetCurrentContext(&dummyContext);
+#ifndef GLX_USE_APPLEGL
#ifdef GLX_DIRECT_RENDERING
_glapi_set_dispatch(NULL); /* no-op functions */
_glapi_set_context(NULL);
#endif
+#endif
}
@@ -186,6 +200,7 @@ glXGetCurrentDrawable(void)
}
+#ifndef GLX_USE_APPLEGL
/************************************************************************/
/**
@@ -313,6 +328,8 @@ __glXGenerateError(Display * dpy, GLXContext gc, XID resource,
_XError(dpy, &error);
}
+#endif /* GLX_USE_APPLEGL */
+
/**
* Make a particular context current.
*
@@ -322,8 +339,17 @@ static Bool
MakeContextCurrent(Display * dpy, GLXDrawable draw,
GLXDrawable read, GLXContext gc)
{
- xGLXMakeCurrentReply reply;
const GLXContext oldGC = __glXGetCurrentContext();
+#ifdef GLX_USE_APPLEGL
+ bool error = apple_glx_make_current_context(dpy,
+ (oldGC && oldGC != &dummyContext) ? oldGC->apple : NULL,
+ gc ? gc->apple : NULL, draw);
+
+ apple_glx_diagnostic("%s: error %s\n", __func__, error ? "YES" : "NO");
+ if(error)
+ return GL_FALSE;
+#else
+ xGLXMakeCurrentReply reply;
const CARD8 opcode = __glXSetupForCommand(dpy);
const CARD8 oldOpcode = ((gc == oldGC) || (oldGC == &dummyContext))
? opcode : __glXSetupForCommand(oldGC->currentDpy);
@@ -419,6 +445,7 @@ MakeContextCurrent(Display * dpy, GLXDrawable draw,
}
#endif
+#endif /* GLX_USE_APPLEGL */
/* Update our notion of what is current */
__glXLock();
@@ -428,8 +455,10 @@ MakeContextCurrent(Display * dpy, GLXDrawable draw,
* cannot be NULL, therefore if they are the same, gc is not
* NULL and not the dummy.
*/
- gc->currentDrawable = draw;
- gc->currentReadable = read;
+ if(gc) {
+ gc->currentDrawable = draw;
+ gc->currentReadable = read;
+ }
}
else {
if (oldGC != &dummyContext) {
@@ -439,7 +468,18 @@ MakeContextCurrent(Display * dpy, GLXDrawable draw,
oldGC->currentReadable = None;
oldGC->currentContextTag = 0;
oldGC->thread_id = 0;
-
+#ifdef GLX_USE_APPLEGL
+
+ /*
+ * At this point we should check if the context has been
+ * through glXDestroyContext, and redestroy it if so.
+ */
+ if(oldGC->do_destroy) {
+ __glXUnlock();
+ /* glXDestroyContext uses the same global lock. */
+ glXDestroyContext(dpy, oldGC);
+ __glXLock();
+#else
if (oldGC->xid == None) {
/* We are switching away from a context that was
* previously destroyed, so we need to free the memory
@@ -455,6 +495,7 @@ MakeContextCurrent(Display * dpy, GLXDrawable draw,
}
#endif
__glXFreeContext(oldGC);
+#endif /* GLX_USE_APPLEGL */
}
}
if (gc) {
@@ -463,6 +504,7 @@ MakeContextCurrent(Display * dpy, GLXDrawable draw,
gc->currentDpy = dpy;
gc->currentDrawable = draw;
gc->currentReadable = read;
+#ifndef GLX_USE_APPLEGL
gc->thread_id = _glthread_GetID();
#ifdef GLX_DIRECT_RENDERING
@@ -486,6 +528,7 @@ MakeContextCurrent(Display * dpy, GLXDrawable draw,
gc->currentContextTag = -1;
}
#endif
+#endif /* GLX_USE_APPLEGL */
}
else {
__glXSetCurrentContextNull();