opengl32: make the old code before the "sync the dibsection to its pixmap" patch be selectable at runtime.

Mike Hearn mike at plan99.net
Tue Mar 14 18:21:56 CST 2006


On Tue, 14 Mar 2006 17:18:21 +0100, Leon Freitag wrote:
> I don't see any other way to speed this up the way it's being synced now, the 
> question is however, whether the apps really _should_ modify the bitmap on 
> windows too (don't know whether they would try to draw controls onto the 
> window and then it would be overdrawn by the opengl image; application like 
> Steam are trying to achieve similar, but they seemed to work well before)

Does this very rough&ready patch work any better?

--- wgl.c~	2006-02-11 01:58:59.000000000 +0000
+++ wgl.c	2006-02-16 19:11:33.000000000 +0000
@@ -77,11 +77,14 @@
   XVisualInfo *vis;
   GLXFBConfig fb_conf;
   GLXContext ctx;
+  BOOL needs_escape;
   struct wine_glcontext *next;
   struct wine_glcontext *prev;
 } Wine_GLContext;
 static Wine_GLContext *context_list;
 
+Wine_GLContext __thread *curctx = NULL;
+
 static inline Wine_GLContext *get_context_from_GLXContext(GLXContext ctx)
 {
     Wine_GLContext *ret;
@@ -91,18 +94,14 @@
 
 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);
+    if (curctx && curctx->needs_escape)
+    {
+        ERR("foo\n");
+        ExtEscape(curctx->hdc, X11DRV_ESCAPE, sizeof(escape), (LPCSTR)&escape, 0, NULL);
+    }
+    
 
     wine_tsx11_lock_ptr();
     return;
@@ -536,6 +535,7 @@
   ENTER_GL();
   if (hglrc == NULL) {
       ret = glXMakeCurrent(default_display, None, NULL);
+      curctx = NULL;
   } else {
       Wine_GLContext *ctx = (Wine_GLContext *) hglrc;
       Drawable drawable = get_drawable( hdc );
@@ -566,8 +566,12 @@
       }
       TRACE(" make current for dis %p, drawable %p, ctx %p\n", ctx->display, (void*) drawable, ctx->ctx);
       ret = glXMakeCurrent(ctx->display, drawable, ctx->ctx);
+      curctx = ctx;
       if(ret && type == OBJ_MEMDC)
+      {
+          curctx->needs_escape = TRUE;
           glDrawBuffer(GL_FRONT_LEFT);
+      }
   }
   LEAVE_GL();
   TRACE(" returning %s\n", (ret ? "True" : "False"));





More information about the wine-devel mailing list