diff options
Diffstat (limited to 'src/glxinfo.c')
-rw-r--r-- | src/glxinfo.c | 460 |
1 files changed, 460 insertions, 0 deletions
diff --git a/src/glxinfo.c b/src/glxinfo.c new file mode 100644 index 0000000..c252d25 --- /dev/null +++ b/src/glxinfo.c @@ -0,0 +1,460 @@ +/* + * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix + * and Linux systems. + * + * Copyright (C) 2004 NVIDIA Corporation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of Version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See Version 2 + * of the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the: + * + * Free Software Foundation, Inc. + * 59 Temple Place - Suite 330 + * Boston, MA 02111-1307, USA + * + */ + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <unistd.h> + +#include "NvCtrlAttributes.h" +#include "query-assign.h" /* CtrlHandles */ +#include "msg.h" + +#include <GL/glx.h> /* GLX #defines */ + + +/* + * print_extension_list() - Formats OpenGL/GLX extension strings + * to contain commas and returns a pointer to the formated string. + * The user is responsible for freeing this buffer. + * + * If there is an error or there is not enough memory to create + * the buffer, NULL is returned. + * + */ + +static char * +format_extension_list(const char *ext) +{ + int i; + char * extTmp = NULL; /* Actual string to print */ + + + if ( !ext || !ext[0] ) + return NULL; + + /* Count number of extensions (to get number of commas needed) */ + i = 0; + extTmp = (char *)ext; + while ( *extTmp != '\0' ) { + if ( *extTmp == ' ' ) { + i++; + } + extTmp++; + } + + /* + * Allocate buffer that will hold the extension string with + * commas in it + */ + extTmp = (char *) malloc( (strlen(ext) +i +1) *sizeof(char) ); + if ( extTmp == NULL ) { + return NULL; + } + + /* Copy extension string to buffer, adding commas */ + i = 0; + while ( *ext != '\0' && *ext != '\n' ) { + if ( *ext == ' ' ) { + extTmp[i++] = ','; + } + extTmp[i++] = *ext; + ext++; + } + extTmp[i] = '\0'; + + /* Remove any trailing whitespace and commas */ + while ( extTmp[ strlen(extTmp)-1 ] == ' ' || + extTmp[ strlen(extTmp)-1 ] == ',' ) { + extTmp[ strlen(extTmp)-1 ] = '\0'; + } + + return extTmp; +} /* format_extension_list() */ + + +/* + * print_fbconfig_attribs() & helper functions - + * Prints a table of fbconfig attributes + * + * NOTE: Only support FBconfig for GLX v1.3+ + * + */ + +#ifdef GLX_VERSION_1_3 + +const char * +render_type_abbrev(int rend_type) +{ + switch (rend_type) { + case GLX_RGBA_BIT: + return "rgb"; + case GLX_COLOR_INDEX_BIT: + return "ci"; + case (GLX_RGBA_BIT | GLX_COLOR_INDEX_BIT): + return "any"; + default: + return "."; + } +} + + +const char * +transparent_type_abbrev(int trans_type) +{ + switch (trans_type) { + case GLX_NONE: + return "."; + case GLX_TRANSPARENT_RGB: + return "rg"; + case GLX_TRANSPARENT_INDEX: + return "ci"; + default: + return "."; + } +} + + +const char * +caveat_abbrev(int caveat) +{ + if (caveat == GLX_NONE_EXT || caveat == 0) + return("."); + else if (caveat == GLX_SLOW_VISUAL_EXT) + return("slo"); + else if (caveat == GLX_NON_CONFORMANT_VISUAL_EXT) + return("NoC"); + else + return("."); +} + + +static void +print_fbconfig_attribs(GLXFBConfigAttr *fbca) +{ + int i; /* Iterator */ + + + if ( fbca == NULL ) { + return; + } + + printf("-fc- -vi- buf lv rgb d s colorbuffer ax dp st " + "accumbuffer -ms- cav -----pbuffer----- ---transparent----\n"); + printf(" id id siz l ci b t r g b a bf th en " + "r g b a ns b eat widt hght max-pxs typ r g b a i\n"); + printf("----------------------------------------------" + "---------------------------------------------------------\n"); + + i = 0; + while ( fbca[i].fbconfig_id != 0 ) { + + printf("0x%2.2x ", fbca[i].fbconfig_id); + if ( fbca[i].visual_id ) { + printf("0x%2.2x ", fbca[i].visual_id); + } else { + printf(" . "); + } + printf("%3d %2d %3.3s %1c %1c ", + fbca[i].buffer_size, + fbca[i].level, + render_type_abbrev(fbca[i].render_type), + fbca[i].doublebuffer ? 'y' : '.', + fbca[i].stereo ? 'y' : '.' + ); + printf("%2d %2d %2d %2d %2d %2d %2d ", + fbca[i].red_size, + fbca[i].green_size, + fbca[i].blue_size, + fbca[i].alpha_size, + fbca[i].aux_buffers, + fbca[i].depth_size, + fbca[i].stencil_size + ); + printf("%2d %2d %2d %2d ", + fbca[i].accum_red_size, + fbca[i].accum_green_size, + fbca[i].accum_blue_size, + fbca[i].accum_alpha_size + ); + if ( fbca[i].multi_sample_valid == 1 ) { + printf("%2d %1d ", + fbca[i].multi_samples, + fbca[i].multi_sample_buffers + ); + } else { + printf(" . . "); + } + printf("%3.3s %4x %4x %7x %3.3s %2d %2d %2d %2d %2d\n", + caveat_abbrev(fbca[i].config_caveat), + fbca[i].pbuffer_width, + fbca[i].pbuffer_height, + fbca[i].pbuffer_max, + transparent_type_abbrev(fbca[i].transparent_type), + fbca[i].transparent_red_value, + fbca[i].transparent_green_value, + fbca[i].transparent_blue_value, + fbca[i].transparent_alpha_value, + fbca[i].transparent_index_value + ); + + i++; + } /* Done printing FBConfig attributes for FBConfig */ + +} /* print_fbconfig_attribs() */ + +#endif /* GLX_VERSION_1_3 */ + + +/* + * print_glxinfo() - prints information about glx + * + */ + +#define TAB " " + +#define SAFE_FREE(m) \ +if ( (m) != NULL ) { \ + free( m ); \ + m = NULL; \ +} + +#define NULL_TO_EMPTY(s) \ +((s)!=NULL)?(s):"" + +void print_glxinfo(const char *display_name) +{ + int screen; + CtrlHandles *h; + ReturnStatus status = NvCtrlSuccess; + + char *direct_rendering = NULL; + char *glx_extensions = NULL; + char *server_vendor = NULL; + char *server_version = NULL; + char *server_extensions = NULL; + char *client_vendor = NULL; + char *client_version = NULL; + char *client_extensions = NULL; + char *opengl_vendor = NULL; + char *opengl_renderer = NULL; + char *opengl_version = NULL; + char *opengl_extensions = NULL; + + GLXFBConfigAttr *fbconfig_attribs = NULL; + + char *formated_ext_str = NULL; + + + h = nv_alloc_ctrl_handles(display_name); + if ( h == NULL ) { + return; + } + + /* Print information for each screen */ + for (screen = 0; screen < h->num_screens; screen++) { + + /* No screen, move on */ + if ( !h->h[screen] ) continue; + + nv_msg(NULL, "GLX Information for %s:", h->screen_names[screen]); + + /* Get GLX information */ + status = NvCtrlGetStringAttribute(h->h[screen], + NV_CTRL_STRING_GLX_DIRECT_RENDERING, + &direct_rendering); + if ( status != NvCtrlSuccess && + status != NvCtrlNoAttribute ) { goto finish; } + status = NvCtrlGetStringAttribute(h->h[screen], + NV_CTRL_STRING_GLX_GLX_EXTENSIONS, + &glx_extensions); + if ( status != NvCtrlSuccess && + status != NvCtrlNoAttribute ) { goto finish; } + if ( glx_extensions != NULL ) { + formated_ext_str = format_extension_list(glx_extensions); + if ( formated_ext_str != NULL ) { + free(glx_extensions); + glx_extensions = formated_ext_str; + } + } + /* Get server GLX information */ + status = NvCtrlGetStringAttribute(h->h[screen], + NV_CTRL_STRING_GLX_SERVER_VENDOR, + &server_vendor); + if ( status != NvCtrlSuccess && + status != NvCtrlNoAttribute ) { goto finish; } + status = NvCtrlGetStringAttribute(h->h[screen], + NV_CTRL_STRING_GLX_SERVER_VERSION, + &server_version); + if ( status != NvCtrlSuccess && + status != NvCtrlNoAttribute ) { goto finish; } + status = NvCtrlGetStringAttribute(h->h[screen], + NV_CTRL_STRING_GLX_SERVER_EXTENSIONS, + &server_extensions); + if ( status != NvCtrlSuccess && + status != NvCtrlNoAttribute ) { goto finish; } + if ( server_extensions != NULL ) { + formated_ext_str = format_extension_list(server_extensions); + if ( formated_ext_str != NULL ) { + free(server_extensions); + server_extensions = formated_ext_str; + } + } + /* Get client GLX information */ + status = NvCtrlGetStringAttribute(h->h[screen], + NV_CTRL_STRING_GLX_CLIENT_VENDOR, + &client_vendor); + if ( status != NvCtrlSuccess && + status != NvCtrlNoAttribute ) { goto finish; } + status = NvCtrlGetStringAttribute(h->h[screen], + NV_CTRL_STRING_GLX_CLIENT_VERSION, + &client_version); + if ( status != NvCtrlSuccess && + status != NvCtrlNoAttribute ) { goto finish; } + status = NvCtrlGetStringAttribute(h->h[screen], + NV_CTRL_STRING_GLX_CLIENT_EXTENSIONS, + &client_extensions); + if ( status != NvCtrlSuccess && + status != NvCtrlNoAttribute ) { goto finish; } + if ( client_extensions != NULL ) { + formated_ext_str = format_extension_list(client_extensions); + if ( formated_ext_str != NULL ) { + free(client_extensions); + client_extensions = formated_ext_str; + } + } + /* Get OpenGL information */ + status = NvCtrlGetStringAttribute(h->h[screen], + NV_CTRL_STRING_GLX_OPENGL_VENDOR, + &opengl_vendor); + if ( status != NvCtrlSuccess && + status != NvCtrlNoAttribute ) { goto finish; } + status = NvCtrlGetStringAttribute(h->h[screen], + NV_CTRL_STRING_GLX_OPENGL_RENDERER, + &opengl_renderer); + if ( status != NvCtrlSuccess && + status != NvCtrlNoAttribute ) { goto finish; } + status = NvCtrlGetStringAttribute(h->h[screen], + NV_CTRL_STRING_GLX_OPENGL_VERSION, + &opengl_version); + if ( status != NvCtrlSuccess && + status != NvCtrlNoAttribute ) { goto finish; } + status = NvCtrlGetStringAttribute(h->h[screen], + NV_CTRL_STRING_GLX_OPENGL_EXTENSIONS, + &opengl_extensions); + if ( status != NvCtrlSuccess && + status != NvCtrlNoAttribute ) { goto finish; } + if ( opengl_extensions != NULL ) { + formated_ext_str = format_extension_list(opengl_extensions); + if ( formated_ext_str != NULL ) { + free(opengl_extensions); + opengl_extensions = formated_ext_str; + } + } + + /* Get FBConfig information */ + status = NvCtrlGetVoidAttribute(h->h[screen], + NV_CTRL_ATTR_GLX_FBCONFIG_ATTRIBS, + (void *)(&fbconfig_attribs)); + if ( status != NvCtrlSuccess && + status != NvCtrlNoAttribute ) { goto finish; } + + /* Print results */ + nv_msg(TAB, "direct rendering: %s", NULL_TO_EMPTY(direct_rendering)); + nv_msg(TAB, "GLX extensions:"); + nv_msg(" ", NULL_TO_EMPTY(glx_extensions)); + nv_msg(" ", "\n"); + nv_msg(TAB, "server glx vendor string: %s", + NULL_TO_EMPTY(server_vendor)); + nv_msg(TAB, "server glx version string: %s", + NULL_TO_EMPTY(server_version)); + nv_msg(TAB, "server glx extensions:"); + nv_msg(" ", NULL_TO_EMPTY(server_extensions)); + nv_msg(" ", "\n"); + nv_msg(TAB, "client glx vendor string: %s", + NULL_TO_EMPTY(client_vendor)); + nv_msg(TAB, "client glx version string: %s", + NULL_TO_EMPTY(client_version)); + nv_msg(TAB, "client glx extensions:"); + nv_msg(" ", NULL_TO_EMPTY(client_extensions)); + nv_msg(" ", "\n"); + nv_msg(TAB, "OpenGL vendor string: %s", + NULL_TO_EMPTY(opengl_vendor)); + nv_msg(TAB, "OpenGL renderer string: %s", + NULL_TO_EMPTY(opengl_renderer)); + nv_msg(TAB, "OpenGL version string: %s", + NULL_TO_EMPTY(opengl_version)); + nv_msg(TAB, "OpenGL extensions:"); + nv_msg(" ", NULL_TO_EMPTY(opengl_extensions)); +#ifdef GLX_VERSION_1_3 + if ( fbconfig_attribs != NULL ) { + nv_msg(" ", "\n"); + print_fbconfig_attribs(fbconfig_attribs); + } +#endif + fflush(stdout); + + /* Free memory used */ + SAFE_FREE(server_vendor); + SAFE_FREE(server_version); + SAFE_FREE(server_extensions); + SAFE_FREE(client_vendor); + SAFE_FREE(client_version); + SAFE_FREE(client_extensions); + SAFE_FREE(direct_rendering); + SAFE_FREE(glx_extensions); + SAFE_FREE(opengl_vendor); + SAFE_FREE(opengl_renderer); + SAFE_FREE(opengl_version); + SAFE_FREE(opengl_extensions); + SAFE_FREE(fbconfig_attribs); + + } /* Done looking at all screens */ + + + /* Fall through */ + finish: + if ( status == NvCtrlError ) { + nv_error_msg("Error fetching GLX Information: %s", + NvCtrlAttributesStrError(status) ); + } + + /* Free any leftover memory used */ + SAFE_FREE(server_vendor); + SAFE_FREE(server_version); + SAFE_FREE(server_extensions); + SAFE_FREE(client_vendor); + SAFE_FREE(client_version); + SAFE_FREE(client_extensions); + SAFE_FREE(direct_rendering); + SAFE_FREE(glx_extensions); + SAFE_FREE(opengl_vendor); + SAFE_FREE(opengl_renderer); + SAFE_FREE(opengl_version); + SAFE_FREE(opengl_extensions); + SAFE_FREE(fbconfig_attribs); + + nv_free_ctrl_handles(h); + +} /* print_glxinfo() */ |