broken window refresh in Vista

OpenGL applications based on wxWidgets, FreeGLUT and possibly other toolkits are broken in Vista, simple alt-tab alt-tab corrupts rendered image, parts that were NOT overlapped by other window are no longer refreshed. Applications based on GLUT don’t have this problem.

Has anyone a clue what’s wrong (in all wxWidgets, FreeGLUT apps), why Vista clips rendered image so that parts of it are not displayed?

For reference, my wxWidgets bugreport http://trac.wxwidgets.org/ticket/10168

You might also want to include the Vista flavor (32 or 64), any service packs, plus your video hardware and drivers.

Vista x64 SP1 (Home Premium EN)
Tested with (randomly picked out of 15 cards):

  • Radeon HD2400, driver 8.10
  • GeForce 7100, driver 178.24

Overview of affected systems:

OS: Vista (not XP)
Color scheme: Windows Vista Basic, Windows Classic or Windows Standard (not Windows Aero)
Toolkit: wxWidgets or FreeGLUT (not GLUT)
GPU: any
GPU driver: any

New finding is that Aero is not affected.

Is it serious Vista bug? Serious limitation of OpenGL driver model? Can anyone confirm/deny it?

Updated overview of affected systems:

OS: Vista (not XP)
Color schemes: Windows Vista Basic, Windows Classic, Windows Standard (not Windows Aero)
Toolkits: all tested (Qt, wxWidgets, FreeGLUT, GLUT)
GPUs: all tested (GeForce, Radeon)
GPU drivers: all tested

New findings are

Qt apps are affected too, moving other window over Qt app corrupts OpenGL rendering
(it’s the same for wxWidgets and FreeGLUT)
(popup is from Thunderbird, but I tried other windows too. corruption was less frequent with some other windows)

GLUT apps are affected too, but in a different way. GLUT app is never corrupted, but moving other window over GLUT app makes glut render into decorations of the other window

Did you ever resolve this problem?

We have exactly the same problem - corrupt window refresh under Vista, but only in compatibility mode, not with Aero. Also, we have noticed that it happens with ATI or Intel graphics, but not with NVidia.

This is a pretty serious problem, because it basically means that OpenGL is broken under Vista, unless you use NVidia. We just can’t require all users to switch Aero on.

Any suggestions?

The only improvement I see (after 1/2 year) is that main problem, seriously broken window update, probably no longer affects Nvidia, I confirm your finding.
I don’t have all toolkits at hand to test, but it looks ok with wxWidgets.

Minor problem on second screenshot (rendering into windows of other applications) is still present also on Nvidia, current driver 182.50.

I wonder if this is fixed in Windows 7 …

If anybody has experience, please let us know.

This bug might be caused the the invalidation region given by the WM_Paint command. The invalidation region tends to stay stuck in the DC, causing nothing to be drawn outside of the area of the window which was overlapping yours.

After receiving a wm_paint command, I used the following:

getwindowRect(H_Wnd, R);
invalidateRect(h_wnd, @R, false);
BeginPaint…
Drawing Procedure
EndPaint

Effectively setting the invalidation region to the whole window. If you don’t respond to WM_Paint messages at all(by leaving them to go to the Default Window Procedure), this glitch never occurs. This might explain why GLUT does not have a problem, as it’s drawing process may not use WM_Paint at all.

Hope it works for you…