[PATCH 03/19] glxproxy: Convert to private-based client tracking
Adam Jackson
ajax at redhat.com
Wed Aug 21 14:25:08 PDT 2013
This is mostly to make things look more like glx/.
Note that the currentDrawables and currentContexts tracking is gone from
glx. We can't get rid of them yet in DMX because we're not actually
running with a full GLX under us, so there's not glXGetCurrent* to work
with.
Signed-off-by: Adam Jackson <ajax at redhat.com>
---
hw/dmx/glxProxy/global.c | 7 --
hw/dmx/glxProxy/glxext.c | 174 +++++++++++---------------------------------
hw/dmx/glxProxy/glxserver.h | 7 --
3 files changed, 41 insertions(+), 147 deletions(-)
diff --git a/hw/dmx/glxProxy/global.c b/hw/dmx/glxProxy/global.c
index 6d4612d..64f434f 100644
--- a/hw/dmx/glxProxy/global.c
+++ b/hw/dmx/glxProxy/global.c
@@ -40,7 +40,6 @@ __GLXcontext *__glXLastContext;
** X resources.
*/
RESTYPE __glXContextRes;
-RESTYPE __glXClientRes;
RESTYPE __glXPixmapRes;
RESTYPE __glXWindowRes;
RESTYPE __glXPbufferRes;
@@ -60,11 +59,5 @@ int __glXBadFBConfig, __glXBadPbuffer;
*/
xGLXSingleReply __glXReply;
-/*
-** A set of state for each client. The 0th one is unused because client
-** indices start at 1, not 0.
-*/
-__GLXclientState *__glXClients[MAXCLIENTS + 1];
-
int __glXVersionMajor;
int __glXVersionMinor;
diff --git a/hw/dmx/glxProxy/glxext.c b/hw/dmx/glxProxy/glxext.c
index b469708..027e9e2 100644
--- a/hw/dmx/glxProxy/glxext.c
+++ b/hw/dmx/glxProxy/glxext.c
@@ -47,6 +47,9 @@
#include "extinit.h"
#include "glx_extinit.h"
+static DevPrivateKeyRec glxClientPrivateKeyRec;
+#define glxClientPrivateKey (&glxClientPrivateKeyRec)
+
/*
** Forward declarations.
*/
@@ -65,39 +68,9 @@ ResetExtension(ExtensionEntry * extEntry)
}
/*
-** Initialize the per-client context storage.
-*/
-static void
-ResetClientState(int clientIndex)
-{
- __GLXclientState *cl = __glXClients[clientIndex];
- Display **keep_be_displays;
- int i;
-
- free(cl->returnBuf);
- free(cl->currentContexts);
- free(cl->currentDrawables);
- free(cl->largeCmdBuf);
-
- for (i = 0; i < screenInfo.numScreens; i++) {
- if (cl->be_displays[i])
- XCloseDisplay(cl->be_displays[i]);
- }
-
- keep_be_displays = cl->be_displays;
- memset(cl, 0, sizeof(__GLXclientState));
- cl->be_displays = keep_be_displays;
-
- free(cl->GLClientextensions);
-
- memset(cl->be_displays, 0, screenInfo.numScreens * sizeof(Display *));
-}
-
-/*
** This procedure is called when the client who created the context goes
** away OR when glXDestroyContext is called. In either case, all we do is
** flag that the ID is no longer valid, and (maybe) free the context.
-** use.
*/
static int
ContextGone(__GLXcontext * cx, XID id)
@@ -111,40 +84,6 @@ ContextGone(__GLXcontext * cx, XID id)
}
/*
-** Free a client's state.
-*/
-static int
-ClientGone(int clientIndex, XID id)
-{
- __GLXcontext *cx;
- __GLXclientState *cl = __glXClients[clientIndex];
- int i;
-
- if (cl) {
- /*
- ** Free all the contexts that are current for this client.
- */
- for (i = 0; i < cl->numCurrentContexts; i++) {
- cx = cl->currentContexts[i];
- if (cx) {
- cx->isCurrent = GL_FALSE;
- if (!cx->idExists) {
- __glXFreeContext(cx);
- }
- }
- }
- /*
- ** Re-initialize the client state structure. Don't free it because
- ** we'll probably get another client with this index and use the struct
- ** again. There is a maximum of MAXCLIENTS of these structures.
- */
- ResetClientState(clientIndex);
- }
-
- return True;
-}
-
-/*
** Free a GLX Pixmap.
*/
void
@@ -275,6 +214,37 @@ __glXFreeContext(__GLXcontext * cx)
return GL_TRUE;
}
+static __GLXclientState *
+glxGetClient(ClientPtr pClient)
+{
+ return dixLookupPrivate(&pClient->devPrivates, glxClientPrivateKey);
+}
+
+static void
+glxClientCallback(CallbackListPtr *list, void *closure, void *data)
+{
+ NewClientInfoRec *clientInfo = data;
+ ClientPtr pClient = clientInfo->client;
+ __GLXclientState *cl = glxGetClient(pClient);
+
+ switch (pClient->clientState) {
+ case ClientStateRunning:
+ cl->client = pClient;
+ break;
+
+ case ClientStateGone:
+ free(cl->returnBuf);
+ free(cl->largeCmdBuf);
+ free(cl->currentContexts);
+ free(cl->currentDrawables);
+ free(cl->GLClientextensions);
+ break;
+
+ default:
+ break;
+ }
+}
+
/*
** Initialize the GLX extension.
*/
@@ -299,8 +269,6 @@ GlxExtensionInit(void)
__glXContextRes = CreateNewResourceType((DeleteType) ContextGone,
"GLXContext");
- __glXClientRes = CreateNewResourceType((DeleteType) ClientGone,
- "GLXClient");
__glXPixmapRes = CreateNewResourceType((DeleteType) PixmapGone,
"GLXPixmap");
__glXWindowRes = CreateNewResourceType((DeleteType) WindowGone,
@@ -308,10 +276,14 @@ GlxExtensionInit(void)
__glXPbufferRes = CreateNewResourceType((DeleteType) PbufferGone,
"GLXPbuffer");
- if (!__glXContextRes || !__glXClientRes || !__glXPixmapRes ||
+ if (!__glXContextRes || !__glXPixmapRes ||
!__glXWindowRes || !__glXPbufferRes)
return;
+ /* XXX client private, */
+ if (!AddCallback (&ClientStateCallback, glxClientCallback, 0))
+ return;
+
/*
** Add extension to server extensions.
*/
@@ -345,13 +317,6 @@ GlxExtensionInit(void)
__glXBadPbuffer = extEntry->errorBase + GLXBadPbuffer;
/*
- ** Initialize table of client state. There is never a client 0.
- */
- for (i = 1; i <= MAXCLIENTS; i++) {
- __glXClients[i] = 0;
- }
-
- /*
** Initialize screen specific data.
*/
__glXScreenInit(screenInfo.numScreens);
@@ -392,36 +357,7 @@ __glXDispatch(ClientPtr client)
__GLXclientState *cl;
opcode = stuff->glxCode;
- cl = __glXClients[client->index];
- if (!cl) {
- cl = calloc(1, sizeof(__GLXclientState));
- __glXClients[client->index] = cl;
- if (!cl) {
- return BadAlloc;
- }
-
- cl->be_displays = calloc(screenInfo.numScreens, sizeof(Display *));
- if (!cl->be_displays) {
- free(cl);
- return BadAlloc;
- }
- }
-
- if (!cl->inUse) {
- /*
- ** This is first request from this client. Associate a resource
- ** with the client so we will be notified when the client dies.
- */
- XID xid = FakeClientID(client->index);
-
- if (!AddResource(xid, __glXClientRes, (pointer) (long) client->index)) {
- return BadAlloc;
- }
- ResetClientState(client->index);
- cl->largeCmdRequestsTotal = 0;
- cl->inUse = GL_TRUE;
- cl->client = client;
- }
+ cl = glxGetClient(client);
/*
** Check for valid opcode.
@@ -446,35 +382,7 @@ __glXSwapDispatch(ClientPtr client)
__GLXclientState *cl;
opcode = stuff->glxCode;
- cl = __glXClients[client->index];
- if (!cl) {
- cl = calloc(1, sizeof(__GLXclientState));
- __glXClients[client->index] = cl;
- if (!cl) {
- return BadAlloc;
- }
-
- cl->be_displays = calloc(screenInfo.numScreens, sizeof(Display *));
- if (!cl->be_displays) {
- free(cl);
- return BadAlloc;
- }
- }
-
- if (!cl->inUse) {
- /*
- ** This is first request from this client. Associate a resource
- ** with the client so we will be notified when the client dies.
- */
- XID xid = FakeClientID(client->index);
-
- if (!AddResource(xid, __glXClientRes, (pointer) (long) client->index)) {
- return BadAlloc;
- }
- ResetClientState(client->index);
- cl->inUse = GL_TRUE;
- cl->client = client;
- }
+ cl = glxGetClient(client);
/*
** Check for valid opcode.
diff --git a/hw/dmx/glxProxy/glxserver.h b/hw/dmx/glxProxy/glxserver.h
index 754ad30..3794860 100644
--- a/hw/dmx/glxProxy/glxserver.h
+++ b/hw/dmx/glxProxy/glxserver.h
@@ -98,11 +98,6 @@ typedef struct {
*/
struct __GLXclientStateRec {
/*
- ** Whether this structure is currently being used to support a client.
- */
- Bool inUse;
-
- /*
** Buffer for returned data.
*/
GLbyte *returnBuf;
@@ -139,8 +134,6 @@ struct __GLXclientStateRec {
};
-extern __GLXclientState *__glXClients[];
-
/************************************************************************/
/*
--
1.8.3.1
More information about the xorg-devel
mailing list