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>
(cherry picked from commit 8b67ec7cc6
)
This commit is contained in:
parent
1fdb7cbce5
commit
abeae4a6d3
|
@ -468,15 +468,24 @@ void GlxDispatchReset(void)
|
||||||
int GlxDispatchRequest(ClientPtr client)
|
int GlxDispatchRequest(ClientPtr client)
|
||||||
{
|
{
|
||||||
REQUEST(xReq);
|
REQUEST(xReq);
|
||||||
|
int result;
|
||||||
|
|
||||||
if (GlxExtensionEntry->base == 0)
|
if (GlxExtensionEntry->base == 0)
|
||||||
return BadRequest;
|
return BadRequest;
|
||||||
|
|
||||||
|
GlxSetRequestClient(client);
|
||||||
|
|
||||||
if (stuff->data < OPCODE_ARRAY_LEN) {
|
if (stuff->data < OPCODE_ARRAY_LEN) {
|
||||||
if (dispatchFuncs[stuff->data] == NULL) {
|
if (dispatchFuncs[stuff->data] == NULL) {
|
||||||
// Try to find a dispatch stub.
|
// Try to find a dispatch stub.
|
||||||
dispatchFuncs[stuff->data] = GetVendorDispatchFunc(stuff->data, 0);
|
dispatchFuncs[stuff->data] = GetVendorDispatchFunc(stuff->data, 0);
|
||||||
}
|
}
|
||||||
return dispatchFuncs[stuff->data](client);
|
result = dispatchFuncs[stuff->data](client);
|
||||||
} else {
|
} else {
|
||||||
return dispatch_GLXSingle(client);
|
result = dispatch_GLXSingle(client);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GlxSetRequestClient(NULL);
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
|
@ -95,6 +95,13 @@ Bool GlxAddXIDMap(XID id, GlxServerVendor *vendor);
|
||||||
GlxServerVendor * GlxGetXIDMap(XID id);
|
GlxServerVendor * GlxGetXIDMap(XID id);
|
||||||
void GlxRemoveXIDMap(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 *GlxAllocContextTag(ClientPtr client, GlxServerVendor *vendor);
|
||||||
GlxContextTagInfo *GlxLookupContextTag(ClientPtr client, GLXContextTag tag);
|
GlxContextTagInfo *GlxLookupContextTag(ClientPtr client, GLXContextTag tag);
|
||||||
void GlxFreeContextTag(GlxContextTagInfo *tagInfo);
|
void GlxFreeContextTag(GlxContextTagInfo *tagInfo);
|
||||||
|
|
|
@ -33,6 +33,13 @@
|
||||||
|
|
||||||
#include "vndservervendor.h"
|
#include "vndservervendor.h"
|
||||||
|
|
||||||
|
static ClientPtr requestClient = NULL;
|
||||||
|
|
||||||
|
void GlxSetRequestClient(ClientPtr client)
|
||||||
|
{
|
||||||
|
requestClient = client;
|
||||||
|
}
|
||||||
|
|
||||||
static GlxServerVendor *LookupXIDMapResource(XID id)
|
static GlxServerVendor *LookupXIDMapResource(XID id)
|
||||||
{
|
{
|
||||||
void *ptr = NULL;
|
void *ptr = NULL;
|
||||||
|
@ -59,10 +66,7 @@ GlxServerVendor *GlxGetXIDMap(XID id)
|
||||||
DixGetAttrAccess);
|
DixGetAttrAccess);
|
||||||
if (rv == Success && ptr != NULL) {
|
if (rv == Success && ptr != NULL) {
|
||||||
DrawablePtr draw = (DrawablePtr) ptr;
|
DrawablePtr draw = (DrawablePtr) ptr;
|
||||||
GlxScreenPriv *screenPriv = GlxGetScreen(draw->pScreen);
|
vendor = GlxGetVendorForScreen(requestClient, draw->pScreen);
|
||||||
if (screenPriv != NULL) {
|
|
||||||
vendor = screenPriv->vendor;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return vendor;
|
return vendor;
|
||||||
|
|
Loading…
Reference in New Issue