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