#define GLX_GLXEXT_PROTOTYPES
+#include <assert.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <GL/gl.h>
int accumRedSize, accumGreenSize, accumBlueSize, accumAlphaSize;
int numSamples, numMultisample;
int visualCaveat;
+ int floatComponents;
+ int srgb;
};
return "rgba|ci";
default:
return "";
- }
+ }
+}
+
+static const char *
+caveat_string(int caveat)
+{
+ switch (caveat) {
+#ifdef GLX_EXT_visual_rating
+ case GLX_SLOW_VISUAL_EXT:
+ return "Slow";
+ case GLX_NON_CONFORMANT_VISUAL_EXT:
+ return "Ncon";
+ case GLX_NONE_EXT:
+ /* fall-through */
+#endif
+ case 0:
+ /* fall-through */
+ default:
+ return "None";
+ }
}
+
static GLboolean
get_visual_attribs(Display *dpy, XVisualInfo *vInfo,
struct visual_attribs *attribs)
attribs->visualCaveat = 0;
#endif
+#if defined(GLX_EXT_framebuffer_sRGB)
+ if (ext && strstr(ext, "GLX_EXT_framebuffer_sRGB")) {
+ glXGetConfig(dpy, vInfo, GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT, &attribs->srgb);
+ }
+#endif
+
return GL_TRUE;
}
get_fbconfig_attribs(Display *dpy, GLXFBConfig fbconfig,
struct visual_attribs *attribs)
{
+ const char *ext = glXQueryExtensionsString(dpy, 0);
int visual_type;
XVisualInfo *vInfo;
glXGetFBConfigAttrib(dpy, fbconfig, GLX_SAMPLES, &attribs->numSamples);
glXGetFBConfigAttrib(dpy, fbconfig, GLX_CONFIG_CAVEAT, &attribs->visualCaveat);
+#if defined(GLX_NV_float_buffer)
+ if (ext && strstr(ext, "GLX_NV_float_buffer")) {
+ glXGetFBConfigAttrib(dpy, fbconfig, GLX_FLOAT_COMPONENTS_NV, &attribs->floatComponents);
+ }
+#endif
+#if defined(GLX_ARB_fbconfig_float)
+ if (ext && strstr(ext, "GLX_ARB_fbconfig_float")) {
+ if (attribs->render_type & GLX_RGBA_FLOAT_BIT_ARB) {
+ attribs->floatComponents = True;
+ }
+ }
+#endif
+
+#if defined(GLX_EXT_framebuffer_sRGB)
+ if (ext && strstr(ext, "GLX_EXT_framebuffer_sRGB")) {
+ glXGetFBConfigAttrib(dpy, fbconfig, GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT, &attribs->srgb);
+ }
+#endif
return GL_TRUE;
}
attribs->bufferSize, attribs->level,
visual_render_type_name(attribs->render_type),
attribs->doubleBuffer, attribs->stereo);
- printf(" rgba: redSize=%d greenSize=%d blueSize=%d alphaSize=%d\n",
+ printf(" rgba: redSize=%d greenSize=%d blueSize=%d alphaSize=%d float=%c sRGB=%c\n",
attribs->redSize, attribs->greenSize,
- attribs->blueSize, attribs->alphaSize);
+ attribs->blueSize, attribs->alphaSize,
+ attribs->floatComponents ? 'Y' : 'N',
+ attribs->srgb ? 'Y' : 'N');
printf(" auxBuffers=%d depthSize=%d stencilSize=%d\n",
attribs->auxBuffers, attribs->depthSize, attribs->stencilSize);
printf(" accum: redSize=%d greenSize=%d blueSize=%d alphaSize=%d\n",
static void
print_visual_attribs_short_header(void)
{
- printf(" visual x bf lv rg d st colorbuffer ax dp st accumbuffer ms cav\n");
- printf(" id dep cl sp sz l ci b ro r g b a bf th cl r g b a ns b eat\n");
- printf("----------------------------------------------------------------------\n");
+ printf(" visual x bf lv rg d st colorbuffer sr ax dp st accumbuffer ms cav\n");
+ printf(" id dep cl sp sz l ci b ro r g b a F gb bf th cl r g b a ns b eat\n");
+ printf("----------------------------------------------------------------------------\n");
}
static void
print_visual_attribs_short(const struct visual_attribs *attribs)
{
- char *caveat = NULL;
-#ifdef GLX_EXT_visual_rating
- if (attribs->visualCaveat == GLX_NONE_EXT || attribs->visualCaveat == 0)
- caveat = "None";
- else if (attribs->visualCaveat == GLX_SLOW_VISUAL_EXT)
- caveat = "Slow";
- else if (attribs->visualCaveat == GLX_NON_CONFORMANT_VISUAL_EXT)
- caveat = "Ncon";
- else
- caveat = "None";
-#else
- caveat = "None";
-#endif
+ const char *caveat = caveat_string(attribs->visualCaveat);
- printf("0x%02x %2d %2s %2d %2d %2d %c%c %c %c %2d %2d %2d %2d %2d %2d %2d",
+ printf("0x%03x %2d %2s %2d %3d %2d %c%c %c %c %2d %2d %2d %2d %c %c %2d %2d %2d",
attribs->id,
attribs->depth,
visual_class_abbrev(attribs->klass),
attribs->stereo ? 'y' : '.',
attribs->redSize, attribs->greenSize,
attribs->blueSize, attribs->alphaSize,
+ attribs->floatComponents ? 'f' : '.',
+ attribs->srgb ? 's' : '.',
attribs->auxBuffers,
attribs->depthSize,
attribs->stencilSize
static void
print_visual_attribs_long_header(void)
{
- printf("Vis Vis Visual Trans buff lev render DB ste r g b a aux dep ste accum buffers MS MS\n");
- printf(" ID Depth Type parent size el type reo sz sz sz sz buf th ncl r g b a num bufs\n");
- printf("----------------------------------------------------------------------------------------------------\n");
+ printf("Vis Vis Visual Trans buff lev render DB ste r g b a s aux dep ste accum buffer MS MS \n");
+ printf(" ID Depth Type parent size el type reo sz sz sz sz flt rgb buf th ncl r g b a num bufs caveats\n");
+ printf("--------------------------------------------------------------------------------------------------------------------\n");
}
static void
print_visual_attribs_long(const struct visual_attribs *attribs)
{
- printf("0x%2x %2d %-11s %2d %2d %2d %4s %3d %3d %3d %3d %3d %3d",
+ const char *caveat = caveat_string(attribs->visualCaveat);
+
+ printf("0x%3x %2d %-11s %2d %3d %2d %4s %3d %3d %3d %3d %3d %3d",
attribs->id,
attribs->depth,
visual_class_name(attribs->klass),
attribs->blueSize, attribs->alphaSize
);
- printf(" %3d %4d %2d %3d %3d %3d %3d %2d %2d\n",
+ printf(" %c %c %3d %4d %2d %3d %3d %3d %3d %2d %2d %6s\n",
+ attribs->floatComponents ? 'f' : '.',
+ attribs->srgb ? 's' : '.',
attribs->auxBuffers,
attribs->depthSize,
attribs->stencilSize,
attribs->accumRedSize, attribs->accumGreenSize,
attribs->accumBlueSize, attribs->accumAlphaSize,
- attribs->numSamples, attribs->numMultisample
+ attribs->numSamples, attribs->numMultisample,
+ caveat
);
}