GLX: Use the sending client for looking up XID's

When GlxGetXIDMap looks up an unknown XID, it will now look up a vendor based
on the screen number for the XID and the client that sent the current request.

In GlxGetXIDMap, if the XID is for a regular X window, then it won't be in the
(XID -> vendor) mapping, so we have to look up a vendor by screen number.

With this change, GlxGetXIDMap will use the (screen -> vendor) map for
whichever client sent the current request, instead of using the global
(screen -> vendor) map.

Since GlxGetXIDMap doesn't take a ClientPtr argument, GlxDispatchRequest will
store the client for the current request in a global variable. That way, the
ABI for GLXVND doesn't need to change.

v2: Fix an error check in GlxDispatchRequest.

Signed-off-by: Aaron Plattner <aplattner@nvidia.com>
Reviewed-by: Aaron Plattner <aplattner@nvidia.com>
Reviewed-by: Adam Jackson <ajax@redhat.com>
This commit is contained in:
Kyle Brenneman 2019-05-08 08:44:54 -06:00 committed by Aaron Plattner
parent 37a36a6b5b
commit 8b67ec7cc6
3 changed files with 26 additions and 6 deletions

View File

@ -468,15 +468,24 @@ void GlxDispatchReset(void)
int GlxDispatchRequest(ClientPtr client)
{
REQUEST(xReq);
int result;
if (GlxExtensionEntry->base == 0)
return BadRequest;
GlxSetRequestClient(client);
if (stuff->data < OPCODE_ARRAY_LEN) {
if (dispatchFuncs[stuff->data] == NULL) {
// Try to find a dispatch stub.
dispatchFuncs[stuff->data] = GetVendorDispatchFunc(stuff->data, 0);
}
return dispatchFuncs[stuff->data](client);
result = dispatchFuncs[stuff->data](client);
} else {
return dispatch_GLXSingle(client);
result = dispatch_GLXSingle(client);
}
GlxSetRequestClient(NULL);
return result;
}

View File

@ -95,6 +95,13 @@ Bool GlxAddXIDMap(XID id, GlxServerVendor *vendor);
GlxServerVendor * GlxGetXIDMap(XID id);
void GlxRemoveXIDMap(XID id);
/**
* Records the client that sent the current request. This is needed in
* GlxGetXIDMap to know which client's (screen -> vendor) mapping to use for a
* regular X window.
*/
void GlxSetRequestClient(ClientPtr client);
GlxContextTagInfo *GlxAllocContextTag(ClientPtr client, GlxServerVendor *vendor);
GlxContextTagInfo *GlxLookupContextTag(ClientPtr client, GLXContextTag tag);
void GlxFreeContextTag(GlxContextTagInfo *tagInfo);

View File

@ -33,6 +33,13 @@
#include "vndservervendor.h"
static ClientPtr requestClient = NULL;
void GlxSetRequestClient(ClientPtr client)
{
requestClient = client;
}
static GlxServerVendor *LookupXIDMapResource(XID id)
{
void *ptr = NULL;
@ -59,10 +66,7 @@ GlxServerVendor *GlxGetXIDMap(XID id)
DixGetAttrAccess);
if (rv == Success && ptr != NULL) {
DrawablePtr draw = (DrawablePtr) ptr;
GlxScreenPriv *screenPriv = GlxGetScreen(draw->pScreen);
if (screenPriv != NULL) {
vendor = screenPriv->vendor;
}
vendor = GlxGetVendorForScreen(requestClient, draw->pScreen);
}
}
return vendor;