Name

    CHROMIUM_discardable_texture

Name Strings

    GL_CHROMIUM_discardable_texture

Version

    Last Modified Date: April 11, 2017

Dependencies

    OpenGL ES 2.0 is required.

Overview

    This extension defines a way to mark textures as "unlocked" or "not
    currently in use", giving GL the opportunity to delete these textures as
    needed (potentially in cases of memory pressure). Clients may try to
    re-lock such a texture, and if successful may continue to use the texture
    as normal.

    This allows a client to opportunistically cache data for future use,
    without worrying about exact memory limits.

New Procedures and Functions

    void glInitializeDiscardableTextureCHROMIUM (GLuint texture_id);

    Notifies GL that a texture may be unlocked in the future. Must be called
    once on a texture, before any uses of glUnlockTextureCHROMIUM. Will set
    GL_INVALID_VALUE if called with a texture ID that does not exist, or if
    called with a texture ID that has already been initialized.

    void glUnlockTextureCHROMIUM (GLuint texture_id);

    Notifies GL that a texture is no longer in use. Once a client calls
    glUnlockTextureCHROMIUM, they may not use the indicated texture in any
    future GL calls. This includes using the texture indirectly, via objects
    (FBOs, etc...) that the texture is bound to. Using a texture once it has
    been unlocked will behave as though the texture is deleted. Will
    set GL_INVALID_VALUE if called with a texture ID that has not been
    initialized via glInitializeDiscardableTextureCHROMIUM.

    bool glLockTextureCHROMIUM (GLuint texture_id);

    Requests that GL re-lock the indicated texture, allowing it to be used in
    future operations. If this function returns true, the client may continue
    to use the indicated texture. The client should assume that unlocking a
    texture clears all bindings (FBOs, etc...), so the client must re-bind the
    texture as necessary. If this function returns false, the client may not
    use  texture again, and should behave as if the texture was deleted via
    glDeleteTextures. Will set GL_INVALID_VALUE if called with a texture ID
    that has not been initialized via glInitializeDiscardableTextureCHROMIUM.

New Tokens

    None.

Errors

    None.

New State

    None.

Revision History

    3/11/2017  Documented the extension
