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

Jose Fonseca jfonseca at vmware.com
Wed Nov 2 05:17:46 PDT 2011


I've pushed, but it doesn't work on nvidia.

It fails with error 0xc0072096.

Have you tried with different implementations?

Jose

----- Original Message -----
> ---
>  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
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
> 


More information about the mesa-dev mailing list