Name

    NV_stream_socket
    NV_stream_socket_unix
    NV_stream_socket_inet

Name Strings

    EGL_NV_stream_socket
    EGL_NV_stream_socket_unix
    EGL_NV_stream_socket_inet

Contributors

    Daniel Kartch
    Bogdan Naodovic
    James Jones
    Zander Clucas
    Tarun Bansal

Contacts

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

Status

    Draft

Version

    Version 6 - October 27, 2016

Number

    EGL Extension #115

Extension Type

    EGL display extension

Dependencies

    EGL_NV_stream_socket requires EGL_NV_stream_remote.

    EGL_NV_stream_socket_unix requires EGL_NV_stream_socket.

    EGL_NV_stream_socket_inet requires EGL_NV_stream_socket.

Overview

    These extensions build on the framework for remote streams provided
    in EGL_NV_stream_remote to define a means for two EGLStream objects
    representing opposite ends of a single stream to establish
    communication using a socket. The application is expected to create
    and connnect both ends of the socket before creating the stream
    objects.

    The base EGL_NV_stream_socket extension defines most of the
    attributes required to initialize the stream objects. The
    EGL_NV_stream_socket_unix and EGL_NV_stream_socket_inet extensions
    indicate support for UNIX domain and internet protocol socket types,
    respectively. Additional extensions may provide support for other
    socket types. The type of socket is important, as certain operations
    are only available with certain types, which may influence how the
    streams are implemented. For instance, UNIX domain sockets allow
    file descriptors to be passed between processes, while internet
    protocol sockets do not. This ability may allow more efficient
    sharing of resources between the socket endpoints.

    An application using this extension will bear some similarity to the
    example code from the EGL_KHR_stream_cross_process_fd extension,
    which also uses sockets to establish the communication between two
    processes and then create a pair of EGLStream objects. The key
    difference is that in that case, the sockets are merely a temporary
    means to an end to pass a file descriptor between the processes.
    Once that is accomplished, the sockets are discarded.

    The file descriptor used by that extension may represent an
    underlying object such as shared memory which allows more efficient
    communication than the sockets themselves. However, there is nothing
    preventing an implementation of EGL_NV_stream_socket from creating
    and passing such a file descriptor as well, gaining the same
    efficiency. Therefore, a protocol based on sockets will work at
    least as well as one based on file descriptors, with the added
    benefit of being more portable.

New Types

    None

New Functions

    None

New Tokens for EGL_NV_stream_socket

    Accepted by eglCreateStreamKHR and returned by eglQueryStreamKHR
    when attribute is EGL_STREAM_PROTOCOL_NV:

        EGL_STREAM_PROTOCOL_SOCKET_NV              0x324B

    Accepted as attribute names by eglCreateStreamKHR and
    eglQueryStreamKHR functions

        EGL_SOCKET_HANDLE_NV                       0x324C
        EGL_SOCKET_TYPE_NV                         0x324D

New Tokens for EGL_NV_stream_socket_unix

    Accepted by eglCreateStreamKHR and returned by eglQueryStreamKHR
    when attribute is EGL_SOCKET_TYPE_NV:

        EGL_SOCKET_TYPE_UNIX_NV                    0x324E

New Tokens for EGL_NV_stream_socket_inet

    Accepted by eglCreateStreamKHR and returned by eglQueryStreamKHR
    when attribute is EGL_SOCKET_TYPE_NV:

        EGL_SOCKET_TYPE_INET_NV                    0x324F

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 EGL_STREAM_PROTOCOL_NV
      is EGL_STREAM_PROTOCOL_SOCKET_NV and values are not provided for
      EGL_SOCKET_HANDLE_NV and EGL_SOCKET_TYPE_NV.

Add to "Table 3.10.4.4 EGLStream Attributes" in EGL_KHR_stream:

        Attribute                   Read/Write   Type        Section
        --------------------------  ----------   ------      ----------
        EGL_SOCKET_HANDLE_NV           io        EGLint      3.10.4.y
        EGL_SOCKET_TYPE_NV             io        EGLint      3.10.4.y+1

