diff --git a/dlls/opengl32/tests/opengl.c b/dlls/opengl32/tests/opengl.c index ccf5e3dd86f..268bece3c08 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 98ecedb9fde..09a1d6ab0bb 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"); + if(physDev) + ret = physDev->hdc; - wine_tsx11_lock(); - gl_d = pglXGetCurrentReadDrawable(); - ret = get_hdc_from_Drawable(gl_d); - wine_tsx11_unlock(); - - 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; }