[Mesa-dev] [PATCH 3/5] wglinfo: Add support for reporting core profile info

Brian Paul brianp at vmware.com
Tue Jul 15 07:39:46 PDT 2014


As with glxinfo, we first report version/extension info for a compatibility
profile context, then report version/extension info for a core profile
context.
---
 src/wgl/wglinfo.c          |  134 +++++++++++++++++++++++++++++++++++++-------
 src/xdemos/glinfo_common.h |   24 ++++++++
 src/xdemos/glxinfo.c       |   24 --------
 3 files changed, 138 insertions(+), 44 deletions(-)

diff --git a/src/wgl/wglinfo.c b/src/wgl/wglinfo.c
index fe94dcc..16008d2 100644
--- a/src/wgl/wglinfo.c
+++ b/src/wgl/wglinfo.c
@@ -42,10 +42,12 @@
 #include "glinfo_common.h"
 
 
+static GLboolean have_WGL_ARB_create_context;
 static GLboolean have_WGL_ARB_pixel_format;
 static GLboolean have_WGL_ARB_multisample;
 
 static PFNWGLGETPIXELFORMATATTRIBIVARBPROC wglGetPixelFormatAttribivARB_func;
+static PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB_func;
 
 
 /**
@@ -77,7 +79,8 @@ WndProc(HWND hWnd,
 
 
 static void
-print_screen_info(HDC _hdc, GLboolean limits, GLboolean singleLine)
+print_screen_info(HDC _hdc, GLboolean limits, GLboolean singleLine,
+                  GLboolean coreProfile)
 {
    WNDCLASS wc;
    HWND win;
@@ -153,36 +156,79 @@ print_screen_info(HDC _hdc, GLboolean limits, GLboolean singleLine)
       PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB_func = 
          (PFNWGLGETEXTENSIONSSTRINGARBPROC)wglGetProcAddress("wglGetExtensionsStringARB");
 #endif
-      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);
+      const char *glVendor, *glRenderer, *glVersion, *glExtensions;
+      const char *wglExtensions = NULL;
       struct ext_functions extfuncs;
       
 #if defined(WGL_ARB_extensions_string)
       if (wglGetExtensionsStringARB_func) {
-         const char *wglExtensions = wglGetExtensionsStringARB_func(hdc);
-         if(wglExtensions) {
-            printf("WGL extensions:\n");
-            print_extension_list(wglExtensions, singleLine);
-         }
+         wglExtensions = wglGetExtensionsStringARB_func(hdc);
          if (extension_supported("WGL_ARB_pixel_format", wglExtensions)) {
             have_WGL_ARB_pixel_format = GL_TRUE;
          }
          if (extension_supported("WGL_ARB_multisample", wglExtensions)) {
             have_WGL_ARB_multisample = GL_TRUE;
          }
+         if (extension_supported("WGL_ARB_create_context", wglExtensions)) {
+            have_WGL_ARB_create_context = GL_TRUE;
+         }
       }
 #endif
-      printf("OpenGL vendor string: %s\n", glVendor);
-      printf("OpenGL renderer string: %s\n", glRenderer);
-      printf("OpenGL version string: %s\n", glVersion);
-#ifdef GL_VERSION_2_0
-      if (glVersion[0] >= '2' && glVersion[1] == '.') {
-         char *v = (char *) glGetString(GL_SHADING_LANGUAGE_VERSION);
-         printf("OpenGL shading language version string: %s\n", v);
+
+      if (coreProfile && have_WGL_ARB_create_context) {
+         /* Try to create a new, core context */
+         HGLRC core_ctx = 0;
+         int i;
+
+         wglCreateContextAttribsARB_func =
+            (PFNWGLCREATECONTEXTATTRIBSARBPROC)
+            wglGetProcAddress("wglCreateContextAttribsARB");
+         assert(wglCreateContextAttribsARB_func);
+         if (!wglCreateContextAttribsARB_func) {
+            printf("Failed to get wglCreateContextAttribsARB pointer.");
+            return;
+         }
+
+         for (i = NUM_GL_VERSIONS - 2; i > 0 ; i--) {
+            int attribs[10], n;
+
+            /* don't bother below GL 3.1 */
+            if (gl_versions[i].major == 3 && gl_versions[i].minor == 0) {
+               break;
+            }
+
+            n = 0;
+            attribs[n++] = WGL_CONTEXT_MAJOR_VERSION_ARB;
+            attribs[n++] = gl_versions[i].major;
+            attribs[n++] = WGL_CONTEXT_MINOR_VERSION_ARB;
+            attribs[n++] = gl_versions[i].minor;
+            if (gl_versions[i].major * 10 + gl_versions[i].minor > 31) {
+               attribs[n++] = WGL_CONTEXT_PROFILE_MASK_ARB;
+               attribs[n++] = WGL_CONTEXT_CORE_PROFILE_BIT_ARB;
+            }
+            attribs[n++] = 0;
+
+            core_ctx = wglCreateContextAttribsARB_func(hdc, 0, attribs);
+            if (core_ctx) {
+               break;
+            }
+         }
+
+         if (!core_ctx) {
+            printf("Failed to create core profile context.\n");
+            return;
+         }
+
+         ctx = core_ctx;
+         if (!wglMakeCurrent(hdc, ctx)) {
+            printf("Failed to bind core profile context.\n");
+            return;
+         }
+         oglString = "OpenGL core profile";
+      }
+      else {
+         coreProfile = GL_FALSE;
       }
