Roderick Colenbrander wrote :

Or perhaps a testcase isn't needed at all. I think the use of 
CreateCompatibleDC in wglGetPbufferDCARB is incorrect. According to MSDN this 
function creates a memory device context. Perhaps something like this works:
HDC hdc = CreateDC(...);
int format_orig = GetPixelFormat(hdc_orig);
SetPixelFormat(hdc, format_orig);
return hdc;

Thanks to your hints I could make the attached patch. It fixes the issue on my side : wglGetPbufferDCARB returns a DC which type is OBJ_DC and WoW does not flicker any more.

Regards,

Bertrand.
diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c
index 962962f..b529f12 100644
--- a/dlls/winex11.drv/opengl.c
+++ b/dlls/winex11.drv/opengl.c
@@ -1869,16 +1869,18 @@ static HDC WINAPI X11DRV_wglGetPbufferDC
 {
     Wine_GLPBuffer* object = (Wine_GLPBuffer*) hPbuffer;
     HDC hDC;
+    int iPixelFormat;
+    PIXELFORMATDESCRIPTOR  pfd;
     if (NULL == object) {
         SetLastError(ERROR_INVALID_HANDLE);
         return NULL;
     }
-    hDC = CreateCompatibleDC(object->hdc);
 
-    /* The function wglGetPbufferDCARB returns a DC to which the pbuffer can 
be connected.
-     * We only support one onscreen rendering format (the one from the main 
visual), so use that. */
-    SetPixelFormat(hDC, 1, NULL);
-    set_drawable(hDC, object->drawable); /* works ?? */
+    hDC = CreateDCA("DISPLAY", NULL, NULL, NULL);
+    iPixelFormat = GetPixelFormat(object->hdc);
+    DescribePixelFormat(hDC, iPixelFormat, sizeof(PIXELFORMATDESCRIPTOR), 
&pfd); 
+    SetPixelFormat(hDC, iPixelFormat, &pfd);
+
     TRACE("(%p)->(%p)\n", hPbuffer, hDC);
     return hDC;
 }


Reply via email to