Name

    NV_stream_remote
    NV_stream_cross_object
    NV_stream_cross_display
    NV_stream_cross_process
    NV_stream_cross_partition
    NV_stream_cross_system

Name Strings

    EGL_NV_stream_remote

Contributors

    Daniel Kartch
    Bogdan Naodovic
    James Jones
    Zander Clucas

Contacts

    Daniel Kartch, NVIDIA (dkartch 'at' nvidia.com)

Status

    Draft

Version

    Version 4 - June 01, 2016

Number

    EGL Extension #114

Extension Type

    EGL display extension

Dependencies

    Requires EGL_KHR_stream

    Interacts with EGL_KHR_stream_cross_process_fd

    All EGL_NV_stream_cross_* extensions require EGL_NV_stream_remote,
    but are independent of each other.

Overview

    This extension provides a generic framework for establishing stream
    connections when the producer and consumer endpoints are not
    associated with the same EGLStream object. The cross-process streams
    allowed by the EGL_KHR_stream_cross_process_fd extension are one
    example of such a connection. Other potential examples include
    streams between objects associated with different EGLDisplays in a
    single process, streams between processes residing in separate
    virtual machine partitions on a single system, or streams between
    entirely separate systems connected via the internet.

    The approach used by EGL_KHR_stream_cross_process_fd has several
    drawbacks:
      - It creates a new pair of stream creation and query functions
        which are specific to both the type of stream and the method
        used for communicating the stream's identity. Extending this
        methodology would require new pairs of functions for every new
        type of stream connection.
      - It allows creation of the connected stream objects without any
        indication of which side will be the consumer and which will be
        the producer. It even allows, although this was probably not
        intended, a cross-process stream to be established, but have
        both producer and consumer exist in the same process, with the
        other process acting as a voyeur that can observe state and
        perhaps modify attributes, but not operate on frames.
      - The use of file descriptors generated by EGL in one process
        and accessed by EGL in another to establish communication has
        potential security flaws, and may not be available at all on
        some real-time operating systems.

    Rather than implement new connection types using this model, we
    propose a more generic approach that does not require a
    proliferation of new interfaces and avoids any ambiguities in how
    the stream will be used. These extensions can coexist with
    EGL_KHR_stream_cross_process_fd, but allow for more control of
    stream communication by the applications.

    These extensions provide the framework with which arbitrary stream
    object pairs can be established, but by themselves are insufficient
    to create such pairs. In addition, a separate extension must be
    used to determine the protocol by which the two objects will
    communicate. See for example the EGL_NV_stream_socket extension.

    Several optional types of separate stream objects are defined,
    with successive levels of remoteness. It should be assumed that
    a more remote type will be less efficient in transfering images,
    and therefore applications should choose the least remote type
    available that is compatible with their use cases.

New Types

    None

New Functions

    None

