Roderick Colenbrander : wgl: Fix wglGetCurrentReadDCARB bugs.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Aug 23 07:25:53 CDT 2007


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

Author: Roderick Colenbrander <thunderbird2k at gmx.net>
Date:   Wed Aug 22 19:47:32 2007 +0200

wgl: Fix wglGetCurrentReadDCARB bugs.

---

 dlls/opengl32/tests/opengl.c |   42 +++++++++++++++++++++++++++++++++++++++
 dlls/winex11.drv/opengl.c    |   45 ++++++++++++++----------------------------
 2 files changed, 57 insertions(+), 30 deletions(-)

diff --git a/dlls/opengl32/tests/opengl.c b/dlls/opengl32/tests/opengl.c
index ccf5e3d..268bece 100644
--- a/dlls/opengl32/tests/opengl.c
+++ b/dlls/opengl32/tests/opengl.c
@@ -29,6 +29,10 @@ typedef void* HPBUFFERARB;
 static const char* (WINAPI *pwglGetExtensionsStringARB)(HDC);
 static int (WINAPI *pwglReleasePbufferDCARB)(HPBUFFERARB, HDC);
 
+/* WGL_ARB_make_current_read */
+static BOOL (WINAPI *pwglMakeContextCurrentARB)(HDC hdraw, HDC hread, HGLRC hglrc);
+static HDC (WINAPI *pwglGetCurrentReadDCARB)();
+
 /* WGL_ARB_pixel_format */
 #define WGL_COLOR_BITS_ARB 0x2014
 #define WGL_RED_BITS_ARB   0x2015
@@ -58,6 +62,10 @@ static void init_functions(void)
     /* WGL_ARB_extensions_string */
     GET_PROC(wglGetExtensionsStringARB)
 
+    /* WGL_ARB_make_current_read */
+    GET_PROC(wglMakeContextCurrentARB);
+    GET_PROC(wglGetCurrentReadDCARB);
+
     /* WGL_ARB_pixel_format */
     GET_PROC(wglChoosePixelFormatARB)
     GET_PROC(wglGetPixelFormatAttribivARB)
@@ -257,6 +265,35 @@ static void test_gdi_dbuf(HDC hdc)
     }
 }
 
