diff options
-rw-r--r-- | glx/vndcmds.c | 2 | ||||
-rw-r--r-- | glx/vndext.c | 9 | ||||
-rw-r--r-- | glx/vndserver.h | 4 |
3 files changed, 12 insertions, 3 deletions
diff --git a/glx/vndcmds.c b/glx/vndcmds.c index c3e1332bf..493e2bfc0 100644 --- a/glx/vndcmds.c +++ b/glx/vndcmds.c @@ -472,6 +472,8 @@ void GlxDispatchReset(void) int GlxDispatchRequest(ClientPtr client) { REQUEST(xReq); + if (GlxExtensionEntry->base == 0) + return BadRequest; if (stuff->data < OPCODE_ARRAY_LEN) { if (dispatchFuncs[stuff->data] == NULL) { // Try to find a dispatch stub. diff --git a/glx/vndext.c b/glx/vndext.c index cef306a40..d7936467b 100644 --- a/glx/vndext.c +++ b/glx/vndext.c @@ -39,6 +39,7 @@ #include <GL/glxproto.h> #include "vndservervendor.h" +ExtensionEntry *GlxExtensionEntry; int GlxErrorBase = 0; static CallbackListRec vndInitCallbackList; static CallbackListPtr vndInitCallbackListPtr = &vndInitCallbackList; @@ -202,6 +203,7 @@ void GlxExtensionInit(void) { ExtensionEntry *extEntry; + GlxExtensionEntry = NULL; // Init private keys, per-screen data if (!dixRegisterPrivateKey(&glvXGLVScreenPrivKey, PRIVATE_SCREEN, 0)) @@ -228,8 +230,15 @@ GlxExtensionInit(void) return; } + GlxExtensionEntry = extEntry; GlxErrorBase = extEntry->errorBase; CallCallbacks(&vndInitCallbackListPtr, extEntry); + + /* We'd better have found at least one vendor */ + for (int i = 0; i < screenInfo.numScreens; i++) + if (GlxGetVendorForScreen(serverClient, screenInfo.screens[i])) + return; + extEntry->base = 0; } static int diff --git a/glx/vndserver.h b/glx/vndserver.h index 12297349c..a175656ae 100644 --- a/glx/vndserver.h +++ b/glx/vndserver.h @@ -62,9 +62,7 @@ typedef struct GlxClientPrivRec { extern int GlxErrorBase; extern RESTYPE idResource; -// Defined in glxext.c. -const ExtensionEntry *GlxGetExtensionEntry(void); - +extern ExtensionEntry *GlxExtensionEntry; Bool GlxDispatchInit(void); void GlxDispatchReset(void); |