[1/6] opengl32/tests: Add a test for window destroy with wglMakeContextCurrentARB.

Matteo Bruni matteo.mystral at gmail.com
Wed Mar 30 17:18:38 CDT 2011


-------------- next part --------------
From 351c44c57f0da593c688b64dde730c8f248e9c1b Mon Sep 17 00:00:00 2001
From: Matteo Bruni <mbruni at codeweavers.com>
Date: Fri, 18 Mar 2011 14:16:58 +0100
Subject: opengl32/tests: Add a test for window destroy with wglMakeContextCurrentARB.

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

diff --git a/dlls/opengl32/tests/opengl.c b/dlls/opengl32/tests/opengl.c
index 9834c6d..7b6c911 100644
--- a/dlls/opengl32/tests/opengl.c
+++ b/dlls/opengl32/tests/opengl.c
@@ -24,8 +24,10 @@
 
 void WINAPI glClearColor(float red, float green, float blue, float alpha);
 void WINAPI glClear(unsigned int mask);
-void WINAPI glFinish(void);
+#define GL_COLOR 0x1800
 typedef unsigned int GLenum;
+void WINAPI glCopyPixels(int x, int y, int width, int height, GLenum type);
+void WINAPI glFinish(void);
 #define GL_NO_ERROR 0x0
 #define GL_INVALID_OPERATION 0x502
 GLenum WINAPI glGetError(void);
@@ -1003,6 +1005,157 @@ static void test_destroy(HDC oldhdc)
     ok(ret, "Failed to make context current, last error %#x.\n", GetLastError());
 }
 
