From http://www.jwz.org/xscreensaver/xscreensaver-5.40.tar.gz
[xscreensaver] / utils / visual-gl.c
index 054bfaf2b6b061549d2a8add3a208383146adb98..c4b940b4bee0a5135ebaeff4fd5e2526aa7184d6 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1999, 2000 by Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1999-2018 by Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -22,6 +22,7 @@
 
 #include "utils.h"
 #include "visual.h"
+#include "resources.h"
 
 #ifdef HAVE_GL
 # include <GL/gl.h>
@@ -40,26 +41,62 @@ get_gl_visual (Screen *screen)
 # define R GLX_RED_SIZE
 # define G GLX_GREEN_SIZE
 # define B GLX_BLUE_SIZE
+# define A GLX_ALPHA_SIZE
 # define D GLX_DEPTH_SIZE
 # define I GLX_BUFFER_SIZE
 # define DB GLX_DOUBLEBUFFER
-
-  int attrs[][20] = {
-    { GLX_RGBA, R, 8, G, 8, B, 8, D, 8, DB, 0 }, /* rgb double */
-    { GLX_RGBA, R, 4, G, 4, B, 4, D, 4, DB, 0 },
-    { GLX_RGBA, R, 2, G, 2, B, 2, D, 2, DB, 0 },
-    { GLX_RGBA, R, 8, G, 8, B, 8, D, 8,     0 }, /* rgb single */
-    { GLX_RGBA, R, 4, G, 4, B, 4, D, 4,     0 },
-    { GLX_RGBA, R, 2, G, 2, B, 2, D, 2,     0 },
-    { I, 8,                       D, 8, DB, 0 }, /* cmap double */
-    { I, 4,                       D, 4, DB, 0 },
-    { I, 8,                       D, 8,     0 }, /* cmap single */
-    { I, 4,                       D, 4,     0 },
-    { GLX_RGBA, R, 1, G, 1, B, 1, D, 1,     0 }  /* monochrome */
+# define ST GLX_STENCIL_SIZE
+
+# if defined(GLX_SAMPLE_BUFFERS) /* Needs to come before GL_SAMPLE_BUFFERS */
+#  define SB GLX_SAMPLE_BUFFERS
+#  define SM GLX_SAMPLES
+# elif defined(GLX_SAMPLE_BUFFERS_ARB)
+#  define SB GLX_SAMPLE_BUFFERS_ARB
+#  define SM GLX_SAMPLES_ARB
+# elif defined(GLX_SAMPLE_BUFFERS_SGIS)
+#  define SB GLX_SAMPLE_BUFFERS_SGIS
+#  define SM GLX_SAMPLES_SGIS
+# elif defined(GL_SAMPLE_BUFFERS)
+#  define SB GL_SAMPLE_BUFFERS
+#  define SM GL_SAMPLES
+# endif
+
+
+  int attrs[][40] = {
+# ifdef SB                               /* rgba double stencil multisample */
+   { GLX_RGBA, R,8, G,8, B,8, A,8, D,8, DB, ST,1, SB,1, SM,8, 0 },
+   { GLX_RGBA, R,8, G,8, B,8, A,8, D,8, DB, ST,1, SB,1, SM,6, 0 },
+   { GLX_RGBA, R,8, G,8, B,8, A,8, D,8, DB, ST,1, SB,1, SM,4, 0 },
+   { GLX_RGBA, R,8, G,8, B,8, A,8, D,8, DB, ST,1, SB,1, SM,2, 0 },
+#  define SB_COUNT 4 /* #### Kludgey count of preceeding lines! */
+# endif
+   { GLX_RGBA, R,8, G,8, B,8, A,8, D,8, DB, ST,1, 0 }, /* rgba double stencil */
+   { GLX_RGBA, R,8, G,8, B,8,      D,8, DB, ST,1, 0 }, /* rgb  double stencil */
+   { GLX_RGBA, R,4, G,4, B,4,      D,4, DB, ST,1, 0 },
+   { GLX_RGBA, R,2, G,2, B,2,      D,2, DB, ST,1, 0 },
+   { GLX_RGBA, R,8, G,8, B,8, A,8, D,8, DB,       0 }, /* rgba double */
+   { GLX_RGBA, R,8, G,8, B,8,      D,8, DB,       0 }, /* rgb  double */
+   { GLX_RGBA, R,4, G,4, B,4,      D,4, DB,       0 },
+   { GLX_RGBA, R,2, G,2, B,2,      D,2, DB,       0 },
+   { GLX_RGBA, R,8, G,8, B,8, A,8, D,8,           0 }, /* rgba single */
+   { GLX_RGBA, R,8, G,8, B,8,      D,8,           0 }, /* rgb  single */
+   { GLX_RGBA, R,4, G,4, B,4,      D,4,           0 },
+   { GLX_RGBA, R,2, G,2, B,2,      D,2,           0 },
+   { I, 8,                         D,8, DB,       0 }, /* cmap double */
+   { I, 4,                         D,4, DB,       0 },
+   { I, 8,                         D,8,           0 }, /* cmap single */
+   { I, 4,                         D,4,           0 },
+   { GLX_RGBA, R,1, G,1, B,1,      D,1,           0 }  /* monochrome */
   };
 
-  int i;
-  for (i = 0; i < sizeof(attrs)/sizeof(*attrs); i++)
+  int i = 0;
+
+# ifdef SB
+  if (! get_boolean_resource (dpy, "multiSample", "MultiSample"))
+    i = SB_COUNT;  /* skip over the multibuffer entries in 'attrs' */
+# endif /* SB */
+
+  for (; i < sizeof(attrs)/sizeof(*attrs); i++)
     {
       XVisualInfo *vi = glXChooseVisual (dpy, screen_num, attrs[i]);
       if (vi)
@@ -136,6 +173,18 @@ describe_gl_visual (FILE *f, Screen *screen, Visual *visual,
         printf ("    GLX type:          indexed (%d)\n", value);
       }
 
+# ifndef  GLX_NONE_EXT       /* Hooray for gratuitious name changes. */
+#  define GLX_NONE_EXT                    GLX_NONE
+#  define GLX_TRANSPARENT_TYPE_EXT        GLX_TRANSPARENT_TYPE
+#  define GLX_TRANSPARENT_INDEX_EXT       GLX_TRANSPARENT_INDEX
+#  define GLX_TRANSPARENT_INDEX_VALUE_EXT GLX_TRANSPARENT_INDEX_VALUE
+#  define GLX_TRANSPARENT_RGB_EXT         GLX_TRANSPARENT_RGB
+#  define GLX_TRANSPARENT_RED_VALUE_EXT   GLX_TRANSPARENT_RED_VALUE
+#  define GLX_TRANSPARENT_GREEN_VALUE_EXT GLX_TRANSPARENT_GREEN_VALUE
+#  define GLX_TRANSPARENT_BLUE_VALUE_EXT  GLX_TRANSPARENT_BLUE_VALUE
+#  define GLX_TRANSPARENT_ALPHA_VALUE_EXT GLX_TRANSPARENT_ALPHA_VALUE
+# endif
+
 # ifdef GLX_VISUAL_CAVEAT_EXT
     if (!glXGetConfig (dpy, vi_out, GLX_VISUAL_CAVEAT_EXT, &value) &&
         value != GLX_NONE_EXT)
@@ -171,15 +220,15 @@ describe_gl_visual (FILE *f, Screen *screen, Visual *visual,
         value != 0)
       printf ("    GLX stencil size:  %d\n", value);
 
-# ifdef GLX_SAMPLE_BUFFERS_SGIS
-    if (!glXGetConfig (dpy, vi_out, GLX_SAMPLE_BUFFERS_SGIS, &value) &&
+# ifdef SB  /* GL_SAMPLE_BUFFERS || GLX_SAMPLE_BUFFERS_* */
+    if (!glXGetConfig (dpy, vi_out, SB, &value) &&
         value != 0)
       {
         int bufs = value;
-        if (!glXGetConfig (dpy, vi_out, GLX_SAMPLES_SGIS, &value))
-          printf ("    GLX multisamplers: %d (%d)\n", bufs, value);
+        if (!glXGetConfig (dpy, vi_out, SM, &value))
+          printf ("    GLX multisample:   %d, %d\n", bufs, value);
       }
-# endif /* GLX_SAMPLE_BUFFERS_SGIS */
+# endif  /* GL_SAMPLE_BUFFERS || GLX_SAMPLE_BUFFERS_* */
 
     if (!glXGetConfig (dpy, vi_out, GLX_TRANSPARENT_TYPE_EXT, &value) &&
         value != GLX_NONE_EXT)