update glxinfo to mesa-demos 8.4.0

This commit is contained in:
jsg 2018-02-23 10:37:24 +00:00
parent ff54d44d65
commit 5397eac377
4 changed files with 303 additions and 60 deletions

View File

@ -30,6 +30,18 @@
#define snprintf _snprintf
#endif
#ifndef GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT
#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x00000001
#endif
#ifndef GL_CONTEXT_FLAG_DEBUG_BIT
#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002
#endif
#ifndef GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB
#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB 0x00000004
#endif
#ifndef GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR
#define GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR 0x00000008
#endif
/**
* Return the GL enum name for a numeric value.
@ -289,9 +301,13 @@ build_core_profile_extension_list(const struct ext_functions *extfuncs)
totalLen = 0;
for (i = 0; i < n; i++) {
const char *ext = (const char *) extfuncs->GetStringi(GL_EXTENSIONS, i);
totalLen += strlen(ext) + 1; /* plus a space */
if (ext)
totalLen += strlen(ext) + 1; /* plus a space */
}
if (!totalLen)
return NULL;
buffer = malloc(totalLen + 1);
if (buffer) {
int pos = 0;
@ -594,12 +610,145 @@ print_limits(const char *extensions, const char *oglstring, int version,
{ 1, GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET, "GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET", "GL_ARB_vertex_attrib_binding" },
{ 1, GL_MAX_VERTEX_ATTRIB_BINDINGS, "GL_MAX_VERTEX_ATTRIB_BINDINGS", "GL_ARB_vertex_attrib_binding" },
#endif
#if defined(GL_ARB_tessellation_shader)
{ 1, GL_MAX_TESS_GEN_LEVEL, "GL_MAX_TESS_GEN_LEVEL", "GL_ARB_tessellation_shader" },
{ 1, GL_MAX_TESS_PATCH_COMPONENTS, "GL_MAX_TESS_PATCH_COMPONENTS", "GL_ARB_tessellation_shader" },
{ 1, GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS, "GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS", "GL_ARB_tessellation_shader" },
{ 1, GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS, "GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS", "GL_ARB_tessellation_shader" },
{ 1, GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS, "GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS", "GL_ARB_tessellation_shader" },
{ 1, GL_MAX_TESS_CONTROL_INPUT_COMPONENTS, "GL_MAX_TESS_CONTROL_INPUT_COMPONENTS", "GL_ARB_tessellation_shader" },
{ 1, GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS, "GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS", "GL_ARB_tessellation_shader" },
{ 1, GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS, "GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS", "GL_ARB_tessellation_shader" },
{ 1, GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS, "GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS", "GL_ARB_tessellation_shader" },
{ 1, GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS, "GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS", "GL_ARB_tessellation_shader" },
{ 1, GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS, "GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS", "GL_ARB_tessellation_shader" },
{ 1, GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS, "GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS", "GL_ARB_tessellation_shader" },
{ 1, GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS, "GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS", "GL_ARB_tessellation_shader" },
{ 1, GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS, "GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS", "GL_ARB_tessellation_shader" },
{ 1, GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS, "GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS", "GL_ARB_tessellation_shader" },
#endif
#if defined(GL_VERSION_3_0)
{ 1, GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS, "GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS", "3.0" },
{ 1, GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS, "GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS", "3.0" },
{ 1, GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS, "GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS", "3.0" },
#endif
#if defined(GL_VERSION_3_1)
{ 1, GL_MAX_TEXTURE_BUFFER_SIZE, "GL_MAX_TEXTURE_BUFFER_SIZE", "3.1" },
{ 1, GL_MAX_RECTANGLE_TEXTURE_SIZE, "GL_MAX_RECTANGLE_TEXTURE_SIZE", "3.1" },
#endif
#if defined(GL_VERSION_3_2)
{ 1, GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS, "GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS", "3.2" },
{ 1, GL_MAX_GEOMETRY_UNIFORM_COMPONENTS, "GL_MAX_GEOMETRY_UNIFORM_COMPONENTS", "3.2" },
{ 1, GL_MAX_GEOMETRY_OUTPUT_VERTICES, "GL_MAX_GEOMETRY_OUTPUT_VERTICES", "3.2" },
{ 1, GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS, "GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS", "3.2" },
{ 1, GL_MAX_VERTEX_OUTPUT_COMPONENTS, "GL_MAX_VERTEX_OUTPUT_COMPONENTS", "3.2" },
{ 1, GL_MAX_GEOMETRY_INPUT_COMPONENTS, "GL_MAX_GEOMETRY_INPUT_COMPONENTS", "3.2" },
{ 1, GL_MAX_GEOMETRY_OUTPUT_COMPONENTS, "GL_MAX_GEOMETRY_OUTPUT_COMPONENTS", "3.2" },
{ 1, GL_MAX_FRAGMENT_INPUT_COMPONENTS, "GL_MAX_FRAGMENT_INPUT_COMPONENTS", "3.2" },
{ 1, GL_MAX_SERVER_WAIT_TIMEOUT, "GL_MAX_SERVER_WAIT_TIMEOUT", "3.2" },
{ 1, GL_MAX_SAMPLE_MASK_WORDS, "GL_MAX_SAMPLE_MASK_WORDS", "3.2" },
{ 1, GL_MAX_COLOR_TEXTURE_SAMPLES, "GL_MAX_COLOR_TEXTURE_SAMPLES", "3.2" },
{ 1, GL_MAX_DEPTH_TEXTURE_SAMPLES, "GL_MAX_DEPTH_TEXTURE_SAMPLES", "3.2" },
{ 1, GL_MAX_INTEGER_SAMPLES, "GL_MAX_INTEGER_SAMPLES", "3.2" },
#endif
#if defined(GL_VERSION_3_3)
{ 1, GL_MAX_DUAL_SOURCE_DRAW_BUFFERS, "GL_MAX_DUAL_SOURCE_DRAW_BUFFERS", "3.3" },
#endif
#if defined(GL_VERSION_4_0)
{ 1, GL_MAX_TRANSFORM_FEEDBACK_BUFFERS, "GL_MAX_TRANSFORM_FEEDBACK_BUFFERS", "4.0" },
#endif
#if defined(GL_VERSION_4_1)
{ 1, GL_MAX_VERTEX_UNIFORM_VECTORS, "GL_MAX_VERTEX_UNIFORM_VECTORS", "4.1" },
{ 1, GL_MAX_VARYING_VECTORS, "GL_MAX_VARYING_VECTORS", "4.1" },
{ 1, GL_MAX_FRAGMENT_UNIFORM_VECTORS, "GL_MAX_FRAGMENT_UNIFORM_VECTORS", "4.1" },
#endif
#if defined(GL_VERSION_4_2)
{ 1, GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS, "GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS", "4.2" },
{ 1, GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS, "GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS", "4.2" },
{ 1, GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS, "GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS", "4.2" },
{ 1, GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS, "GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS", "4.2" },
{ 1, GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS, "GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS", "4.2" },
{ 1, GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS, "GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS", "4.2" },
{ 1, GL_MAX_VERTEX_ATOMIC_COUNTERS, "GL_MAX_VERTEX_ATOMIC_COUNTERS", "4.2" },
{ 1, GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS, "GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS", "4.2" },
{ 1, GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS, "GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS", "4.2" },
{ 1, GL_MAX_GEOMETRY_ATOMIC_COUNTERS, "GL_MAX_GEOMETRY_ATOMIC_COUNTERS", "4.2" },
{ 1, GL_MAX_FRAGMENT_ATOMIC_COUNTERS, "GL_MAX_FRAGMENT_ATOMIC_COUNTERS", "4.2" },
{ 1, GL_MAX_COMBINED_ATOMIC_COUNTERS, "GL_MAX_COMBINED_ATOMIC_COUNTERS", "4.2" },
{ 1, GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE, "GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE", "4.2" },
{ 1, GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS, "GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS", "4.2" },
{ 1, GL_MAX_IMAGE_UNITS, "GL_MAX_IMAGE_UNITS", "4.2" },
{ 1, GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS, "GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS", "4.2" },
{ 1, GL_MAX_IMAGE_SAMPLES, "GL_MAX_IMAGE_SAMPLES", "4.2" },
{ 1, GL_MAX_VERTEX_IMAGE_UNIFORMS , "GL_MAX_VERTEX_IMAGE_UNIFORMS", "4.2" },
{ 1, GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS, "GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS", "4.2" },
{ 1, GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS, "GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS", "4.2" },
{ 1, GL_MAX_GEOMETRY_IMAGE_UNIFORMS, "GL_MAX_GEOMETRY_IMAGE_UNIFORMS", "4.2" },
{ 1, GL_MAX_FRAGMENT_IMAGE_UNIFORMS, "GL_MAX_FRAGMENT_IMAGE_UNIFORMS", "4.2" },
{ 1, GL_MAX_COMBINED_IMAGE_UNIFORMS, "GL_MAX_COMBINED_IMAGE_UNIFORMS", "4.2" },
#endif
#if defined(GL_VERSION_4_3)
{ 1, GL_MAX_ELEMENT_INDEX, "GL_MAX_ELEMENT_INDEX", "4.3" },
{ 1, GL_MAX_COMPUTE_UNIFORM_BLOCKS, "GL_MAX_COMPUTE_UNIFORM_BLOCKS", "4.3" },
{ 1, GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS, "GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS", "4.3" },
{ 1, GL_MAX_COMPUTE_IMAGE_UNIFORMS, "GL_MAX_COMPUTE_IMAGE_UNIFORMS", "4.3" },
{ 1, GL_MAX_COMPUTE_SHARED_MEMORY_SIZE, "GL_MAX_COMPUTE_SHARED_MEMORY_SIZE", "4.3" },
{ 1, GL_MAX_COMPUTE_UNIFORM_COMPONENTS, "GL_MAX_COMPUTE_UNIFORM_COMPONENTS", "4.3" },
{ 1, GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS, "GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS", "4.3" },
{ 1, GL_MAX_COMPUTE_ATOMIC_COUNTERS, "GL_MAX_COMPUTE_ATOMIC_COUNTERS", "4.3" },
{ 1, GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS, "GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS", "4.3" },
{ 1, GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS, "GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS", "4.3" },
{ 1, GL_MAX_COMPUTE_WORK_GROUP_COUNT, "GL_MAX_COMPUTE_WORK_GROUP_COUNT", "4.3" },
{ 1, GL_MAX_COMPUTE_WORK_GROUP_SIZE, "GL_MAX_COMPUTE_WORK_GROUP_SIZE", "4.3" },
{ 1, GL_MAX_DEBUG_MESSAGE_LENGTH, "GL_MAX_DEBUG_MESSAGE_LENGTH", "4.3" },
{ 1, GL_MAX_DEBUG_LOGGED_MESSAGES, "GL_MAX_DEBUG_LOGGED_MESSAGES", "4.3" },
{ 1, GL_MAX_DEBUG_GROUP_STACK_DEPTH, "GL_MAX_DEBUG_GROUP_STACK_DEPTH", "4.3" },
{ 1, GL_MAX_LABEL_LENGTH, "GL_MAX_LABEL_LENGTH", "4.3" },
{ 1, GL_MAX_UNIFORM_LOCATIONS, "GL_MAX_UNIFORM_LOCATIONS", "4.3" },
{ 1, GL_MAX_FRAMEBUFFER_WIDTH, "GL_MAX_FRAMEBUFFER_WIDTH", "4.3" },
{ 1, GL_MAX_FRAMEBUFFER_HEIGHT, "GL_MAX_FRAMEBUFFER_HEIGHT", "4.3" },
{ 1, GL_MAX_FRAMEBUFFER_LAYERS, "GL_MAX_FRAMEBUFFER_LAYERS", "4.3" },
{ 1, GL_MAX_FRAMEBUFFER_SAMPLES, "GL_MAX_FRAMEBUFFER_SAMPLES", "4.3" },
{ 1, GL_MAX_WIDTH, "GL_MAX_WIDTH", "4.3" },
{ 1, GL_MAX_HEIGHT, "GL_MAX_HEIGHT", "4.3" },
{ 1, GL_MAX_DEPTH, "GL_MAX_DEPTH", "4.3" },
{ 1, GL_MAX_LAYERS, "GL_MAX_LAYERS", "4.3" },
{ 1, GL_MAX_COMBINED_DIMENSIONS, "GL_MAX_COMBINED_DIMENSIONS", "4.3" },
{ 1, GL_MAX_NAME_LENGTH, "GL_MAX_NAME_LENGTH", "4.3" },
{ 1, GL_MAX_NUM_ACTIVE_VARIABLES, "GL_MAX_NUM_ACTIVE_VARIABLES", "4.3" },
{ 1, GL_MAX_NUM_COMPATIBLE_SUBROUTINES, "GL_MAX_NUM_COMPATIBLE_SUBROUTINES", "4.3" },
{ 1, GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS, "GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS", "4.3" },
{ 1, GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS, "GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS", "4.3" },
{ 1, GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS, "GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS", "4.3" },
{ 1, GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS, "GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS", "4.3" },
{ 1, GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS, "GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS", "4.3" },
{ 1, GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS, "GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS", "4.3" },
{ 1, GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS, "GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS", "4.3" },
{ 1, GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS, "GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS", "4.3" },
{ 1, GL_MAX_SHADER_STORAGE_BLOCK_SIZE, "GL_MAX_SHADER_STORAGE_BLOCK_SIZE", "4.3" },
{ 1, GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES, "GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES", "4.3" },
{ 1, GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET, "GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET", "4.3" },
{ 1, GL_MAX_VERTEX_ATTRIB_BINDINGS, "GL_MAX_VERTEX_ATTRIB_BINDINGS", "4.3" },
#endif
#if defined(GL_VERSION_4_4)
{ 1, GL_MAX_VERTEX_ATTRIB_STRIDE, "GL_MAX_VERTEX_ATTRIB_STRIDE", "4.4" },
#endif
#if defined(GL_VERSION_4_5)
{ 1, GL_MAX_CULL_DISTANCES, "GL_MAX_CULL_DISTANCES", "4.5" },
{ 1, GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES, "GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES", "4.5" },
#endif
#if defined(GL_VERSION_4_6)
{ 1, GL_MAX_TEXTURE_MAX_ANISOTROPY, "GL_MAX_TEXTURE_MAX_ANISOTROPY", "4.6" },
#endif
#if defined(GL_ARB_transform_feedback3)
{ 1, GL_MAX_TRANSFORM_FEEDBACK_BUFFERS, "GL_MAX_TRANSFORM_FEEDBACK_BUFFERS", "GL_ARB_transform_feedback3" },
{ 1, GL_MAX_VERTEX_STREAMS, "GL_MAX_VERTEX_STREAMS", "GL_ARB_transform_feedback3" },
#endif
{ 0, (GLenum) 0, NULL, NULL }
};
GLint i, max[2];
const char *prev_ext = "none";
printf("%s limits:\n", oglstring);
for (i = 0; limits[i].count; i++) {
@ -608,10 +757,17 @@ print_limits(const char *extensions, const char *oglstring, int version,
extension_supported(limits[i].extension, extensions)) {
glGetIntegerv(limits[i].token, max);
if (glGetError() == GL_NO_ERROR) {
if (limits[i].count == 1)
if (limits[i].extension && strcmp(limits[i].extension, prev_ext) != 0) {
printf(" %s:\n", limits[i].extension);
prev_ext = limits[i].extension;
}
if (limits[i].count == 1) {
printf(" %s = %d\n", limits[i].name, max[0]);
else /* XXX fix if we ever query something with more than 2 values */
}
else {
assert(limits[i].count == 2);
printf(" %s = %d, %d\n", limits[i].name, max[0], max[1]);
}
}
}
}
@ -622,21 +778,37 @@ print_limits(const char *extensions, const char *oglstring, int version,
GL_MAX_CONVOLUTION_WIDTH, max);
extfuncs->GetConvolutionParameteriv(GL_CONVOLUTION_2D,
GL_MAX_CONVOLUTION_HEIGHT, max+1);
printf(" GL_ARB_imaging:\n");
printf(" GL_MAX_CONVOLUTION_WIDTH/HEIGHT = %d, %d\n", max[0], max[1]);
}
if (extension_supported("GL_ARB_texture_compression", extensions)) {
GLint i, n;
GLint *formats;
printf(" GL_ARB_texture_compression:\n");
glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &n);
printf(" GL_NUM_COMPRESSED_TEXTURE_FORMATS = %d\n", n);
formats = (GLint *) malloc(n * sizeof(GLint));
glGetIntegerv(GL_COMPRESSED_TEXTURE_FORMATS, formats);
for (i = 0; i < n; i++) {
printf(" %s\n", enum_name(formats[i]));
printf(" %s\n", enum_name(formats[i]));
}
free(formats);
}
#if defined(GL_VERSION_4_3)
if (version >= 43) {
GLint i, n = 0;
printf(" 4.3:\n");
glGetIntegerv(GL_NUM_SHADING_LANGUAGE_VERSIONS, &n);
printf(" GL_NUM_SHADING_LANGUAGE_VERSIONS = %d\n", n);
for (i = 0; i < n; i++) {
printf(" %s\n", (const char *)
extfuncs->GetStringi(GL_SHADING_LANGUAGE_VERSION, i));
}
}
#endif
#if defined(GL_ARB_vertex_program)
if (extension_supported("GL_ARB_vertex_program", extensions)) {
print_program_limits(GL_VERTEX_PROGRAM_ARB, extfuncs);
@ -711,12 +883,10 @@ const char *
context_flags_string(int mask)
{
const static struct bit_info bits[] = {
#ifdef GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT
{ GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT, "forward-compatible" },
#endif
#ifdef GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB
{ GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB, "robust-access" },
#endif
{ GL_CONTEXT_FLAG_DEBUG_BIT, "debug" },
{ GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR, "no-error" },
};
return bitmask_to_string(bits, ELEMENTS(bits), mask);
@ -733,15 +903,15 @@ usage(void)
printf("\t-display <dname>: Print GLX visuals on specified server.\n");
printf("\t-i: Force an indirect rendering context.\n");
#endif
printf("\t-B: brief output, print only the basics.\n");
printf("\t-v: Print visuals info in verbose form.\n");
printf("\t-t: Print verbose table.\n");
printf("\t-t: Print verbose visual information 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)
{
@ -771,6 +941,9 @@ parse_args(int argc, char *argv[], struct options *options)
else if (strcmp(argv[i], "-v") == 0) {
options->mode = Verbose;
}
else if (strcmp(argv[i], "-B") == 0) {
options->mode = Brief;
}
else if (strcmp(argv[i], "-b") == 0) {
options->findBest = GL_TRUE;
}
@ -791,3 +964,59 @@ parse_args(int argc, char *argv[], struct options *options)
}
}
}
static void
query_ATI_meminfo(void)
{
#ifdef GL_ATI_meminfo
int i[4];
printf("Memory info (GL_ATI_meminfo):\n");
glGetIntegerv(GL_VBO_FREE_MEMORY_ATI, i);
printf(" VBO free memory - total: %u MB, largest block: %u MB\n",
i[0] / 1024, i[1] / 1024);
printf(" VBO free aux. memory - total: %u MB, largest block: %u MB\n",
i[2] / 1024, i[3] / 1024);
glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI, i);
printf(" Texture free memory - total: %u MB, largest block: %u MB\n",
i[0] / 1024, i[1] / 1024);
printf(" Texture free aux. memory - total: %u MB, largest block: %u MB\n",
i[2] / 1024, i[3] / 1024);
glGetIntegerv(GL_RENDERBUFFER_FREE_MEMORY_ATI, i);
printf(" Renderbuffer free memory - total: %u MB, largest block: %u MB\n",
i[0] / 1024, i[1] / 1024);
printf(" Renderbuffer free aux. memory - total: %u MB, largest block: %u MB\n",
i[2] / 1024, i[3] / 1024);
#endif
}
static void
query_NVX_gpu_memory_info(void)
{
#ifdef GL_NVX_gpu_memory_info
int i;
printf("Memory info (GL_NVX_gpu_memory_info):\n");
glGetIntegerv(GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX, &i);
printf(" Dedicated video memory: %u MB\n", i / 1024);
glGetIntegerv(GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX, &i);
printf(" Total available memory: %u MB\n", i / 1024);
glGetIntegerv(GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX, &i);
printf(" Currently available dedicated video memory: %u MB\n", i / 1024);
#endif
}
void
print_gpu_memory_info(const char *glExtensions)
{
if (strstr(glExtensions, "GL_ATI_meminfo"))
query_ATI_meminfo();
if (strstr(glExtensions, "GL_NVX_gpu_memory_info"))
query_NVX_gpu_memory_info();
}