+static void test_destroy_read(HDC oldhdc)
+{
+    PIXELFORMATDESCRIPTOR pf_desc =
+    {
+        sizeof(PIXELFORMATDESCRIPTOR),
+        1,                     /* version */
+        PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
+        PFD_TYPE_RGBA,
+        24,                    /* 24-bit color depth */
+        0, 0, 0, 0, 0, 0,      /* color bits */
+        0,                     /* alpha buffer */
+        0,                     /* shift bit */
+        0,                     /* accumulation buffer */
+        0, 0, 0, 0,            /* accum bits */
+        32,                    /* z-buffer */
+        0,                     /* stencil buffer */
+        0,                     /* auxiliary buffer */
+        PFD_MAIN_PLANE,        /* main layer */
+        0,                     /* reserved */
+        0, 0, 0                /* layer masks */
+    };
+    int pixel_format;
+    HWND draw_window, read_window;
+    HGLRC ctx;
+    BOOL ret;
+    HDC read_dc, draw_dc;
+    GLenum glerr;
+    DWORD err;
+    HGLRC oldctx = wglGetCurrentContext();
+
+    ok(!!oldctx, "Expected to find a valid current context\n");
+
+    draw_window = CreateWindowA("static", "opengl32_test",
+            WS_POPUP, 0, 0, 640, 480, 0, 0, 0, 0);
+    ok(!!draw_window, "Failed to create window, last error %#x.\n", GetLastError());
+
+    draw_dc = GetDC(draw_window);
+    ok(!!draw_dc, "Failed to get DC.\n");
+
+    pixel_format = ChoosePixelFormat(draw_dc, &pf_desc);
+    if (!pixel_format)
+    {
+        win_skip("Failed to find pixel format.\n");
+        ReleaseDC(draw_window, draw_dc);
+        DestroyWindow(draw_window);
+        return;
+    }
+
+    ret = SetPixelFormat(draw_dc, pixel_format, &pf_desc);
+    ok(ret, "Failed to set pixel format, last error %#x.\n", GetLastError());
+
+    read_window = CreateWindowA("static", "opengl32_test",
+            WS_POPUP, 0, 0, 640, 480, 0, 0, 0, 0);
+    ok(!!read_window, "Failed to create window, last error %#x.\n", GetLastError());
+
+    read_dc = GetDC(read_window);
+    ok(!!draw_dc, "Failed to get DC.\n");
+
+    pixel_format = ChoosePixelFormat(read_dc, &pf_desc);
+    if (!pixel_format)
+    {
+        win_skip("Failed to find pixel format.\n");
+        ReleaseDC(read_window, read_dc);
+        DestroyWindow(read_window);
+        ReleaseDC(draw_window, draw_dc);
+        DestroyWindow(draw_window);
+        return;
+    }
+
+    ret = SetPixelFormat(read_dc, pixel_format, &pf_desc);
+    ok(ret, "Failed to set pixel format, last error %#x.\n", GetLastError());
+
+    ctx = wglCreateContext(draw_dc);
+    ok(!!ctx, "Failed to create GL context, last error %#x.\n", GetLastError());
+
+    ret = pwglMakeContextCurrentARB(draw_dc, read_dc, ctx);
+    ok(ret, "Failed to make context current, last error %#x.\n", GetLastError());
+
+    glCopyPixels(0, 0, 640, 480, GL_COLOR);
+    glFinish();
+    glerr = glGetError();
+    ok(glerr == GL_NO_ERROR, "Failed glCopyPixel, error %#x.\n", glerr);
+
+    ret = DestroyWindow(read_window);
+    ok(ret, "Failed to destroy window, last error %#x.\n", GetLastError());
+
+    ok(wglGetCurrentContext() == ctx, "Wrong current context.\n");
+
+    if (0) /* Crashes on AMD on Windows */
+    {
+        glCopyPixels(0, 0, 640, 480, GL_COLOR);
+        glFinish();
+        glerr = glGetError();
+        ok(glerr == GL_NO_ERROR, "Failed glCopyPixel, error %#x.\n", glerr);
+    }
+
+    glClear(GL_COLOR_BUFFER_BIT);
+    glFinish();
+    glerr = glGetError();
+    ok(glerr == GL_NO_ERROR, "Failed glClear, error %#x.\n", glerr);
+
+    ret = wglMakeCurrent(NULL, NULL);
+    ok(ret, "Failed to clear current context, last error %#x.\n", GetLastError());
+
+    if (0) /* This crashes with Nvidia drivers on Windows. */
+    {
+        SetLastError(0xdeadbeef);
+        ret = pwglMakeContextCurrentARB(draw_dc, read_dc, ctx);
+        err = GetLastError();
+        ok(!ret && err == ERROR_INVALID_HANDLE,
+                "Unexpected behavior when making context current, ret %d, last error %#x.\n", ret, err);
+    }
+
+    ret = DestroyWindow(draw_window);
+    ok(ret, "Failed to destroy window, last error %#x.\n", GetLastError());
+
+    glClear(GL_COLOR_BUFFER_BIT);
+    glFinish();
+    glerr = glGetError();
+    todo_wine ok(glerr == GL_INVALID_OPERATION, "Failed glClear, error %#x.\n", glerr);
+
+    SetLastError(0xdeadbeef);
+    ret = pwglMakeContextCurrentARB(draw_dc, read_dc, ctx);
+    err = GetLastError();
+    todo_wine ok(!ret && (err == ERROR_INVALID_HANDLE || err == 0xc0070006),
+            "Unexpected behavior when making context current, ret %d, last error %#x.\n", ret, err);
+
+    todo_wine ok(wglGetCurrentContext() == NULL, "Wrong current context.\n");
+
+    wglMakeCurrent(NULL, NULL);
+
+    wglMakeCurrent(oldhdc, oldctx);
+    ok(wglGetCurrentContext() == oldctx, "Wrong current context.\n");
+
+    SetLastError(0xdeadbeef);
+    ret = pwglMakeContextCurrentARB(draw_dc, read_dc, ctx);
+    err = GetLastError();
+    todo_wine ok(!ret && (err == ERROR_INVALID_HANDLE || err == 0xc0070006),
+            "Unexpected behavior when making context current, last error %#x.\n", err);
+
+    todo_wine ok(wglGetCurrentContext() == oldctx, "Wrong current context.\n");
+
+    ret = wglDeleteContext(ctx);
+    ok(ret, "Failed to delete GL context, last error %#x.\n", GetLastError());
+
+    ReleaseDC(read_window, read_dc);
+    ReleaseDC(draw_window, draw_dc);
+
+    wglMakeCurrent(oldhdc, oldctx);
+}
+
 START_TEST(opengl)
 {
     HWND hwnd;
@@ -1103,7 +1256,10 @@ START_TEST(opengl)
             test_opengl3(hdc);
 
         if(strstr(wgl_extensions, "WGL_ARB_make_current_read"))
+        {
             test_make_current_read(hdc);
+            test_destroy_read(hdc);
+        }
         else
             skip("WGL_ARB_make_current_read not supported, skipping test\n");
 
-- 
1.7.3.4


More information about the wine-patches mailing list