Module: Demos Branch: master Commit: e38396b2c19ee65a6cd0e8f44fb7d051d7851a3a URL: http://cgit.freedesktop.org/mesa/demos/commit/?id=e38396b2c19ee65a6cd0e8f44fb7d051d7851a3a
Author: Morgan Armand <[email protected]> Date: Sun Oct 30 17:45:17 2011 +0100 Mesa-demos: add wglcontext to test the creation of a context through WGL_ARB_create_context Signed-off-by: José Fonseca <[email protected]> --- src/wgl/CMakeLists.txt | 1 + src/wgl/wglcontext.c | 274 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 275 insertions(+), 0 deletions(-) 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..957689b --- /dev/null +++ b/src/wgl/wglcontext.c @@ -0,0 +1,274 @@ +/* + * Copyright (C) 2011 Morgan Armand <[email protected]> + * + * 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; +} _______________________________________________ mesa-commit mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/mesa-commit
