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; }