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.

    When ANGLE uses VK_KHR_unified_image_layouts, the Vulkan stage and access
    masks for each texture continue to be derived from the layouts parameter
    and used for synchronization purposes, but the actual Vulkan layout of the
    images must be VK_IMAGE_LAYOUT_GENERAL.

    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.
