Updates to the Present and DRI3 extension specifications

Keith Packard keithp at keithp.com
Sat Oct 19 03:09:16 CEST 2013

First off, I want to thank people for their review and comments about
these two extensions, in particular those attending XDC who helped
clarify several important points.

These updates include a proposal for the Present Redirection additions;
I'd love to get some comments here, especially from people implementing
compositing managers, but I don't expect to have that ready for the X
server freeze in a couple of weeks. Everything else only involves minor
changes to the current DRI3/Present implementation which I've been
running here for several months without any major issues.

			     ❄ ❄ ❄  ❄  ❄ ❄ ❄

1. DRI3 changes.

        git://people.freedesktop.org/~keithp/dri3proto master

I've added the ability to take an existing SyncFence object and transfer
it to the client. That seems like a requirement to implement a
compositing manager in GL.

I've also realized that because there isn't any actual kernel support
for Fencing in the Intel driver, I'll probably end up just removing all
of the futex-based fake fences I'd done there and rely on implicit
synchronization for now. We need kernel fencing support in the intel
driver to do the cut-through page flipping that I want; if I get to that
point, I'll have 'real' kernel fence objects and won't have to play
games with futexes (or eventfds either, for that matter).

			     ❄ ❄ ❄  ❄  ❄ ❄ ❄

2. Present changes. The full version of the specification is available
here. Below, I've summarized the changes over the last couple of weeks.

        git://people.freedesktop.org/~keithp/presentproto master

			     ❄ ❄ ❄  ❄  ❄ ❄ ❄

2.1 PresentIdleNotify events

A GPU-resident fence is something queued to the GPU which causes
execution to halt until the fence is triggered. As such, the CPU will
queue such a fence long before it becomes triggered. Because pixmaps
used in PresentPixmap can become idle out of sequence, the client needs
to know which pixmap it should use in the next frame, but it doesn't
want to wait for the fence to be signaled as that would involve blocking
the CPU on GPU execution.

Sending an X event to let the client know which pixmap will become idle
next will allow the client to select the right pixmap to use for
subsequent operations. The client is expected to wait for the fence
before actually using it, but that wait can be queued to the GPU and not
block the CPU immediately.

For the Intel driver, which has no GPU fences, the IdleNotify event will be
used to select which pixmap to use next; no fence will be needed as the
X server will ensure that GPU operations are correctly serialized.

			     ❄ ❄ ❄  ❄  ❄ ❄ ❄

2.2 Present redirection

This version also tries to specify the semantics for Present
redirection. The design allows the compositing manager to catch
PresentPixmap operations to any redirected windows and handle them
itself. Clients will be completely unaware that redirection is
occurring, the apparent behavior will be as if the window was not
composited and the PresentPixmap operations were handled directly by the
X server itself.

Because this is not yet well understood, I don't think this will be
ready for X server 1.15 and I will remove it from the specification if
the X server doesn't include support for it. It would then be re-added
in a later version of the specification and X server and compositing
manager clients will be able to tell whether support is available by
looking at the extension version number.

			     ❄ ❄ ❄  ❄  ❄ ❄ ❄

2.3 Capabilities

Instead of requiring all drivers to support all Present features, I've
added a set of per-CRTC capabilities. Here's the current set:

	PresentCapabilityAsync means that the target device can flip
	the scanout buffer mid-frame instead of waiting for a vertical
	blank interval. The precise latency between the flip request
	and the actual scanout transition is not defined by this
	specification, but is intended to be no more than a few

	PresentCapabilityFence means that the target device can take
	advantage of SyncFences in the Present operations to improve
	GPU throughput. The driver must operate correctly in the
	absense of fences, but may have reduced performance. Using
	fences for drivers not advertising this capability should have
	no performance impact.

	PresentCapabilityUST means that the target device can scanout
	the image at an arbitrary UST time value, and is not driven by
	a periodic scanout timer. Applications specifying UST times
	for PresentPixmap can expect that their image will appear to
	the user within a short amount of time from that specified in
	the request. The precise accuracy of the scanout time is not
	defined by the extension, but is expected to be on the order
	of milliseconds or less.

Adding new capabilities will require bumping the minor protocol version
so that clients can tell the difference between an unknown capability
and an unsupported capability.

			     ❄ ❄ ❄  ❄  ❄ ❄ ❄

2.4 Options

PresentPixmap now takes a set of options to control its behavior. There
are three defined:

        PresentOptionAsync - requests cut-through copy or flip instead
        of blocking for vblank

        PresentOptionCopy - requires that the X server *not* flip to the
        provided pixmap and instead copy from it. This allows lazy
        applications to know that their buffer will go idle when the
        PresentNotify event is delivered and that its contents will be
        precisely what was in it before the operation.

        PresentOptionUST - requests that the copy or flip occur at a
        specific UST (unadjusted system time, which on Linux is
        CLOCK_MONOTONIC). For hardware which doesn't have a periodic
        screen update, this allows applications to schedule updates at
        regular clock intervals.

			     ❄ ❄ ❄  ❄  ❄ ❄ ❄

2.5 CompleteModes

The PresentCompleteNotify event now tells the client what happened with
the pixmap it sent to PresentPixmap:

        PresentCompleteModeCopy - the bits were copied out of the pixmap
        and into the window. The buffer is now idle.

        PresentCompleteModeFlip - the pixmap is being used as a scanout
        buffer. The buffer will not be idle until it is not being used
        as scanout anymore.

        PresentCompleteSkip - when a subsequent PresentPixmap operation
        targets the same window at the same MSC, then any pending
        operations will appear to execute at the specified time, but the
        X server will not actually do anything with the
        contents. Applications should probably treat this the same as
        PresentCompleteModeCopy in most respects.

			     ❄ ❄ ❄  ❄  ❄ ❄ ❄

2.6 Wait fences

PresentPixmap now has a wait-fence parameter which it uses to
synchronize access with other clients. The PresentPixmap operation will
not occur until after the specified fence has been signaled.

			     ❄ ❄ ❄  ❄  ❄ ❄ ❄

keith.packard at intel.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 827 bytes
Desc: not available
URL: <http://lists.x.org/archives/xorg-devel/attachments/20131018/187d034f/attachment.pgp>

More information about the xorg-devel mailing list