[Mesa-dev] [PATCH] glxinfo: add support for creating/querying core-profile contexts (v2.1)

Mike Lothian mike at fireburn.co.uk
Tue Jan 15 19:32:48 PST 2013


I also noticed that the core profile reports:

    GL_OES_read_format, GL_S3_s3tc, k^?,

As extensions on r600g - the "k^?" does not show up on i965


On 12 January 2013 22:15, Dave Airlie <airlied at gmail.com> wrote:

> From: Brian Paul <brianp at vmware.com>
>
> [airlied: Based on Brian's patch, I've fixed it up to always report a
> non-core
> and core profile, after each other, and dropped the -c flag as its redunant
> now]
>
> The -c flag says to try to create a core profile (no legacy features)
> using glXCreateContextAttribsARB().  A core profile may advertise a
> different set of extensions than a compatibility profile (though,
> the only difference with NVIDIA's driver is the presence of
> GL_ARB_compatibility).  Also note that extensions need to be queried
> one at a time with glGetStringi().
>
> Be more careful with creating direct vs. indirect contexts.  If
> we're trying to get a direct context, don't immediately settle for
> indirect.  Try indirect only after failing to get direct.
>
> xsync workaround from Kaelyn Uhrain
> v2.1: add xsync to stop wierd xcb bug, drop [-c]
>
> Signed-off-by: Dave Airlie <airlied at redhat.com>
> ---
>  src/xdemos/glxinfo.c | 565
> +++++++++++++++++++++++++++++++++++++++++----------
>  1 file changed, 457 insertions(+), 108 deletions(-)
>
> diff --git a/src/xdemos/glxinfo.c b/src/xdemos/glxinfo.c
> index 38bd384..c1ecdfd 100644
> --- a/src/xdemos/glxinfo.c
> +++ b/src/xdemos/glxinfo.c
> @@ -29,6 +29,7 @@
>   *  -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)
> + *  -c                     request a core profile rendering context
>   *
>   * Brian Paul  26 January 2000
>   */
> @@ -62,6 +63,8 @@
>  #define GLX_COLOR_INDEX_BIT            0x00000002
>  #endif
>
> +#define ELEMENTS(array) (sizeof(array) / sizeof(array[0]))
> +
>  typedef enum
>  {
>     Normal,
> @@ -108,6 +111,43 @@ struct visual_attribs
>  };
>
>
> +/** list of known OpenGL versions */
> +static 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},
> +   {0, 0} /* end of list */
> +};
> +
> +#define NUM_GL_VERSIONS ELEMENTS(gl_versions)
> +
> +
> +/**
> + * GL Error checking/warning.
> + */
> +static void
> +CheckError(int line)
> +{
> +   int n;
> +   n = glGetError();
> +   if (n)
> +      printf("Warning: GL error 0x%x at line %d\n", n, line);
> +}
> +
> +
>  /*
>   * qsort callback for string comparison.
>   */
> @@ -219,6 +259,45 @@ print_extension_list(const char *ext, Bool singleLine)
>  }
>
>
> +/**
> + * Get list of OpenGL extensions using core profile's glGetStringi().
> + */
> +static char *
> +build_core_profile_extension_list(void)
> +{
> +   GLint i, n, totalLen;
> +   char *buffer;
> +   static PFNGLGETSTRINGIPROC glGetStringi_func = NULL;
> +
> +   if (!glGetStringi_func) {
> +      glGetStringi_func = (PFNGLGETSTRINGIPROC)
> +         glXGetProcAddressARB((GLubyte *) "glGetStringi");
> +   }
> +
> +   glGetIntegerv(GL_NUM_EXTENSIONS, &n);
> +
> +   /* compute totalLen */
> +   totalLen = 0;
> +   for (i = 0; i < n; i++) {
> +      const char *ext = (const char *) glGetStringi_func(GL_EXTENSIONS,
> i);
> +      totalLen += strlen(ext) + 1; /* plus a space */
> +   }
> +
> +   buffer = malloc(totalLen);
> +   if (buffer) {
> +      int pos = 0;
> +      for (i = 0; i < n; i++) {
> +         const char *ext = (const char *)
> glGetStringi_func(GL_EXTENSIONS, i);
> +         strcpy(buffer + pos, ext);
> +         pos += strlen(ext);
> +         buffer[pos++] = ' ';
> +      }
> +   }
> +   return buffer;
> +}
> +
> +
> +
>  static void
>  print_display_info(Display *dpy)
>  {
> @@ -373,7 +452,7 @@ extension_supported(const char *ext, const char
> *extensionsList)
>   * Print interesting OpenGL implementation limits.
>   */
>  static void
> -print_limits(const char *extensions)
> +print_limits(const char *extensions, const char *oglstring)
>  {
>     struct token_name {
>        GLuint count;
> @@ -436,7 +515,7 @@ print_limits(const char *extensions)
>     };
>     GLint i, max[2];
>
> -   printf("OpenGL limits:\n");
> +   printf("%s limits:\n", oglstring);
>     for (i = 0; limits[i].count; i++) {
>        if (!limits[i].extension ||
>            extension_supported(limits[i].extension, extensions)) {
> @@ -480,10 +559,249 @@ print_limits(const char *extensions)
>  }
>
>
> -static void
> -print_screen_info(Display *dpy, int scrnum, Bool allowDirect, Bool
> limits, Bool singleLine)
> +struct bit_info
> +{
> +   int bit;
> +   const char *name;
> +};
> +
> +
> +/**
> + * Return string representation for bits in a bitmask.
> + */
> +static const char *
> +bitmask_to_string(const struct bit_info bits[], int numBits, int mask)
> +{
> +   static char buffer[256], *p;
> +   int i;
> +
> +   strcpy(buffer, "(none)");
> +   p = buffer;
> +   for (i = 0; i < numBits; i++) {
> +      if (mask & bits[i].bit) {
> +         if (p > buffer)
> +            *p++ = ',';
> +         strcpy(p, bits[i].name);
> +         p += strlen(bits[i].name);
> +      }
> +   }
> +
> +   return buffer;
> +}
> +
> +/**
> + * Return string representation for the bitmask returned by
> + * GL_CONTEXT_PROFILE_MASK (OpenGL 3.2 or later).
> + */
> +static const char *
> +profile_mask_string(int mask)
> +{
> +   const static struct bit_info bits[] = {
> +#ifdef GL_CONTEXT_CORE_PROFILE_BIT
> +      { GL_CONTEXT_CORE_PROFILE_BIT, "core profile"},
> +#endif
> +#ifdef GL_CONTEXT_COMPATIBILITY_PROFILE_BIT
> +      { GL_CONTEXT_COMPATIBILITY_PROFILE_BIT, "compatibility profile" }
> +#endif
> +   };
> +
> +   return bitmask_to_string(bits, ELEMENTS(bits), mask);
> +}
> +
> +
> +/**
> + * Return string representation for the bitmask returned by
> + * GL_CONTEXT_FLAGS (OpenGL 3.0 or later).
> + */
> +static 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
> +   };
> +
> +   return bitmask_to_string(bits, ELEMENTS(bits), mask);
> +}
> +
> +
> +/**
> + * Choose a simple FB Config.
> + */
> +static GLXFBConfig *
> +choose_fb_config(Display *dpy, int scrnum)
> +{
> +   int fbAttribSingle[] = {
> +      GLX_RENDER_TYPE,   GLX_RGBA_BIT,
> +      GLX_RED_SIZE,      1,
> +      GLX_GREEN_SIZE,    1,
> +      GLX_BLUE_SIZE,     1,
> +      GLX_DOUBLEBUFFER,  False,
> +      None };
> +   int fbAttribDouble[] = {
> +      GLX_RENDER_TYPE,   GLX_RGBA_BIT,
> +      GLX_RED_SIZE,      1,
> +      GLX_GREEN_SIZE,    1,
> +      GLX_BLUE_SIZE,     1,
> +      GLX_DOUBLEBUFFER,  True,
> +      None };
> +   GLXFBConfig *configs;
> +   int nConfigs;
> +
> +   configs = glXChooseFBConfig(dpy, scrnum, fbAttribSingle, &nConfigs);
> +   if (!configs)
> +      configs = glXChooseFBConfig(dpy, scrnum, fbAttribDouble, &nConfigs);
> +
> +   return configs;
> +}
> +
> +
> +static Bool CreateContextErrorFlag;
> +
> +static int
> +create_context_error_handler(Display *dpy, XErrorEvent *error)
> +{
> +   (void) dpy;
> +   (void) error->error_code;
> +   CreateContextErrorFlag = True;
> +   return 0;
> +}
> +
> +
> +/**
> + * Try to create a GLX context of the given version with flags/options.
> + * Note: A version number is required in order to get a core profile
> + * (at least w/ NVIDIA).
> + */
> +static GLXContext
> +create_context_flags(Display *dpy, GLXFBConfig fbconfig, int major, int
> minor,
> +                     int contextFlags, int profileMask, Bool direct)
> +{
> +#ifdef GLX_ARB_create_context
> +   static PFNGLXCREATECONTEXTATTRIBSARBPROC
> glXCreateContextAttribsARB_func = 0;
> +   static Bool firstCall = True;
> +   int (*old_handler)(Display *, XErrorEvent *);
> +   GLXContext context;
> +   int attribs[20];
> +   int n = 0;
> +
> +   if (firstCall) {
> +      /* See if we have GLX_ARB_create_context_profile and get pointer to
> +       * glXCreateContextAttribsARB() function.
> +       */
> +      const char *glxExt = glXQueryExtensionsString(dpy, 0);
> +      if (extension_supported("GLX_ARB_create_context_profile", glxExt)) {
> +         glXCreateContextAttribsARB_func =
> (PFNGLXCREATECONTEXTATTRIBSARBPROC)
> +            glXGetProcAddress((const GLubyte *)
> "glXCreateContextAttribsARB");
> +      }
> +      firstCall = False;
> +   }
> +
> +   if (!glXCreateContextAttribsARB_func)
> +      return 0;
> +
> +   /* setup attribute array */
> +   if (major) {
> +      attribs[n++] = GLX_CONTEXT_MAJOR_VERSION_ARB;
> +      attribs[n++] = major;
> +      attribs[n++] = GLX_CONTEXT_MINOR_VERSION_ARB;
> +      attribs[n++] = minor;
> +   }
> +   if (contextFlags) {
> +      attribs[n++] = GLX_CONTEXT_FLAGS_ARB;
> +      attribs[n++] = contextFlags;
> +   }
> +#ifdef GLX_ARB_create_context_profile
> +   if (profileMask) {
> +      attribs[n++] = GLX_CONTEXT_PROFILE_MASK_ARB;
> +      attribs[n++] = profileMask;
> +   }
> +#endif
> +   attribs[n++] = 0;
> +
> +   /* install X error handler */
> +   old_handler = XSetErrorHandler(create_context_error_handler);
> +   CreateContextErrorFlag = False;
> +
> +   /* try creating context */
> +   context = glXCreateContextAttribsARB_func(dpy,
> +                                             fbconfig,
> +                                             0, /* share_context */
> +                                             direct,
> +                                             attribs);
> +
> +   /* restore error handler */
> +   XSetErrorHandler(old_handler);
> +
> +   if (CreateContextErrorFlag)
> +      context = 0;
> +
> +   if (direct) {
> +      if (!glXIsDirect(dpy, context)) {
> +         glXDestroyContext(dpy, context);
> +         return 0;
> +      }
> +   }
> +
> +   return context;
> +#else
> +   return 0;
> +#endif
> +}
> +
> +
> +/**
> + * Try to create a GLX context of the newest version.
> + */
> +static GLXContext
> +create_context_with_config(Display *dpy, GLXFBConfig config,
> +                           Bool coreProfile, Bool direct)
> +{
> +   GLXContext ctx = 0;
> +
> +   if (coreProfile) {
> +      /* Try to create a core profile, starting with the newest version of
> +       * GL that we're aware of.  If we don't specify the version
> +       */
> +      int i;
> +      for (i = NUM_GL_VERSIONS - 2; i > 0 ; i--) {
> +         ctx = create_context_flags(dpy, config,
> +                                    gl_versions[i].major,
> +                                    gl_versions[i].minor,
> +                                    0x0,
> +                                    GLX_CONTEXT_CORE_PROFILE_BIT_ARB,
> +                                    direct);
> +         if (ctx)
> +            return ctx;
> +      }
> +      /* couldn't get core profile context */
> +      return 0;
> +   }
> +
> +   /* GLX should return a context of the latest GL version that supports
> +    * the full profile.
> +    */
> +   ctx = glXCreateNewContext(dpy, config, GLX_RGBA_TYPE, NULL, direct);
> +
> +   /* make sure the context is direct, if direct was requested */
> +   if (ctx && direct) {
> +      if (!glXIsDirect(dpy, ctx)) {
> +         glXDestroyContext(dpy, ctx);
> +         return 0;
> +      }
> +   }
> +
> +   return ctx;
> +}
> +
> +
> +static XVisualInfo *
> +choose_xvisinfo(Display *dpy, int scrnum)
>  {
> -   Window win;
>     int attribSingle[] = {
>        GLX_RGBA,
>        GLX_RED_SIZE, 1,
> @@ -497,60 +815,53 @@ print_screen_info(Display *dpy, int scrnum, Bool
> allowDirect, Bool limits, Bool
>        GLX_BLUE_SIZE, 1,
>        GLX_DOUBLEBUFFER,
>        None };
> +   XVisualInfo *visinfo;
> +
> +   visinfo = glXChooseVisual(dpy, scrnum, attribSingle);
> +   if (!visinfo)
> +      visinfo = glXChooseVisual(dpy, scrnum, attribDouble);
> +
> +   return visinfo;
> +}
> +
>
> +static void
> +print_screen_info(Display *dpy, int scrnum, Bool allowDirect,
> +                  Bool coreProfile, Bool limits, Bool singleLine)
> +{
> +   Window win;
>     XSetWindowAttributes attr;
>     unsigned long mask;
>     Window root;
>     GLXContext ctx = NULL;
>     XVisualInfo *visinfo;
>     int width = 100, height = 100;
> +   GLXFBConfig *fbconfigs;
> +   const char *oglstring = coreProfile ? "OpenGL core profile" : "OpenGL";
>
>     root = RootWindow(dpy, scrnum);
>
>     /*
> -    * Find a basic GLX visual.  We'll then create a rendering context and
> -    * query various info strings.
> -    */
> -   visinfo = glXChooseVisual(dpy, scrnum, attribSingle);
> -   if (!visinfo)
> -      visinfo = glXChooseVisual(dpy, scrnum, attribDouble);
> -
> -   if (visinfo)
> -      ctx = glXCreateContext( dpy, visinfo, NULL, allowDirect );
> -
> -#ifdef GLX_VERSION_1_3
> -   /* Try glXChooseFBConfig() if glXChooseVisual didn't work.
> -    * XXX when would that happen?
> +    * Choose FBConfig or XVisualInfo and create a context.
>      */
> -   if (!visinfo) {
> -      int fbAttribSingle[] = {
> -        GLX_RENDER_TYPE,   GLX_RGBA_BIT,
> -        GLX_RED_SIZE,      1,
> -        GLX_GREEN_SIZE,    1,
> -        GLX_BLUE_SIZE,     1,
> -        GLX_DOUBLEBUFFER,  False,
> -        None };
> -      int fbAttribDouble[] = {
> -        GLX_RENDER_TYPE,   GLX_RGBA_BIT,
> -        GLX_RED_SIZE,      1,
> -        GLX_GREEN_SIZE,    1,
> -        GLX_BLUE_SIZE,     1,
> -        GLX_DOUBLEBUFFER,  True,
> -        None };
> -      GLXFBConfig *configs = NULL;
> -      int nConfigs;
> -
> -      configs = glXChooseFBConfig(dpy, scrnum, fbAttribSingle, &nConfigs);
> -      if (!configs)
> -        configs = glXChooseFBConfig(dpy, scrnum, fbAttribDouble,
> &nConfigs);
> -
> -      if (configs) {
> -        visinfo = glXGetVisualFromFBConfig(dpy, configs[0]);
> -        ctx = glXCreateNewContext(dpy, configs[0], GLX_RGBA_TYPE, NULL,
> allowDirect);
> -        XFree(configs);
> +   fbconfigs = choose_fb_config(dpy, scrnum);
> +   if (fbconfigs) {
> +      ctx = create_context_with_config(dpy, fbconfigs[0],
> +                                       coreProfile, allowDirect);
> +      if (!ctx && allowDirect) {
> +         /* try indirect */
> +         ctx = create_context_with_config(dpy, fbconfigs[0],
> +                                          coreProfile, False);
>        }
> +
> +      visinfo = glXGetVisualFromFBConfig(dpy, fbconfigs[0]);
> +      XFree(fbconfigs);
> +   }
> +   else {
> +      visinfo = choose_xvisinfo(dpy, scrnum);
> +      if (visinfo)
> +        ctx = glXCreateContext(dpy, visinfo, NULL, allowDirect);
>     }
> -#endif
>
>     if (!visinfo) {
>        fprintf(stderr, "Error: couldn't find RGB GLX visual or
> fbconfig\n");
> @@ -563,6 +874,9 @@ print_screen_info(Display *dpy, int scrnum, Bool
> allowDirect, Bool limits, Bool
>        return;
>     }
>
> +   /*
> +    * Create a window so that we can just bind the context.
> +    */
>     attr.background_pixel = 0;
>     attr.border_pixel = 0;
>     attr.colormap = XCreateColormap(dpy, root, visinfo->visual, AllocNone);
> @@ -583,72 +897,118 @@ print_screen_info(Display *dpy, int scrnum, Bool
> allowDirect, Bool limits, Bool
>        const char *glVendor = (const char *) glGetString(GL_VENDOR);
>        const char *glRenderer = (const char *) glGetString(GL_RENDERER);
>        const char *glVersion = (const char *) glGetString(GL_VERSION);
> -      const char *glExtensions = (const char *)
> glGetString(GL_EXTENSIONS);
> +      char *glExtensions;
>        int glxVersionMajor;
>        int glxVersionMinor;
>        char *displayName = NULL;
>        char *colon = NULL, *period = NULL;
> -
> +      int version; /* 20, 21, 30, 31, 32, etc */
> +
> +      CheckError(__LINE__);
> +      /* Get list of GL extensions */
> +      if (coreProfile) {
> +         glExtensions = build_core_profile_extension_list();
> +      }
> +      else {
> +         glExtensions = (char *) glGetString(GL_EXTENSIONS);
> +      }
> +
> +      CheckError(__LINE__);
> +
>        if (! glXQueryVersion( dpy, & glxVersionMajor, & glxVersionMinor ))
> {
>           fprintf(stderr, "Error: glXQueryVersion failed\n");
>           exit(1);
>        }
>
> -      /* Strip the screen number from the display name, if present. */
> -      if (!(displayName = (char *) malloc(strlen(DisplayString(dpy)) +
> 1))) {
> -         fprintf(stderr, "Error: malloc() failed\n");
> -         exit(1);
> -      }
> -      strcpy(displayName, DisplayString(dpy));
> -      colon = strrchr(displayName, ':');
> -      if (colon) {
> -         period = strchr(colon, '.');
> -         if (period)
> -            *period = '\0';
> -      }
> -      printf("display: %s  screen: %d\n", displayName, scrnum);
> -      free(displayName);
> -      printf("direct rendering: ");
> -      if (glXIsDirect(dpy, ctx)) {
> -         printf("Yes\n");
> -      }
> -      else {
> -         if (!allowDirect) {
> -            printf("No (-i specified)\n");
> +      if (!coreProfile) {
> +         /* Strip the screen number from the display name, if present. */
> +         if (!(displayName = (char *) malloc(strlen(DisplayString(dpy)) +
> 1))) {
> +            fprintf(stderr, "Error: malloc() failed\n");
> +            exit(1);
>           }
> -         else if (getenv("LIBGL_ALWAYS_INDIRECT")) {
> -            printf("No (LIBGL_ALWAYS_INDIRECT set)\n");
> +         strcpy(displayName, DisplayString(dpy));
> +         colon = strrchr(displayName, ':');
> +         if (colon) {
> +            period = strchr(colon, '.');
> +            if (period)
> +               *period = '\0';
> +         }
> +
> +         printf("display: %s  screen: %d\n", displayName, scrnum);
> +         free(displayName);
> +         printf("direct rendering: ");
> +         if (glXIsDirect(dpy, ctx)) {
> +            printf("Yes\n");
>           }
>           else {
> -            printf("No (If you want to find out why, try setting "
> -                   "LIBGL_DEBUG=verbose)\n");
> +            if (!allowDirect) {
> +               printf("No (-i specified)\n");
> +            }
> +            else if (getenv("LIBGL_ALWAYS_INDIRECT")) {
> +               printf("No (LIBGL_ALWAYS_INDIRECT set)\n");
> +            }
> +            else {
> +               printf("No (If you want to find out why, try setting "
> +                      "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);
> -      printf("OpenGL vendor string: %s\n", glVendor);
> -      printf("OpenGL renderer string: %s\n", glRenderer);
> -      printf("OpenGL version string: %s\n", glVersion);
> +         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);
> +         printf("OpenGL vendor string: %s\n", glVendor);
> +         printf("OpenGL renderer string: %s\n", glRenderer);
> +      } else
> +         printf("\n");
> +
> +      printf("%s version string: %s\n", oglstring, glVersion);
> +
> +      version = (glVersion[0] - '0') * 10 + (glVersion[2] - '0');
> +
> +      CheckError(__LINE__);
> +
>  #ifdef GL_VERSION_2_0
> -      if (glVersion[0] >= '2' && glVersion[1] == '.') {
> +      if (version >= 20) {
>           char *v = (char *) glGetString(GL_SHADING_LANGUAGE_VERSION);
> -         printf("OpenGL shading language version string: %s\n", v);
> +         printf("%s shading language version string: %s\n", oglstring, v);
> +      }
> +#endif
> +      CheckError(__LINE__);
> +#ifdef GL_VERSION_3_0
> +      if (version >= 30) {
> +         GLint flags;
> +         glGetIntegerv(GL_CONTEXT_FLAGS, &flags);
> +         printf("%s context flags: %s\n", oglstring,
> context_flags_string(flags));
>        }
>  #endif
> +      CheckError(__LINE__);
> +#ifdef GL_VERSION_3_2
> +      if (version >= 32) {
> +         GLint mask;
> +         glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &mask);
> +         printf("%s profile mask: %s\n", oglstring,
> profile_mask_string(mask));
> +      }
> +#endif
> +
> +      CheckError(__LINE__);
>
> -      printf("OpenGL extensions:\n");
> +      printf("%s extensions:\n", oglstring);
>        print_extension_list(glExtensions, singleLine);
> +
> +      CheckError(__LINE__);
> +
>        if (limits)
> -         print_limits(glExtensions);
> +         print_limits(glExtensions, oglstring);
> +
> +      if (coreProfile)
> +         free(glExtensions);
>     }
>     else {
>        fprintf(stderr, "Error: glXMakeCurrent failed\n");
> @@ -657,6 +1017,7 @@ print_screen_info(Display *dpy, int scrnum, Bool
> allowDirect, Bool limits, Bool
>     glXDestroyContext(dpy, ctx);
>     XFree(visinfo);
>     XDestroyWindow(dpy, win);
> +   XSync(dpy, 1);
>  }
>
>
> @@ -684,26 +1045,13 @@ visual_class_name(int cls)
>  static const char *
>  visual_drawable_type(int type)
>  {
> -   static char buffer[256], *p;
> -   const static struct { int bit; const char *name; } bits[] = {
> +   const static struct bit_info bits[] = {
>        { GLX_WINDOW_BIT, "window" },
>        { GLX_PIXMAP_BIT, "pixmap" },
>        { GLX_PBUFFER_BIT, "pbuffer" }
>     };
> -   int i;
> -
> -   strcpy(buffer, "(none)");
> -   p = buffer;
> -   for (i = 0; i < 3; i++) {
> -      if (type & bits[i].bit) {
> -         if (p > buffer)
> -            *p++ = ',';
> -         strcpy(p, bits[i].name);
> -         p += strlen(bits[i].name);
> -      }
> -   }
>
> -   return buffer;
> +   return bitmask_to_string(bits, ELEMENTS(bits), type);
>  }
>
>  static const char *
> @@ -1296,7 +1644,7 @@ find_best_visual(Display *dpy, int scrnum)
>  static void
>  usage(void)
>  {
> -   printf("Usage: glxinfo [-v] [-t] [-h] [-i] [-b] [-s] ][-display
> <dname>]\n");
> +   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");
> @@ -1372,7 +1720,8 @@ main(int argc, char *argv[])
>        print_display_info(dpy);
>        for (scrnum = 0; scrnum < numScreens; scrnum++) {
>           mesa_hack(dpy, scrnum);
> -         print_screen_info(dpy, scrnum, allowDirect, limits, singleLine);
> +         print_screen_info(dpy, scrnum, allowDirect, 0, limits,
> singleLine);
> +         print_screen_info(dpy, scrnum, allowDirect, 1, limits,
> singleLine);
>           printf("\n");
>           print_visual_info(dpy, scrnum, mode);
>  #ifdef GLX_VERSION_1_3
> --
> 1.8.0.2
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20130116/21e9d17b/attachment-0001.html>


More information about the mesa-dev mailing list