Edit

kc3-lang/angle/extensions/EGL_ANGLE_d3d_texture_client_buffer.txt

Branch :

  • Show log

    Commit

  • Author : Sunny Sachanandani
    Date : 2019-08-28 14:35:32
    Hash : c1af9abf
    Message : Add support for overriding internal format for D3D11 texture EGLImages Add an optional EGL_D3D11_TEXTURE_FORMAT_ANGLE attribute that is the GL internal format to use for EGLImage being created. This will be used for RGB emulation of swap chain texture backed WebGL contexts in Chrome when they have alpha:false set. Without RGB emulation it is possible to observe side-effects of the underlying swap chain being RGBA such as reading/writing the alpha channel, BlitFramebuffer working/not working when expected, etc. Also document creating EGLImages from D3D11 textures in the existing EGL_ANGLE_d3d_texture_client_buffer extension along with RGB emulation. Bug: chromium:699566, chromium:939657 Change-Id: I4931cb7bdc46e9bc6debd56b79ecc10ea27bd78b Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1777099 Reviewed-by: Geoff Lang <geofflang@chromium.org> Commit-Queue: Sunny Sachanandani <sunnyps@chromium.org>

  • extensions/EGL_ANGLE_d3d_texture_client_buffer.txt
  • Name
    
        ANGLE_d3d_texture_client_buffer
    
    Name Strings
    
        EGL_ANGLE_d3d_texture_client_buffer
    
    Contributors
    
        Geoff Lang
        Olli Etuaho
        Sunny Sachanandani
    
    Contacts
    
        Geoff Lang, Google Inc. (geofflang 'at' google.com)
    
    Status
    
        Draft
    
    Version
    
        Version 5, Sep 6, 2019
    
    Number
    
        EGL Extension #??
    
    Dependencies
    
        This extension is written against the wording of the EGL 1.2
        Specification.
    
        References the EGL_ANGLE_device_d3d and EGL_KHR_image_base extensions.
    
    Overview
    
        This extension allows creating EGL surfaces and EGL images from D3D texture
        objects.
    
    New Types
    
        None
    
    New Procedures and Functions
    
        None
    
    New Tokens
    
        Accepted by the <target> parameter of eglCreateImageKHR and <buftype>
        parameter of eglCreatePbufferFromClientBuffer:
    
            EGL_D3D_TEXTURE_ANGLE            0x33A3
    
    Additions to Chapter 2 of the EGL 1.2 Specification (EGL Operation)
    
        Add to section 2.5.1 "EGLImage Specification" (as defined by the
        EGL_KHR_image_base specification), in the description of
        eglCreateImageKHR:
    
       "Values accepted for <target> are listed in Table aaa, below.
    
          +----------------------------+-----------------------------------------+
          |  <target>                  |  Notes                                  |
          +----------------------------+-----------------------------------------+
          |  EGL_D3D_TEXTURE_ANGLE     |  Used for Direct3D11 texture objects    |
          +----------------------------+-----------------------------------------+
           Table aaa.  Legal values for eglCreateImageKHR <target> parameter
    
        ...
    
        If <target> is EGL_D3D_TEXTURE_ANGLE, <dpy> must be a valid display, <ctx>
        must be EGL_NO_CONTEXT, <buffer> must be a pointer to a valid D3D11 texture
        object (cast into the type EGLClientBuffer), and attributes other than
        EGL_TEXTURE_INTERNAL_FORMAT_ANGLE are ignored. The width and height of
        the pbuffer are determined by the width and height of <buffer>."
    
        If EGL_TEXTURE_INTERNAL_FORMAT_ANGLE is specified, it is used to interpret
        <buffer> according to the provided internal format. See table
        egl.restrictions for acceptable texture object types and formats.
    
        If the EGL_ANGLE_device_d3d extension is present, the provided D3D11 texture
        object must have been created by the same D3D11 device queried from the
        display. If these requirements are not met, an EGL_BAD_PARAMETER error is
        generated."
    
    Additions to Chapter 3 of the EGL 1.2 Specification (EGL Functions and Errors)
    
        Replace the last sentence of paragraph 1 of Section 3.5.3 with the
        following text.
        "Currently, the only client API resources which may be bound in this
        fashion are OpenVG VGImage objects and Direct3D texture objects."
    
        Replace the last sentence of paragraph 2 ("To bind a client API...") of
        Section 3.5.3 with the following text.
        "When <buftype> is EGL_OPENVG_IMAGE or EGL_D3D_TEXTURE_ANGLE, the width and
        height of the pbuffer are determined by the width and height of <buffer>."
    
        Replace the third paragraph of Section 3.5.3 with the following text.
        "<buftype> specifies the type of buffer to be bound. The only allowed values
        of <buftype> are EGL_OPENVG_IMAGE and EGL_D3D_TEXTURE_ANGLE".
    
        Append the following text to the fourth paragraph of Section 3.5.3.
        "When <buftype> is EGL_D3D_TEXTURE_ANGLE, <buffer> must be
        a valid D3D texture object, cast into the type EGLClientBuffer. See table
        egl.restrictions for acceptable texture object types and formats. If the
        EGL_ANGLE_device_d3d extension is present, the provided D3D texture object
        must have been created by the same D3D device queried from the display.
        If these requirements are not met, an EGL_BAD_PARAMETER error is
        generated."
    
        ---------------------------------------------------------------------------
        Resource Type      Resource Restrictions
        ---------------------------------------------------------------------------
        IDirect3DTexture9  Memory pool must be D3DPOOL_DEFAULT.
    
                           Format must be D3DFMT_R8G8B8, D3DFMT_A8R8G8B8,
                           D3DFMT_A16B16G16R16F or D3DFMT_A32B32G32R32F.
    
                           EGL_TEXTURE_INTERNAL_FORMAT_ANGLE is not supported.
    
        ID3D11Texture2D    Usage flags must be D3D11_USAGE_DEFAULT.
    
                           Format must be
                           DXGI_FORMAT_R8G8B8A8_UNORM,
                           DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
                           DXGI_FORMAT_B8G8R8A8_UNORM,
                           DXGI_FORMAT_B8G8R8A8_UNORM_SRGB (support is optional),
                           DXGI_FORMAT_R8G8B8A8_TYPELESS (support is optional),
                           DXGI_FORMAT_B8G8R8A8_TYPELESS (support is optional),
                           DXGI_FORMAT_R16G16B16A16_FLOAT,
                           DXGI_FORMAT_R32G32B32A32_FLOAT, or
                           DXGI_FORMAT_R10G10B10A2_UNORM.
    
                           EGL_TEXTURE_INTERNAL_FORMAT_ANGLE (if supported) must be
                           GL_RGBA (supported for all formats),
                           GL_RGB (supported except for DXGI_FORMAT_R10G10B10A2_UNORM), or
                           GL_BGRA_EXT (supported only for
                                        DXGI_FORMAT_B8G8R8A8_UNORM,
                                        DXGI_FORMAT_B8G8R8A8_UNORM_SRGB, or
                                        DXGI_FORMAT_B8G8R8A8_TYPELESS).
    
        --------------------------------------------------------------------------
        Table egl.restrictions - Restrictions on D3D resources that can be used
        as a <buffer>.
        --------------------------------------------------------------------------
    
        Append to the fifth paragraph of Section 3.5.3.
        "In addition, in case buftype is EGL_D3D_TEXTURE_ANGLE and the D3D resource
        has a typeless DXGI format, attrib_list may contain the attribute
        EGL_GL_COLORSPACE."
    
        Append to the end of Section 3.5.3.
        "When a pbuffer is created with type EGL_D3D_TEXTURE_ANGLE, the contents
        of the associcated D3D texture object are undefined while the pbuffer is
        the current read surface, draw surface or bound to a client texture."
    
        Append to the end of Section 3.5.3.
        "When a pbuffer is created with type EGL_D3D_TEXTURE_ANGLE, and the
        EGL_GL_COLORSPACE attribute is not specified in attrib_list, the
        EGL_GL_COLORSPACE attribute of the surface is determined by the DXGI format
        of the Direct3D texture. For *_SRGB DXGI formats, the value of
        EGL_GL_COLORSPACE is EGL_GL_COLORSPACE_SRGB. For other formats including
        *_TYPELESS DXGI formats, the value of EGL_GL_COLORSPACE defaults to
        EGL_GL_COLORSPACE_LINEAR."
    
    Issues
    
        1. What renderers allow the use of a multi-sampled texture?
    
        PROPOSED: Mutli-sampled texture support is currently limited to D3D11.
        Additionally, the client is responsible for resolving the texture.
    
        2. How does this extension interact with EXT_sRGB_write_control?
    
        If GL_FRAMEBUFFER_SRGB_EXT is disabled and a pbuffer created from a D3D
        texture with an *_SRGB format is being rendered to, it is undefined whether
        SRGB conversion will be performed.
    
        3. What renderers allow the use of typeless textures?
    
        PROPOSED: Support for typeless textures is currently limited to D3D11.
    
        4. Can RGB formats be supported?
    
        RESOLVED: RGB internal formats are supported for creating images from D3D11
        textures in version 5 by setting EGL_TEXTURE_INTERNAL_FORMAT_ANGLE attribute
        to GL_RGB. Images with an RGB format will ensure that the alpha channel of
        the texture is reset to 1.0 when it is used.
    
    Revision History
    
        Version 5, 2019/09/06 - added support for creating EGLImage.
    
        Version 4, 2019/04/15 - added support for DXGI_FORMAT_R10G10B10A2_UNORM.
    
        Version 3, 2018/01/23 - added support for typeless textures.
    
        Version 2, 2018/01/15 - clarified SRGB conversion handling.
    
        Version 1, 2016/10/05 - first draft.