-#endif
 
       extfuncs.GetProgramivARB = (PFNGLGETPROGRAMIVARBPROC)
          wglGetProcAddress("glGetProgramivARB");
@@ -191,9 +237,55 @@ print_screen_info(HDC _hdc, GLboolean limits, GLboolean singleLine)
       extfuncs.GetConvolutionParameteriv = (GETCONVOLUTIONPARAMETERIVPROC)
          wglGetProcAddress("glGetConvolutionParameteriv");
 
+      glVendor = (const char *) glGetString(GL_VENDOR);
+      glRenderer = (const char *) glGetString(GL_RENDERER);
+      glVersion = (const char *) glGetString(GL_VERSION);
+      if (coreProfile) {
+         glExtensions = build_core_profile_extension_list(&extfuncs);
+      }
+      else {
+         glExtensions = (const char *) glGetString(GL_EXTENSIONS);
+      }
+
+      /*
+       * Print all the vendor, version, extension strings.
+       */
+
+      if (!coreProfile) {
+         if (wglExtensions) {
+            printf("WGL extensions:\n");
+            print_extension_list(wglExtensions, singleLine);
+         }
+         printf("OpenGL vendor string: %s\n", glVendor);
+         printf("OpenGL renderer string: %s\n", glRenderer);
+      }
+
+      printf("%s version string: %s\n", oglString, glVersion);
+
       version = (glVersion[0] - '0') * 10 + (glVersion[2] - '0');
 
-      printf("OpenGL extensions:\n");
+#ifdef GL_VERSION_2_0
+      if (version >= 20) {
+         char *v = (char *) glGetString(GL_SHADING_LANGUAGE_VERSION);
+         printf("%s shading language version string: %s\n", oglString, v);
+      }
+#endif
+#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
+#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
+
+      printf("%s extensions:\n", oglString);
       print_extension_list(glExtensions, singleLine);
       if (limits) {
          print_limits(glExtensions, oglString, version, &extfuncs);
@@ -543,7 +635,9 @@ main(int argc, char *argv[])
       printf("%d\n", b);
    }
    else {
-      print_screen_info(hdc, opts.limits, opts.singleLine);
+      print_screen_info(hdc, opts.limits, opts.singleLine, GL_FALSE);
+      printf("\n");
+      print_screen_info(hdc, opts.limits, opts.singleLine, GL_TRUE);
       printf("\n");
       print_visual_info(hdc, opts.mode);
    }
diff --git a/src/xdemos/glinfo_common.h b/src/xdemos/glinfo_common.h
index a268727..41384f7 100644
--- a/src/xdemos/glinfo_common.h
+++ b/src/xdemos/glinfo_common.h
@@ -83,6 +83,30 @@ struct options
 };
 
 
+/** 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)
+
 
 void
 print_extension_list(const char *ext, GLboolean singleLine);
diff --git a/src/xdemos/glxinfo.c b/src/xdemos/glxinfo.c
index 6e7fa3a..2d187f6 100644
--- a/src/xdemos/glxinfo.c
+++ b/src/xdemos/glxinfo.c
@@ -102,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
  *
-- 
1.7.10.4



More information about the mesa-dev mailing list