View File

@ -67,7 +67,8 @@ typedef enum
{
Normal,
Wide,
Verbose
Verbose,
Brief
} InfoMode;
@ -85,6 +86,7 @@ struct options
/** list of known OpenGL versions */
static const struct { int major, minor; } gl_versions[] = {
{4, 6},
{4, 5},
{4, 4},
{4, 3},
@ -137,5 +139,7 @@ context_flags_string(int mask);
void
parse_args(int argc, char *argv[], struct options *options);
void
print_gpu_memory_info(const char *glExtensions);
#endif /* GLINFO_COMMON_H */

View File

@ -1,16 +1,16 @@
.\" $OpenBSD: glxinfo.1,v 1.3 2015/02/03 16:15:13 schwarze Exp $
.\" $OpenBSD: glxinfo.1,v 1.4 2018/02/23 10:37:24 jsg Exp $
.\" $TOG: xdpyinfo.man /main/22 1998/02/09 13:57:10 kaleb $
.\" Copyright 1988, 1989, 1994, 1998 The Open Group
.\"
.\"
.\" Permission to use, copy, modify, distribute, and sell this software and its
.\" documentation for any purpose is hereby granted without fee, provided that
.\" the above copyright notice appear in all copies and that both that
.\" copyright notice and this permission notice appear in supporting
.\" documentation.
.\"
.\"
.\" The above copyright notice and this permission notice shall be included
.\" in all copies or substantial portions of the Software.
.\"
.\"
.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
@ -18,7 +18,7 @@
.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
.\" OTHER DEALINGS IN THE SOFTWARE.
.\"
.\"
.\" Except as contained in this notice, the name of The Open Group shall
.\" not be used in advertising or otherwise to promote the sale, use or
.\" other dealings in this Software without prior written authorization
@ -26,7 +26,7 @@
.\"
.\" $XFree86: xc/programs/glxinfo/glxinfo.man,v 1.5 2001/12/14 20:00:47 dawes Exp $
.\"
.Dd $Mdocdate: February 3 2015 $
.Dd $Mdocdate: February 23 2018 $
.Dt GLXINFO 1
.Os
.Sh NAME
@ -34,7 +34,7 @@
.Nd display info about a GLX extension and OpenGL renderer
.Sh SYNOPSIS
.Nm glxinfo
.Op Fl bhilstv
.Op Fl Bbhilstv
.Op Fl display Ar displayname
.Sh DESCRIPTION
.Nm
@ -47,6 +47,8 @@ buffered, the component sizes, Z-buffering depth, etc).
.Pp
Command line options include:
.Bl -tag -width Ds
.It Fl B
Brief output mode, print only the basics.
.It Fl b
Find the 'best' visual and print its number.
.It Fl h

View File

@ -26,6 +26,7 @@
* -t print wide table
* -v print verbose information
* -display DisplayName specify the X display to interogate
* -B brief, print only the basics
* -b only print ID of "best" visual on screen 0
* -i use indirect rendering connection only
* -l print interesting OpenGL limits (added 5 Sep 2002)
@ -390,9 +391,10 @@ query_renderer(void)
static Bool
print_screen_info(Display *dpy, int scrnum, Bool allowDirect,
print_screen_info(Display *dpy, int scrnum,
const struct options *opts,
Bool coreProfile, Bool es2Profile, Bool limits,
Bool singleLine, Bool coreWorked)
Bool coreWorked)
{
Window win;
XSetWindowAttributes attr;
@ -413,8 +415,9 @@ print_screen_info(Display *dpy, int scrnum, Bool allowDirect,
fbconfigs = choose_fb_config(dpy, scrnum);
if (fbconfigs) {
ctx = create_context_with_config(dpy, fbconfigs[0],
coreProfile, es2Profile, allowDirect);
if (!ctx && allowDirect && !coreProfile) {
coreProfile, es2Profile,
opts->allowDirect);
if (!ctx && opts->allowDirect && !coreProfile) {
/* try indirect */
ctx = create_context_with_config(dpy, fbconfigs[0],
coreProfile, es2Profile, False);
@ -426,7 +429,7 @@ print_screen_info(Display *dpy, int scrnum, Bool allowDirect,
else if (!coreProfile && !es2Profile) {
visinfo = choose_xvisinfo(dpy, scrnum);
if (visinfo)
ctx = glXCreateContext(dpy, visinfo, NULL, allowDirect);
ctx = glXCreateContext(dpy, visinfo, NULL, opts->allowDirect);
} else
visinfo = NULL;
@ -465,9 +468,9 @@ print_screen_info(Display *dpy, int scrnum, Bool allowDirect,
const char *glVendor = (const char *) glGetString(GL_VENDOR);
const char *glRenderer = (const char *) glGetString(GL_RENDERER);
const char *glVersion = (const char *) glGetString(GL_VERSION);
char *glExtensions;
int glxVersionMajor;
int glxVersionMinor;
char *glExtensions = NULL;
int glxVersionMajor = 0;
int glxVersionMinor = 0;
char *displayName = NULL;
char *colon = NULL, *period = NULL;
struct ext_functions extfuncs;
@ -482,21 +485,21 @@ print_screen_info(Display *dpy, int scrnum, Bool allowDirect,
extfuncs.GetConvolutionParameteriv = (GETCONVOLUTIONPARAMETERIVPROC)
glXGetProcAddressARB((GLubyte *) "glGetConvolutionParameteriv");
/* Get list of GL extensions */
if (coreProfile) {
glExtensions = build_core_profile_extension_list(&extfuncs);
if (!glXQueryVersion(dpy, & glxVersionMajor, & glxVersionMinor)) {
fprintf(stderr, "Error: glXQueryVersion failed\n");
exit(1);
}
else {
/* Get list of GL extensions */
if (coreProfile && extfuncs.GetStringi)
glExtensions = build_core_profile_extension_list(&extfuncs);
if (!glExtensions) {
coreProfile = False;
glExtensions = (char *) glGetString(GL_EXTENSIONS);
}
CheckError(__LINE__);
if (! glXQueryVersion( dpy, & glxVersionMajor, & glxVersionMinor )) {
fprintf(stderr, "Error: glXQueryVersion failed\n");
exit(1);
}
if (!coreWorked) {
/* Strip the screen number from the display name, if present. */
if (!(displayName = (char *) malloc(strlen(DisplayString(dpy)) + 1))) {
@ -518,7 +521,7 @@ print_screen_info(Display *dpy, int scrnum, Bool allowDirect,
printf("Yes\n");
}
else {
if (!allowDirect) {
if (!opts->allowDirect) {
printf("No (-i specified)\n");
}
else if (getenv("LIBGL_ALWAYS_INDIRECT")) {
@ -529,19 +532,22 @@ print_screen_info(Display *dpy, int scrnum, Bool allowDirect,
"LIBGL_DEBUG=verbose)\n");
}
}
printf("server glx vendor string: %s\n", serverVendor);
printf("server glx version string: %s\n", serverVersion);
printf("server glx extensions:\n");
print_extension_list(serverExtensions, singleLine);
printf("client glx vendor string: %s\n", clientVendor);
printf("client glx version string: %s\n", clientVersion);
printf("client glx extensions:\n");
print_extension_list(clientExtensions, singleLine);
printf("GLX version: %u.%u\n", glxVersionMajor, glxVersionMinor);
printf("GLX extensions:\n");
print_extension_list(glxExtensions, singleLine);
if (opts->mode != Brief) {
printf("server glx vendor string: %s\n", serverVendor);
printf("server glx version string: %s\n", serverVersion);
printf("server glx extensions:\n");
print_extension_list(serverExtensions, opts->singleLine);
printf("client glx vendor string: %s\n", clientVendor);
printf("client glx version string: %s\n", clientVersion);
printf("client glx extensions:\n");
print_extension_list(clientExtensions, opts->singleLine);
printf("GLX version: %u.%u\n", glxVersionMajor, glxVersionMinor);
printf("GLX extensions:\n");
print_extension_list(glxExtensions, opts->singleLine);
}
if (strstr(glxExtensions, "GLX_MESA_query_renderer"))
query_renderer();
print_gpu_memory_info(glExtensions);
printf("OpenGL vendor string: %s\n", glVendor);
printf("OpenGL renderer string: %s\n", glRenderer);
} else
@ -578,10 +584,10 @@ print_screen_info(Display *dpy, int scrnum, Bool allowDirect,
CheckError(__LINE__);
printf("%s extensions:\n", oglstring);
print_extension_list(glExtensions, singleLine);
CheckError(__LINE__);
if (opts->mode != Brief) {
printf("%s extensions:\n", oglstring);
print_extension_list(glExtensions, opts->singleLine);
}
if (limits) {
print_limits(glExtensions, oglstring, version, &extfuncs);
@ -1250,19 +1256,21 @@ 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, 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);
coreWorked = print_screen_info(dpy, scrnum, &opts,
True, False, opts.limits, False);
print_screen_info(dpy, scrnum, &opts, False, False,
opts.limits, coreWorked);
print_screen_info(dpy, scrnum, &opts, False, True, False, True);
printf("\n");
print_visual_info(dpy, scrnum, opts.mode);
if (opts.mode != Brief) {
print_visual_info(dpy, scrnum, opts.mode);
#ifdef GLX_VERSION_1_3
print_fbconfig_info(dpy, scrnum, opts.mode);
print_fbconfig_info(dpy, scrnum, opts.mode);
#endif
}
if (scrnum + 1 < numScreens)
printf("\n\n");
}