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) | ||||
| { | ||||
|     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; | ||||
| } | ||||
|  |  | |||
|  | @ -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); | ||||
|  |  | |||
|  | @ -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; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue