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.
