[gnome-session] gnome-session-check-accelerated: Set _GNOME_MAX_SCREEN_SIZE on the root window
- From: Bastien Nocera <hadess src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-session] gnome-session-check-accelerated: Set _GNOME_MAX_SCREEN_SIZE on the root window
- Date: Tue, 13 Nov 2012 17:39:42 +0000 (UTC)
commit 313def1d1d20b684367c59d4b1f5b1b5ff1ea1c5
Author: Adam Jackson <ajax redhat com>
Date: Thu Aug 23 10:27:11 2012 -0400
gnome-session-check-accelerated: Set _GNOME_MAX_SCREEN_SIZE on the root window
Compute this from the minimum of the maximum texture size and the
maximum renderbuffer size. gnome-settings-daemon may use this to avoid
setting mode configurations that exceed the screen dimensions.
https://bugzilla.gnome.org/show_bug.cgi?id=688252
tools/gnome-session-check-accelerated-helper.c | 41 ++++++++++++++++++++---
1 files changed, 35 insertions(+), 6 deletions(-)
---
diff --git a/tools/gnome-session-check-accelerated-helper.c b/tools/gnome-session-check-accelerated-helper.c
index 6086bd1..0e24582 100644
--- a/tools/gnome-session-check-accelerated-helper.c
+++ b/tools/gnome-session-check-accelerated-helper.c
@@ -79,6 +79,7 @@
#include <regex.h>
#include <X11/Xlib.h>
+#include <X11/Xatom.h>
#include <X11/extensions/Xcomposite.h>
#include <GL/gl.h>
#include <GL/glx.h>
@@ -86,6 +87,7 @@
#define SIZE_UNSET 0
#define SIZE_ERROR -1
static int max_texture_size = SIZE_UNSET;
+static int max_renderbuffer_size = SIZE_UNSET;
static inline void
_print_error (const char *str)
@@ -287,12 +289,17 @@ _has_hardware_gl (Display *display)
if (_is_gl_renderer_blacklisted (renderer))
goto out;
- /* we need to get the max texture size while we have a context,
- * but we'll check its value later */
+ /* we need to get the max texture and renderbuffer sizes while we have
+ * a context, but we'll check their values later */
+
glGetIntegerv (GL_MAX_TEXTURE_SIZE, &max_texture_size);
if (glGetError() != GL_NO_ERROR)
max_texture_size = SIZE_ERROR;
+ glGetIntegerv (GL_MAX_RENDERBUFFER_SIZE_EXT, &max_renderbuffer_size);
+ if (glGetError() != GL_NO_ERROR)
+ max_renderbuffer_size = SIZE_ERROR;
+
ret = TRUE;
out:
@@ -377,16 +384,38 @@ out:
return ret;
}
+static void
+_set_max_screen_size_property (Display *display, int screen, int size)
+{
+ Atom max_screen_size_atom;
+
+ max_screen_size_atom = XInternAtom (display, "_GNOME_MAX_SCREEN_SIZE",
+ False);
+
+ /* Will be read by gnome-settings-daemon and
+ * gnome-control-center to avoid display configurations where 3D
+ * is not available (and would break gnome-shell) */
+ XChangeProperty (display, RootWindow(display, screen),
+ max_screen_size_atom,
+ XA_CARDINAL, 32, PropModeReplace,
+ (unsigned char *)&size, 1);
+
+ XSync(display, False);
+}
+
static gboolean
_is_max_texture_size_big_enough (Display *display)
{
- int screen;
+ int screen, size;
screen = DefaultScreen (display);
- if (max_texture_size < DisplayWidth (display, screen) ||
- max_texture_size < DisplayHeight (display, screen))
+ size = MIN(max_renderbuffer_size, max_texture_size);
+ if (size < DisplayWidth (display, screen) ||
+ size < DisplayHeight (display, screen))
return FALSE;
+ _set_max_screen_size_property (display, screen, size);
+
return TRUE;
}
@@ -433,7 +462,7 @@ main (int argc, char **argv)
}
if (!_is_max_texture_size_big_enough (display)) {
- _print_error ("GL_MAX_TEXTURE_SIZE is too small.");
+ _print_error ("GL_MAX_{TEXTURE,RENDERBUFFER}_SIZE is too small.");
goto out;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]