Name

    ANGLE_stream_producer_d3d_texture_nv12

Name Strings

    EGL_ANGLE_stream_producer_d3d_texture_nv12

Contributors

    Ian Ewell
    Geoff Lang
    John Bauman

Contacts

    Geoff Lang, Google (geofflang ‘at’ google.com)

Status

    Draft

Version

    Version 1, April 6, 2016

Number

    EGL Extension #XXX

Dependencies

    Requires EGL 1.5.
    Requires OpenGL ES 2.0.

    Requires the EGL_KHR_stream extension.
    Requires the EGL_NV_stream_consumer_gltexture_yuv extension.
    Requires the EGL_ANGLE_device_d3d extension.

Overview

    This extension allows D3D11 NV12 textures to be inserted into an EGL stream
    with the expectation that the stream consumer will be a YUV GL texture
    consumer using a two plane configuration (i.e. a Y plane and a UV plane).
    This will act as the producer of the stream.

New procedures and functions

    EGLBoolean eglCreateStreamProducerD3DTextureNV12ANGLE
                                                  (EGLDisplay dpy,
                                                   EGLStreamKHR stream,
                                                   const EGLAttrib *attrib_list)
    EGLBoolean eglStreamPostD3DTextureNV12ANGLE(EGLDisplay dpy,
                                                EGLStreamKHR stream,
                                                void *texture,
                                                const EGLAttrib *attrib_list)

New Tokens

    Accepted as an <attribute> in eglStreamPostD3DTextureNV12ANGLE:

        EGL_D3D_TEXTURE_SUBRESOURCE_ID_ANGLE 0x33AB

Replace section "3.10.3.1 No way to connect producer to EGLStream" in the
EGL_KHR_stream extension with this:

    3.10.3.1 Stream Surface Producer

    Call

        EGLBoolean eglCreateStreamProducerD3DTextureNV12ANGLE(
                    EGLDisplay dpy,
                    EGLStreamKHR stream,
                    const EGLAttrib *attrib_list)

    to create a producer that accepts D3D11 NV12 textures and connect it as the
    producer of <stream>. <attrib_list> is used to specify attributes for the
    stream producer. Currently there are no attributes to specify, and the
    attribute list is used as a placeholder for future additions.

    On failure, eglCreateStreamProducerD3DTextureNV12ANGLE returns EGL_FALSE and
    generates an error.

        - EGL_BAD_STATE_KHR is generated if <stream> is not in the state
          EGL_STREAM_STATE_CONNECTING_KHR.

        - EGL_BAD_MATCH is generated if <stream> does not have a connected GL
          texture YUV consumer that is configured to bind to two OpenGL
          textures: one for the Y plane and one for the UV plane.

        - EGL_BAD_STREAM_KHR is generated if <stream> is not a valid EGLStream
          generated for <dpy>.

        - EGL_BAD_DISPLAY is generated if <dpy> is not a valid, initialized
          display.

Add a section preceding "3.9.3 Posting Semantics" in the EGL specification:

    3.9.x Posting to a Stream

    To post a D3D11 NV12 texture to a stream, call

        EGLBoolean eglStreamPostD3DTextureNV12ANGLE(
                    EGLDisplay dpy,
                    EGLStreamKHR stream,
                    void *texture,
                    const EGLAttrib *attrib_list);

    If <stream> is an appropriately configured stream and <texture> points to a
    valid ID3D11Texture2D object of the format DXGI_FORMAT_NV12 that is owned
    by the same ID3D11Device that is queried with the EGL_ANGLE_device_d3d
    extension, the texture will be posted to the stream and can be bound as one
    or more OpenGL texture objects.

    The parameter <attrib_list> allows for per-frame attributes to be specified
    along with the texture. The only parameter currently available is
    EGL_D3D_TEXTURE_SUBRESOURCE_ID_ANGLE, which allows the subresource id of
    the texture that will be used to be specified. If this attribute is not
    explicitly specified, it will default to the value of 0.

    It is the responsibility of the application to perform any synchronization
    between the insertion of the frame into the stream and the use of the
    consumer textures output by the stream. The EGL_CONSUMER_LATENCY_USEC_KHR
    attribute will have no effect on the function of the implementation of this
    extension, but can still be used for communication between components of
    the application.

    The implementation will hold a reference to the D3D11 texture object if the
    insertion is successful and will release the texture object when a new frame
    is inserted or when the stream is destroyed.

    On failure, eglStreamInsertD3DTextureNV12 returns EGL_FALSE and generates an
    error.

        - EGL_BAD_STATE is generated if <stream> is not in the state
          EGL_STREAM_STATE_EMPTY_KHR, EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR,
          or EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR.

        - EGL_BAD_MATCH is generated if the stream is not associated with a
          D3D11 NV12 texture producer.

        - EGL_BAD_PARAMETER is generated if <texture> is not owned by the
          queried device, is not in the format DXGI_FORMAT_NV12, is not
          compatible with the implementation, or if the specified value for
          EGL_D3D_TEXTURE_SUBRESOURCE_ID_ANGLE is not a valid subresource id for
          the texture.

        - EGL_BAD_STREAM_KHR is generated if <stream> is not a valid EGLStream.

        - EGL_BAD_ATTRIBUTE is generated if an attribute other than
          EGL_D3D_TEXTURE_SUBRESOURCE_ID_ANGLE is specified in <attrib_list>.

Revision History

    #1 (April 6, 2016) Ian Ewell
        - initial draft