e8725b8
diff --git a/glx/vndext.c b/glx/vndext.c
e8725b8
index d7936467be5858f1c63d8d5cd4e4fec2a91fd4cc..20c0648ccfc9fc592a552725c0d0fef609db7362 100644
e8725b8
--- a/glx/vndext.c
e8725b8
+++ b/glx/vndext.c
e8725b8
@@ -139,8 +139,17 @@ GlxGetClientData(ClientPtr client)
e8725b8
 {
e8725b8
     GlxClientPriv *cl = xglvGetClientPrivate(client);
e8725b8
     if (cl == NULL) {
e8725b8
-        cl = calloc(1, sizeof(GlxClientPriv));
e8725b8
+        cl = calloc(1, sizeof(GlxClientPriv)
e8725b8
+                + screenInfo.numScreens * sizeof(GlxServerVendor *));
e8725b8
         if (cl != NULL) {
e8725b8
+            int i;
e8725b8
+
e8725b8
+            cl->vendors = (GlxServerVendor **) (cl + 1);
e8725b8
+            for (i=0; i
e8725b8
+            {
e8725b8
+                cl->vendors[i] = GlxGetVendorForScreen(NULL, screenInfo.screens[i]);
e8725b8
+            }
e8725b8
+
e8725b8
             xglvSetClientPrivate(client, cl);
e8725b8
         }
e8725b8
     }
e8725b8
diff --git a/glx/vndserver.h b/glx/vndserver.h
e8725b8
index a175656ae7c22fcc0e4bf74bb9067312fb5ec14a..78246d212cea42f923808852159c973e3b64318d 100644
e8725b8
--- a/glx/vndserver.h
e8725b8
+++ b/glx/vndserver.h
e8725b8
@@ -57,6 +57,11 @@ typedef struct GlxContextTagInfoRec {
e8725b8
 typedef struct GlxClientPrivRec {
e8725b8
     GlxContextTagInfo *contextTags;
e8725b8
     unsigned int contextTagCount;
e8725b8
+
e8725b8
+    /**
e8725b8
+     * The vendor handles for each screen.
e8725b8
+     */
e8725b8
+    GlxServerVendor **vendors;
e8725b8
 } GlxClientPriv;
e8725b8
 
e8725b8
 extern int GlxErrorBase;
e8725b8
diff --git a/glx/vndservermapping.c b/glx/vndservermapping.c
e8725b8
index fd3be92d95c28969291ca0c50a77d49a29007a8e..778656bb6eadcad43afe0e985c14a67eb44402a4 100644
e8725b8
--- a/glx/vndservermapping.c
e8725b8
+++ b/glx/vndservermapping.c
e8725b8
@@ -187,10 +187,21 @@ Bool GlxSetScreenVendor(ScreenPtr screen, GlxServerVendor *vendor)
e8725b8
 
e8725b8
 GlxServerVendor *GlxGetVendorForScreen(ClientPtr client, ScreenPtr screen)
e8725b8
 {
e8725b8
-    GlxScreenPriv *priv = GlxGetScreen(screen);
e8725b8
-    if (priv != NULL) {
e8725b8
-        return priv->vendor;
e8725b8
+    // Note that the client won't be sending GPU screen numbers, so we don't
e8725b8
+    // need per-client mappings for them.
e8725b8
+    if (client != NULL && !screen->isGPU) {
e8725b8
+        GlxClientPriv *cl = GlxGetClientData(client);
e8725b8
+        if (cl != NULL) {
e8725b8
+            return cl->vendors[screen->myNum];
e8725b8
+        } else {
e8725b8
+            return NULL;
e8725b8
+        }
e8725b8
     } else {
e8725b8
-        return NULL;
e8725b8
+        GlxScreenPriv *priv = GlxGetScreen(screen);
e8725b8
+        if (priv != NULL) {
e8725b8
+            return priv->vendor;
e8725b8
+        } else {
e8725b8
+            return NULL;
e8725b8
+        }
e8725b8
     }
e8725b8
 }