Update to the latest glxinfo code in mesa demos git which notably adds

information based on GLX_MESA_query_renderer.

The glxinfo man page isn't present in mesa demos so switch our page to
mdoc and update the flags.

Prompted by an initial diff from brynet@
ok brynet@ kettenis@
This commit is contained in:
jsg 2015-02-03 03:17:20 +00:00
parent d7186e55ad
commit 9411ad8983
4 changed files with 227 additions and 132 deletions

View File

@ -573,6 +573,11 @@ print_limits(const char *extensions, const char *oglstring, int version,
{ 1, GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT, "GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT", "GL_ARB_texture_buffer_object" }, { 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" }, { 1, GL_MAX_TEXTURE_BUFFER_SIZE, "GL_MAX_TEXTURE_BUFFER_SIZE", "GL_ARB_texture_buffer_object" },
#endif #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) #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_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" }, { 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);
}
}
}

View File

@ -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 void
print_extension_list(const char *ext, GLboolean singleLine); print_extension_list(const char *ext, GLboolean singleLine);
@ -86,4 +134,8 @@ const char *
context_flags_string(int mask); context_flags_string(int mask);
void
parse_args(int argc, char *argv[], struct options *options);
#endif /* GLINFO_COMMON_H */ #endif /* GLINFO_COMMON_H */

View File

@ -1,3 +1,4 @@
.\" $OpenBSD: glxinfo.1,v 1.2 2015/02/03 03:17:20 jsg Exp $
.\" $TOG: xdpyinfo.man /main/22 1998/02/09 13:57:10 kaleb $ .\" $TOG: xdpyinfo.man /main/22 1998/02/09 13:57:10 kaleb $
.\" Copyright 1988, 1989, 1994, 1998 The Open Group .\" 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 $ .\" $XFree86: xc/programs/glxinfo/glxinfo.man,v 1.5 2001/12/14 20:00:47 dawes Exp $
.\" .\"
.TH GLXINFO 1 __vendorversion__ .Dd $Mdocdate: February 3 2015 $
.SH NAME .Dt GLXINFO 1
glxinfo \- display info about a GLX extension and OpenGL renderer. .Os
.SH SYNOPSIS .Sh NAME
.B "glxinfo" .Nm glxinfo
[\-t] .Nd display info about a GLX extension and OpenGL renderer.
[\-v] .Sh SYNOPSIS
[\-b] .Nm glxinfo
[\-display \fIdisplayname\fP] .Op Fl bhilstv
.SH DESCRIPTION .Op Fl display Ar displayname
.PP .Sh DESCRIPTION
.I glxinfo .Nm
lists information about the GLX extension, OpenGL capable visuals, and the 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 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 available for each OpenGL capable visual (e.g. whether the visual is double
buffered, the component sizes, Z-buffering depth, etc). buffered, the component sizes, Z-buffering depth, etc).
.PP .Pp
Command line options include: Command line options include:
.TP 8 .Bl -tag -width Ds
.B \-t .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 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. The -t option directs glxinfo to produce a wider, more readable
tabular format. tabular format.
.TP 8 .It Fl v
.B \-v
Directs glxinfo to generate a verbose format output style for Directs glxinfo to generate a verbose format output style for
the visual list similar to the info of xdpyinfo. the visual list similar to the info of xdpyinfo.
.TP 8 .It Fl display Ar displayname
.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"
Specify the display to query. Specify the display to query.
.PP .El
.SH ENVIRONMENT .Sh ENVIRONMENT
.PP .Bl -tag -width Ds -compact
.TP 8 .It Ev DISPLAY
.B DISPLAY
To get the default host, display number, and screen. To get the default host, display number, and screen.
.SH "SEE ALSO" .El
.Sh "SEE ALSO"
xdpyinfo(1) xdpyinfo(1)
.SH AUTHOR .Sh AUTHOR
Brian Paul Brian Paul
.br .br
Modifications for __xservername__ added by Mark Paton Modifications for XFree86 added by Mark Paton

View File

