blob: 18dcdc6f1178e865c9fe41f6b7ff57a54dbe3951 [file] [log] [blame]
Name
EXT_buffer_age
Name Strings
EGL_EXT_buffer_age
Notice
Copyright 2011,2012 Intel Cooperation
IP Status
No known IP claims.
Contributors
Robert Bragg
Neil Roberts
Tapani Pälli
Kristian Høgsberg
Acorn Pooley
James Jones
Contacts
Robert Bragg, Intel (robert.bragg 'at' intel.com)
Status
Complete.
Version
12 - June 13, 2013
Number
EGL Extension #52
Dependencies
Requires EGL 1.4
This extension is written against the wording of the EGL 1.4
Specification.
Overview
The aim of this extension is to expose enough information to
applications about how the driver manages the set of front and
back buffers associated with a given surface to allow applications
to re-use the contents of old frames and minimize how much must be
redrawn for the next frame.
There are lots of different ways for a driver to manage these
buffers, from double buffering, different styles of triple
buffering and even n-buffering or simply single buffer rendering.
We also need to consider that power management events or memory
pressure events might also result in some of the buffers not
currently in-use being freed.
This extension lets applications query the age of the back buffer
contents for an EGL surface as the number of frames elapsed since
the contents were most recently defined. The back buffer can
either be reported as invalid (has an age of 0) or it may be
reported to contain the contents from n frames prior to the
current frame.
Once the application has queried the buffer age, the age of
contents remains valid until the end of the frame for all pixels
that continue to pass the pixel ownership test.
For many use-cases this extension can provide an efficient
alternative to using the EGL_BUFFER_PRESERVED swap behaviour. The
EGL_BUFFER_PRESERVED swap behaviour adds a direct dependency for
any frame n on frame n - 1 which can affect the pipelining of
multiple frames but also implies a costly copy-back of data to
initialize the back-buffer at the start of each frame.
For example if you consider a double buffered application drawing
a small spinning icon, but everything else in the scene is static.
If we know that 2 buffers are continuously being recycled each
time eglSwapBuffers is called then even though 100s of frames may
need to be drawn to animate the icon it can be seen that the two
buffers are remaining unchanged except within the bounds of the
icon. In this scenario ideally the application would simply
perform an incremental update of the old buffer instead of
redundantly redrawing all the static parts of the scene. The
problem up until now though has been that EGL doesn't report how
buffers may be recycled so it wasn't safe for applications to try
and reuse their contents. Now applications can keep track of all
the regions that have changed over the last n frames and by
knowing the age of the buffer they know how to efficiently repair
buffers that are re-cycled instead of redrawing the entire scene.
New Procedures and Functions
None
New Tokens
EGL_BUFFER_AGE_EXT 0x313D
Additions to Section 2.2 of the EGL 1.4 Specification (Rendering
Contexts and drawing surfaces)
Add the following text to a new subsection titled "Pixel
Ownership Test" after the subsection titled "Interaction With
Native Rendering":
A fragment produced by a client api through rasterization
with windows coordinates (x, y) only modifies the pixel in the
rendering surface at that location if it passes the pixel
ownership test defined by the native window system.
The pixel ownership test determines if the pixel at location
(x, y) in a rendering surface is currently owned by the client
api (more precisely, by this its context). If it is not, the
native window system decides the fate of the incoming
fragment. Possible results are that the fragment is discarded
or that some subset of the subsequent per-fragment operations
are applied to the fragment. This test allows the window
system to control the client api behavior, for instance, when
a window surface is obscured.
The pixel ownership test can only fail for window surfaces,
not for pixmap surfaces or pbuffer surfaces.
Most native window systems will be able to guarantee that no
fragment will ever fail the pixel ownership test, but a
notable exception to this is the X11 window system where,
depending on the driver, the pixel ownership test may fail
when portions of a window are obscured.
Additions to Section 3.5 of the EGL 1.4 Specification (Rendering Surfaces)
Add the following to the table of "Queryable surface attributes
and types":
+----------------------+---------+-----------------------------+
| Attribute | Type | Description |
+----------------------+---------+-----------------------------+
| EGL_BUFFER_AGE_EXT | Integer | Age of back-buffer contents |
+----------------------+---------+-----------------------------+
Table aaa: Queryable surface attributes and types.
Add the following text to the subsection titled "Surface
Attributes" in the description for eglQuerySurface
Querying EGL_BUFFER_AGE_EXT returns the age of the color
contents of the current back-buffer as the number of frames
elapsed since it was most recently defined. Applications can,
under certain conditions described below, use this age to
safely rely on the contents of old back- buffers to
potentially reduce the amount of redrawing they do each frame.
A frame is the period between calls to any of the functions in
table 3.X, hereafter referred to as "frame boundaries."
Function name
--------------------
eglSwapBuffers
Table 3.X, Frame Boundary Functions
Buffers' ages are initialized to 0 at buffer creation time.
When a frame boundary is reached, the following occurs before
any exchanging or copying of color buffers:
* The current back buffer's age is set to 1.
* Any other color buffers' ages are incremented by 1 if
their age was previously greater than 0.
For the purposes of buffer age tracking, a buffer's content
is considered defined when its age is a value greater than 0.
For example, with a double buffered surface and an
implementation that swaps via buffer exchanges, the age would
usually be 2. With a triple buffered surface the age would
usually be 3. An age of 1 means the previous swap was
implemented as a copy. An age of 0 means the buffer has only
just been initialized and the contents are undefined. Single
buffered surfaces have no frame boundaries and therefore
always have an age of 0.
Frame boundaries are the only events that can set a buffer's
age to a positive value. Once EGL_BACK_BUFFER_AGE_EXT has been
queried then it can be assumed that the age will remain valid
until the next frame boundary. EGL implementations are
permitted, but not required, to reset the buffer age in
response to pixel ownership test changes for any pixels within
the drawable, or if new pixels are added to or removed from
the drawable, i.e., the drawable is resized. A reset of this
nature does not affect the age of content for pixels that pass
the pixel ownership test before and after the event that
caused the reset. In other words, applications can assume
that no event will invalidate the content of pixels that
continuously pass the pixel ownership test between when the
buffer age was queried and the following frame boundary.
It is up to applications to track pixel ownership using data
collected from relevant window system events, such as
configuration and expose events on X11.
If the EGL implementation decides to free un-used back-buffers
when the system is under memory pressure or in response to
power-management events then EGL will return an age of 0 when
it allocates a new buffer at the start of a new frame.
If the EGL_BUFFER_PRESERVED swap behaviour is in use then
it can be assumed that the age will always be 1. It is
recommended where possible though that the
EGL_BUFFER_PRESERVED swap behaviour not be used since it can
have severe performance consequences. Keeping track of the
buffer age and the regions that have changed over the last 2
or 3 frames instead can often replace the need for using
EGL_BUFFER_PRESERVED.
EGL_BUFFER_AGE_EXT state is a property of the EGL surface that
owns the buffers and lives in the address space of the
application. That is, if an EGL surface has been created from
a native window or pixmap that may be shared between
processes, the buffer age is not guaranteed to be synchronized
across the processes. Binding and unbinding a surface to and
from one or more contexts in the same address space will not
affect the ages of any buffers in that surface.
Add the following text to last paragraph of the subsection titled
"Surface Attributes" in the description for eglQuerySurface
errors.
If querying EGL_BUFFER_AGE_EXT and <surface> is not bound as
the draw surface to the calling threads current context
an EGL_BAD_SURFACE error is generated.
Dependencies on OpenGL ES
None
Dependencies on OpenVG
None
Issues
1) What are the semantics if EGL_BUFFER_PRESERVED is in use
RESOLVED: The age will always be 1 in this case. More
clarification about this was added along with the
recommendation to use the buffer age to reuse buffers instead
of EGL_BUFFER_PRESERVED when possible to avoid the
in-efficiencies of introducing a dependency for each frame on
the previous frame.
2) How can an application know that all pixels of a re-usable
buffer were originally owned by the current context?
RESOLVED: It is up to the application to track pixel ownership
using existing window system specific events, such as X11
expose or configure notify events.
3) What are the semantics if the buffer age attribute is queried for
a surface that isn't bound to the calling thread's context as the
draw surface?
RESOLVED: we report an EGL_BAD_SURFACE error as is similarly
done when calling eglSwapBuffers for such a surface.
4) What is the buffer age of a single buffered surface?
RESOLVED: 0. This falls out implicitly from the buffer age
calculations, which dictate that a buffer's age starts at 0,
and is only incremented by frame boundaries. Since frame
boundary functions do not affect single buffered surfaces,
their age will always be 0.
5) What guarantees are provided after querying the buffer age?
RESOLVED: The buffer age of pixels which continue to pass the
pixel ownership test must remain valid until the next frame
boundary otherwise applications can't be absolutely sure of
the consistency of their rendered content. Implementations
may reset the queryable age of the buffer when pixel ownership
changes occur. This is further clarified in section 3.5
Revision History
Version 1, 25/07/2011
- First draft
Version 2, 03/08/2011
- Clarified semantics for using EGL_BUFFER_PRESERVED
Version 3, 01/09/2011
- Fixed a prototype inconsistency
Version 4, 03/11/2011
- Split out the buffer age parts from EGL_INTEL_start_frame
Version 5, 20/03/2012
- Document that once the age is queried it remains valid until
the end of the frame so we can remove the need for a separate
EGL_EXT_start_frame extension.
Version 6, 20/03/2012
- Clarify that only buffers who's contents were fully owned by
the context are tracked.
Version 7, 20/03/2012
- Document that an error will be generated if querying the age
for a surface not bound to the current context.
Version 8, 25/08/2012
- Update in line with changes made to the GLX_EXT_buffer_age draft spec
including more relaxed pixel ownership requirements and explicit
clarification of the buffer age calculation.
Version 9 20/09/2012
- Update in line with changes made to the EGL_EXT_buffer age
draft space
Version 10 29/11/2012
- Add pixel ownership test section and other minor
clarifications
Version 11 13/12/2012
- Allocated enumerant and marked complete.
Version 12, 13/06/2013, Chad Versace <chad.versace@intel.com>
- Remove the "all rights reserved" clause from the copyright notice. The
removal does not change the copyright notice's semantics, since the
clause is already implied by any unadorned copyright notice. But, the
removal does diminish the likelihood of unwarranted caution in readers
of the spec.
- Add "IP Status" section to explicitly state that this extension has no
knonw IP claims.