+static void test_make_current_read(HDC hdc)
+{
+    int res;
+    HDC hread;
+    HGLRC hglrc = wglCreateContext(hdc);
+
+    if(!hglrc)
+    {
+        skip("wglCreateContext failed!\n");
+        return;
+    }
+
+    res = wglMakeCurrent(hdc, hglrc);
+    if(!res)
+    {
+        skip("wglMakeCurrent failed!\n");
+        return;
+    }
+
+    /* Test what wglGetCurrentReadDCARB does for wglMakeCurrent as the spec doesn't mention it */
+    hread = pwglGetCurrentReadDCARB();
+    trace("hread %p, hdc %p\n", hread, hdc);
+    ok(hread == hdc, "wglGetCurrentReadDCARB failed for standard wglMakeCurrent\n");
+
+    pwglMakeContextCurrentARB(hdc, hdc, hglrc);
+    hread = pwglGetCurrentReadDCARB();
+    ok(hread == hdc, "wglGetCurrentReadDCARB failed for wglMakeContextCurrent\n");
+}
+
 START_TEST(opengl)
 {
     HWND hwnd;
@@ -311,6 +348,11 @@ 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_make_current_read"))
+            test_make_current_read(hdc);
+        else
+            trace("WGL_ARB_make_current_read not supported, skipping test\n");
+
         if(strstr(wgl_extensions, "WGL_ARB_pbuffer"))
             test_pbuffers(hdc);
         else
diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c
index 98ecedb..09a1d6a 100644
--- a/dlls/winex11.drv/opengl.c
+++ b/dlls/winex11.drv/opengl.c
@@ -110,6 +110,7 @@ typedef struct wine_glcontext {
     GLXContext ctx;
     BOOL do_escape;
     X11DRV_PDEVICE *physDev;
+    X11DRV_PDEVICE *pReadDev;
     RECT viewport;
     RECT scissor;
     BOOL scissor_enabled;
@@ -554,22 +555,6 @@ static inline Wine_GLContext *get_context_from_GLXContext(GLXContext ctx)
     return ret;
 }
 
-/**
- * get_hdc_from_Drawable (internal)
- *
- * For use by wglGetCurrentReadDCARB.
- */
-static inline HDC get_hdc_from_Drawable(GLXDrawable d)
-{
-    Wine_GLContext *ret;
-    for (ret = context_list; ret; ret = ret->next) {
-        if (d == ret->physDev->drawable) {
-            return ret->hdc;
-        }
-    }
-    return NULL;
-}
-
 static inline BOOL is_valid_context( Wine_GLContext *ctx )
 {
     Wine_GLContext *ptr;
@@ -1532,17 +1517,14 @@ BOOL X11DRV_wglDeleteContext(HGLRC hglrc)
  */
 static HDC WINAPI X11DRV_wglGetCurrentReadDCARB(void) 
 {
-    GLXDrawable gl_d;
-    HDC ret;
+    HDC ret = 0;
+    Wine_GLContext *ctx = NtCurrentTeb()->glContext;
+    X11DRV_PDEVICE *physDev = ctx ? ctx->pReadDev : NULL;
 
-    TRACE("()\n");
-
-    wine_tsx11_lock();
-    gl_d = pglXGetCurrentReadDrawable();
-    ret = get_hdc_from_Drawable(gl_d);
-    wine_tsx11_unlock();
+    if(physDev)
+        ret = physDev->hdc;
 
-    TRACE(" returning %p (GL drawable %lu)\n", ret, gl_d);
+    TRACE(" returning %p (GL drawable %lu)\n", ret, physDev ? physDev->drawable : 0);
     return ret;
 }
 
@@ -1681,6 +1663,7 @@ BOOL X11DRV_wglMakeCurrent(X11DRV_PDEVICE *physDev, HGLRC hglrc) {
         if(ret)
         {
             ctx->physDev = physDev;
+            ctx->pReadDev = physDev;
 
             if (type == OBJ_MEMDC)
             {
@@ -1703,10 +1686,10 @@ BOOL X11DRV_wglMakeCurrent(X11DRV_PDEVICE *physDev, HGLRC hglrc) {
  *
  * For OpenGL32 wglMakeContextCurrentARB
  */
-BOOL X11DRV_wglMakeContextCurrentARB(X11DRV_PDEVICE* hDrawDev, X11DRV_PDEVICE* hReadDev, HGLRC hglrc) 
+BOOL X11DRV_wglMakeContextCurrentARB(X11DRV_PDEVICE* pDrawDev, X11DRV_PDEVICE* pReadDev, HGLRC hglrc)
 {
     BOOL ret;
-    TRACE("(%p,%p,%p)\n", hDrawDev, hReadDev, hglrc);
+    TRACE("(%p,%p,%p)\n", pDrawDev, pReadDev, hglrc);
 
     if (!has_opengl()) {
         ERR("No libGL on this box - disabling OpenGL support !\n");
@@ -1722,13 +1705,15 @@ BOOL X11DRV_wglMakeContextCurrentARB(X11DRV_PDEVICE* hDrawDev, X11DRV_PDEVICE* h
             ret = FALSE;
         } else {
             Wine_GLContext *ctx = (Wine_GLContext *) hglrc;
-            Drawable d_draw = get_glxdrawable(hDrawDev);
-            Drawable d_read = get_glxdrawable(hReadDev);
+            Drawable d_draw = get_glxdrawable(pDrawDev);
+            Drawable d_read = get_glxdrawable(pReadDev);
 
             if (ctx->ctx == NULL) {
-                ctx->ctx = pglXCreateContext(gdi_display, ctx->vis, NULL, GetObjectType(hDrawDev->hdc) == OBJ_MEMDC ? False : True);
+                ctx->ctx = pglXCreateContext(gdi_display, ctx->vis, NULL, GetObjectType(pDrawDev->hdc) == OBJ_MEMDC ? False : True);
                 TRACE(" created a delayed OpenGL context (%p)\n", ctx->ctx);
             }
+            ctx->physDev = pDrawDev;
+            ctx->pReadDev = pReadDev;
             ret = pglXMakeContextCurrent(gdi_display, d_draw, d_read, ctx->ctx);
             NtCurrentTeb()->glContext = ctx;
         }




More information about the wine-cvs mailing list