Don't use glxinfo to access the graphic driver name

glxinfo is part of mesa-demos, and installing it pulls a lot of unnecessary
programs. We can get the same informations by querying the driver directly.

https://bugzilla.gnome.org/show_bug.cgi?id=691613
This commit is contained in:
Giovanni Campagna 2013-01-12 17:43:21 +01:00
parent 7e94eca2fb
commit c60221e0b4
2 changed files with 49 additions and 40 deletions

View file

@ -131,7 +131,7 @@ PKG_CHECK_MODULES(DATETIME_PANEL, $COMMON_MODULES
polkit-gobject-1 >= $POLKIT_REQUIRED_VERSION
gdk-pixbuf-2.0 >= $GDKPIXBUF_REQUIRED_VERSION)
PKG_CHECK_MODULES(DISPLAY_PANEL, $COMMON_MODULES gnome-desktop-3.0 >= 3.1.0)
PKG_CHECK_MODULES(INFO_PANEL, $COMMON_MODULES libgtop-2.0
PKG_CHECK_MODULES(INFO_PANEL, $COMMON_MODULES libgtop-2.0 gl
polkit-gobject-1 >= $POLKIT_REQUIRED_VERSION)
PKG_CHECK_MODULES(KEYBOARD_PANEL, $COMMON_MODULES
gnome-desktop-3.0 >= $GNOME_DESKTOP_REQUIRED_VERSION

View file

@ -35,6 +35,10 @@
#include <glibtop/mem.h>
#include <glibtop/sysinfo.h>
#include <gdk/gdkx.h>
#include <GL/gl.h>
#include <GL/glx.h>
#include "gsd-disk-space-helper.h"
/* Autorun options */
@ -297,54 +301,59 @@ graphics_data_free (GraphicsData *gdata)
}
static char *
get_graphics_data_glx_renderer (void)
get_graphics_data_glx_renderer ()
{
GError *error;
GRegex *re;
GMatchInfo *match_info;
char *output;
char *result;
GString *info;
Display *display;
int attributes[] = {
GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT,
GLX_X_VISUAL_TYPE, GLX_TRUE_COLOR,
GLX_RENDER_TYPE, GLX_RGBA_BIT,
None
};
int nconfigs;
Window window;
GLXFBConfig *config;
GLXWindow glxwin;
GLXContext context;
char *renderer;
info = g_string_new (NULL);
gdk_error_trap_push ();
error = NULL;
g_spawn_command_line_sync ("glxinfo -l", &output, NULL, NULL, &error);
if (error != NULL)
{
g_warning ("Unable to get graphics info: %s", error->message);
g_error_free (error);
return NULL;
}
display = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
re = g_regex_new ("^OpenGL renderer string: (.+)$", G_REGEX_MULTILINE, 0, &error);
if (re == NULL)
{
g_warning ("Error building regex: %s", error->message);
g_error_free (error);
goto out;
}
config = glXChooseFBConfig (display, DefaultScreen (display),
attributes, &nconfigs);
if (config == NULL) {
g_warning ("Failed to get OpenGL configuration");
g_regex_match (re, output, 0, &match_info);
while (g_match_info_matches (match_info))
{
char *device;
gdk_error_trap_pop_ignored ();
return NULL;
}
device = g_match_info_fetch (match_info, 1);
g_string_append_printf (info, "%s ", device);
g_free (device);
window = XCreateSimpleWindow (display, DefaultRootWindow (display),
0, 0, /* x, y */
1, 1, /* width, height */
0, 0, 0 /* border_width, border, background */);
glxwin = glXCreateWindow (display, *config, window, NULL);
g_match_info_next (match_info, NULL);
}
g_match_info_free (match_info);
g_regex_unref (re);
context = glXCreateNewContext (display, *config, GLX_RGBA_TYPE,
NULL, TRUE);
out:
g_free (output);
result = prettify_info (info->str);
g_string_free (info, TRUE);
glXMakeContextCurrent (display, glxwin, glxwin, context);
renderer = (char *) glGetString (GL_RENDERER);
renderer = renderer ? prettify_info (renderer) : NULL;
return result;
glXMakeContextCurrent (display, None, None, NULL);
glXDestroyContext (display, context);
glXDestroyWindow (display, glxwin);
XDestroyWindow (display, window);
if (gdk_error_trap_pop () != Success) {
g_warning ("Failed to get OpenGL driver info");
return NULL;
}
return renderer;
}
static char *