Patch for opengl32.dll.so

Roderick Colenbrander thunderbird2k at gmx.net
Thu Nov 2 07:25:33 CST 2006


> Roderick Colenbrander wrote:
> >> Roderick Colenbrander wrote :
> >>     
> >>>> On 11/1/06, Bertrand Coconnier <bcoconni at club-internet.fr> wrote:
> >>>>         
> >>>>> Hi,
> >>>>>
> >>>>> The last release of Wine 0.9.24 contains an error in the code of
> >>>>>           
> >>>> opengl32.dll.so
> >>>>         
> >>>>> under X11 : Wine tries to get the address of "wglGetIntegerv" (line
> >>>>>           
> >> 608
> >>     
> >>>> of
> >>>>         
> >>>>> dlls/opengl32/wgl.c) before the extensions of WGL have actually been
> >>>>>           
> >>>> loaded
> >>>>         
> >>>>> (i.e. before X11DRV_WineGL_LoadExtensions() is called). The reading
> of
> >>>>>           
> >>>> the
> >>>>         
> >>>>> wglGetIntegerv address fails and afterwards, whenever
> >>>>>           
> >>>> internal_glGetIntegerv()
> >>>>         
> >>>>> is called, wine_wgl.p_wglGetIntegerv is NULL and a Fatal Exception
> is
> >>>>>           
> >>>> raised.
> >>>>
> >>>>
> >>>> This is probably already fixed in the git tree.  See the commit:
> >>>> winex11.drv: Fixed the prototype of many OpenGL functions.
> >>>>
> >>>> Jesse
> >>>>         
> >>> Else if the problem still happens something strange is going as the
> >>>       
> >> extensions are registered at x11drv startup.
> >>     
> >>> Roderick
> >>>       
> >> Yes, the problem still happens because the function process_attach()
> (line
> >> 582 
> >> of dlls/opengl32/wgl.c) is called before the x11drv startup. The
> comment
> >> of 
> >> process_attach is very clear : "/* This is for brain-dead applications
> >> that use 
> >> OpenGL functions before even creating a rendering context.... */". It
> is
> >> clear 
> >> that process_attach is a workaround for *brain-dead* apps :) and among
> >> other 
> >> things it gets the address of wglGetIntegerv. This operation used to
> >> succeed as 
> >> long as GetProcAddress() was used but now since x11drv is needed to
> upload
> >> the 
> >> wglGetIntegerv address there is some kind of race condition and the
> >> operation 
> >> fails hence the bug.
> >>
> >> Bertrand.
> >>     
> >
> > Compared to 0.9.23 I changed the way wglGetIntegerv is loaded before it
> was directly loaded using GetProcAddress from winex11.drv now it is still
> loaded from winex11.drv but then using wglGetProcAddress from gdi32. At wine
> startup (I'm not sure at which stage but I believe directly when you use
> gdi stuff or perhaps even earlier) winex11.drv is initialized and during
> this initialization my opengl code is initialized aswell. I wonder what causes
> the race as I haven't seen it happening for other users yet. I want to
> avoid a patch like yours as I plan to do similar things for some other
> functions.
> >
> > Perhaps something goes wrong in wglGetProcAddress itself. Try running
> wine using: WINEDEBUG=+wgl,+opengl wine wow.exe -opengl &> log. If it is
> correct you'll see some opengl information (gl version, loading of extensions)
> before stuff happens in opengl32.dll.
> >
> > Roderick
> >   
> Hi Roderick, do you have a patch for this problem, since 0.23 a number 
> of wow users seem to be getting a crash at startup that didn't happen 
> before 0.23 or 0.22, can't remember which, only some users not all.
> 
> I just wondered if this is the fix for it, if we could try it out ?
> 
> Regards
> Nick

Hmm, if that is indeed the case this patch could work for them. The whole issue is new for me, I'll see what I can do about it. Right now there's some GLX code in opengl32 which creates an opengl context. I was planning to replace it with WGL code, that might help too (if I load the function pointers afterwards). Perhaps Alexandre has an idea how to correctly fight the race condition.

Roderick
-- 
Der GMX SmartSurfer hilft bis zu 70% Ihrer Onlinekosten zu sparen! 
Ideal für Modem und ISDN: http://www.gmx.net/de/go/smartsurfer



More information about the wine-devel mailing list