In section "3.10.4.x+1 EGL_STREAM_PROTOCOL_NV Attribute" of
EGL_NV_stream_remote, add EGL_STREAM_PROTOCOL_SOCKET_NV to the list of
legal values and add

    A value of EGL_STREAM_PROTOCOL_SOCKET_NV indicates that the stream
    is a remote stream whose communication is established using a socket
    connection provided by the application. The details of the messages
    passed through the socket are implementation dependent, and may be
    influenced by the stream and socket types. This value for the
    EGL_STREAM_PROTOCOL_NV attribute is compatible with values of
    EGL_STREAM_CROSS_OBJECT_NV, EGL_STREAM_CROSS_DISPLAY_NV,
    EGL_STREAM_CROSS_PROCESS_NV, and EGL_STREAM_CROSS_PARTITION_NV for
    the EGL_STREAM_TYPE_NV attribute.

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

    3.10.4.y EGL_SOCKET_HANDLE_NV Attribute

    The EGL_SOCKET_HANDLE_NV attribute may be set when the stream
    is created, and provides the handle to a blocking socket which will
    be used to communicate with the other endpoint of the stream. If the
    value of EGL_STREAM_PROTOCOL_NV is not EGL_STREAM_PROTOCOL_SOCKET_NV,
    this attribute is ignored.

    The type of this value is operating system dependent, and the
    default value will be an invalid socket handle for the operating
    system. In particular, for unix-like operating systems, the value is
    a socket file descriptor as returned by socket() and related
    functions, and the default value is -1.

    Prior to creating the EGLStream object, the application may use the
    socket handle as it wishes. But once the EGLStream object has been
    successfully created, it assumes full ownership of this socket. If
    the application subsequently writes to, reads from, or closes the
    socket, undefined behavior will result. Furthermore, if any data
    sent over the socket prior to creating the EGLStream object is not
    consumed before the opposite EGLStream object is created, undefined
    behavior will result.

    When the EGLStream object is deleted, the socket handle will be
    closed by the stream.

    3.10.4.y+1 EGL_SOCKET_TYPE_NV Attribute

    The EGL_SOCKET_TYPE_NV attribute may be set when the stream is
    created, and indicates the type of the socket provided by the
    EGL_STREAM_SOCKET_HANDLE_NV attribute. If the value of
    EGL_STREAM_PROTOCOL_NV is not EGL_STREAM_PROTOCOL_SOCKET_NV this
    attribute is ignored.

    The default value is EGL_NONE.

If EGL_NV_stream_socket_unix is present, add to section "3.10.4.y+1
EGL_SOCKET_TYPE_NV Attribute" above:

    A value of EGL_SOCKET_TYPE_UNIX_NV indicates that the socket handle
    represents a Unix domain socket, created with SOCK_STREAM type.

If EGL_NV_stream_socket_inet is present, add to section "3.10.4.y+1
EGL_SOCKET_TYPE_NV Attribute" above:

    A value of EGL_SOCKET_TYPE_INET_NV indicates that the socket handle
    represents an internet protocol socket, created with SOCK_STREAM
    type.

Issues

    None

Revision History

    #6  (October 27, 2016) Daniel Kartch
        - Indicate that the socket handle provided should represent
          a blocking socket.

    #5  (June 7, 2016) Daniel Kartch
        - Add contact and clean up in preparation for publication.

    #4  (September 16, 2015) Zander Clucas
        - Indicated STREAM_SOCKET_PROTOCOL as compatible with socket
          type CROSS_PROCESS.

    #3  (December 16, 2014) Daniel Kartch
        - Refined overview to clarify comparison with
          EGL_KHR_cross_process_fd.
        - Indicated SOCK_STREAM as a requirement for the socket types.

    #2  (December 11, 2014) Daniel Kartch
        - Rewrote as NV draft for earlier release.
        - Reserved enum values.

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

