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