[gnome-session] check-accelerated: check for llvmpipe



commit 529956f42562bbe685690c12dbeb11c6d7b9ec3d
Author: Frederic Crozat <fcrozat suse com>
Date:   Wed Jul 24 15:14:16 2013 +0200

    check-accelerated: check for llvmpipe
    
    Check if running under llvmpipe and set Atom
    _GNOME_IS_SOFTWARE_RENDERING to 1 in that case.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=704402

 tools/gnome-session-check-accelerated-common.h |    2 ++
 tools/gnome-session-check-accelerated-helper.c |    9 +++++++++
 tools/gnome-session-check-accelerated.c        |   15 +++++++++++++--
 3 files changed, 24 insertions(+), 2 deletions(-)
---
diff --git a/tools/gnome-session-check-accelerated-common.h b/tools/gnome-session-check-accelerated-common.h
index 5cb2a85..59631d9 100644
--- a/tools/gnome-session-check-accelerated-common.h
+++ b/tools/gnome-session-check-accelerated-common.h
@@ -25,3 +25,5 @@
 /* Exit value for helper */
 #define HELPER_ACCEL 0
 #define HELPER_NO_ACCEL 1
+#define HELPER_SOFTWARE_RENDERING 2
+
diff --git a/tools/gnome-session-check-accelerated-helper.c b/tools/gnome-session-check-accelerated-helper.c
index 4575f96..bdbbe77 100644
--- a/tools/gnome-session-check-accelerated-helper.c
+++ b/tools/gnome-session-check-accelerated-helper.c
@@ -90,6 +90,7 @@
 #define SIZE_ERROR -1
 static int max_texture_size = SIZE_UNSET;
 static int max_renderbuffer_size = SIZE_UNSET;
+static gboolean has_llvmpipe = FALSE;
 
 static inline void
 _print_error (const char *str)
@@ -278,6 +279,8 @@ _has_hardware_gl (Display *display)
         renderer = (const char *) glGetString (GL_RENDERER);
         if (_is_gl_renderer_blacklisted (renderer))
                 goto out;
+        if (renderer && strcasestr (renderer, "llvmpipe"))
+               has_llvmpipe = TRUE;
 
         /* we need to get the max texture and renderbuffer sizes while we have
          * a context, but we'll check their values later */
@@ -444,6 +447,12 @@ main (int argc, char **argv)
                 goto out;
         }
 
+        if (has_llvmpipe) {
+                _print_error ("llvmpipe detected.");
+                ret = HELPER_SOFTWARE_RENDERING;
+                goto out;
+        }
+
         ret = HELPER_ACCEL;
 
 out:
diff --git a/tools/gnome-session-check-accelerated.c b/tools/gnome-session-check-accelerated.c
index 3f094cf..14e0e9f 100644
--- a/tools/gnome-session-check-accelerated.c
+++ b/tools/gnome-session-check-accelerated.c
@@ -41,6 +41,7 @@
 #define ACCEL_CHECK_RUNNING 2
 
 static Atom is_accelerated_atom;
+static Atom is_software_rendering_atom;
 static gboolean property_changed;
 
 static void
@@ -106,7 +107,7 @@ main (int argc, char **argv)
         int estatus;
         char *child_argv[] = { LIBEXECDIR "/gnome-session-check-accelerated-helper", NULL };
         Window rootwin;
-        glong is_accelerated;
+        glong is_accelerated, is_software_rendering;
         GError *error = NULL;
 
         gtk_init (NULL, NULL);
@@ -115,6 +116,7 @@ main (int argc, char **argv)
         rootwin = gdk_x11_get_default_root_xwindow ();
 
         is_accelerated_atom = gdk_x11_get_xatom_by_name_for_display (display, "_GNOME_SESSION_ACCELERATED");
+        is_software_rendering_atom = gdk_x11_get_xatom_by_name_for_display (display, 
"_GNOME_IS_SOFTWARE_RENDERING");
 
         {
                 Atom type;
@@ -163,10 +165,12 @@ main (int argc, char **argv)
         if (!g_spawn_sync (NULL, (char**)child_argv, NULL, 0,
                            NULL, NULL, NULL, NULL, &estatus, &error)) {
                 is_accelerated = FALSE;
+                is_software_rendering = FALSE;
                 g_printerr ("gnome-session-check-accelerated: Failed to run helper: %s\n", error->message);
                 g_clear_error (&error);
         } else {
-                is_accelerated = (WEXITSTATUS(estatus) == HELPER_ACCEL);
+                is_accelerated = (WEXITSTATUS(estatus) == HELPER_ACCEL) || (WEXITSTATUS(estatus) == 
HELPER_SOFTWARE_RENDERING);
+                is_software_rendering = (WEXITSTATUS(estatus) == HELPER_SOFTWARE_RENDERING);
                 if (!is_accelerated)
                         g_printerr ("gnome-session-check-accelerated: Helper exited with code %d\n", 
estatus);
         }
@@ -178,6 +182,13 @@ main (int argc, char **argv)
                                XA_CARDINAL, 32, PropModeReplace, (guchar *) &is_accelerated, 1);
        }
 
+       if (is_software_rendering) {
+               XChangeProperty (GDK_DISPLAY_XDISPLAY (display),
+                               rootwin,
+                               is_software_rendering_atom,
+                               XA_CARDINAL, 32, PropModeReplace, (guchar *) &is_software_rendering, 1);
+       }
+
         gdk_display_sync (display);
 
         return is_accelerated ? 0 : 1;


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