On Tue, 2009-09-08 at 09:20 -0700, Karl Schultz wrote: > > > On Tue, Sep 8, 2009 at 9:17 AM, Brian Paul <bri...@vmware.com> wrote: > Dimitar Kodjabachev wrote: > > Hello, > > > > I sent this to mesa3d-dev, which was probably not the right > place. > > > mesa3d-dev is OK since there may be a bug in the Mesa wgl > code. I'm > cc'ing mesa3d-dev. > > > > I have the following situation (pseudocode) with Mesa 7.4.4: > > > > hglrc1 = wglCreateContext(hdc1) > > wglMakeCurrent(hdc1,hglrc1) > > hglrc2 = wglCreateContext(hdc2) > > wglMakeCurrent(hdc2,hglrc2) > > wglMakeCurrent(hdc3,hglrc2) > > wglDeleteContext(hglrc1) > > wglDeleteContext(hglrc2) > > > > As a result of this sequence of calls, a WMesaFramebuffer > structure is leaked. > > The call causing the leak is wglMakeCurrent(hdc3,hglrc2). > This is what I know > > so far: > > > > -> wglMakeCurrent(hdc3,hglrc2) calls > > -> WMesaMakeCurrent(hglrc2,hdc3) which calls > > -> wmesa_lookup_framebuffer(hdc3) which returns NULL, as > the hdc given to > > wglMakeCurrent is different from the one given at the > time > > of wglCreateContext > > -> wmesa_new_framebuffer() is called and a new frame buffer > is allocated > > > > This new frame buffer is not released upon > wglDeleteContext(hglrc2). > > > A rendering context is not the same as a drawing surface. So > deleting > a rendering context does not imply deleting a surface. > > > > As far as > > I know, the device context passed to wglMakeCurrent does not > have to > > be the same as the one passed to wglCreateContext as long as > the the actual > > device and the pixel formats are. Is this correct or is my > usage wrong? > > > My understanding is that the context passed to > wglMakeCurrent() must > have been created by a call to wglCreateContext(). > > > Right, but there are two contexts passed in wglMakeCurrent(). Here > the GL context (rendering context) is hglrc2, created by > wglCreateContext(). But the Window context (device context) is hdc3, > which is just a Windows Win32 handle. > > > I don't think I can help with this memory leak. Maybe someone > else > who works on Windows can help you. > > > The problem is that wglMakeCurrent() will lazily allocate the > framebuffer when a device context is made current for the first time. > The created framebuffer gets added onto a list and is tagged with the > device context that it was just associated with. When a rendering > context is destroyed, this list is searched for a framebuffer tagged > with the device context that is current at the time the rendering > context was destroyed, and if found, the framebuffer is freed. > > Note that this conflicts with what Brian said above about deleting > surfaces. I imagine that this was added to wgl as a way to free the > framebuffer *somehow*. > > The leak is caused here because the rendering context is associated > with two device contexts. A framebuffer is created for each device. > Later, when the rendering context is destroyed, only one framebuffer > is freed, because only one device context can be current when > destroying the rendering context, and only the framebuffer tagged with > that device context is freed. > > Since destroying a rendering context shouldn't destroy any surfaces, > it isn't an option to tag all framebuffers with the rendering context > id and then delete all framebuffers tagged that way when a rendering > context is destroyed. Although this would fix the leak. > > The right way, I think, is to destroy the framebuffer associated with > a device context when the device context is destroyed. This might > involve hooking Windows somehow to get a notification when it is > destroyed or setting up a message handler to get WM_DESTROY messages > so that we can free resources associated with the device. > > The wgl code hasn't been all that robust or complete, and I don't know > right now if this design/approach is even correct. I'd have to dig > into this more. > > Right now, I don't have much of a workaround to suggest for the > current implementation except to try to destroy hglrc2 and recreate it > before making current with hdc3. > > > Karl
What WGL implementation are we talking about here? One of the pure Mesa based one in src/mesa/drivers/windows/gdi, or the Gallium based one in src/gallium/state_trackers/wgl ? The Gallium WGL state tracker is a faily complete implementation of both WGL and ICD interfaces and at least the ICD interface has received a lot of testing. The drawback is that the only available driver for it ATM is softpipe, which is in generally slower than Mesa's swrast. Jose ------------------------------------------------------------------------------ Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day trial. Simplify your report design, integration and deployment - and focus on what you do best, core application coding. Discover what's new with Crystal Reports now. http://p.sf.net/sfu/bobj-july _______________________________________________ Mesa3d-dev mailing list Mesa3d-dev@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mesa3d-dev