Asynchronous Display Flipping for Linux

Using display (or plane or page) flipping is a nice optimization for screen updates as it avoids copying the application render buffer to the separate scanout buffer. However, in the current DRM interface, the flip operation is not performed immediately. Rather, the flip operation must be presented to the kernel before the vertical blank interval preceding the desired display time.

If the flip operation is even slightly delayed, the new scanout image will not be visible until the following frame. With many applications pushing the performance of the graphics hardware right to the edge, it's not at all uncommon for an occasional frame to 'just miss' and cause an ugly jerk on the screen.

The GLX_EXT_swap_control_tear extension provides a way for applications to request that when the swap request is delivered too late, instead of delaying for the next frame, the contents should be presented as soon as possible, even if that might cause some tearing artifacts on the screen. This gives the application developer the choice between the two visual artifacts (tearing vs judder).

A Linux interface for Async Flipping

This part was pretty easy to implement.

First, a new capability value, DRM_CAP_ASYNC_PAGE_FLIP was added so that applications could discover whether the driver offered this feature or not.

Second, a new flag value, DRM_MODE_PAGE_FLIP_ASYNC was added to the DRM_IOCTL_MODE_PAGE_FLIP ioctl.

To get the new flag down into the driver required adding the flag parameter to the page_flip crtc function.

Async Display Flipping support in Intel Hardware

Recent Intel display hardware has support for asynchronous flipping, either through the ring using the MI_DISPLAY_FLIP instruction or directly through the registers. There are some limitations however:

  • The pitch of the current and new frame buffers must match

  • Both current and new frame buffers must use X tiling

I've also only implemented flipping on Sandybridge and Ivybridge hardware as that's what I've got for testing.

Using Async Display Flipping with Present

I'm using async display flipping when the kernel supports it in the current Present implementation. This offers the ability to short-circuit multiple presentations targeting the same scanout frame. I haven't exposed the ability to select this to applications over the Present protocol yet, but that's not a big change.

Implementing the GLX_EXT_swap_control_tear extension

I haven't even looked at implementing this extension; I'm hoping that once I've gotten the functionality exposed over the X protocol that someone will at least help me figure out how to hook this up.

Getting the Bits

The interesting pieces here are the new kernel bits; the DRM library changes simply add new defines to existing APIs.

  • Kernel bits are in my repository

    git:// dri3

  • DRM library bits are in my drm repository

    git:// dri3