Alexandre Julliard : winex11: Always store the GL drawable in the device context.

Alexandre Julliard julliard at winehq.org
Thu May 3 14:23:48 CDT 2012


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu May  3 13:54:29 2012 +0200

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 883deba..8b2297e 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 b750d59..20f9911 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();




More information about the wine-cvs mailing list