> Date: Mon, 2 Feb 2015 13:06:34 +1100
> From: Jonathan Gray <[email protected]>
>
> On Sun, Feb 01, 2015 at 06:39:39PM -0500, Bryan Steele wrote:
> > This was committed to the upstream demos, but we include
> > glxinfo/glxgears in xenocara.
> >
> > http://cgit.freedesktop.org/mesa/demos/patch/?id=999b6950c644266bb871e79438751bdba2fa2a08
> >
> > Does this show useful output for anyone?
>
> While that commit is not in a released version of mesa demos
> yet I agree it is worth having.
>
> I'd rather update all of glinxfo than just pull this commit though.
> Here is a diff which does that and I've converted the man page
> to mdoc and updated it as it doesn't seem to be present in mesa demos.
I agree.
> Index: glinfo_common.c
> ===================================================================
> RCS file: /cvs/xenocara/app/glxinfo/glinfo_common.c,v
> retrieving revision 1.1
> diff -u -p -r1.1 glinfo_common.c
> --- glinfo_common.c 13 Jul 2014 09:47:57 -0000 1.1
> +++ glinfo_common.c 2 Feb 2015 01:27:26 -0000
> @@ -573,6 +573,11 @@ print_limits(const char *extensions, con
> { 1, GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT,
> "GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT", "GL_ARB_texture_buffer_object" },
> { 1, GL_MAX_TEXTURE_BUFFER_SIZE, "GL_MAX_TEXTURE_BUFFER_SIZE",
> "GL_ARB_texture_buffer_object" },
> #endif
> +#if defined (GL_ARB_texture_multisample)
> + { 1, GL_MAX_COLOR_TEXTURE_SAMPLES, "GL_MAX_COLOR_TEXTURE_SAMPLES",
> "GL_ARB_texture_multisample" },
> + { 1, GL_MAX_DEPTH_TEXTURE_SAMPLES, "GL_MAX_DEPTH_TEXTURE_SAMPLES",
> "GL_ARB_texture_multisample" },
> + { 1, GL_MAX_INTEGER_SAMPLES, "GL_MAX_INTEGER_SAMPLES",
> "GL_ARB_texture_multisample" },
> +#endif
> #if defined (GL_ARB_uniform_buffer_object)
> { 1, GL_MAX_VERTEX_UNIFORM_BLOCKS, "GL_MAX_VERTEX_UNIFORM_BLOCKS",
> "GL_ARB_uniform_buffer_object" },
> { 1, GL_MAX_FRAGMENT_UNIFORM_BLOCKS, "GL_MAX_FRAGMENT_UNIFORM_BLOCKS",
> "GL_ARB_uniform_buffer_object" },
> @@ -718,3 +723,71 @@ context_flags_string(int mask)
> }
>
>
> +static void
> +usage(void)
> +{
> +#ifdef _WIN32
> + printf("Usage: wglinfo [-v] [-t] [-h] [-b] [-l] [-s]\n");
> +#else
> + printf("Usage: glxinfo [-v] [-t] [-h] [-b] [-l] [-s] [-i] [-display
> <dname>]\n");
> + printf("\t-display <dname>: Print GLX visuals on specified server.\n");
> + printf("\t-i: Force an indirect rendering context.\n");
> +#endif
> + printf("\t-v: Print visuals info in verbose form.\n");
> + printf("\t-t: Print verbose table.\n");
> + printf("\t-h: This information.\n");
> + printf("\t-b: Find the 'best' visual and print its number.\n");
> + printf("\t-l: Print interesting OpenGL limits.\n");
> + printf("\t-s: Print a single extension per line.\n");
> +}
> +
> +
> +void
> +parse_args(int argc, char *argv[], struct options *options)
> +{
> + int i;
> +
> + options->mode = Normal;
> + options->findBest = GL_FALSE;
> + options->limits = GL_FALSE;
> + options->singleLine = GL_FALSE;
> + options->displayName = NULL;
> + options->allowDirect = GL_TRUE;
> +
> + for (i = 1; i < argc; i++) {
> +#ifndef _WIN32
> + if (strcmp(argv[i], "-display") == 0 && i + 1 < argc) {
> + options->displayName = argv[i + 1];
> + i++;
> + }
> + else if (strcmp(argv[i], "-i") == 0) {
> + options->allowDirect = GL_FALSE;
> + }
> + else
> +#endif
> + if (strcmp(argv[i], "-t") == 0) {
> + options->mode = Wide;
> + }
> + else if (strcmp(argv[i], "-v") == 0) {
> + options->mode = Verbose;
> + }
> + else if (strcmp(argv[i], "-b") == 0) {
> + options->findBest = GL_TRUE;
> + }
> + else if (strcmp(argv[i], "-l") == 0) {
> + options->limits = GL_TRUE;
> + }
> + else if (strcmp(argv[i], "-h") == 0) {
> + usage();
> + exit(0);
> + }
> + else if(strcmp(argv[i], "-s") == 0) {
> + options->singleLine = GL_TRUE;
> + }
> + else {
> + printf("Unknown option `%s'\n", argv[i]);
> + usage();
> + exit(0);
> + }
> + }
> +}
> Index: glinfo_common.h
> ===================================================================
> RCS file: /cvs/xenocara/app/glxinfo/glinfo_common.h,v
> retrieving revision 1.1
> diff -u -p -r1.1 glinfo_common.h
> --- glinfo_common.h 13 Jul 2014 09:47:57 -0000 1.1
> +++ glinfo_common.h 2 Feb 2015 01:27:26 -0000
> @@ -63,6 +63,54 @@ struct bit_info
> };
>
>
> +typedef enum
> +{
> + Normal,
> + Wide,
> + Verbose
> +} InfoMode;
> +
> +
> +struct options
> +{
> + InfoMode mode;
> + GLboolean findBest;
> + GLboolean limits;
> + GLboolean singleLine;
> + /* GLX only */
> + char *displayName;
> + GLboolean allowDirect;
> +};
> +
> +
> +/** list of known OpenGL versions */
> +static const struct { int major, minor; } gl_versions[] = {
> + {4, 5},
> + {4, 4},
> + {4, 3},
> + {4, 2},
> + {4, 1},
> + {4, 0},
> +
> + {3, 3},
> + {3, 2},
> + {3, 1},
> + {3, 0},
> +
> + {2, 1},
> + {2, 0},
> +
> + {1, 5},
> + {1, 4},
> + {1, 3},
> + {1, 2},
> + {1, 1},
> + {1, 0},
> +
> + {0, 0} /* end of list */
> +};
> +
> +
> void
> print_extension_list(const char *ext, GLboolean singleLine);
>
> @@ -84,6 +132,10 @@ profile_mask_string(int mask);
>
> const char *
> context_flags_string(int mask);
> +
> +
> +void
> +parse_args(int argc, char *argv[], struct options *options);
>
>
> #endif /* GLINFO_COMMON_H */
> Index: glxinfo.1
> ===================================================================
> RCS file: /cvs/xenocara/app/glxinfo/glxinfo.1,v
> retrieving revision 1.1
> diff -u -p -r1.1 glxinfo.1
> --- glxinfo.1 26 Nov 2006 11:23:56 -0000 1.1
> +++ glxinfo.1 2 Feb 2015 01:59:22 -0000
> @@ -1,3 +1,4 @@
> +.\" $OpenBSD$
> .\" $TOG: xdpyinfo.man /main/22 1998/02/09 13:57:10 kaleb $
> .\" Copyright 1988, 1989, 1994, 1998 The Open Group
> .\"
> @@ -25,55 +26,54 @@
> .\"
> .\" $XFree86: xc/programs/glxinfo/glxinfo.man,v 1.5 2001/12/14 20:00:47
> dawes Exp $
> .\"
> -.TH GLXINFO 1 __vendorversion__
> -.SH NAME
> -glxinfo \- display info about a GLX extension and OpenGL renderer.
> -.SH SYNOPSIS
> -.B "glxinfo"
> -[\-t]
> -[\-v]
> -[\-b]
> -[\-display \fIdisplayname\fP]
> -.SH DESCRIPTION
> -.PP
> -.I glxinfo
> +.Dd $Mdocdate$
> +.Dt GLXINFO 1
> +.Os
> +.Sh NAME
> +.Nm glxinfo
> +.Nd display info about a GLX extension and OpenGL renderer.
> +.Sh SYNOPSIS
> +.Nm glxinfo
> +.Op Fl bhilstv
> +.Op Fl display Ar displayname
> +.Sh DESCRIPTION
> +.Nm
> lists information about the GLX extension, OpenGL capable visuals, and the
> OpenGL renderer on an X server. The GLX and renderer info includes the
> version
> -and extension attributes. The visual info lists the GLX visual attributes
> +and extension attributes. The visual info lists the GLX visual attributes
> available for each OpenGL capable visual (e.g. whether the visual is double
> buffered, the component sizes, Z-buffering depth, etc).
> -.PP
> +.Pp
> Command line options include:
> -.TP 8
> -.B \-t
> +.Bl -tag -width Ds
> +.It Fl b
> +Find the 'best' visual and print its number.
> +.It Fl h
> +Print a short help message.
> +.It Fl i
> +Force an indirect rendering context.
> +.It Fl l
> +Print interesting OpenGL limits.
> +.It Fl s
> +Print a single extension per line.
> +.It Fl t
> By default the visual info is presented in a concise 80 character wide
> tabular format. The -t option directs glxinfo to produce a wider, more
> readable
> tabular format.
> -.TP 8
> -.B \-v
> +.It Fl v
> Directs glxinfo to generate a verbose format output style for
> the visual list similar to the info of xdpyinfo.
> -.TP 8
> -.B \-b
> -Print the ID of the "best" visual on screen 0.
> -.TP 8
> -.B \-l
> -Print interesting OpenGL limits.
> -.TP 8
> -.B \-i
> -Use indirect rendering connection only.
> -.TP 8
> -.BI "\-display " "displayname"
> +.It Fl display Ar displayname
> Specify the display to query.
> -.PP
> -.SH ENVIRONMENT
> -.PP
> -.TP 8
> -.B DISPLAY
> +.El
> +.Sh ENVIRONMENT
> +.Bl -tag -width Ds -compact
> +.It Ev DISPLAY
> To get the default host, display number, and screen.
> -.SH "SEE ALSO"
> +.El
> +.Sh "SEE ALSO"
> xdpyinfo(1)
> -.SH AUTHOR
> +.Sh AUTHOR
> Brian Paul
> .br
> -Modifications for __xservername__ added by Mark Paton
> +Modifications for XFree86 added by Mark Paton
> Index: glxinfo.c
> ===================================================================
> RCS file: /cvs/xenocara/app/glxinfo/glxinfo.c,v
> retrieving revision 1.2
> diff -u -p -r1.2 glxinfo.c
> --- glxinfo.c 13 Jul 2014 09:47:57 -0000 1.2
> +++ glxinfo.c 2 Feb 2015 01:27:26 -0000
> @@ -63,13 +63,6 @@
> #define GLX_COLOR_INDEX_BIT 0x00000002
> #endif
>
> -typedef enum
> -{
> - Normal,
> - Wide,
> - Verbose
> -} InfoMode;
> -
>
> struct visual_attribs
> {
> @@ -109,30 +102,6 @@ struct visual_attribs
> };
>
>
> -/** list of known OpenGL versions */
> -static const struct { int major, minor; } gl_versions[] = {
> - {1, 0},
> - {1, 1},
> - {1, 2},
> - {1, 3},
> - {1, 4},
> - {1, 5},
> - {2, 0},
> - {2, 1},
> - {3, 0},
> - {3, 1},
> - {3, 2},
> - {3, 3},
> - {4, 0},
> - {4, 1},
> - {4, 2},
> - {4, 3},
> - {4, 4},
> - {0, 0} /* end of list */
> -};
> -
> -#define NUM_GL_VERSIONS ELEMENTS(gl_versions)
> -
> /**
> * Version of the context that was created
> *
> @@ -299,7 +268,7 @@ create_context_with_config(Display *dpy,
> * GL that we're aware of. If we don't specify the version
> */
> int i;
> - for (i = NUM_GL_VERSIONS - 2; i > 0 ; i--) {
> + for (i = 0; gl_versions[i].major > 0; i++) {
> /* don't bother below GL 3.0 */
> if (gl_versions[i].major == 3 &&
> gl_versions[i].minor == 0)
> @@ -373,6 +342,53 @@ choose_xvisinfo(Display *dpy, int scrnum
> }
>
>
> +static void
> +query_renderer(void)
> +{
> +#ifdef GLX_MESA_query_renderer
> + PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC queryInteger;
> + PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC queryString;
> + unsigned int v[3];
> +
> + queryInteger = (PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC)
> + glXGetProcAddressARB((const GLubyte *)
> + "glXQueryCurrentRendererIntegerMESA");
> + queryString = (PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC)
> + glXGetProcAddressARB((const GLubyte *)
> + "glXQueryCurrentRendererStringMESA");
> +
> + printf("Extended renderer info (GLX_MESA_query_renderer):\n");
> + queryInteger(GLX_RENDERER_VENDOR_ID_MESA, v);
> + printf(" Vendor: %s (0x%x)\n",
> + queryString(GLX_RENDERER_VENDOR_ID_MESA), *v);
> + queryInteger(GLX_RENDERER_DEVICE_ID_MESA, v);
> + printf(" Device: %s (0x%x)\n",
> + queryString(GLX_RENDERER_DEVICE_ID_MESA), *v);
> + queryInteger(GLX_RENDERER_VERSION_MESA, v);
> + printf(" Version: %d.%d.%d\n", v[0], v[1], v[2]);
> + queryInteger(GLX_RENDERER_ACCELERATED_MESA, v);
> + printf(" Accelerated: %s\n", *v ? "yes" : "no");
> + queryInteger(GLX_RENDERER_VIDEO_MEMORY_MESA, v);
> + printf(" Video memory: %dMB\n", *v);
> + queryInteger(GLX_RENDERER_UNIFIED_MEMORY_ARCHITECTURE_MESA, v);
> + printf(" Unified memory: %s\n", *v ? "yes" : "no");
> + queryInteger(GLX_RENDERER_PREFERRED_PROFILE_MESA, v);
> + printf(" Preferred profile: %s (0x%x)\n",
> + *v == GLX_CONTEXT_CORE_PROFILE_BIT_ARB ? "core" :
> + *v == GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB ? "compat" :
> + "unknown", *v);
> + queryInteger(GLX_RENDERER_OPENGL_CORE_PROFILE_VERSION_MESA, v);
> + printf(" Max core profile version: %d.%d\n", v[0], v[1]);
> + queryInteger(GLX_RENDERER_OPENGL_COMPATIBILITY_PROFILE_VERSION_MESA, v);
> + printf(" Max compat profile version: %d.%d\n", v[0], v[1]);
> + queryInteger(GLX_RENDERER_OPENGL_ES_PROFILE_VERSION_MESA, v);
> + printf(" Max GLES1 profile version: %d.%d\n", v[0], v[1]);
> + queryInteger(GLX_RENDERER_OPENGL_ES2_PROFILE_VERSION_MESA, v);
> + printf(" Max GLES[23] profile version: %d.%d\n", v[0], v[1]);
> +#endif
> +}
> +
> +
> static Bool
> print_screen_info(Display *dpy, int scrnum, Bool allowDirect,
> Bool coreProfile, Bool es2Profile, Bool limits,
> @@ -524,6 +540,8 @@ print_screen_info(Display *dpy, int scrn
> printf("GLX version: %u.%u\n", glxVersionMajor, glxVersionMinor);
> printf("GLX extensions:\n");
> print_extension_list(glxExtensions, singleLine);
> + if (strstr(glxExtensions, "GLX_MESA_query_renderer"))
> + query_renderer();
> printf("OpenGL vendor string: %s\n", glVendor);
> printf("OpenGL renderer string: %s\n", glRenderer);
> } else
> @@ -1204,76 +1222,24 @@ find_best_visual(Display *dpy, int scrnu
> }
>
>
> -static void
> -usage(void)
> -{
> - printf("Usage: glxinfo [-v] [-t] [-h] [-i] [-b] [-s] [-display
> <dname>]\n");
> - printf("\t-v: Print visuals info in verbose form.\n");
> - printf("\t-t: Print verbose table.\n");
> - printf("\t-display <dname>: Print GLX visuals on specified server.\n");
> - printf("\t-h: This information.\n");
> - printf("\t-i: Force an indirect rendering context.\n");
> - printf("\t-b: Find the 'best' visual and print its number.\n");
> - printf("\t-l: Print interesting OpenGL limits.\n");
> - printf("\t-s: Print a single extension per line.\n");
> -}
> -
> -
> int
> main(int argc, char *argv[])
> {
> - char *displayName = NULL;
> Display *dpy;
> int numScreens, scrnum;
> - InfoMode mode = Normal;
> - Bool findBest = False;
> - Bool limits = False;
> - Bool allowDirect = True;
> - Bool singleLine = False;
> + struct options opts;
> Bool coreWorked;
> - int i;
>
> - for (i = 1; i < argc; i++) {
> - if (strcmp(argv[i], "-display") == 0 && i + 1 < argc) {
> - displayName = argv[i + 1];
> - i++;
> - }
> - else if (strcmp(argv[i], "-t") == 0) {
> - mode = Wide;
> - }
> - else if (strcmp(argv[i], "-v") == 0) {
> - mode = Verbose;
> - }
> - else if (strcmp(argv[i], "-b") == 0) {
> - findBest = True;
> - }
> - else if (strcmp(argv[i], "-i") == 0) {
> - allowDirect = False;
> - }
> - else if (strcmp(argv[i], "-l") == 0) {
> - limits = True;
> - }
> - else if (strcmp(argv[i], "-h") == 0) {
> - usage();
> - return 0;
> - }
> - else if (strcmp(argv[i], "-s") == 0) {
> - singleLine = True;
> - }
> - else {
> - printf("Unknown option `%s'\n", argv[i]);
> - usage();
> - return 0;
> - }
> - }
> + parse_args(argc, argv, &opts);
>
> - dpy = XOpenDisplay(displayName);
> + dpy = XOpenDisplay(opts.displayName);
> if (!dpy) {
> - fprintf(stderr, "Error: unable to open display %s\n",
> XDisplayName(displayName));
> + fprintf(stderr, "Error: unable to open display %s\n",
> + XDisplayName(opts.displayName));
> return -1;
> }
>
> - if (findBest) {
> + if (opts.findBest) {
> int b;
> mesa_hack(dpy, 0);
> b = find_best_visual(dpy, 0);
> @@ -1284,14 +1250,18 @@ main(int argc, char *argv[])
> print_display_info(dpy);
> for (scrnum = 0; scrnum < numScreens; scrnum++) {
> mesa_hack(dpy, scrnum);
> - coreWorked = print_screen_info(dpy, scrnum, allowDirect, True,
> False, limits, singleLine, False);
> - print_screen_info(dpy, scrnum, allowDirect, False, False, limits,
> singleLine, coreWorked);
> - print_screen_info(dpy, scrnum, allowDirect, False, True, False,
> singleLine, True);
> + coreWorked = print_screen_info(dpy, scrnum, opts.allowDirect,
> + True, False, opts.limits,
> + opts.singleLine, False);
> + print_screen_info(dpy, scrnum, opts.allowDirect, False, False,
> + opts.limits, opts.singleLine, coreWorked);
> + print_screen_info(dpy, scrnum, opts.allowDirect, False, True, False,
> + opts.singleLine, True);
>
> printf("\n");
> - print_visual_info(dpy, scrnum, mode);
> + print_visual_info(dpy, scrnum, opts.mode);
> #ifdef GLX_VERSION_1_3
> - print_fbconfig_info(dpy, scrnum, mode);
> + print_fbconfig_info(dpy, scrnum, opts.mode);
> #endif
> if (scrnum + 1 < numScreens)
> printf("\n\n");
>
>