[gnome-session] tools: Use whitelist/blacklist regexps when evaluating renderer



commit 50b121a7737a13bde1195d1aea215ff8789f65fd
Author: Vincent Untz <vuntz gnome org>
Date:   Wed Oct 19 14:27:25 2011 +0200

    tools: Use whitelist/blacklist regexps when evaluating renderer
    
    The regexps are in a file that we also ship.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=644325

 data/Makefile.am                               |    5 +-
 data/hardware-compatibility                    |   20 +++++
 tools/Makefile.am                              |    3 +-
 tools/gnome-session-check-accelerated-helper.c |   95 ++++++++++++++++++++++--
 4 files changed, 115 insertions(+), 8 deletions(-)
---
diff --git a/data/Makefile.am b/data/Makefile.am
index cdd3201..6f0fb33 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -5,6 +5,9 @@ ui_DATA = \
 	session-properties.ui	\
 	gsm-inhibit-dialog.ui
 
+hwcompatdir = $(pkgdatadir)
+hwcompat_DATA = hardware-compatibility
+
 xsessiondir = $(datadir)/xsessions
 xsession_in_files = gnome.desktop.in
 xsession_DATA = $(xsession_in_files:.desktop.in=.desktop)
@@ -39,7 +42,7 @@ EXTRA_DIST =					\
 	$(session_in_in_files)			\
 	$(gsettings_SCHEMAS:.xml=.xml.in)	\
 	$(ui_DATA)				\
-	$(pixmap_DATA_dist)
+	$(hwcompat_DATA)
 
 CLEANFILES =					\
 	$(gsettings_SCHEMAS)			\
diff --git a/data/hardware-compatibility b/data/hardware-compatibility
new file mode 100644
index 0000000..b311898
--- /dev/null
+++ b/data/hardware-compatibility
@@ -0,0 +1,20 @@
+##
+## This file contains a list of blacklist/whitelist regular expressions for
+## renderer strings.
+##
+## The regular expressions are case-insensitive POSIX Extended Regular
+## Expressions. See regex(7) for details.
+##
+## Syntax:
+##  - Comment lines start with '#'
+##  - Lines starting with '+' are whitelisting.
+##  - Lines starting with '-' are blacklisting.
+##  - Lines not starting with '#', '+', '-' are ignored.
+##
+
+# Old Mesa software GL renderer
+-software rasterizer
+
+# Gallium has softpipe and llvmpipe
+-softpipe
+-llvmpipe
diff --git a/tools/Makefile.am b/tools/Makefile.am
index aaf1ca1..dc85836 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -26,7 +26,8 @@ gnome_session_quit_LDADD =			\
 gnome_session_check_accelerated_helper_SOURCES = 		\
 	gnome-session-check-accelerated-helper.c
 
-gnome_session_check_accelerated_helper_CPPFLAGS =		\
+gnome_session_check_accelerated_helper_CPPFLAGS =	\
+	-DPKGDATADIR=\""$(pkgdatadir)"\"		\
 	$(GL_TEST_CFLAGS)
 
 gnome_session_check_accelerated_helper_LDADD = 		\
diff --git a/tools/gnome-session-check-accelerated-helper.c b/tools/gnome-session-check-accelerated-helper.c
index c1b49e2..c0fa1e5 100644
--- a/tools/gnome-session-check-accelerated-helper.c
+++ b/tools/gnome-session-check-accelerated-helper.c
@@ -75,6 +75,8 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include <regex.h>
+
 #include <X11/Xlib.h>
 #include <X11/extensions/Xcomposite.h>
 #include <GL/gl.h>
@@ -148,6 +150,92 @@ _has_composite (Display *display)
 }
 
 static int
+_is_comment (const char *line)
+{
+        while (*line && isspace(*line))
+                line++;
+
+        if (*line == '#' || *line == '\0')
+                return 0;
+        else
+                return 1;
+}
+
+static int
+_is_gl_renderer_blacklisted (const char *renderer)
+{
+        FILE *blacklist;
+        char *line = NULL;
+        size_t line_len = 0;
+        int ret = 1;
+
+        blacklist = fopen(PKGDATADIR "/hardware-compatibility", "r");
+        if (blacklist == NULL)
+                goto out;
+
+        while (getline (&line, &line_len, blacklist) != -1) {
+                int whitelist = 0;
+                const char *re_str;
+                regex_t re;
+                int status;
+
+                if (line == NULL)
+                        break;
+
+                /* Drop trailing \n */
+                line[strlen(line) - 1] = '\0';
+
+                if (_is_comment (line) == 0) {
+                        free (line);
+                        line = NULL;
+                        continue;
+                }
+
+                if (line[0] == '+')
+                        whitelist = 1;
+                else if (line[0] == '-')
+                        whitelist = 0;
+                else {
+                        _print_error ("Invalid syntax in this line for hardware compatibility:");
+                        _print_error (line);
+                        free (line);
+                        line = NULL;
+                        continue;
+                }
+
+                re_str = line + 1;
+
+                if (regcomp (&re, re_str, REG_EXTENDED|REG_ICASE|REG_NOSUB) != 0) {
+                        _print_error ("Cannot use this regular expression for hardware compatibility:");
+                        _print_error (re_str);
+                } else {
+                        status = regexec (&re, renderer, 0, NULL, 0);
+                        regfree(&re);
+
+                        if (status == 0) {
+                                if (whitelist)
+                                        ret = 0;
+                                goto out;
+                        }
+                }
+
+                free (line);
+                line = NULL;
+        }
+
+        ret = 0;
+
+out:
+        if (line != NULL)
+                free (line);
+
+        if (blacklist != NULL)
+                fclose (blacklist);
+
+        return ret;
+}
+
+static int
 _has_hardware_gl (Display *display)
 {
         int screen;
@@ -193,12 +281,7 @@ _has_hardware_gl (Display *display)
                 goto out;
 
         renderer = (const char *) glGetString (GL_RENDERER);
-        /* The current Mesa software GL renderer string is
-	 * "Software Rasterizer".
-	 * Gallium has softpipe and llvmpipe. */
-        if (strcasestr (renderer, "software rasterizer") != NULL ||
-            strcasestr (renderer, "softpipe") != NULL ||
-            strcasestr (renderer, "llvmpipe") != NULL)
+        if (_is_gl_renderer_blacklisted (renderer) != 0)
                 goto out;
 
         /* we need to get the max texture size while we have a context,



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]