From: SourceForge.net <no...@so...> - 2008-11-26 18:21:35
|
Bugs item #1947243, was opened at 2008-04-20 18:01 Message generated for change (Comment added) made by the_fiddler You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100003&aid=1947243&group_id=3 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Stephen A (the_fiddler) Assigned to: Nobody/Anonymous (nobody) Summary: Mesa 7.0.3 implementation error: wmesa: can't swap [...] Initial Comment: While testing OpenTK (http://sourceforge.net/projects/opentk) with Mesa on windows, I received the following error: Mesa 7.0.3 implementation error: wmesa: can't swap non-current window Please report at bugzilla.freedesktop.org The opengl context is created and current. However, nothing appears when drawing to the screen. The program works perfectly on microsoft's software implementation, as well as on ati, nvidia, intel and sis chips (tested on windows and linux, x86 and x86_64). However it fails with Mesa on Windows (Mesa/Linux is untested for the time being). The debug version of mesa doesn't show anything else (maybe I need to enable an environment variable for more information?) Any pointers on what might cause this error, and/or how to track this down? I can provide binaries and source code that reproduces the issue and test as needed - although I'm not sure how useful the source will be (C# code). Thanks! ---------------------------------------------------------------------- Comment By: Stephen A (the_fiddler) Date: 2008-11-26 20:21 Message: After removing the "if (pwc->hDC == hdc)" check, everything seems to work correctly, multiple contexts included. I believe this change is safe (tested with Blender and OpenTK). Please tell me if you need any more testing. diff --git a/src/mesa/drivers/windows/gdi/wmesa.c b/src/mesa/drivers/windows/gdi/wmesa.c index 8074695..ac4df84 100644 --- a/src/mesa/drivers/windows/gdi/wmesa.c +++ b/src/mesa/drivers/windows/gdi/wmesa.c @@ -1662,16 +1662,10 @@ void WMesaSwapBuffers( HDC hdc ) /* If we're swapping the buffer associated with the current context * we have to flush any pending rendering commands first. */ - if (pwc->hDC == hdc) { - _mesa_notifySwapBuffers(ctx); + _mesa_notifySwapBuffers(ctx); - BitBlt(pwfb->hDC, 0, 0, pwfb->Base.Width, pwfb->Base.Height, - pwfb->dib_hDC, 0, 0, SRCCOPY); - } - else { - /* XXX for now only allow swapping current window */ - _mesa_problem(NULL, "wmesa: can't swap non-current window"); - } + BitBlt(pwfb->hDC, 0, 0, pwfb->Base.Width, pwfb->Base.Height, + pwfb->dib_hDC, 0, 0, SRCCOPY); } ---------------------------------------------------------------------- Comment By: Brian Paul (brianp) Date: 2008-11-26 02:33 Message: I can't test this, but how about this patch: diff --git a/src/mesa/drivers/windows/gdi/wmesa.c b/src/mesa/drivers/windows/gdi index 1ddea33..79514bf 100644 --- a/src/mesa/drivers/windows/gdi/wmesa.c +++ b/src/mesa/drivers/windows/gdi/wmesa.c @@ -1659,13 +1659,9 @@ void WMesaSwapBuffers( HDC hdc ) */ if (pwc->hDC == hdc) { _mesa_notifySwapBuffers(ctx); - - BitBlt(pwfb->hDC, 0, 0, pwfb->Base.Width, pwfb->Base.Height, - pwfb->dib_hDC, 0, 0, SRCCOPY); } - else { - /* XXX for now only allow swapping current window */ - _mesa_problem(NULL, "wmesa: can't swap non-current window"); + BitBlt(pwfb->hDC, 0, 0, pwfb->Base.Width, pwfb->Base.Height, + pwfb->dib_hDC, 0, 0, SRCCOPY); } } It seems that the BitBlt() call has no dependencies on the current rendering context so it should do what's expected even if the current context is bound to a different window. Here's a code sequence which would exercise the issue: wglMakeCurrent(ctx, win1); draw something in win1(); wglMakeCurrent(ctx, win2); draw something in win2(); wglSwapBuffers(win1); wglSwapBuffers(win2); ---------------------------------------------------------------------- Comment By: Karl Schultz (kschultz) Date: 2008-11-26 02:02 Message: It would be nice to know which samples are failing. I obviously tried one and didn't see the failure. If you could identify one that fails, that would help. Debugging-- I think I said before that the message would be shown when there was no current context when swapbuffers was called. So, it would be good to set breakpoints in wmesa at makecurrent and swapbuffers and make sure that the sequencing is correct. ---------------------------------------------------------------------- Comment By: Stephen A (the_fiddler) Date: 2008-11-26 01:28 Message: Another thing that I should have mentioned it that OpenTK links the library at runtime (LoadLibrary et al). Maybe this has something to do with the problem? ---------------------------------------------------------------------- Comment By: Stephen A (the_fiddler) Date: 2008-11-26 01:25 Message: Thank you for taking the time to reproduce the issue - I should have attached a test app. Unfortunately, I am still getting this error on Mesa 7.2. Most OpenTK samples work fine. The ones that fail are built on Windows.Forms (a thin wrapper around winapi) and the only real difference is that the context is initialized on a control (not the whole window). The strange thing is that everything seems to succeed, selecting the pixel format (pfd index: 1), creating a context, making it current, swapping buffers. Even so, the output remains blank and this error message is triggered. I've tried both wglSwapBuffers and (gdi32) SwapBuffers with thes same results. For the record, Mesa/Linux works fine. Any ideas on how I could go about debugging this issue? ---------------------------------------------------------------------- Comment By: Karl Schultz (kschultz) Date: 2008-05-27 04:37 Message: Logged In: YES user_id=188365 Originator: NO Perhaps the OP could post the exact steps needed to reproduce the problem. ---------------------------------------------------------------------- Comment By: Karl Schultz (kschultz) Date: 2008-05-27 04:35 Message: Logged In: YES user_id=188365 Originator: NO OpenTK worked rather well for me with Mesa. Here's what I did: Grabbed 7.0.3 zip files and built the libs using Visual C++ 2005 Express. I unzipped the OpenTK zip file from SF and copied OPENGL32.DLL, GLU32.DLL, and GLUT32.DLL into the opentk-0.9.1/Examples folder. I didn't build any OpenTK files; just copied these three DLL's into Example. I then ran Examples.exe and the tests ran fine, just slower than my native OpenGL and Radeon X800. In fact, the GLSL Julia Set example actually worked better than the X800 because the X800 driver could not compile the vertex shader program. Mesa compiled both shader progs without complaint. The error you pointed out would happen if you tried to swap buffers without a current context, which doesn't make sense. wglMakeCurrent is the related API. And I'm not sure how you got the error, since I wasn't able to reproduce it. ---------------------------------------------------------------------- Comment By: Nobody/Anonymous (nobody) Date: 2008-05-08 12:08 Message: Logged In: NO I got the same error. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100003&aid=1947243&group_id=3 |