Name

    ANGLE_vulkane_image

Name Strings

    GL_ANGLE_vulkane_image

Contributors

    Peng Huang, Google

Contact

    Peng Huang, Google (penghuang 'at' chromium.com)

Status

    Draft

Version

    Last Modified Date: Nov 19, 2021
    Revision: 1

Number

    TBD

Dependencies

    Written against the OpenGL 4.5 and OpenGL ES 3.2 specifications

    GL_ANGLE_vulkane_image requires GL_EXT_external_objects

Overview

    Building upon the OpenGL memory object and semaphore framework
    defined in EXT_external_objects, this extension enables an OpenGL
    application to share textures with an external API.

New Procedures and Functions

    If the GL_ANGLE_vulkane_image string is reported, the following commands
    are added:

    void AcquireTexturesANGLE(uint numTextures,
                              const uint *textures,
                              const GLenum *layouts);

    void ReleaseTexturesANGLE(uint numTextures,
                              const uint *textures,
                              GLenum *layouts);

New Tokens

    None

Additions to Chapter 4 of the OpenGL 4.5 Specification (Event Model)

    The command
        void AcquireTexturesANGLE(uint numTextures,
                                  const uint *textures,
                                  const GLenum *layouts);
    will acquire ownership of textures. Since the texture layout state is
    managed internally by the GL, but may have been modified by an external API,
    the current layout of the textures must be specified to initialize internal
    GL state prior to correspond to those specified by the Vulkan API as
    described in table 4.4. However, the layouts do not necessarily correspond
    to an optimal state for any particular GL operation. The GL will simply
    perform appropriate transitions internally as necessary based on the
    specified current layout of the texture.

    The command
        void ReleaseTexturesANGLE(uint numTextures,
                                  const uint *textures,
                                  GLenum *layouts);
    will release ownership of textures. The current texture layouts will be
    returned, so an external API can perform appropriate transitions as
    necessary based on the returned current layout of the textures.

Revision History

    Revision 1, 2021-11-19 (Peng Huang)
        - Initial draft based closely on EXT_external_objects_fd.
