On 12/10/13 02:03, Eric Anholt wrote: > This will allow a megadrivers build to reference the actual driver being > loaded from the shared dri_util screen creation code. > > Reviewed-by: Matt Turner <matts...@gmail.com> > --- > include/GL/internal/dri_interface.h | 27 +++++++++++++++++++-- > src/egl/drivers/dri2/egl_dri2.c | 27 +++++++++++++++++---- > src/egl/drivers/dri2/egl_dri2.h | 1 + > src/gbm/backends/dri/gbm_dri.c | 15 ++++++++---- > src/gbm/backends/dri/gbm_driint.h | 1 + > src/glx/dri2_glx.c | 23 +++++++++++------- > src/glx/drisw_glx.c | 13 +++++++--- > src/mesa/drivers/dri/common/dri_util.c | 44 > +++++++++++++++++++++++++--------- > 8 files changed, 117 insertions(+), 34 deletions(-) > > diff --git a/include/GL/internal/dri_interface.h > b/include/GL/internal/dri_interface.h > index ea90e86..a36ee34 100644 > --- a/include/GL/internal/dri_interface.h > +++ b/include/GL/internal/dri_interface.h > @@ -713,7 +713,7 @@ struct __DRIlegacyExtensionRec { > * conjunction with the core extension. > */ > #define __DRI_SWRAST "DRI_SWRast" > -#define __DRI_SWRAST_VERSION 3 > +#define __DRI_SWRAST_VERSION 4 > > struct __DRIswrastExtensionRec { > __DRIextension base; > @@ -749,6 +749,18 @@ struct __DRIswrastExtensionRec { > const uint32_t *attribs, > unsigned *error, > void *loaderPrivate); > + > + /** > + * createNewScreen() with the driver extensions passed in. > + * > + * \since version 4 > + */ > + __DRIscreen *(*createNewScreen2)(int screen, > + const __DRIextension **loader_extensions, > + const __DRIextension **driver_extensions, > + const __DRIconfig ***driver_configs, > + void *loaderPrivate); > + > }; > > /** > @@ -831,7 +843,7 @@ struct __DRIdri2LoaderExtensionRec { > * constructors for DRI2. > */ > #define __DRI_DRI2 "DRI_DRI2" > -#define __DRI_DRI2_VERSION 3 > +#define __DRI_DRI2_VERSION 4 > > #define __DRI_API_OPENGL 0 /**< OpenGL compatibility profile */ > #define __DRI_API_GLES 1 /**< OpenGL ES 1.x */ > @@ -939,6 +951,17 @@ struct __DRIdri2ExtensionRec { > const uint32_t *attribs, > unsigned *error, > void *loaderPrivate); > + > + /** > + * createNewScreen with the driver's extension list passed in. > + * > + * \since version 4 > + */ > + __DRIscreen *(*createNewScreen2)(int screen, int fd, > + const __DRIextension > **loader_extensions, > + const __DRIextension > **driver_extensions, > + const __DRIconfig ***driver_configs, > + void *loaderPrivate); > }; > > > diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c > index 2c01323..270df20 100644 > --- a/src/egl/drivers/dri2/egl_dri2.c > +++ b/src/egl/drivers/dri2/egl_dri2.c > @@ -459,6 +459,7 @@ dri2_load_driver(_EGLDisplay *disp) > dlclose(dri2_dpy->driver); > return EGL_FALSE; > } > + dri2_dpy->driver_extensions = extensions; > > return EGL_TRUE; > } > @@ -479,6 +480,7 @@ dri2_load_driver_swrast(_EGLDisplay *disp) > dlclose(dri2_dpy->driver); > return EGL_FALSE; > } > + dri2_dpy->driver_extensions = extensions; > > return EGL_TRUE; > } > @@ -544,14 +546,29 @@ dri2_create_screen(_EGLDisplay *disp) > dri2_dpy = disp->DriverData; > > if (dri2_dpy->dri2) { > + if (dri2_dpy->dri2->base.version >= 4) { > dri2_dpy->dri_screen = > - dri2_dpy->dri2->createNewScreen(0, dri2_dpy->fd, > dri2_dpy->extensions, > - &dri2_dpy->driver_configs, disp); > + dri2_dpy->dri2->createNewScreen2(0, dri2_dpy->fd, > + dri2_dpy->extensions, > + dri2_dpy->driver_extensions, > + &dri2_dpy->driver_configs, disp); Can you please re-indent the above part of this hunk
> + } else { > + dri2_dpy->dri_screen = > + dri2_dpy->dri2->createNewScreen(0, dri2_dpy->fd, > + dri2_dpy->extensions, > + &dri2_dpy->driver_configs, disp); > + } > } else { > assert(dri2_dpy->swrast); > - dri2_dpy->dri_screen = > - dri2_dpy->swrast->createNewScreen(0, dri2_dpy->extensions, > - &dri2_dpy->driver_configs, disp); > + if (dri2_dpy->swrast->base.version >= 4) { > + dri2_dpy->dri_screen = > + dri2_dpy->swrast->createNewScreen2(0, dri2_dpy->extensions, > + dri2_dpy->driver_extensions, > + &dri2_dpy->driver_configs, > disp); > + } else { Missing a line here + dri2_dpy->dri_screen = > + dri2_dpy->swrast->createNewScreen(0, dri2_dpy->extensions, > + &dri2_dpy->driver_configs, > disp); > + } > } > > if (dri2_dpy->dri_screen == NULL) { > diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h > index fba5f81..f5e6770 100644 > --- a/src/egl/drivers/dri2/egl_dri2.h > +++ b/src/egl/drivers/dri2/egl_dri2.h > @@ -118,6 +118,7 @@ struct dri2_egl_display > __DRIdri2LoaderExtension dri2_loader_extension; > __DRIswrastLoaderExtension swrast_loader_extension; > const __DRIextension *extensions[4]; > + const __DRIextension **driver_extensions; > > #ifdef HAVE_X11_PLATFORM > xcb_connection_t *conn; > diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c > index 0cab549..6733956 100644 > --- a/src/gbm/backends/dri/gbm_dri.c > +++ b/src/gbm/backends/dri/gbm_dri.c > @@ -228,7 +228,7 @@ dri_load_driver(struct gbm_dri_device *dri) > dlclose(dri->driver); > return -1; > } > - > + dri->driver_extensions = extensions; > > if (dri_bind_extensions(dri, gbm_dri_device_extensions, extensions) < 0) { > dlclose(dri->driver); > @@ -263,9 +263,16 @@ dri_screen_create(struct gbm_dri_device *dri) > if (dri->dri2 == NULL) > return -1; > > - dri->screen = dri->dri2->createNewScreen(0, dri->base.base.fd, > - dri->extensions, > - &dri->driver_configs, dri); > + if (dri->dri2->base.version >= 4) { > + dri->screen = dri->dri2->createNewScreen2(0, dri->base.base.fd, > + dri->extensions, > + dri->driver_extensions, > + &dri->driver_configs, dri); > + } else { > + dri->screen = dri->dri2->createNewScreen(0, dri->base.base.fd, > + dri->extensions, > + &dri->driver_configs, dri); > + } > if (dri->screen == NULL) > return -1; > > diff --git a/src/gbm/backends/dri/gbm_driint.h > b/src/gbm/backends/dri/gbm_driint.h > index 18fc3c0..6305b06 100644 > --- a/src/gbm/backends/dri/gbm_driint.h > +++ b/src/gbm/backends/dri/gbm_driint.h > @@ -53,6 +53,7 @@ struct gbm_dri_device { > > const __DRIconfig **driver_configs; > const __DRIextension *extensions[4]; > + const __DRIextension **driver_extensions; > > __DRIimage *(*lookup_image)(__DRIscreen *screen, void *image, void *data); > void *lookup_user_data; > diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c > index 7e22906..cfa5856 100644 > --- a/src/glx/dri2_glx.c > +++ b/src/glx/dri2_glx.c > @@ -1223,15 +1223,20 @@ dri2CreateScreen(int screen, struct glx_display * > priv) > goto handle_error; > } > > - > - /* If the server does not support the protocol for > - * DRI2GetBuffersWithFormat, don't supply that interface to the driver. > - */ > - psc->driScreen = > - psc->dri2->createNewScreen(screen, psc->fd, > - (const __DRIextension **) > - &pdp->loader_extensions[0], > - &driver_configs, psc); > + if (psc->dri2->base.version >= 4) { > + psc->driScreen = > + psc->dri2->createNewScreen2(screen, psc->fd, > + (const __DRIextension **) > + &pdp->loader_extensions[0], > + extensions, > + &driver_configs, psc); > + } else { > + psc->driScreen = > + psc->dri2->createNewScreen(screen, psc->fd, > + (const __DRIextension **) > + &pdp->loader_extensions[0], > + &driver_configs, psc); > + } > > if (psc->driScreen == NULL) { > ErrorMessageF("failed to create dri screen\n"); > diff --git a/src/glx/drisw_glx.c b/src/glx/drisw_glx.c > index a7d0843..cb1d650 100644 > --- a/src/glx/drisw_glx.c > +++ b/src/glx/drisw_glx.c > @@ -680,9 +680,16 @@ driswCreateScreen(int screen, struct glx_display *priv) > goto handle_error; > } > > - psc->driScreen = > - psc->swrast->createNewScreen(screen, loader_extensions, > - &driver_configs, psc); > + if (psc->swrast->base.version >= 4) { > + psc->driScreen = > + psc->swrast->createNewScreen2(screen, loader_extensions, > + extensions, > + &driver_configs, psc); > + } else { > + psc->driScreen = > + psc->swrast->createNewScreen(screen, loader_extensions, > + &driver_configs, psc); > + } > if (psc->driScreen == NULL) { > ErrorMessageF("failed to create dri screen\n"); > goto handle_error; > diff --git a/src/mesa/drivers/dri/common/dri_util.c > b/src/mesa/drivers/dri/common/dri_util.c > index 32f0e33..75956e4 100644 > --- a/src/mesa/drivers/dri/common/dri_util.c > +++ b/src/mesa/drivers/dri/common/dri_util.c > @@ -88,9 +88,10 @@ setupLoaderExtensions(__DRIscreen *psp, > * Display. > */ > static __DRIscreen * > -dri2CreateNewScreen(int scrn, int fd, > - const __DRIextension **extensions, > - const __DRIconfig ***driver_configs, void *data) > +dri2CreateNewScreen2(int scrn, int fd, > + const __DRIextension **extensions, > + const __DRIextension **driver_extensions, > + const __DRIconfig ***driver_configs, void *data) > { > static const __DRIextension *emptyExtensionList[] = { NULL }; > __DRIscreen *psp; > @@ -153,12 +154,31 @@ dri2CreateNewScreen(int scrn, int fd, > return psp; > } > > +static __DRIscreen * > +dri2CreateNewScreen(int scrn, int fd, > + const __DRIextension **extensions, > + const __DRIconfig ***driver_configs, void *data) > +{ > + return dri2CreateNewScreen2(scrn, fd, extensions, NULL, > + driver_configs, data); > +} > + > /** swrast driver createNewScreen entrypoint. */ > static __DRIscreen * > -driCreateNewScreen(int scrn, const __DRIextension **extensions, > - const __DRIconfig ***driver_configs, void *data) > +driSWRastCreateNewScreen(int scrn, const __DRIextension **extensions, > + const __DRIconfig ***driver_configs, void *data) > +{ > + return dri2CreateNewScreen2(scrn, -1, extensions, NULL, > + driver_configs, data); > +} > + > +static __DRIscreen * > +driSWRastCreateNewScreen2(int scrn, const __DRIextension **extensions, > + const __DRIextension **driver_extensions, > + const __DRIconfig ***driver_configs, void *data) > { > - return dri2CreateNewScreen(scrn, -1, extensions, driver_configs, data); > + return dri2CreateNewScreen2(scrn, -1, extensions, driver_extensions, > + driver_configs, data); > } > > /** > @@ -679,7 +699,7 @@ const __DRIcoreExtension driCoreExtension = { > > /** DRI2 interface */ > const __DRIdri2Extension driDRI2Extension = { > - .base = { __DRI_DRI2, 3 }, > + .base = { __DRI_DRI2, 4 }, > > .createNewScreen = dri2CreateNewScreen, > .createNewDrawable = dri2CreateNewDrawable, > @@ -688,15 +708,17 @@ const __DRIdri2Extension driDRI2Extension = { > .createNewContextForAPI = dri2CreateNewContextForAPI, > .allocateBuffer = dri2AllocateBuffer, > .releaseBuffer = dri2ReleaseBuffer, > - .createContextAttribs = dri2CreateContextAttribs > + .createContextAttribs = dri2CreateContextAttribs, > + .createNewScreen2 = dri2CreateNewScreen2, > }; > > const __DRIswrastExtension driSWRastExtension = { > - { __DRI_SWRAST, __DRI_SWRAST_VERSION }, > - driCreateNewScreen, > + { __DRI_SWRAST, 4 }, > + driSWRastCreateNewScreen, > dri2CreateNewDrawable, > dri2CreateNewContextForAPI, > - dri2CreateContextAttribs > + dri2CreateContextAttribs, > + driSWRastCreateNewScreen2, > }; > Seems like the driSWRastExtension can be written more explicitly (short of the correct term) similar to driDRI2Extension. I believe that can be done as a follow up. Cheers Emil > const __DRI2configQueryExtension dri2ConfigQueryExtension = { > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev