summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Jackson <ajax@redhat.com>2020-10-16 17:18:18 -0400
committerAdam Jackson <ajax@redhat.com>2020-10-21 10:24:31 -0400
commitce8530d6c9292d5a0c82522e5fd05831403a9c70 (patch)
tree6a8fd95d936eb9cdc7a42c8049a4a2982e90b23e
parent3bb7ebfc7504af0e85596f3ad4b72a2ede10d227 (diff)
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>
-rw-r--r--src/glx/dri2_glx.c13
-rw-r--r--src/glx/dri2_priv.h1
-rw-r--r--src/glx/dri3_glx.c9
-rw-r--r--src/glx/dri_glx.c43
-rw-r--r--src/glx/drisw_glx.c7
-rw-r--r--src/glx/glxclient.h2
6 files changed, 54 insertions, 21 deletions
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