I have difficulty understanding the difference between those two values of the DXGI_SWAP_EFFECT enumeration. MSDN documentation states:
DXGI_SWAP_EFFECT_DISCARD
Use this flag to specify the bit-block transfer (bitblt) model and to specify that DXGI discard the contents of the back buffer after you call
IDXGISwapChain1::Present1
. This flag is valid for a swap chain with more than one back buffer, although, applications only have read and write access to buffer 0. Use this flag to enable the display driver to select the most efficient presentation technique for the swap chain.DXGI_SWAP_EFFECT_SEQUENTIAL
Use this flag to specify the bitblt model and to specify that DXGI persist the contents of the back buffer after you call
IDXGISwapChain1::Present1
. Use this option to present the contents of the swap chain in order, from the first buffer (buffer 0) to the last buffer. This flag cannot be used with multisampling.
So, Sequential
is for displaying the contents of the chain "in order", in other words, in the same order as you called Present()
. If so, is Discard
not in order? Obviously an older picture should never be shown before a newer one. What kind of "most efficient presentation technique" would this flag enable then?
What if your monitor's refresh rate is 60fps and your code is able to render at 90fps. In this case, every one out of two Present
s, the queue will be full. What happens then? Does Present
block until the next vsync, capping your rendering rate to 60fps and introducing input lag, or does it discard the oldest buffer in the queue with the new one and allows you to go on with your rendering code as fast as you can? Do these DXGI_SWAP_EFFECT
flags have any bearing on the issue?
Thanks.