> 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");
> 
> 

Reply via email to