New Tokens

    Returned by eglQueryStreamKHR and eglQueryStreamAttribKHR when
    attribute is EGL_STREAM_STATE_KHR:

        EGL_STREAM_STATE_INITIALIZING_NV           0x3240

    Accepted as attribute names in eglCreateStreamKHR,
    eglCreateStreamAttribKHR, eglQueryStreamKHR, and
    eglQueryStreamAttribKHR:

        EGL_STREAM_TYPE_NV                         0x3241
        EGL_STREAM_PROTOCOL_NV                     0x3242
        EGL_STREAM_ENDPOINT_NV                     0x3243

    Accepted by eglCreateStreamKHR and eglCreateStreamAttribKHR, and
    returned by eglQueryStreamKHR and eglQueryStreamAttribKHR, as value
    when attribute is EGL_STREAM_TYPE_NV, EGL_STREAM_PROTOCOL_NV or
    EGL_STREAM_ENDPOINT_NV:

        EGL_STREAM_LOCAL_NV                        0x3244

    When EGL_NV_stream_cross_object is present, accepted by
    eglCreateStreamKHR and eglCreateStreamAttribKHR and returned by
    eglQueryStreamKHR and eglQueryStreamAttribKHR as value for
    attribute EGL_STREAM_TYPE_NV:

        EGL_STREAM_CROSS_OBJECT_NV                 0x334D

    When EGL_NV_stream_cross_display is present, accepted by
    eglCreateStreamKHR and eglCreateStreamAttribKHR and returned by
    eglQueryStreamKHR and eglQueryStreamAttribKHR as value for
    attribute EGL_STREAM_TYPE_NV:

        EGL_STREAM_CROSS_DISPLAY_NV                0x334E

    When EGL_NV_stream_cross_process is present, accepted as
    value for attribute EGL_STREAM_TYPE_NV by eglCreateStreamKHR
    and eglCreateStreamAttribKHR. When either
    EGL_NV_stream_cross_process or EGL_KHR_stream_cross_process_fd
    is present, returned by eglQueryStreamKHR and
    eglQueryStreamAttribKHR for attribute EGL_STREAM_TYPE_NV:

        EGL_STREAM_CROSS_PROCESS_NV                0x3245

    When EGL_NV_stream_cross_partition is present, accepted by
    eglCreateStreamKHR and eglCreateStreamAttribKHR and returned by
    eglQueryStreamKHR and eglQueryStreamAttribKHR as value for
    attribute EGL_STREAM_TYPE_NV:

        EGL_STREAM_CROSS_PARTITION_NV              0x323F

    When EGL_NV_stream_cross_system is present, accepted by
    eglCreateStreamKHR and eglCreateStreamAttribKHR and returned by
    eglQueryStreamKHR and eglQueryStreamAttribKHR as value for
    attribute EGL_STREAM_TYPE_NV:

        EGL_STREAM_CROSS_SYSTEM_NV                 0x334F

    If EGL_KHR_stream_cross_process_fd is present, returned by
    eglQueryStreamKHR and eglQueryStreamAttribKHR when attribute is
    EGL_STREAM_PROTOCOL_NV:

        EGL_STREAM_PROTOCOL_FD_NV                  0x3246

    Accepted by eglCreateStreamKHR and eglCreateStreamAttribKHR, and
    returned by eglQueryStreamKHR and eglQueryStreamAttribKHR when
    attribute is EGL_STREAM_ENDPOINT_NV:

        EGL_STREAM_PRODUCER_NV                     0x3247
        EGL_STREAM_CONSUMER_NV                     0x3248

Add to "Glossary" of EGL_KHR_stream:

    Local stream
    A stream implemented with both consumer and producer attached to a
    single EGLStream object.

    Remote stream
    A stream implemented with two EGLStream objects that communicate
    with each other, with the consumer attached to one object and the
    producer attached to the other.

Add to section "3.10.1 Creating an EGLStream" in EGL_KHR_stream:

    If a remote EGLStream is created, as described in section "3.10.5.x
    Remote streams", and is paired with an EGLStream object which has
    conflicting values for some attributes, creation will succeed, but
    the stream will enter state EGL_STREAM_STATE_DISCONNECTED_KHR once
    communication is established.

Add to list of failures in section "3.10.1 Creating an EGLStream" in
EGL_KHR stream:

        - EGL_BAD_MATCH is generated if the value of any one of the
          EGL_STREAM_TYPE_NV, EGL_STREAM_PROTOCOL_NV, or
          EGL_STREAM_ENDPOINT_NV attributes is EGL_STREAM_LOCAL_NV and
          any other of these attributes is neither EGL_STREAM_LOCAL_NV
          nor EGL_DONT_CARE.

Add to section "3.10.2 Connecting an EGLStream to a consumer" in
EGL_KHR_stream:

    Any function which connects a consumer to an EGLStream will fail and
    generate an EGL_BAD_ACCESS error if the value of the EGLStream's
    EGL_STREAM_ENDPOINT_NV attribute is EGL_STREAM_PRODUCER_NV.

