diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c index e281c8cb071..6c2e8d2bb6c 100644 --- a/src/glx/dri2_glx.c +++ b/src/glx/dri2_glx.c @@ -716,6 +716,7 @@ dri2DestroyScreen(struct glx_screen *base) /* Free the direct rendering per screen data */ (*psc->core->destroyScreen) (psc->driScreen); driDestroyConfigs(psc->driver_configs); + free(psc->driverName); close(psc->fd); free(psc); } @@ -1202,11 +1203,20 @@ dri2BindExtensions(struct dri2_screen *psc, struct glx_display * priv, } } +static char * +dri2_get_driver_name(struct glx_screen *glx_screen) +{ + struct dri2_screen *psc = (struct dri2_screen *)glx_screen; + + return psc->driverName; +} + static const struct glx_screen_vtable dri2_screen_vtable = { .create_context = dri2_create_context, .create_context_attribs = dri2_create_context_attribs, .query_renderer_integer = dri2_query_renderer_integer, .query_renderer_string = dri2_query_renderer_string, + .get_driver_name = dri2_get_driver_name, }; static struct glx_screen * @@ -1267,6 +1277,7 @@ dri2CreateScreen(int screen, struct glx_display * priv) free(driverName); driverName = loader_driverName; } + psc->driverName = driverName; extensions = driOpenDriver(driverName, &psc->driver); if (extensions == NULL) @@ -1356,7 +1367,6 @@ dri2CreateScreen(int screen, struct glx_display * priv) psp->copySubBuffer = dri2CopySubBuffer; __glXEnableDirectExtension(&psc->base, "GLX_MESA_copy_sub_buffer"); - free(driverName); free(deviceName); tmp = getenv("LIBGL_SHOW_FPS"); @@ -1383,7 +1393,6 @@ handle_error: if (psc->driver) dlclose(psc->driver); - free(driverName); free(deviceName); glx_screen_cleanup(&psc->base); free(psc); diff --git a/src/glx/dri2_priv.h b/src/glx/dri2_priv.h index a93551b146d..8f3f980bc1f 100644 --- a/src/glx/dri2_priv.h +++ b/src/glx/dri2_priv.h @@ -54,6 +54,7 @@ struct dri2_screen { const __DRIconfig **driver_configs; void *driver; + char *driverName; int fd; int show_fps_interval; diff --git a/src/glx/dri3_glx.c b/src/glx/dri3_glx.c index 60b0c1c400f..32d4fb38e39 100644 --- a/src/glx/dri3_glx.c +++ b/src/glx/dri3_glx.c @@ -806,11 +806,20 @@ dri3_bind_extensions(struct dri3_screen *psc, struct glx_display * priv, } } +static char * +dri3_get_driver_name(struct glx_screen *glx_screen) +{ + struct dri3_screen *psc = (struct dri3_screen *)glx_screen; + + return loader_get_driver_for_fd(psc->fd); +} + static const struct glx_screen_vtable dri3_screen_vtable = { .create_context = dri3_create_context, .create_context_attribs = dri3_create_context_attribs, .query_renderer_integer = dri3_query_renderer_integer, .query_renderer_string = dri3_query_renderer_string, + .get_driver_name = dri3_get_driver_name, }; /** dri3_create_screen diff --git a/src/glx/dri_glx.c b/src/glx/dri_glx.c index 53de8f04e75..f2ee0908b99 100644 --- a/src/glx/dri_glx.c +++ b/src/glx/dri_glx.c @@ -99,48 +99,51 @@ struct dri_drawable static Bool driGetDriverName(Display * dpy, int scrNum, char **driverName) { + struct glx_screen *glx_screen = GetGLXScreenConfigs(dpy, scrNum); + + if (!glx_screen || !glx_screen->vtable->get_driver_name) + return False; + + *driverName = glx_screen->vtable->get_driver_name(glx_screen); + return True; +} + +static char * +dri_get_driver_name(struct glx_screen *psc) +{ + Display *dpy = psc->dpy; + int scrNum = psc->scr; int directCapable; Bool b; int event, error; int driverMajor, driverMinor, driverPatch; - - *driverName = NULL; + char *driverName = NULL; if (XF86DRIQueryExtension(dpy, &event, &error)) { /* DRI1 */ if (!XF86DRIQueryDirectRenderingCapable(dpy, scrNum, &directCapable)) { ErrorMessageF("XF86DRIQueryDirectRenderingCapable failed\n"); - return False; + return NULL; } if (!directCapable) { ErrorMessageF("XF86DRIQueryDirectRenderingCapable returned false\n"); - return False; + return NULL; } b = XF86DRIGetClientDriverName(dpy, scrNum, &driverMajor, &driverMinor, - &driverPatch, driverName); + &driverPatch, &driverName); if (!b) { ErrorMessageF("Cannot determine driver name for screen %d\n", scrNum); - return False; + return NULL; } InfoMessageF("XF86DRIGetClientDriverName: %d.%d.%d %s (screen %d)\n", - driverMajor, driverMinor, driverPatch, *driverName, + driverMajor, driverMinor, driverPatch, driverName, scrNum); - return True; + return driverName; } - else if (DRI2QueryExtension(dpy, &event, &error)) { /* DRI2 */ - char *dev; - Bool ret = DRI2Connect(dpy, RootWindow(dpy, scrNum), driverName, &dev); - - if (ret) - free(dev); - - return ret; - } - - return False; + return NULL; } /* @@ -154,6 +157,7 @@ glXGetScreenDriver(Display * dpy, int scrNum) { static char ret[32]; char *driverName; + if (driGetDriverName(dpy, scrNum, &driverName)) { int len; if (!driverName) @@ -935,6 +939,7 @@ static const struct glx_screen_vtable dri_screen_vtable = { .create_context_attribs = NULL, .query_renderer_integer = NULL, .query_renderer_string = NULL, + .get_driver_name = dri_get_driver_name, }; static struct glx_screen * diff --git a/src/glx/drisw_glx.c b/src/glx/drisw_glx.c index b282db8cf83..afa335eee81 100644 --- a/src/glx/drisw_glx.c +++ b/src/glx/drisw_glx.c @@ -768,11 +768,18 @@ driswDestroyScreen(struct glx_screen *base) #define SWRAST_DRIVER_NAME "swrast" +static char * +drisw_get_driver_name(struct glx_screen *glx_screen) +{ + return strdup(SWRAST_DRIVER_NAME); +} + static const struct glx_screen_vtable drisw_screen_vtable = { .create_context = drisw_create_context, .create_context_attribs = drisw_create_context_attribs, .query_renderer_integer = drisw_query_renderer_integer, .query_renderer_string = drisw_query_renderer_string, + .get_driver_name = drisw_get_driver_name, }; static void diff --git a/src/glx/glxclient.h b/src/glx/glxclient.h index ea7668fbc27..fb5dbc409b2 100644 --- a/src/glx/glxclient.h +++ b/src/glx/glxclient.h @@ -500,6 +500,8 @@ struct glx_screen_vtable { int (*query_renderer_string)(struct glx_screen *psc, int attribute, const char **value); + + char *(*get_driver_name)(struct glx_screen *psc); }; struct glx_screen