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

Alexandre Julliard julliard at wine.codeweavers.com
Thu Feb 2 07:09:20 CST 2006


Module: wine
Branch: refs/heads/master
Commit: 13268261bbe0d4013937a6a9804fbda378244512
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=13268261bbe0d4013937a6a9804fbda378244512

Author: Huw Davies <huw at codeweavers.com>
Date:   Thu Feb  2 13:23:55 2006 +0100

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

---

 dlls/opengl32/opengl_ext.h |    3 ++-
 dlls/opengl32/wgl.c        |   22 +++++++++++++++++++++-
 dlls/x11drv/init.c         |   10 ++++++++--
 dlls/x11drv/x11drv.h       |    3 ++-
 4 files changed, 33 insertions(+), 5 deletions(-)

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-cvs mailing list