@ -63,13 +63,6 @@
#define GLX_COLOR_INDEX_BIT 0x00000002 #define GLX_COLOR_INDEX_BIT 0x00000002
#endif #endif
typedef enum
{
Normal,
Wide,
Verbose
} InfoMode;
struct visual_attribs 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 * Version of the context that was created
* *
@ -299,7 +268,7 @@ create_context_with_config(Display *dpy, GLXFBConfig config,
* GL that we're aware of. If we don't specify the version * GL that we're aware of. If we don't specify the version
*/ */
int i; 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 */ /* don't bother below GL 3.0 */
if (gl_versions[i].major == 3 && if (gl_versions[i].major == 3 &&
gl_versions[i].minor == 0) 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 static Bool
print_screen_info(Display *dpy, int scrnum, Bool allowDirect, print_screen_info(Display *dpy, int scrnum, Bool allowDirect,
Bool coreProfile, Bool es2Profile, Bool limits, Bool coreProfile, Bool es2Profile, Bool limits,
@ -524,6 +540,8 @@ print_screen_info(Display *dpy, int scrnum, Bool allowDirect,
printf("GLX version: %u.%u\n", glxVersionMajor, glxVersionMinor); printf("GLX version: %u.%u\n", glxVersionMajor, glxVersionMinor);
printf("GLX extensions:\n"); printf("GLX extensions:\n");
print_extension_list(glxExtensions, singleLine); print_extension_list(glxExtensions, singleLine);
if (strstr(glxExtensions, "GLX_MESA_query_renderer"))
query_renderer();
printf("OpenGL vendor string: %s\n", glVendor); printf("OpenGL vendor string: %s\n", glVendor);
printf("OpenGL renderer string: %s\n", glRenderer); printf("OpenGL renderer string: %s\n", glRenderer);
} else } else
@ -1204,76 +1222,24 @@ find_best_visual(Display *dpy, int scrnum)
} }
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 int
main(int argc, char *argv[]) main(int argc, char *argv[])
{ {
char *displayName = NULL;
Display *dpy; Display *dpy;
int numScreens, scrnum; int numScreens, scrnum;
InfoMode mode = Normal; struct options opts;
Bool findBest = False;
Bool limits = False;
Bool allowDirect = True;
Bool singleLine = False;
Bool coreWorked; Bool coreWorked;
int i;
for (i = 1; i < argc; i++) { parse_args(argc, argv, &opts);
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;
}
}
dpy = XOpenDisplay(displayName); dpy = XOpenDisplay(opts.displayName);
if (!dpy) { 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; return -1;
} }
if (findBest) { if (opts.findBest) {
int b; int b;
mesa_hack(dpy, 0); mesa_hack(dpy, 0);
b = find_best_visual(dpy, 0); b = find_best_visual(dpy, 0);
@ -1284,14 +1250,18 @@ main(int argc, char *argv[])
print_display_info(dpy); print_display_info(dpy);
for (scrnum = 0; scrnum < numScreens; scrnum++) { for (scrnum = 0; scrnum < numScreens; scrnum++) {
mesa_hack(dpy, scrnum); mesa_hack(dpy, scrnum);
coreWorked = print_screen_info(dpy, scrnum, allowDirect, True, False, limits, singleLine, False); coreWorked = print_screen_info(dpy, scrnum, opts.allowDirect,
print_screen_info(dpy, scrnum, allowDirect, False, False, limits, singleLine, coreWorked); True, False, opts.limits,
print_screen_info(dpy, scrnum, allowDirect, False, True, False, singleLine, True); 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"); printf("\n");
print_visual_info(dpy, scrnum, mode); print_visual_info(dpy, scrnum, opts.mode);
#ifdef GLX_VERSION_1_3 #ifdef GLX_VERSION_1_3
print_fbconfig_info(dpy, scrnum, mode); print_fbconfig_info(dpy, scrnum, opts.mode);
#endif #endif
if (scrnum + 1 < numScreens) if (scrnum + 1 < numScreens)
printf("\n\n"); printf("\n\n");