summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'hardened/xorg/x11-base/xorg-server/files/06-aiglx-happy-vt-switch.patch')
-rw-r--r--hardened/xorg/x11-base/xorg-server/files/06-aiglx-happy-vt-switch.patch241
1 files changed, 241 insertions, 0 deletions
diff --git a/hardened/xorg/x11-base/xorg-server/files/06-aiglx-happy-vt-switch.patch b/hardened/xorg/x11-base/xorg-server/files/06-aiglx-happy-vt-switch.patch
new file mode 100644
index 0000000..314f1f0
--- /dev/null
+++ b/hardened/xorg/x11-base/xorg-server/files/06-aiglx-happy-vt-switch.patch
@@ -0,0 +1,241 @@
+diff --git a/GL/glx/glxdri.c b/GL/glx/glxdri.c
+index cfa9996..77fa4bf 100644
+--- a/GL/glx/glxdri.c
++++ b/GL/glx/glxdri.c
+@@ -63,27 +63,30 @@ #include "dispatch.h"
+ #define STRINGIFY(macro_or_string) STRINGIFY_ARG (macro_or_string)
+ #define STRINGIFY_ARG(contents) #contents
+
+-typedef struct __GLXDRIscreen __GLXDRIscreen;
+-typedef struct __GLXDRIcontext __GLXDRIcontext;
++typedef struct __GLXDRIscreen __GLXDRIscreen;
++typedef struct __GLXDRIcontext __GLXDRIcontext;
+ typedef struct __GLXDRIdrawable __GLXDRIdrawable;
+
+ struct __GLXDRIscreen {
+- __GLXscreen base;
++ __GLXscreen base;
+
+- __DRIscreen driScreen;
+- void *driver;
++ xf86EnterVTProc *enterVT;
++ xf86LeaveVTProc *leaveVT;
++
++ __DRIscreen driScreen;
++ void *driver;
+ };
+
+ struct __GLXDRIcontext {
+- __GLXcontext base;
++ __GLXcontext base;
+
+- __DRIcontext driContext;
++ __DRIcontext driContext;
+ };
+
+ struct __GLXDRIdrawable {
+- __GLXdrawable base;
++ __GLXdrawable base;
+
+- __DRIdrawable *driDrawable;
++ __DRIdrawable *driDrawable;
+ };
+
+ /* History:
+@@ -594,8 +597,7 @@ static __DRIfuncPtr getProcAddress(const
+
+ static __DRIscreen *findScreen(__DRInativeDisplay *dpy, int scrn)
+ {
+- __GLXDRIscreen *screen =
+- (__GLXDRIscreen *) __glXgetActiveScreen(scrn);
++ __GLXDRIscreen *screen = (__GLXDRIscreen *) __glXgetActiveScreen(scrn);
+
+ return &screen->driScreen;
+ }
+@@ -789,6 +791,30 @@ static const __DRIinterfaceMethods inter
+
+ static const char dri_driver_path[] = DRI_DRIVER_PATH;
+
++static Bool
++glxDRIEnterVT (int index, int flags)
++{
++ __GLXDRIscreen *screen = (__GLXDRIscreen *) __glXgetActiveScreen(index);
++
++ LogMessage(X_INFO, "AIGLX: Resuming AIGLX clients after VT switch\n");
++
++ glxResumeClients();
++
++ return (*screen->enterVT) (index, flags);
++}
++
++static void
++glxDRILeaveVT (int index, int flags)
++{
++ __GLXDRIscreen *screen = (__GLXDRIscreen *) __glXgetActiveScreen(index);
++
++ LogMessage(X_INFO, "AIGLX: Suspending AIGLX clients for VT switch\n");
++
++ glxSuspendClients();
++
++ return (*screen->leaveVT) (index, flags);
++}
++
+ static __GLXscreen *
+ __glXDRIscreenProbe(ScreenPtr pScreen)
+ {
+@@ -813,6 +839,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
+ void *dev_priv = NULL;
+ char filename[128];
+ Bool isCapable;
++ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+
+ if (!xf86LoaderCheckSymbol("DRIQueryDirectRenderingCapable")) {
+ LogMessage(X_ERROR, "AIGLX: DRI module not loaded\n");
+@@ -983,6 +1010,11 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
+
+ __glXsetEnterLeaveServerFuncs(__glXDRIenterServer, __glXDRIleaveServer);
+
++ screen->enterVT = pScrn->EnterVT;
++ pScrn->EnterVT = glxDRIEnterVT;
++ screen->leaveVT = pScrn->LeaveVT;
++ pScrn->LeaveVT = glxDRILeaveVT;
++
+ LogMessage(X_INFO,
+ "AIGLX: Loaded and initialized %s\n", filename);
+
+diff --git a/GL/glx/glxext.c b/GL/glx/glxext.c
+index 8bbb83f..edc257c 100644
+--- a/GL/glx/glxext.c
++++ b/GL/glx/glxext.c
+@@ -234,13 +231,11 @@ GLboolean __glXFreeContext(__GLXcontext
+ * __glXDispatch() or as a callback from the resource manager. In
+ * the latter case we need to lift the DRI lock manually. */
+
+- if (!inDispatch)
+- __glXleaveServer();
++ __glXleaveServer();
+
+ cx->destroy(cx);
+
+- if (!inDispatch)
+- __glXenterServer();
++ __glXenterServer();
+
+ return GL_TRUE;
+ }
+@@ -336,7 +331,7 @@ void GlxExtensionInit(void)
+ /*
+ ** Initialize table of client state. There is never a client 0.
+ */
+- for (i=1; i <= MAXCLIENTS; i++) {
++ for (i = 1; i <= MAXCLIENTS; i++) {
+ __glXClients[i] = 0;
+ }
+
+@@ -407,11 +402,36 @@ __GLXcontext *__glXForceCurrent(__GLXcli
+
+ /************************************************************************/
+
+-/*
+-** Top level dispatcher; all commands are executed from here down.
+-*/
++static int glxServerLeaveCount;
++static int glxBlockClients;
+
+-/* I cried when I wrote this. Damn you XAA! */
++void glxSuspendClients(void)
++{
++ int i;
++
++ for (i = 1; i <= MAXCLIENTS; i++) {
++ if (__glXClients[i] == NULL || !__glXClients[i]->inUse)
++ continue;
++
++ IgnoreClient(__glXClients[i]->client);
++ }
++
++ glxBlockClients = TRUE;
++}
++
++void glxResumeClients(void)
++{
++ int i;
++
++ glxBlockClients = FALSE;
++
++ for (i = 1; i <= MAXCLIENTS; i++) {
++ if (__glXClients[i] == NULL || !__glXClients[i]->inUse)
++ continue;
++
++ AttendClient(__glXClients[i]->client);
++ }
++}
+
+ static void
+ __glXnopEnterServer(void)
+@@ -436,14 +456,19 @@ void __glXsetEnterLeaveServerFuncs(void
+
+ void __glXenterServer(void)
+ {
+- (*__glXenterServerFunc)();
++ glxServerLeaveCount--;
++
++ if (glxServerLeaveCount == 0)
++ (*__glXenterServerFunc)();
+ }
+
+ void __glXleaveServer(void)
+ {
+- (*__glXleaveServerFunc)();
+-}
++ if (glxServerLeaveCount == 0)
++ (*__glXleaveServerFunc)();
+
++ glxServerLeaveCount++;
++}
+
+ /*
+ ** Top level dispatcher; all commands are executed from here down.
+@@ -496,6 +521,15 @@ static int __glXDispatch(ClientPtr clien
+ return __glXError(GLXBadLargeRequest);
+ }
+
++ /* If we're currently blocking GLX clients, just put this guy to
++ * sleep, reset the request and return. */
++ if (glxBlockClients) {
++ ResetCurrentRequest(client);
++ client->sequence--;
++ IgnoreClient(client);
++ return(client->noClientException);
++ }
++
+ /*
+ ** Use the opcode to index into the procedure table.
+ */
+@@ -506,12 +540,8 @@ static int __glXDispatch(ClientPtr clien
+
+ __glXleaveServer();
+
+- inDispatch = True;
+-
+ retval = proc(cl, (GLbyte *) stuff);
+
+- inDispatch = False;
+-
+ __glXenterServer();
+
+ return retval;
+diff --git a/GL/glx/glxserver.h b/GL/glx/glxserver.h
+index 8ece1e2..9eed1bc 100644
+--- a/GL/glx/glxserver.h
++++ b/GL/glx/glxserver.h
+@@ -136,6 +136,9 @@ void __glXsetEnterLeaveServerFuncs(void
+ void __glXenterServer(void);
+ void __glXleaveServer(void);
+
++void glxSuspendClients(void);
++void glxResumeClients(void);
++
+ /*
+ ** State kept per client.
+ */