Enabling Intel® Adaptive Sync with 11th-generation Intel® Processor Graphics, DXGI 1.5, and Microsoft DirectX* 12

By Jordan Sheller, Published: 08/29/2019, Last Updated: 08/29/2019

An application demonstrating Intel® Adaptive Sync along with a library that allows the developer to query and set Adaptive Sync settings is available on GitHub*GameTechDev

Intel support of Adaptive Sync reduces stuttering and tearing for more elegant gameplay for those with monitors capable of supporting it. With the  Microsoft DirectX Graphics Infrastructure 1.5, coupled with 11th-generation Intel® Processor Graphics, enabling Adaptive Sync is possible for every game.

Without Adaptive Sync there are two options. One is to send a frame to the display hardware as soon as it is ready. This can result in an image that appears torn because we actually replaced the image being scanned out to the display in the middle of scanning out the previous image. To eliminate tearing, we can instead require that the frame be updated at vertical synchronization (Vsync) intervals. The downside with this is that it can introduce latency in the displayed frame because we have to have the completed image ready for display by the time the Vsync occurs or wait until the next one. Adaptive Sync can minimize both of these problems by allowing the image to be displayed any time within an interval when the rendered image is permitted to be updated. As soon as the previous frame is completed the new frame will be displayed, and the previous frame will remain the displayed frame until the new frame is ready for display.

sync comparison
Figure 1. Visual comparison between vertical sync, disabled vertical sync, and Adaptive Sync.

To take advantage of Adaptive Sync in your game there are a few requirements:

  • 11th-generation Intel Processor Graphics
  • DXGI 1.5
  • Use the DirectX 11 or 12 API
  • A monitor that supports VESA* Adaptive Sync
  • Adaptive Sync enabled in the Intel® Graphics Control Panel (Intel® GCP)
  • A DisplayPort* cable must be used (HDMI* is not currently being supported)

When implementing Adaptive Sync in DirectX 12, the DXGI Present() call will take care of the majority of work, but it is essential that the sync interval is set to 0 so the frame is sent immediately when finished:

m_swapChain->Present(0, presentFlags);

When in windowed mode, tearing flags should be provided to the swap chain description, present call, and buffer resize:

swapChainDesc.Flags = m_tearingSupport ? DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING : 0;

UINT presentFlags = (m_tearingSupport && m_windowedMode) ?
DXGI_PRESENT_ALLOW_TEARING : 0;

Along with being supported within the game, Adaptive Sync support will need to be enabled in the Intel Graphics Control Panel (Intel GCP):

intel g c p 3 d global settings
Figure 2. Intel® Graphics Control Panel (Intel® GCP) 3D global settings, which contains the flag for enabling Adaptive Sync.

Relevant reading from Microsoft* on Adaptive Sync:

I would like to thank Errin Miller, Adam Lake, and Dave Bookout for their contributions to this article.

Product and Performance Information

1

Intel's compilers may or may not optimize to the same degree for non-Intel microprocessors for optimizations that are not unique to Intel microprocessors. These optimizations include SSE2, SSE3, and SSSE3 instruction sets and other optimizations. Intel does not guarantee the availability, functionality, or effectiveness of any optimization on microprocessors not manufactured by Intel. Microprocessor-dependent optimizations in this product are intended for use with Intel microprocessors. Certain optimizations not specific to Intel microarchitecture are reserved for Intel microprocessors. Please refer to the applicable product User and Reference Guides for more information regarding the specific instruction sets covered by this notice.

Notice revision #20110804