Name

    NV_context_priority_realtime

Name Strings

    EGL_NV_context_priority_realtime

Contributors

    Sandeep Shinde
    Kirill Artamonov
    Sami Kiminki
    Donghan Ryu
    Daniel Koch
    Mark Kilgard

Contacts

    Sandeep Shinde, NVIDIA (sashinde 'at' nvidia 'dot' com)

Status

    Complete

Version

    Version 4 - November 21, 2017

Number

    EGL Extension #124

Dependencies

    Requires EGL 1.0.

    Requires EGL_IMG_context_priority

    This extension is written against the wording of the EGL 1.5
    Specification - August 27, 2014 (but may be implemented against earlier
    versions).

Overview

    This extension allows an EGLContext to be created with one extra
    priority level in addition to three priority levels that are part of
    EGL_IMG_context_priority extension.

    This new level has extra privileges that are not available to other three
    levels. Some of the privileges may include:
    - Allow realtime priority to only few contexts
    - Allow realtime priority only to trusted applications
    - Make sure realtime priority contexts are executed immediately
    - Preempt any current context running on GPU on submission of
      commands for realtime context

    The mechanism for determining which EGL context is allowed to use this
    priority level is platform dependent.

New Types

    None

New Procedures and Functions

    None

New Tokens

    New attribute value accepted for the EGL_CONTEXT_PRIORITY_LEVEL_IMG
    attribute in the <attrib_list> argument of eglCreateContext:

        EGL_CONTEXT_PRIORITY_REALTIME_NV         0x3357

Additions to Chapter 3 of the EGL 1.5 Specification (EGL Functions and Errors)

    Add a NEW section "3.7.1.7 Context Priority" to specify the context
    priority attribute for EGL_IMG_context_priority and values:

    "3.7.1.7 Context Priority

    The attribute EGL_CONTEXT_PRIORITY_LEVEL_IMG specifies a context
    priority hint for a context supporting context priority.  This
    attribute's value may be one of EGL_CONTEXT_PRIORITY_HIGH_IMG,
    EGL_CONTEXT_PRIORITY_MEDIUM_IMG, EGL_CONTEXT_PRIORITY_LOW_IMG,
    or EGL_CONTEXT_PRIORITY_REALTIME_NV.  The default value for
    EGL_CONTEXT_PRIORITY_LEVEL_IMG is EGL_CONTEXT_PRIORITY_MEDIUM_IMG.

    This attribute is a hint, as an implementation may not support
    multiple contexts at some priority levels and system policy may limit
    access to high priority contexts to appropriate system privilege
    level.

    The value EGL_CONTEXT_PRIORITY_REALTIME_NV requests the created
    context run at the highest possible priority and be capable of
    preempting the current executing context when commands are flushed
    by such a realtime context.

    This attribute is supported only for OpenGL and OpenGL ES contexts."

    Within section 3.7.4 "Context Queries" amend the eglQueryContext
    discussion as follows:

    Change the sentence describing the attribute parameter to include
    EGL_CONTEXT_PRIORITY_LEVEL_IMG so it reads:

    "attribute must be set to EGL_CONFIG_ID, EGL_CONTEXT_CLIENT_TYPE,
    EGL_CONTEXT_CLIENT_VERSION, EGL_RENDER_BUFFER, or
     EGL_CONTEXT_PRIORITY_LEVEL_IMG."

    After the discussion of "Querying EGL_RENDER_BUFFER", add:

    "Querying EGL_CONTEXT_PRIORITY_LEVEL_IMG returns the priority this
    context was actually created with. Note: this may not be the same
    as specified at context creation time, due to implementation limits
    on the number of contexts that can be created at a specific priority
    level in the system."

Issues

    1)  The EGL_IMG_context_priority extension is written to amend the EGL
        1.4 specification.  Should this extension amend EGL 1.5 or 1.4?

        RESOLVED:  EGL 1.5 because it is newer and better organized to
        extend context attributes.

        EGL 1.5 rewrites 3.7.1 "Creating Rendering Contexts" to have subsections
        for different context attributes.  This extension adds a new such section
        that includes the EGL_IMG_context_priority attribute and values too.

    2)  Is context priority hint supported for both OpenGL and OpenGL ES contexts?

        RESOLVED:  Yes.

    3)  What is the intended application of the realtime priority level?

        RESOLVED:  One anticipated application is the system compositor
        for a Head Mounted Display (HMD) requires realtime recomposition
        for time-warping.

    4)  What action causes a context with realtime priority to preempt
        other contexts?

        RESOLVED:  Preemption by a context with realtime priority should
        occur when there are pending rendering commands and an implicit or
        explicit flush (i.e. glFlush or glFinish) occurs.

    5)  What does "trusted" or "appropriate system privilege level"
        mean in practice for a Linux-based operating system such as Android?

        RESOLVED: Trusted means an application that has higher privileges
        than other apps such as having CAP_SYS_NICE capability. On Android
        such applications have to be registered in advance with the OS;
        unpriviledged third party app cannot acquire this capability.

        This restriction exists so arbitrary applications do not starve or
        otherwise compromise the interactivity of the system overall.

    6)  In practice how many realtime priority contexts can exist in a system to
        get best performance?

        RESOLVED: Only one realtime priority context should be active at a given
        moment to get best performance.

    7)  Can a context created with a realtime priority hint that is
        in fact given a realtime priority, subsequently find that realtime
        priority revoked and, if revoked, can it be restored?

        RESOLVED: No, once a context is created with specific priority level, the
        priority will not change for lifetime of the context. This means there will
        not be revoking or restoring of realtime priority to already created context.

    8)  The attrib_list for eglCreateContext could list the attribute
        EGL_CONTEXT_PRIORITY_LEVEL_IMG multiple times with different valid values.
        What happens in this case?

        RESOLVED: Behavior is undefined in this case.

        NVIDIA's EGL implementation handles such case by using the last (valid) attribute
        value listed in the attrib_list array as the effective attribute value for
        creating the context.

        The EGL specification is unfortunately silent on this issue.


Revision History
    Version 1,  2016/11/23 (Sandeep Shinde)
        - Initial version
    Version 2,  2017/10/13 (Mark Kilgard)
        - Complete and convert to NV extension
    Version 3, 2017/10/31 (Sandeep Shinde)
        - Few minor corrections. Issue 6 resolved.
    Version 4, 2017/11/21 (Sandeep Shinde)
        - Update enum value and add extension number
