-/* 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
#include "utils.h"
#include "visual.h"
+#include "resources.h"
#ifdef HAVE_GL
# include <GL/gl.h>
# 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
-
- int attrs[][20] = {
- { GLX_RGBA, R, 8, G, 8, B, 8, D, 8, GLX_DOUBLEBUFFER, 0 }, /* rgb double */
- { GLX_RGBA, R, 4, G, 4, B, 4, D, 4, GLX_DOUBLEBUFFER, 0 },
- { GLX_RGBA, R, 2, G, 2, B, 2, D, 2, GLX_DOUBLEBUFFER, 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, GLX_DOUBLEBUFFER, 0 }, /* cmap double */
- { I, 4, D, 4, GLX_DOUBLEBUFFER, 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 DB GLX_DOUBLEBUFFER
+# 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)
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)
+# ifdef GLX_NON_CONFORMANT_EXT
printf (" GLX rating: %s\n",
(value == GLX_NONE_EXT ? "none" :
value == GLX_SLOW_VISUAL_EXT ? "slow" :
-# ifdef GLX_NON_CONFORMANT_EXT
value == GLX_NON_CONFORMANT_EXT ? "non-conformant" :
-# endif /* GLX_NON_CONFORMANT_EXT */
"???"));
+# else
+ printf (" GLX rating: %s\n",
+ (value == GLX_NONE_EXT ? "none" :
+ value == GLX_SLOW_VISUAL_EXT ? "slow" :
+ "???"));
+# endif /* GLX_NON_CONFORMANT_EXT */
# endif /* GLX_VISUAL_CAVEAT_EXT */
if (!glXGetConfig (dpy, vi_out, GLX_DOUBLEBUFFER, &value))
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)