I've been having problems with screen tearing in my own authored video games, ever since I moved to a new system with a i7-4770S, HD 4600 graphics, and Windows 8.1. Of course the fault could lie anywhere between my coding and the hardware. I'd appreciate knowing whether anyone else can replicate the problem using my code or point out a mistake in my use of DirectX. I've reduced the demo to 360 lines of DirectX that makes the problem visually loud if it is present. I have not seen the problem on other hardware using similar code.
By default, the program sets up DirectX 9 with full screen mode with double-buffering and performs the following repeatedly:
- Get a back buffer and lock it.
- Fill it with a red checkerboard.
- Fill it with a blue checkerboard.
- Unlock it, release it, and present it.
The display should show an all blue checkerboard, since the red is completely overwritten by blue before presenting the buffer, and indeed it does appear all blue on prior systems. But with i7-4470S + HD 4600 graphics + Windows 8.1, I see a wide band of red flickering at the top. The symptom seems to indicate some bug with flipping the back buffer.
In the program, the keys 0, 1, and 2 control the display interval:
- 0 = D3DPRESENT_INTERVAL_IMMEDIATE. With this, the problem goes away.
- 1 = D3DPRESENT_INTERVAL_DEFAULT. With this, the band shows up on the afflicted system.
- 2 = D3DPRESENT_INTERVAL_TWO. With this, the screen flickers red/blue.
Any other key causes the program to exit.
Attached are three files:
* RedFlicker.zip: a Visual Studio Express 2013 solution with the source code. The problem replicates best for me with a "Debug" build.
* RedFlicker.exe.zip: pre-built binary of the program, using Visual Studio Express 2008.
* DixDiag.txt.zip: The DxDiag report for the afflicted machine.
[2014 Feb 4 Update] Added attachments for binary and DxDiag.