[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