From 416e79f3e6082b6050bd3b82db99ac0e457c9196 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Thu, 3 May 2012 13:54:29 +0200 Subject: [PATCH] winex11: Always store the GL drawable in the device context. --- dlls/winex11.drv/bitmap.c | 1 + dlls/winex11.drv/opengl.c | 53 +++++++++++---------------------------- 2 files changed, 16 insertions(+), 38 deletions(-) diff --git a/dlls/winex11.drv/bitmap.c b/dlls/winex11.drv/bitmap.c index 883debaf775..8b2297e10c0 100644 --- a/dlls/winex11.drv/bitmap.c +++ b/dlls/winex11.drv/bitmap.c @@ -100,6 +100,7 @@ HBITMAP X11DRV_SelectBitmap( PHYSDEV dev, HBITMAP hbitmap ) physDev->bitmap = physBitmap; physDev->drawable = physBitmap->pixmap; + physDev->gl_drawable = physBitmap->glxpixmap; physDev->color_shifts = physBitmap->trueColor ? &physBitmap->color_shifts : NULL; SetRect( &physDev->drawable_rect, 0, 0, bitmap.bmWidth, bitmap.bmHeight ); physDev->dc_rect = physDev->drawable_rect; diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c index b750d5970e6..20f99115b7f 100644 --- a/dlls/winex11.drv/opengl.c +++ b/dlls/winex11.drv/opengl.c @@ -641,24 +641,6 @@ static inline BOOL is_valid_context( Wine_GLContext *ctx ) return (ptr != NULL); } -static Drawable get_glxdrawable(X11DRV_PDEVICE *physDev) -{ - Drawable ret; - - if(physDev->bitmap) - { - if (physDev->bitmap->hbitmap == BITMAP_stock_phys_bitmap.hbitmap) - ret = physDev->drawable; /* PBuffer */ - else - ret = physDev->bitmap->glxpixmap; - } - else if(physDev->gl_drawable) - ret = physDev->gl_drawable; - else - ret = physDev->drawable; - return ret; -} - static int describeContext(Wine_GLContext* ctx) { int tmp; int ctx_vis_id; @@ -681,7 +663,7 @@ static BOOL describeDrawable(X11DRV_PDEVICE *physDev) { TRACE(" HDC %p has:\n", physDev->dev.hdc); TRACE(" - iPixelFormat %d\n", fmt->iPixelFormat); - TRACE(" - Drawable %lx\n", get_glxdrawable(physDev)); + TRACE(" - Drawable %lx\n", physDev->gl_drawable); TRACE(" - FBCONFIG_ID 0x%x\n", fmt->fmt_id); pglXGetFBConfigAttrib(gdi_display, fmt->fbconfig, GLX_VISUAL_ID, &tmp); @@ -1652,7 +1634,7 @@ static BOOL internal_SetPixelFormat(X11DRV_PDEVICE *physDev, HWND hwnd; /* SetPixelFormat is not allowed on the X root_window e.g. GetDC(0) */ - if(get_glxdrawable(physDev) == root_window) + if(physDev->drawable == root_window) { ERR("Invalid operation on root_window\n"); return FALSE; @@ -1940,7 +1922,6 @@ BOOL X11DRV_wglMakeCurrent(PHYSDEV dev, HGLRC hglrc) } else { - Drawable drawable = get_glxdrawable(physDev); Wine_GLContext *prev_ctx = NtCurrentTeb()->glContext; /* The describe lines below are for debugging purposes only */ @@ -1949,8 +1930,8 @@ BOOL X11DRV_wglMakeCurrent(PHYSDEV dev, HGLRC hglrc) describeContext(ctx); } - TRACE(" make current for drawable %lx, ctx %p\n", drawable, ctx->ctx); - ret = pglXMakeCurrent(gdi_display, drawable, ctx->ctx); + TRACE(" make current for drawable %lx, ctx %p\n", physDev->gl_drawable, ctx->ctx); + ret = pglXMakeCurrent(gdi_display, physDev->gl_drawable, ctx->ctx); if (ret) { @@ -1961,8 +1942,8 @@ BOOL X11DRV_wglMakeCurrent(PHYSDEV dev, HGLRC hglrc) ctx->tid = GetCurrentThreadId(); ctx->hdc = hdc; ctx->read_hdc = hdc; - ctx->drawables[0] = drawable; - ctx->drawables[1] = drawable; + ctx->drawables[0] = physDev->gl_drawable; + ctx->drawables[1] = physDev->gl_drawable; ctx->refresh_drawables = FALSE; if (type == OBJ_MEMDC) pglDrawBuffer(GL_FRONT_LEFT); @@ -2011,10 +1992,8 @@ BOOL X11DRV_wglMakeContextCurrentARB( PHYSDEV draw_dev, PHYSDEV read_dev, HGLRC ret = FALSE; } else { Wine_GLContext *ctx = (Wine_GLContext *) hglrc; - Drawable d_draw = get_glxdrawable(pDrawDev); - Drawable d_read = get_glxdrawable(pReadDev); - ret = pglXMakeContextCurrent(gdi_display, d_draw, d_read, ctx->ctx); + ret = pglXMakeContextCurrent(gdi_display, pDrawDev->gl_drawable, pReadDev->gl_drawable, ctx->ctx); if (ret) { Wine_GLContext *prev_ctx = NtCurrentTeb()->glContext; @@ -2024,8 +2003,8 @@ BOOL X11DRV_wglMakeContextCurrentARB( PHYSDEV draw_dev, PHYSDEV read_dev, HGLRC ctx->tid = GetCurrentThreadId(); ctx->hdc = draw_dev->hdc; ctx->read_hdc = read_dev->hdc; - ctx->drawables[0] = d_draw; - ctx->drawables[1] = d_read; + ctx->drawables[0] = pDrawDev->gl_drawable; + ctx->drawables[1] = pReadDev->gl_drawable; ctx->refresh_drawables = FALSE; NtCurrentTeb()->glContext = ctx; } @@ -2276,7 +2255,7 @@ void flush_gl_drawable(X11DRV_PDEVICE *physDev) int w, h; RECT rect; - if (!physDev->gl_copy || !physDev->current_pf) + if (!physDev->gl_copy || !physDev->gl_drawable) return; w = physDev->dc_rect.right - physDev->dc_rect.left; @@ -2694,6 +2673,7 @@ HDC X11DRV_wglGetPbufferDCARB(PHYSDEV dev, HPBUFFERARB hPbuffer) * All formats in our pixelformat list are compatible with each other and the main drawable. */ physDev->current_pf = object->fmt->iPixelFormat; physDev->drawable = object->drawable; + physDev->gl_drawable = object->drawable; SetRect( &physDev->drawable_rect, 0, 0, object->width, object->height ); physDev->dc_rect = physDev->drawable_rect; @@ -3806,7 +3786,6 @@ BOOL destroy_glxpixmap(Display *display, XID glxpixmap) BOOL X11DRV_SwapBuffers(PHYSDEV dev) { X11DRV_PDEVICE *physDev = get_x11drv_dev( dev ); - GLXDrawable drawable; Wine_GLContext *ctx = NtCurrentTeb()->glContext; if (!has_opengl()) return FALSE; @@ -3820,15 +3799,13 @@ BOOL X11DRV_SwapBuffers(PHYSDEV dev) return FALSE; } - if (!physDev->current_pf) + if (!physDev->gl_drawable) { WARN("Using an invalid drawable, skipping\n"); SetLastError(ERROR_INVALID_HANDLE); return FALSE; } - drawable = get_glxdrawable(physDev); - wine_tsx11_lock(); sync_context(ctx); if(physDev->pixmap) { @@ -3841,13 +3818,13 @@ BOOL X11DRV_SwapBuffers(PHYSDEV dev) * copying */ pglFlush(); if(w > 0 && h > 0) - pglXCopySubBufferMESA(gdi_display, drawable, 0, 0, w, h); + pglXCopySubBufferMESA(gdi_display, physDev->gl_drawable, 0, 0, w, h); } else - pglXSwapBuffers(gdi_display, drawable); + pglXSwapBuffers(gdi_display, physDev->gl_drawable); } else - pglXSwapBuffers(gdi_display, drawable); + pglXSwapBuffers(gdi_display, physDev->gl_drawable); flush_gl_drawable(physDev); wine_tsx11_unlock();