Tomas Carnecky wrote:
> comments?
> 

Why do I have the impression that when it comes to x11drv/opengl nobody
wants to take the responsibility. I won't submit a patch until someone
says 'tom, your approach looks good, improve this and then submit a
patch to wine-patches' or 'tom, no, this won't work because ... try to
change this ... move the code there ... don't do that, it will break
this' etc.
I don't want to know whether the implementation details are ok, I just
want to know whether the general idea (the flags field) is acceptable.

I did the changes I've described and it does work, but I won't work on
it any further (eg. make it independent of my previous patches) unless I
get a green light.

In the attachment is the latest patch I've applied to my local tree, you
see that it requires the X11DRV_[S|G]ET_FLAGS escape code which I've
added in one of my previous patches. Maybe that gives you an better idea
of what I'm trying to do.

tom


117000e2604e102f41632dcbe3a5e454f9d218b9
diff --git a/dlls/opengl32/wgl.c b/dlls/opengl32/wgl.c
index ac0f401..7490015 100644
--- a/dlls/opengl32/wgl.c
+++ b/dlls/opengl32/wgl.c
@@ -173,6 +173,16 @@ inline static Font get_font( HDC hdc )
     return font;
 }
 
+inline static BOOL is_pbuffer( HDC hdc )
+{
+    long flags;
+    enum x11drv_escape_codes escape = X11DRV_GET_FLAGS;
+
+    if (!ExtEscape( hdc, X11DRV_ESCAPE, sizeof(escape), (LPCSTR)&escape,
+                    sizeof(flags), (LPSTR)&flags )) return False;
+    return ((flags & X11DRV_FLAG_PBUFFER) == X11DRV_FLAG_PBUFFER);
+}
+
 
 /***********************************************************************
  *		wglCreateContext (OPENGL32.@)
@@ -571,8 +581,9 @@ BOOL WINAPI wglMakeCurrent(HDC hdc,
       TRACE(" make current for dis %p, drawable %p, ctx %p\n", ctx->display, (void*) drawable, ctx->ctx);
       ret = glXMakeCurrent(ctx->display, drawable, ctx->ctx);
       NtCurrentTeb()->glContext = ctx;
-      if(ret && type == OBJ_MEMDC) {
+      if(ret && type == OBJ_MEMDC && !is_pbuffer(hdc)) {
           ctx->do_escape = TRUE;
+          glDrawBuffer(GL_FRONT);
       }
   }
   LEAVE_GL();
diff --git a/dlls/opengl32/wgl_ext.c b/dlls/opengl32/wgl_ext.c
index 6c708f9..2304ccb 100644
--- a/dlls/opengl32/wgl_ext.c
+++ b/dlls/opengl32/wgl_ext.c
@@ -75,6 +75,22 @@ inline static BOOL is_damaged( HDC hdc )
     return ((flags & X11DRV_FLAG_DAMAGED) == X11DRV_FLAG_DAMAGED);
 }
 
+inline static BOOL set_pbuffer_flag( HDC hdc )
+{
+    long flags;
+    enum x11drv_escape_codes escape = X11DRV_GET_FLAGS;
+
+    if (!ExtEscape( hdc, X11DRV_ESCAPE, sizeof(escape), (LPCSTR)&escape,
+                    sizeof(flags), (LPSTR)&flags )) return False;
+
+    escape = X11DRV_SET_FLAGS;
+    flags |= X11DRV_FLAG_PBUFFER;
+    if (!ExtEscape( hdc, X11DRV_ESCAPE, sizeof(escape), (LPCSTR)&escape,
+                    sizeof(flags), (LPSTR)&flags )) return False;
+
+    return True;
+}
+
 /* Some WGL extensions... */
 static const char *WGL_extensions_base = "WGL_ARB_extensions_string WGL_EXT_extensions_string";
 static char *WGL_extensions = NULL;
@@ -1088,6 +1104,7 @@ HDC WINAPI wglGetPbufferDCARB(HPBUFFERAR
   hDC = CreateCompatibleDC(object->hdc);
   SetPixelFormat(hDC, object->pixelFormat, NULL);
   set_drawable(hDC, object->drawable); /* works ?? */
+  set_pbuffer_flag(hDC);
   TRACE("(%p)->(%p)\n", hPbuffer, hDC);
   return hDC;
 }
diff --git a/include/wine/x11drv_escape.h b/include/wine/x11drv_escape.h
index af69ce0..ed7940d 100644
--- a/include/wine/x11drv_escape.h
+++ b/include/wine/x11drv_escape.h
@@ -22,6 +22,7 @@ #ifndef __WINE_X11DRV_ESCAPE_H
 #define __WINE_X11DRV_ESCAPE_H
 
 #define X11DRV_FLAG_DAMAGED     ( 1 << 0 )
+#define X11DRV_FLAG_PBUFFER     ( 1 << 1 )
 
 #define X11DRV_ESCAPE 6789
 enum x11drv_escape_codes


Reply via email to