Add to section "3.10.3 Connecting an EGLStream to a producer" in
EGL_KHR_stream:

    Any function which connects a producer to an EGLStream will fail and
    generate an EGL_BAD_ACCESS error if the value of the EGLStream's
    EGL_STREAM_ENDPOINT_NV attribute is EGL_STREAM_CONSUMER_NV.

Add to "Table 3.10.4.4 EGLStream Attributes" in EGL_KHR_stream:

        Attribute                   Read/Write   Type        Section
        --------------------------  ----------   ------      ----------
        EGL_STREAM_TYPE_NV             io       EGLint      3.10.4.x
        EGL_STREAM_PROTOCOL_NV         io       EGLint      3.10.4.x+1
        EGL_STREAM_ENDPOINT_NV         io       EGLint      3.10.4.x+2

Add to beginning of state list in section "3.10.4.3 EGL_STREAM_STATE_KHR
Attribute" in EGL_KHR_stream:

        - EGL_STREAM_STATE_INITIALIZING_NV - The EGLStream object
          represents one endpoint of a remote stream and has not yet
          established communication with the opposite endpoint.

Replace the first entry in the state transition table in section
"3.10.4.3 EGL_STREAM_STATE_KHR Attribute" in EGL_KHR_stream:

    -> EGL_STREAM_STATE_INITIALIZING_NV
    A new remote EGLStream is created in this state.

    EGL_STREAM_STATE_INITIALIZING_NV ->
    EGL_STREAM_STATE_CREATED_KHR
    Occurs when a remote EGLStream object establishes communication with
    the opposite endpoint.

    -> EGL_STREAM_STATE_CREATED_KHR
    A new local EGLStream or EGLStream of undetermined type is created
    in this state.

Add new subsections to the end of section "3.10.4 EGLStream Attributes"
in EGL_KHR_stream:

    3.10.4.x EGL_STREAM_TYPE_NV Attribute

    The EGL_STREAM_TYPE_NV attribute may be set when the stream
    is created, and indicates the type of connection between the
    EGLStream objects to which the consumer and producer are attached.
    Legal values are EGL_DONT_CARE and EGL_STREAM_LOCAL_NV. The
    default value is EGL_DONT_CARE.

    A value of EGL_STREAM_LOCAL_NV indicates that this is a local
    stream with both consumer and producer connected to a single
    EGLStream object.

    If EGL_DONT_CARE is initially specified, the value of the attribute
    will automatically be changed to the appropriate value once both
    consumer and producer are attached, depending on the functions used.

    Other possible values for EGL_STREAM_TYPE_NV may be defined by
    additional extensions to indicate a remote stream. Where used,
    the EGL_STREAM_PROTOCOL_NV attribute must also be set to a
    communication protocol compatible with the stream type.

    3.10.4.x+1 EGL_STREAM_PROTOCOL_NV Attribute

    The EGL_STREAM_PROTOCOL_NV attribute may be set when the stream is
    created, and indicates the manner in which communication is
    established between the EGLStream objects to which the consumer
    and producer are attached. Legal values are EGL_DONT_CARE and
    EGL_STREAM_LOCAL_NV. The default value is EGL_DONT_CARE.

    A value of EGL_STREAM_LOCAL_NV indicates that this is a local
    stream with both consumer and producer connected to a single
    EGLStream object, so no communication protocol is required.

    If EGL_DONT_CARE is initially specified, the value of the attribute
    will automatically be changed to the appropriate value once both
    consumer and producer are attached, depending on the functions used.

    Other possible values for EGL_STREAM_PROTOCOL_NV may be defined by
    additional extensions to indicate the communication protocol to be
    used for a remote stream. Not all communication protocols are
    compatible with all stream types, and vice versa. If incompatible
    types and protocols are specified, an EGL_BAD_MATCH error will be
    generated.

    3.10.4.x+2 EGL_STREAM_ENDPOINT_NV Attribute

    The EGL_STREAM_ENDPOINT_NV attribute may be set when the stream is
    created, and indicates the endpoints which will be attached to the
    EGLStream object. Legal values are EGL_DONT_CARE,
    EGL_STREAM_LOCAL_NV, EGL_STREAM_CONSUMER_NV, and
    EGL_STREAM_PRODUCER_NV. The default value is EGL_DONT_CARE.

    A value of EGL_STREAM_LOCAL_NV indicates that this is a local
    stream with both consumer and producer connected to a single
    EGLStream object.

    A value of EGL_STREAM_CONSUMER_NV indicates that the EGLStream
    object represents the consumer side of a remote stream.

    A value of EGL_STREAM_PRODUCER_NV indicates that the EGLStream
    object represents the producer side of a remote stream.

    If EGL_DONT_CARE is initially specified, the value of the attribute
    will automatically be changed to the appropriate value once both
    consumer and producer are attached, depending on the functions used.

