glx: Delegate the core of glXGetScreenDriver to the GLX screen vtable

This is a minor bugfix, in that the prior code required that the server
expose either XFree86-DRI or DRI2 to get the name; Xwayland exposed
neither, just DRI3. Now, for DRI2 and DRI3, we just ask the loader. It
also means we report "swrast" for the driver name when that's what we're
using, which is probably a good thing.

v2: Trust the driver name from the server for DRI2 (Michel Dänzer)

Reviewed-by: Michel Dänzer <mdaenzer@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7219>
This commit is contained in:
Adam Jackson 2020-10-16 17:18:18 -04:00
parent 3bb7ebfc75
commit ce8530d6c9
6 changed files with 54 additions and 21 deletions

View File

@ -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);

View File

@ -54,6 +54,7 @@ struct dri2_screen {
const __DRIconfig **driver_configs;
void *driver;
char *driverName;
int fd;
int show_fps_interval;

View File

@ -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

View File

@ -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 *

View File

@ -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

View File

@ -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