Roderick Colenbrander : winex11.drv:
Route wglMakeContextCurrentARB through gdi32.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Oct 31 15:07:41 CST 2006
Module: wine
Branch: master
Commit: 2506677c60d140aff3e27290af7c218e5baf9c9a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=2506677c60d140aff3e27290af7c218e5baf9c9a
Author: Roderick Colenbrander <thunderbird2k at gmx.net>
Date: Tue Oct 31 18:29:14 2006 +0100
winex11.drv: Route wglMakeContextCurrentARB through gdi32.
---
dlls/gdi32/driver.c | 1 +
dlls/gdi32/gdi_private.h | 1 +
dlls/gdi32/opengl.c | 40 ++++++++++++++++++++++++++++++++++++-
dlls/winex11.drv/opengl.c | 10 ++++----
dlls/winex11.drv/winex11.drv.spec | 1 +
5 files changed, 47 insertions(+), 6 deletions(-)
diff --git a/dlls/gdi32/driver.c b/dlls/gdi32/driver.c
index a751c72..16bde65 100644
--- a/dlls/gdi32/driver.c
+++ b/dlls/gdi32/driver.c
@@ -199,6 +199,7 @@ #define GET_FUNC(name) driver->funcs.p##
GET_FUNC(wglCreateContext);
GET_FUNC(wglDeleteContext);
GET_FUNC(wglGetProcAddress);
+ GET_FUNC(wglMakeContextCurrentARB);
GET_FUNC(wglMakeCurrent);
GET_FUNC(wglShareLists);
GET_FUNC(wglUseFontBitmapsA);
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index d173151..eda9827 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -188,6 +188,7 @@ typedef struct tagDC_FUNCS
BOOL (*pwglDeleteContext)(HGLRC);
PROC (*pwglGetProcAddress)(LPCSTR);
BOOL (*pwglMakeCurrent)(PHYSDEV, HGLRC);
+ BOOL (*pwglMakeContextCurrentARB)(PHYSDEV, PHYSDEV, HGLRC);
BOOL (*pwglShareLists)(HGLRC hglrc1, HGLRC hglrc2);
BOOL (*pwglUseFontBitmapsA)(PHYSDEV, DWORD, DWORD, DWORD);
BOOL (*pwglUseFontBitmapsW)(PHYSDEV, DWORD, DWORD, DWORD);
diff --git a/dlls/gdi32/opengl.c b/dlls/gdi32/opengl.c
index 2be485e..03ce10d 100644
--- a/dlls/gdi32/opengl.c
+++ b/dlls/gdi32/opengl.c
@@ -161,6 +161,36 @@ BOOL WINAPI wglMakeCurrent(HDC hdc, HGLR
}
/***********************************************************************
+ * wglMakeContextCurrentARB
+ */
+static BOOL WINAPI wglMakeContextCurrentARB(HDC hDrawDC, HDC hReadDC, HGLRC hglrc)
+{
+ BOOL ret = FALSE;
+ DC *DrawDC;
+ DC *ReadDC;
+
+ TRACE("hDrawDC: (%p), hReadDC: (%p) hglrc: (%p)\n", hDrawDC, hReadDC, hglrc);
+
+ /* Both hDrawDC and hReadDC need to be valid */
+ DrawDC = DC_GetDCPtr( hDrawDC);
+ if (!DrawDC) return FALSE;
+
+ ReadDC = DC_GetDCPtr( hReadDC);
+ if (!ReadDC) {
+ GDI_ReleaseObj(hDrawDC);
+ return FALSE;
+ }
+
+ if (!DrawDC->funcs->pwglMakeContextCurrentARB) FIXME(" :stub\n");
+ else ret = DrawDC->funcs->pwglMakeContextCurrentARB(DrawDC->physDev, ReadDC->physDev, hglrc);
+
+ GDI_ReleaseObj(hDrawDC);
+ GDI_ReleaseObj(hReadDC);
+
+ return ret;
+}
+
+/***********************************************************************
* wglShareLists (OPENGL32.@)
*/
BOOL WINAPI wglShareLists(HGLRC hglrc1, HGLRC hglrc2)
@@ -228,7 +258,7 @@ BOOL WINAPI wglUseFontBitmapsW(HDC hdc,
PROC WINAPI wglGetProcAddress(LPCSTR func)
{
PROC ret = NULL;
- DC * dc = NULL;
+ DC *dc;
if(!func)
return NULL;
@@ -244,5 +274,13 @@ PROC WINAPI wglGetProcAddress(LPCSTR fun
GDI_ReleaseObj(default_hdc);
+ /* At the moment we implement one WGL extension which requires a HDC. When we
+ * are looking up this call and when the Extension is available (that is the case
+ * when a non-NULL value is returned by wglGetProcAddress), we return the address
+ * of a wrapper function which will handle the HDC->PhysDev conversion.
+ */
+ if(ret && strcmp(func, "wglMakeContextCurrentARB") == 0)
+ return wglMakeContextCurrentARB;
+
return ret;
}
diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c
index 046c57b..92ca29c 100644
--- a/dlls/winex11.drv/opengl.c
+++ b/dlls/winex11.drv/opengl.c
@@ -1376,10 +1376,10 @@ BOOL X11DRV_wglMakeCurrent(X11DRV_PDEVIC
}
/* OpenGL32 wglMakeContextCurrentARB */
-static BOOL WINAPI X11DRV_wglMakeContextCurrentARB(HDC hDrawDC, HDC hReadDC, HGLRC hglrc)
+BOOL X11DRV_wglMakeContextCurrentARB(X11DRV_PDEVICE* hDrawDev, X11DRV_PDEVICE* hReadDev, HGLRC hglrc)
{
BOOL ret;
- TRACE("(%p,%p,%p)\n", hDrawDC, hReadDC, hglrc);
+ TRACE("(%p,%p,%p)\n", hDrawDev, hReadDev, hglrc);
wine_tsx11_lock();
if (hglrc == NULL) {
@@ -1390,11 +1390,11 @@ static BOOL WINAPI X11DRV_wglMakeContext
ret = FALSE;
} else {
Wine_GLContext *ctx = (Wine_GLContext *) hglrc;
- Drawable d_draw = get_drawable( hDrawDC );
- Drawable d_read = get_drawable( hReadDC );
+ Drawable d_draw = get_glxdrawable(hDrawDev);
+ Drawable d_read = get_glxdrawable(hReadDev);
if (ctx->ctx == NULL) {
- ctx->ctx = pglXCreateContext(ctx->display, ctx->vis, NULL, GetObjectType(hDrawDC) == OBJ_MEMDC ? False : True);
+ ctx->ctx = pglXCreateContext(ctx->display, ctx->vis, NULL, GetObjectType(hDrawDev->hdc) == OBJ_MEMDC ? False : True);
TRACE(" created a delayed OpenGL context (%p)\n", ctx->ctx);
}
ret = pglXMakeContextCurrent(ctx->display, d_draw, d_read, ctx->ctx);
diff --git a/dlls/winex11.drv/winex11.drv.spec b/dlls/winex11.drv/winex11.drv.spec
index 56c2c1a..2c9a07e 100644
--- a/dlls/winex11.drv/winex11.drv.spec
+++ b/dlls/winex11.drv/winex11.drv.spec
@@ -134,6 +134,7 @@ # OpenGL
@ cdecl wglCreateContext(long) X11DRV_wglCreateContext
@ cdecl wglDeleteContext(long) X11DRV_wglDeleteContext
@ cdecl wglGetProcAddress(ptr) X11DRV_wglGetProcAddress
+@ cdecl wglMakeContextCurrentARB(ptr ptr long) X11DRV_wglMakeContextCurrentARB
@ cdecl wglMakeCurrent(long long) X11DRV_wglMakeCurrent
@ cdecl wglShareLists(long long) X11DRV_wglShareLists
@ cdecl wglUseFontBitmapsA(long long long long) X11DRV_wglUseFontBitmapsA
More information about the wine-cvs
mailing list