[Mesa-dev] [PATCH] Mesa-demos: add wglcontext to test the creation of a context through WGL_ARB_create_context

Morgan Armand morgan.devel at gmail.com
Sun Oct 30 09:45:17 PDT 2011


---
 src/wgl/CMakeLists.txt |    1 +
 src/wgl/wglcontext.c   |  274
++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 275 insertions(+), 0 deletions(-)
 create mode 100644 src/wgl/wglcontext.c

diff --git a/src/wgl/CMakeLists.txt b/src/wgl/CMakeLists.txt
index 834e836..88e6a20 100644
--- a/src/wgl/CMakeLists.txt
+++ b/src/wgl/CMakeLists.txt
@@ -13,5 +13,6 @@ add_executable (wgl_sharedtex_mt sharedtex_mt.c)
 set_target_properties (wgl_sharedtex_mt PROPERTIES OUTPUT_NAME
sharedtex_mt)
 
 add_executable (wglinfo wglinfo.c)
+add_executable (wglcontext wglcontext.c)
 
 install (TARGETS wglthreads wgl_sharedtex_mt wglinfo DESTINATION wgl)
diff --git a/src/wgl/wglcontext.c b/src/wgl/wglcontext.c
new file mode 100644
index 0000000..41e44cd
--- /dev/null
+++ b/src/wgl/wglcontext.c
@@ -0,0 +1,274 @@
+/*
+ * Copyright (C) 2011 Morgan Armand <morgan.devel at gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
"Software"),
+ * to deal in the Software without restriction, including without
limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * 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.  IN NO EVENT SHALL
+ * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 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.
+ */
+
+#include <windows.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <GL/gl.h>
+#include <GL/glext.h>
+#include <GL/wglext.h>
+
+static LRESULT CALLBACK
+WndProc(HWND hWnd,
+        UINT uMsg,
+        WPARAM wParam,
+        LPARAM lParam )
+{
+   switch (uMsg) {
+   case WM_DESTROY:
+      PostQuitMessage(0);
+      break;
+   default:
+      return DefWindowProc(hWnd, uMsg, wParam, lParam);
+   }
+
+   return 0;
+}
+
+static char *
+context_error_to_string(DWORD error)
+{
+   switch (error) {
+   case ERROR_INVALID_VERSION_ARB:  return "ERROR_INVALID_VERSION_ARB";
+   case ERROR_INVALID_PROFILE_ARB:  return "ERROR_INVALID_PROFILE_ARB";
+   case ERROR_INVALID_OPERATION:    return "ERROR_INVALID_OPERATION";
+   case ERROR_DC_NOT_FOUND:         return "ERROR_DC_NOT_FOUND";
+   case ERROR_INVALID_PIXEL_FORMAT: return "ERROR_INVALID_PIXEL_FORMAT";
+   case ERROR_NO_SYSTEM_RESOURCES:  return "ERROR_NO_SYSTEM_RESOURCES";
+   case ERROR_INVALID_PARAMETER:    return "ERROR_INVALID_PARAMETER";
+   default:                         return "Unknown Error";
+   }
+}
+
+static char *
+profile_mask_to_string(GLint profileMask)
+{
+   switch (profileMask) {
+   case WGL_CONTEXT_CORE_PROFILE_BIT_ARB:
+      return "WGL_CONTEXT_CORE_PROFILE_BIT_ARB";
+   case WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB:
+      return "WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB";
+   default:
+      return "0";
+   }
+}
+
+static void
+print_context_infos()
+{
+   GLint majorVersion;
+   GLint minorVersion;
+   GLint profileMask;
+   const GLubyte *version;
+
+   fprintf(stdout, "Context Informations\n");
+
+   version = glGetString(GL_VERSION);
+   fprintf(stdout, "GL_VERSION: %s\n", glGetString(GL_VERSION));
+
+   // Request informations with the new 3.x features.
+   if (sscanf(version, "%d.%d", &majorVersion, &minorVersion) != 2)
+      return;
+
+   if (majorVersion >= 3) {
+      glGetIntegerv(GL_MAJOR_VERSION, &majorVersion);
+      glGetIntegerv(GL_MINOR_VERSION, &minorVersion);
+      glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &profileMask);
+      fprintf(stdout, "GL_MAJOR_VERSION: %d\n", majorVersion);
+      fprintf(stdout, "GL_MINOR_VERSION: %d\n", minorVersion);
+      fprintf(stdout, "GL_CONTEXT_PROFILE_MASK: %s\n",
profile_mask_to_string(profileMask));
+   }
+}
+
+static void
+create_context(int majorVersion, int minorVersion, int profileMask, int
contextFlags)
+{
+   WNDCLASS wc;
+   HWND win;
+   HDC hdc;
+   PIXELFORMATDESCRIPTOR pfd;
+   int pixelFormat;
+   HGLRC tmp, ctx;
+   PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB;
+   int attribsList[] = {
+      WGL_CONTEXT_MAJOR_VERSION_ARB, 1,
+      WGL_CONTEXT_MINOR_VERSION_ARB, 0,
+      WGL_CONTEXT_FLAGS_ARB, 0,
+      WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_CORE_PROFILE_BIT_ARB,
+      0
+   };
+
+   memset(&wc, 0, sizeof(wc));
+   wc.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
+   wc.lpfnWndProc = WndProc;
+   wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
+   wc.hCursor = LoadCursor(NULL, IDC_ARROW);
+   wc.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1);
+   wc.lpszClassName = "wglcontext";
+
+   if (!RegisterClass(&wc)) {
+      fprintf(stderr, "RegisterClass() failed\n");
+      return;
+   }
+
+   win = CreateWindowEx(0,
+                     wc.lpszClassName,
+                     "wglinfo",
+                     WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
+                     CW_USEDEFAULT,
+                     CW_USEDEFAULT,
+                     CW_USEDEFAULT,
+                     CW_USEDEFAULT,
+                     NULL,
+                     NULL,
+                     wc.hInstance,
+                     NULL);
+   if (!win) {
+      fprintf(stderr, "CreateWindowEx() failed\n");
+      return;
+   }
+
+   hdc = GetDC(win);
+   if (!hdc) {
+      fprintf(stderr, "GetDC() failed\n");
+      return;
+   }
+
+   memset(&pfd, 0, sizeof(pfd));
+   pfd.nVersion = 1;
+   pfd.nSize = sizeof(pfd);
+   pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL;
+   pfd.iPixelType = PFD_TYPE_RGBA;
+   pfd.cColorBits = 24;
+   pfd.cDepthBits = 24;
+   pfd.iLayerType = PFD_MAIN_PLANE;
+
+   pixelFormat = ChoosePixelFormat(hdc, &pfd);
+   if (!pixelFormat) {
+      fprintf(stderr, "ChoosePixelFormat() failed\n");
+      return;
+   }
+
+   if (!SetPixelFormat(hdc, pixelFormat, &pfd)) {
+      fprintf(stderr, "SetPixelFormat() failed\n");
+      return;
+   }
+
+   tmp = wglCreateContext(hdc);
+   if (!tmp) {
+      fprintf(stderr, "wglCreateContext() failed\n");
+      return;
+   }
+
+   if (!wglMakeCurrent(hdc, tmp)) {
+      fprintf(stderr, "wglMakeCurrent() failed\n");
+      return;
+   }
+
+   wglCreateContextAttribsARB =
+     
(PFNWGLCREATECONTEXTATTRIBSARBPROC)wglGetProcAddress("wglCreateContextAttribsARB");
+
+   if (!wglCreateContextAttribsARB) {
+      fprintf(stderr, "wglCreateContextAttribsARB isn't supported\n");
+      return;
+   }
+
+   attribsList[1] = majorVersion;
+   attribsList[3] = minorVersion;
+   attribsList[5] = contextFlags;
+   attribsList[7] = profileMask;
+
+   ctx = wglCreateContextAttribsARB(hdc, 0, attribsList);
+   if (!ctx) {
+      DWORD error = GetLastError();
+      fprintf(stderr, "wglCreateContextAttribsARB failed(): %s (0x%x)\n",
+              context_error_to_string(error), error);
+      return;
+   }
+
+   wglMakeCurrent(NULL, NULL);
+   wglDeleteContext(tmp);
+
+   if (!wglMakeCurrent(hdc, ctx)) {
+      fprintf(stderr, "wglMakeCurrent() failed\n");
+      return;
+   }
+
+   print_context_infos(majorVersion);
+}
+
+static void
+usage(void)
+{
+   fprintf(stdout, "Usage: wglcontext [-h] [-major <major>] [-minor
<minor>] [-core] [-compat] [-debug] [-forward]\n");
+   fprintf(stdout, "   -major   : specify the major version you want\n");
+   fprintf(stdout, "   -minor   : specify the minor version you want\n");
+   fprintf(stdout, "   -core    : request a context implementing the
core profile\n");
+   fprintf(stdout, "   -compat  : request a context implementing the
compatibility profile\n");
+   fprintf(stdout, "   -debug   : request a debug context\n");
+   fprintf(stdout, "   -forward : request a forward-compatible context\n");
+   
+}
+
+int
+main(int argc, char *argv[])
+{
+   int i;
+   int majorVersion = 1, minorVersion = 0;
+   int contextFlags = 0x0;
+   int profileMask = WGL_CONTEXT_CORE_PROFILE_BIT_ARB;
+
+   for (i = 1; i < argc; i++) {
+      if (strcmp(argv[i], "-h") == 0) {
+         usage();
+         exit(0);
+      }
+      else if (strcmp(argv[i], "-major") == 0 && i + 1 < argc) {
+         majorVersion = (int)strtol(argv[i + 1], (char **)NULL, 10);
+         i++;
+      }
+      else if (strcmp(argv[i], "-minor") == 0 && i + 1 < argc) {
+         minorVersion = (int)strtol(argv[i + 1], (char **)NULL, 10);
+         i++;
+      }
+      else if (strcmp(argv[i], "-core") == 0) {
+         profileMask = WGL_CONTEXT_CORE_PROFILE_BIT_ARB;
+      }
+      else if (strcmp(argv[i], "-compat") == 0) {
+         profileMask = WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB;
+      }
+      else if (strcmp(argv[i], "-debug") == 0) {
+         contextFlags |= WGL_CONTEXT_DEBUG_BIT_ARB;
+      }
+      else if (strcmp(argv[i], "-forward") == 0) {
+         contextFlags |= WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB;
+      }
+      else {
+         usage();
+         exit(1);
+      }
+   }
+
+   create_context(majorVersion, minorVersion,
+                  profileMask, contextFlags);
+
+   return 0;
+}
-- 
1.7.7.1.msysgit.0



More information about the mesa-dev mailing list