If EGL_NV_stream_cross_object is present, in section 3.10.4.x above,
add EGL_STREAM_CROSS_OBJECT_NV to the list of legal values, and insert

    A value of EGL_STREAM_CROSS_OBJECT_NV indicates that the stream
    object represents one endpoint of a remote stream whose other
    endpoint is obtained from the same EGLDisplay.

If EGL_NV_stream_cross_display is present, in section 3.10.4.x above,
add EGL_STREAM_CROSS_DISPLAY_NV to the list of legal values, and insert

    A value of EGL_STREAM_CROSS_DISPLAY_NV indicates that the stream
    object represents one endpoint of a remote stream whose other
    endpoint may be obtained from a different EGLDisplay in the same
    process.

If EGL_NV_stream_cross_process or EGL_NV_stream_cross_process_fd is
present, in section "3.10.4.x" above, add EGL_STREAM_CROSS_PROCESS_NV
to the list of legal values, and insert

    A value of EGL_STREAM_CROSS_PROCESS_NV indicates that the stream
    object represents one endpoint of a remote stream whose other
    endpoint may reside in a separate process.

If EGL_NV_stream_cross_partition is present, in section 3.10.4.x
above, add EGL_STREAM_CROSS_PARTITION_NV to the list of legal values,
and insert

    A value of EGL_STREAM_CROSS_PARTITION_NV indicates that the stream
    object represents one endpoint of a remote stream whose other
    endpoint may reside in a separate virtual machine partition on
    the same system. The partitions are not required to be using the
    same operating systems, but must support compatible communication
    protocols.

If EGL_NV_stream_cross_system is present, in section 3.10.4.x above,
add EGL_STREAM_CROSS_SYSTEM_NV to the list of legal values, and insert

    A value of EGL_STREAM_CROSS_SYSTEM_NV indicates that the stream
    object represents one endpoint of a remote stream whose other
    endpoint may reside on an independent hardware system with no
    directly sharable memory resources.

If EGL_KHR_stream_cross_process_fd is present, in section 3.10.4.x+1
above, add EGL_STREAM_PROTOCOL_FD_NV to the list of legal values, and
insert

    A value of EGL_STREAM_PROTOCOL_FD_NV indicates that the stream is
    a remote stream whose communication is established using a file
    descriptor. The details of what this file descriptor represents
    are implementation dependent. If the EGL_STREAM_PROTOCOL_NV
    attribute is initialized with this value, the EGL_STREAM_TYPE_NV
    attribute must specify a value of EGL_STREAM_CROSS_PROCESS_NV or
    an EGL_BAD_MATCH failure is generated.

    If an initial value of EGL_DONT_CARE is specified and a file
    descriptor is subsequently obtained with
    eglGetStreamFileDescriptorKHR, the value will be automatically
    changed to EGL_STREAM_PROTOCOL_FD_NV.

