opengl: Sync a dibsection to its pixmap before drawing to it via opengl

Huw D M Davies h.davies1 at physics.ox.ac.uk
Wed Feb 1 06:29:24 CST 2006


On Wed, Feb 01, 2006 at 12:44:30PM +0100, Alexandre Julliard wrote:
> It seems to me that GET_GLX_DRAWABLE is already doing pretty much the
> same thing, couldn't you reuse that instead of adding another escape?

Actually I was going to remove the CoerceDIBSection in
GET_GLX_DRAWABLE after this patch goes in.  It was there as a hack to
force the dib section into sync after a call to wglMakeCurrent.
However in princple the app could start fiddling with the bits
straight after that call, so there's no need for that sync once we
have the opengl calls themselves controlling the synchronization.

Here's the same patch but removeing that extra coerce.

Huw.
-- 
Huw Davies
huw at codeweavers.com

diff --git a/dlls/opengl32/opengl_ext.h b/dlls/opengl32/opengl_ext.h
index 274f8d3..ad176c4 100644
--- a/dlls/opengl32/opengl_ext.h
+++ b/dlls/opengl32/opengl_ext.h
@@ -58,7 +58,8 @@ extern void (*wine_tsx11_lock_ptr)(void)
 extern void (*wine_tsx11_unlock_ptr)(void);
 
 /* As GLX relies on X, this is needed */
-#define ENTER_GL() wine_tsx11_lock_ptr()
+void enter_gl(void);
+#define ENTER_GL() enter_gl()
 #define LEAVE_GL() wine_tsx11_unlock_ptr()
 
 
diff --git a/dlls/opengl32/wgl.c b/dlls/opengl32/wgl.c
index afb4c86..04eb40f 100644
--- a/dlls/opengl32/wgl.c
+++ b/dlls/opengl32/wgl.c
@@ -54,7 +54,8 @@ enum x11drv_escape_codes
     X11DRV_END_EXPOSURES,       /* end graphics exposures */
     X11DRV_GET_DCE,             /* get the DCE pointer */
     X11DRV_SET_DCE,             /* set the DCE pointer */
-    X11DRV_GET_GLX_DRAWABLE     /* get current glx drawable for a DC */
+    X11DRV_GET_GLX_DRAWABLE,    /* get current glx drawable for a DC */
+    X11DRV_SYNC_PIXMAP          /* sync the dibsection to its pixmap */
 };
 
 void (*wine_tsx11_lock_ptr)(void) = NULL;
@@ -88,6 +89,25 @@ static inline Wine_GLContext *get_contex
     return ret;
 }
 
+void enter_gl(void)
+{
+    GLXContext gl_ctx;
+    Wine_GLContext *ctx;
+    enum x11drv_escape_codes escape = X11DRV_SYNC_PIXMAP;
+
+    wine_tsx11_lock_ptr();
+    gl_ctx = glXGetCurrentContext();
+    if(!gl_ctx) return;
+    ctx = get_context_from_GLXContext(gl_ctx);
+    wine_tsx11_unlock_ptr(); /* unlock before calling GDI apis */
+
+    if(ctx && GetObjectType(ctx->hdc) == OBJ_MEMDC)
+        ExtEscape(ctx->hdc, X11DRV_ESCAPE, sizeof(escape), (LPCSTR)&escape, 0, NULL);
+
+    wine_tsx11_lock_ptr();
+    return;
+}
+
 static inline void free_context(Wine_GLContext *context)
 {
   if (context->next != NULL) context->next->prev = context->prev;
diff --git a/dlls/x11drv/init.c b/dlls/x11drv/init.c
index c2729b4..9774c6f 100644
--- a/dlls/x11drv/init.c
+++ b/dlls/x11drv/init.c
@@ -414,8 +414,6 @@ INT X11DRV_ExtEscape( X11DRV_PDEVICE *ph
                     {
                         if(!physDev->bitmap->glxpixmap)
                             physDev->bitmap->glxpixmap = create_glxpixmap(physDev);
-
-                        X11DRV_CoerceDIBSection(physDev, DIB_Status_GdiMod, FALSE);
                         *(Drawable *)out_data = physDev->bitmap->glxpixmap;
                     }
                     else
@@ -423,6 +421,14 @@ INT X11DRV_ExtEscape( X11DRV_PDEVICE *ph
                     return TRUE;
                 }
                 break;
+            case X11DRV_SYNC_PIXMAP:
+                if(physDev->bitmap)
+                {
+                    X11DRV_CoerceDIBSection(physDev, DIB_Status_GdiMod, FALSE);
+                    return TRUE;
+                }
+                return FALSE;
+                break;
             }
         }
         break;
diff --git a/dlls/x11drv/x11drv.h b/dlls/x11drv/x11drv.h
index 21b28d5..0339fad 100644
--- a/dlls/x11drv/x11drv.h
+++ b/dlls/x11drv/x11drv.h
@@ -480,7 +480,8 @@ enum x11drv_escape_codes
     X11DRV_END_EXPOSURES,    /* end graphics exposures */
     X11DRV_GET_DCE,          /* get the DCE pointer */
     X11DRV_SET_DCE,          /* set the DCE pointer */
-    X11DRV_GET_GLX_DRAWABLE  /* get current glx drawable for a DC */
+    X11DRV_GET_GLX_DRAWABLE, /* get current glx drawable for a DC */
+    X11DRV_SYNC_PIXMAP       /* sync the dibsection to its pixmap */
 };
 
 struct x11drv_escape_set_drawable



More information about the wine-patches mailing list