Flickering bug for World of Warcraft
Roderick Colenbrander
thunderbird2k at gmx.net
Sat Nov 4 11:01:15 CST 2006
> > Roderick Colenbrander wrote :
> > >> 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.
> > >
> > > @@ -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;
> > > }
> > >
> > > I'm not sure if this is correct for all programs. Some more testing
> > needs to be done in other programs that use pbuffers. The set_drawable
> line
> > must have a purpose (though I like to get rid of it or atleast implement
> it
> > without ExtEscape). And I'm also not sure if we need to retrieve the
> > pixelformat of the 'parent hdc' as it is allways 1 though retrieving it
> is nicer.
> > >
> > > Roderick
> >
> > The patch fixes the bug whether the set_drawable is included or not. So
> I
> > guess
> > it does not hurt. I also dug in the wine-patches mailing list and it
> > appeared
> > that you included this line in your original patch (see
> > http://www.winehq.org/pipermail/wine-patches/2006-September/030335.html)
> > but
> > infortunately you did not give any detail at the time about the reason
> of
> > its
> > inclusion. Yet it seems logical that the DC returned by
> wglGetPbufferDCARB
> > is
> > linked to the Pbuffer drawable rather than the window drawable.
> >
> > About the retrival of the pixel format of the 'parent hdc', I agree that
> > it is a
> > bit overkill but once again it does not hurt and it may prevent bugs to
> > occur if
> > one day Wine will use more than one pixel format.
> >
> > So what about this patch ?
> >
> > @@ -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);
> > + hDC = CreateDCA("DISPLAY", NULL, NULL, NULL);
> > + iPixelFormat = GetPixelFormat(object->hdc);
> > + DescribePixelFormat(hDC, iPixelFormat,
> sizeof(PIXELFORMATDESCRIPTOR),
> > &pfd);
> > + SetPixelFormat(hDC, iPixelFormat, &pfd);
> > set_drawable(hDC, object->drawable); /* works ?? */
> > +
> > TRACE("(%p)->(%p)\n", hPbuffer, hDC);
> > return hDC;
> > }
> >
> > About testing, I don't have an app other than WoW that uses OpenGL (not
> to
> > mention Pbuffers) so if some people out there could give this patch a
> > try...
> >
> > Bertrand.
>
> The main issue I still have with the patch which isn't something you have
> done wrong is set_drawable. Before I started moving the original opengl32
> code to winex11.drv (I didn't write the WGL code), there was a need to get
> access to X11 data inside opengl32. For this purpose 'ExtEscape' got used.
> This isn't a nice mechanism and Alexandre wants to get rid of it as much as
> possible.
>
> The set_drawable call uses ExtEscape too. I think I'm going to move a part
> of wglGetCurrentDCARB to gdi32.dll in which we can do CreateDCA. Then we
> can pass the HDC and pbuffer to the other part of wglGetCurrentDCARB which
> will be in winex11.drv. The winex11.drv version can then just set the
> drawable in a X11DRV_PDEVICE (x11drv version of a hdc).
>
> Regards,
> Roderick
Could you check if the attached patch works? It does more or less what I explained in the last email. If it works I'll clean it up as right now it is a bit hacky. I hope to find some apps to test it on.
Regards,
Roderick
--
GMX DSL-Flatrate 0,- Euro* - Überall, wo DSL verfügbar ist!
NEU: Jetzt bis zu 16.000 kBit/s! http://www.gmx.net/de/go/dsl
-------------- next part --------------
A non-text attachment was scrubbed...
Name: wow_hack.patch
Type: text/x-patch
Size: 5307 bytes
Desc: not available
Url : http://www.winehq.org/pipermail/wine-devel/attachments/20061104/210c5579/wow_hack.bin
More information about the wine-devel
mailing list