Add a new subsection to the end of "3.10.5 EGLStream operation":

    3.10.5.x Remote streams

    An EGLStream object may be created as the endpoint of a remote
    stream by specifying EGL_STREAM_PRODUCER_NV or
    EGL_STREAM_CONSUMER_NV as the value for its EGL_STREAM_ENDPOINT_NV
    attribute. Valid and compatible EGL_STREAM_TYPE_NV and
    EGL_STREAM_PROTOCOL_NV values other than EGL_DONT_CARE or
    EGL_STREAM_LOCAL_NV must also be specified.

    If a value for EGL_STREAM_ENDPOINT_NV is not specified, the stream
    is assumed to be local, but other extensions (see for example
    EGL_KHR_stream_cross_process_fd) may allow it to be converted to a
    remote stream before the producer has been attached.

    When an EGLStream object is created as remote, any unspecified
    attribute will be initially set to a value of EGL_DONT_CARE. Pairs
    of EGLStream objects representing opposite endpoints of a stream are
    not required to specify the same attribute lists, but their
    attributes must be compatible. When communication is established
    between the endpoints, they will exchange attribute settings:
        - If both endpoints have a value of EGL_DONT_CARE for an
          attribute, the default value will be assigned.
        - If one endpoint has a value of EGL_DONT_CARE for an attribute,
          it will be set to the other endpoint's value.
        - If neither endpoint has a value of EGL_DONT_CARE for an
          attribute, their values must agree. In most cases, this means
          the values must be identical, but this may not be true for all
          attributes. In particular, one endpoint must specify an
          EGL_STREAM_ENDPOINT_NV value of EGL_STREAM_CONSUMER_NV, and
          the other must specify a value of EGL_STREAM_PRODUCER_NV.
    If the values for any attribute are not compatible, the stream will
    transition to the EGL_STREAM_STATE_DISCONNECTED_KHR state.

    Additionally, if the two EGLStream objects representing a remote
    stream are created for EGLDisplays which cannot share resources,
    the stream will transition to the EGL_STREAM_STATE_DISCONNECTED_KHR
    state.

    When using remote streams, there may be latency in communicating
    state changes between the EGLStream objects representing the two
    endpoints. For instance, when a new frame is inserted into the
    stream by the producer, the consumer endpoint may not immediately
    transition to EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR. Similarly,
    when a frame is acquired by the consumer, the producer endpoint may
    not immediately transition to
    EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR. Applications should rely
    only on the state of the endpoint on which they are operating to
    determine the expected results of that operation.

In section "3.10.1.1 Duplicating an EGLStream from a file descriptor" of
the EGL_KHR_stream_cross_process_fd extension, add to the failure list
for eglGetStreamFileDescriptor

        - EGL_BAD_ACCESS is generated if the EGL_STREAM_TYPE_NV
          attribute of <stream> is anything other than EGL_DONT_CARE or
          EGL_STREAM_CROSS_PROCESS_NV.

        - EGL_BAD_ACCESS is generated if the EGL_STREAM_PROTOCOL_NV
          attribute of <stream> is anything other than EGL_DONT_CARE or
          EGL_STREAM_PROTOCOL_FD_NV.

        - EGL_BAD_ACCESS is generated if the EGL_STREAM_ENDPOINT_NV
          attribute of <stream> is EGL_STREAM_LOCAL_NV.

Issues

    None

Revision History

    #4  (June 01, 2016)
        - Removed sync object definition. It will be provided by a
          separate extension.
        - Folded in cross-partition extension.
        - Added types for cross-object, cross-display, and
          cross-system streams.
        - General cleanup in preparation for publication.

    #3  (September 16, 2015) Zander Clucas
        - Removed dependence of the CROSS_PROCESS type on the
          EGL_NV_cross_process_fd extension
        - Added CROSS_PROCESS to the list of STREAM_TYPE legal values
        - Added CROSS_PROCESS requirement for cross_process_fd protocol

    #2  (December 11, 2014) Daniel Kartch
        - Rewrote as NV draft for earlier release.
        - Added section for creation of sync object.
        - Reserved enum values.

    #1  (October 10, 2014) Daniel Kartch
        - Initial EXT draft
