diff options
| -rw-r--r-- | include/GL/internal/dri_interface.h | 20 | ||||
| -rw-r--r-- | src/glx/x11/glxext.c | 14 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/common/dri_util.c | 9 | 
3 files changed, 43 insertions, 0 deletions
| diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h index aa2b1cf805..ee73233771 100644 --- a/include/GL/internal/dri_interface.h +++ b/include/GL/internal/dri_interface.h @@ -56,10 +56,25 @@ typedef struct __DRIdriverRec		__DRIdriver;  typedef struct __DRIframebufferRec	__DRIframebuffer;  typedef struct __DRIversionRec		__DRIversion;  typedef struct __DRIinterfaceMethodsRec	__DRIinterfaceMethods; + +typedef struct __DRIextensionRec	__DRIextension;  /*@}*/  /** + * Extension struct.  Drivers 'inherit' from this struct by embedding + * it as the first element in the extension struct.  The + * __DRIscreen::getExtensions entry point will return a list of these + * structs and the loader can use the extensions it knows about by + * casting it to a more specific extension and optionally advertising + * the GLX extension.  See below for examples. + */ +struct __DRIextensionRec { +    const char *name; +}; + + +/**   * \name Functions provided by the driver loader.   */  /*@{*/ @@ -275,6 +290,11 @@ struct __DRIscreenRec {      void (*destroyScreen)(__DRIscreen *screen);      /** +     * Method to get screen extensions. +     */ +    const __DRIextension **(*getExtensions)(__DRIscreen *screen); + +    /**       * Method to create the private DRI drawable data and initialize the       * drawable dependent methods.       */ diff --git a/src/glx/x11/glxext.c b/src/glx/x11/glxext.c index ee8e238bec..cb187717f1 100644 --- a/src/glx/x11/glxext.c +++ b/src/glx/x11/glxext.c @@ -1011,6 +1011,18 @@ CallCreateNewScreen(Display *dpy, int scrn, __GLXscreenConfigs *psc,      return psp;  } + +static void queryExtensions(__GLXscreenConfigs *psc) +{ +    const __DRIextension **extensions; +    int i; + +    extensions = psc->driScreen.getExtensions(&psc->driScreen); +    for (i = 0; extensions[i]; i++) { +	/* Unknown extension, just ignore... */ +    } +} +  #endif /* GLX_DIRECT_RENDERING */ @@ -1205,6 +1217,8 @@ static Bool AllocAndFetchScreenConfigs(Display *dpy, __GLXdisplayPrivate *priv)  		    CallCreateNewScreen(dpy, i, psc,  					& priv->driDisplay,  					priv->driDisplay.createNewScreen[i] ); +		if (psc->driScreen.private != NULL) +		    queryExtensions(psc);  	    }  	}  #endif diff --git a/src/mesa/drivers/dri/common/dri_util.c b/src/mesa/drivers/dri/common/dri_util.c index 84a6d819de..c8be7b0706 100644 --- a/src/mesa/drivers/dri/common/dri_util.c +++ b/src/mesa/drivers/dri/common/dri_util.c @@ -624,6 +624,14 @@ driCreateNewContext(__DRIscreen *screen, const __GLcontextModes *modes,  }  /*@}*/ +static const __DRIextension ** +driGetExtensions(__DRIscreen *screen) +{ +    __DRIscreenPrivate *psp = screen->private; +    static const __DRIextension *extensions[1]; + +    return extensions; +}  /*****************************************************************/  /** \name Screen handling functions                              */ @@ -750,6 +758,7 @@ void * __DRI_CREATE_NEW_SCREEN( int scrn, __DRIscreen *psc,      psp->dummyContextPriv.driScreenPriv = NULL;      psc->destroyScreen     = driDestroyScreen; +    psc->getExtensions     = driGetExtensions;      psc->createNewDrawable = driCreateNewDrawable;      psc->getMSC            = driGetMSC;      psc->createNewContext  = driCreateNewContext; | 
