Roderick Colenbrander : opengl32: Add a test case for WGL_ARB_create_context/opengl3.

Alexandre Julliard julliard at winehq.org
Fri Oct 10 08:06:44 CDT 2008


Module: wine
Branch: master
Commit: a3dff8af94deea9cf72fe0dcf50a6cb6e1b4ead6
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=a3dff8af94deea9cf72fe0dcf50a6cb6e1b4ead6

Author: Roderick Colenbrander <thunderbird2k at gmx.net>
Date:   Thu Oct  9 20:54:50 2008 +0000

opengl32: Add a test case for WGL_ARB_create_context/opengl3.

---

 dlls/opengl32/tests/opengl.c |  122 +++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 121 insertions(+), 1 deletions(-)

diff --git a/dlls/opengl32/tests/opengl.c b/dlls/opengl32/tests/opengl.c
index 65c47c6..b931999 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




More information about the wine-cvs mailing list