From a3dff8af94deea9cf72fe0dcf50a6cb6e1b4ead6 Mon Sep 17 00:00:00 2001 From: Roderick Colenbrander Date: Thu, 9 Oct 2008 20:54:50 +0000 Subject: [PATCH] opengl32: Add a test case for WGL_ARB_create_context/opengl3. --- dlls/opengl32/tests/opengl.c | 122 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 121 insertions(+), 1 deletion(-) diff --git a/dlls/opengl32/tests/opengl.c b/dlls/opengl32/tests/opengl.c index 65c47c603f9..b931999e348 100644 --- a/dlls/opengl32/tests/opengl.c +++ b/dlls/opengl32/tests/opengl.c @@ -1,7 +1,7 @@ /* * Some tests for OpenGL functions * - * Copyright (C) 2007 Roderick Colenbrander + * Copyright (C) 2007-2008 Roderick Colenbrander * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -30,6 +30,18 @@ const unsigned char * WINAPI glGetString(unsigned int); #define MAX_FORMATS 256 typedef void* HPBUFFERARB; +/* WGL_ARB_create_context */ +HGLRC (WINAPI *pwglCreateContextAttribsARB)(HDC hDC, HGLRC hShareContext, const int *attribList); +/* GetLastError */ +#define ERROR_INVALID_VERSION_ARB 0x2095 +#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091 +#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092 +#define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093 +#define WGL_CONTEXT_FLAGS_ARB 0x2094 +/* Flags for WGL_CONTEXT_FLAGS_ARB */ +#define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001 +#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 + /* WGL_ARB_extensions_string */ static const char* (WINAPI *pwglGetExtensionsStringARB)(HDC); static int (WINAPI *pwglReleasePbufferDCARB)(HPBUFFERARB, HDC); @@ -64,6 +76,9 @@ static void init_functions(void) if(!p ## func) \ trace("wglGetProcAddress(%s) failed\n", #func); + /* WGL_ARB_create_context */ + GET_PROC(wglCreateContextAttribsARB); + /* WGL_ARB_extensions_string */ GET_PROC(wglGetExtensionsStringARB) @@ -400,6 +415,108 @@ static void test_dc(HWND hwnd, HDC hdc) } } +static void test_opengl3(HDC hdc) +{ + /* Try to create a context using an invalid OpenGL version namely 0.x */ + { + HGLRC gl3Ctx; + int attribs[] = {WGL_CONTEXT_MAJOR_VERSION_ARB, 0, 0}; + + gl3Ctx = pwglCreateContextAttribsARB(hdc, 0, attribs); + ok(gl3Ctx == 0, "wglCreateContextAttribs with major version=0 should fail!\n"); + + if(gl3Ctx) + wglDeleteContext(gl3Ctx); + } + + /* Try to create a context compatible with OpenGL 1.x; 1.0-2.1 is allowed */ + { + HGLRC gl3Ctx; + int attribs[] = {WGL_CONTEXT_MAJOR_VERSION_ARB, 1, 0}; + + gl3Ctx = pwglCreateContextAttribsARB(hdc, 0, attribs); + ok(gl3Ctx != 0, "pwglCreateContextAttribsARB for a 1.x context failed!\n"); + wglDeleteContext(gl3Ctx); + } + + /* Try to pass an invalid HDC */ + { + HGLRC gl3Ctx; + DWORD error; + gl3Ctx = pwglCreateContextAttribsARB((HDC)0xdeadbeef, 0, 0); + ok(gl3Ctx == 0, "pwglCreateContextAttribsARB using an invalid HDC passed\n"); + error = GetLastError(); + ok(error == ERROR_DC_NOT_FOUND, "Expected ERROR_DC_NOT_FOUND, got error=%x\n", error); + wglDeleteContext(gl3Ctx); + } + + /* Try to pass an invalid shareList */ + { + HGLRC gl3Ctx; + DWORD error; + gl3Ctx = pwglCreateContextAttribsARB(hdc, (HGLRC)0xdeadbeef, 0); + ok(gl3Ctx == 0, "pwglCreateContextAttribsARB using an invalid shareList passed\n"); + error = GetLastError(); + ok(error == ERROR_INVALID_OPERATION, "Expected ERROR_INVALID_OPERATION, got error=%x\n", error); + wglDeleteContext(gl3Ctx); + } + + /* Try to create an OpenGL 3.0 context */ + { + int attribs[] = {WGL_CONTEXT_MAJOR_VERSION_ARB, 3, WGL_CONTEXT_MINOR_VERSION_ARB, 0, 0}; + HGLRC gl3Ctx = pwglCreateContextAttribsARB(hdc, 0, attribs); + + if(gl3Ctx == NULL) + { + skip("Skipping the rest of the WGL_ARB_create_context test due to lack of OpenGL 3.0\n"); + return; + } + + wglDeleteContext(gl3Ctx); + } + + /* Test matching an OpenGL 3.0 context with an older one, OpenGL 3.0 should allow it until the new object model is introduced in a future revision */ + { + HGLRC glCtx = wglCreateContext(hdc); + + int attribs[] = {WGL_CONTEXT_MAJOR_VERSION_ARB, 3, WGL_CONTEXT_MINOR_VERSION_ARB, 0, 0}; + int attribs_future[] = {WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB, WGL_CONTEXT_MAJOR_VERSION_ARB, 3, WGL_CONTEXT_MINOR_VERSION_ARB, 0, 0}; + + HGLRC gl3Ctx = pwglCreateContextAttribsARB(hdc, glCtx, attribs); + ok(gl3Ctx != NULL, "Sharing of a display list between OpenGL 3.0 and OpenGL 1.x/2.x failed!\n"); + if(gl3Ctx) + wglDeleteContext(gl3Ctx); + + gl3Ctx = pwglCreateContextAttribsARB(hdc, glCtx, attribs_future); + ok(gl3Ctx != NULL, "Sharing of a display list between a forward compatible OpenGL 3.0 context and OpenGL 1.x/2.x failed!\n"); + if(gl3Ctx) + wglDeleteContext(gl3Ctx); + + if(glCtx) + wglDeleteContext(glCtx); + } + + /* Try to create an OpenGL 3.0 context and test windowless rendering */ + { + HGLRC gl3Ctx; + int attribs[] = {WGL_CONTEXT_MAJOR_VERSION_ARB, 3, WGL_CONTEXT_MINOR_VERSION_ARB, 0, 0}; + BOOL res; + + gl3Ctx = pwglCreateContextAttribsARB(hdc, 0, attribs); + ok(gl3Ctx != 0, "pwglCreateContextAttribsARB for a 3.0 context failed!\n"); + + /* OpenGL 3.0 allows offscreen rendering WITHOUT a drawable */ + /* NOTE: Nvidia's 177.89 beta drivers don't allow this yet */ + res = wglMakeCurrent(0, gl3Ctx); + ok(res == TRUE, "OpenGL 3.0 should allow windowless rendering, but the test failed!\n"); + if(res) + wglMakeCurrent(0, 0); + + if(gl3Ctx) + wglDeleteContext(gl3Ctx); + } +} + START_TEST(opengl) { HWND hwnd; @@ -477,6 +594,9 @@ START_TEST(opengl) wgl_extensions = pwglGetExtensionsStringARB(hdc); if(wgl_extensions == NULL) skip("Skipping opengl32 tests because this OpenGL implementation doesn't support WGL extensions!\n"); + if(strstr(wgl_extensions, "WGL_ARB_create_context")) + test_opengl3(hdc); + if(strstr(wgl_extensions, "WGL_ARB_make_current_read")) test_make_current_read(hdc); else -- 2.11.4.GIT