summaryrefslogtreecommitdiff
path: root/dix
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2014-04-17 18:18:49 -0700
committerEric Anholt <eric@anholt.net>2014-04-23 10:32:02 -0700
commitabf12027063dbe22bec1d055ad8db365cf07395a (patch)
tree306b0df0614f21830d279672476b387ac89e3f10 /dix
parentf12221cbd8ff33070fa2ca086bccf7ed32115f0e (diff)
glx: Move the GLX variable caching what GL context is current to dix.
GLX is trying to track whether the context it wants is current, to avoid the glFlush() (and the rest of the overhead) that occurs on all MakeCurrent calls. However, its cache can be incorrect now that glamor exists. This is a step toward getting glamor to coordinate with GLX. Signed-off-by: Eric Anholt <eric@anholt.net> Reviewed-by: Michel Dänzer <michel.daenzer@amd.com> Reviewed-by: Adam Jackson <ajax@redhat.com>
Diffstat (limited to 'dix')
-rw-r--r--dix/dixutils.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/dix/dixutils.c b/dix/dixutils.c
index 5de74c8b4..cdd370bd6 100644
--- a/dix/dixutils.c
+++ b/dix/dixutils.c
@@ -866,3 +866,28 @@ InitCallbackManager(void)
{
DeleteCallbackManager();
}
+
+/**
+ * Coordinates the global GL context used by modules in the X Server
+ * doing rendering with OpenGL.
+ *
+ * When setting a GL context (glXMakeCurrent() or eglMakeCurrent()),
+ * there is an expensive implied glFlush() required by the GLX and EGL
+ * APIs, so modules don't want to have to do it on every request. But
+ * the individual modules using GL also don't know about each other,
+ * so they have to coordinate who owns the current context.
+ *
+ * When you're about to do a MakeCurrent, you should set this variable
+ * to your context's address, and you can skip MakeCurrent if it's
+ * already set to yours.
+ *
+ * When you're about to do a DestroyContext, you should set this to
+ * NULL if it's set to your context.
+ *
+ * When you're about to do an unbindContext on a DRI driver, you
+ * should set this to NULL. Despite the unbindContext interface
+ * sounding like it only unbinds the passed in context, it actually
+ * unconditionally clears the dispatch table even if the given
+ * context wasn't current.
+ */
+void *lastGLContext = NULL;