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:
parent
d7186e55ad
commit
9411ad8983
@ -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_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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
@ -86,4 +134,8 @@ const char *
|
||||
context_flags_string(int mask);
|
||||
|
||||
|
||||
void
|
||||
parse_args(int argc, char *argv[], struct options *options);
|
||||
|
||||
|
||||
#endif /* GLINFO_COMMON_H */
|
||||
|
@ -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 $
|
||||
.\" 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: February 3 2015 $
|
||||
.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
|
||||
|
@ -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, GLXFBConfig config,
|
||||
* 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 scrnum, Bool allowDirect,
|
||||
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 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
|
||||
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");
|
||||
|
Loading…
Reference in New Issue
Block a user