Name

    ARB_sparse_buffer

Name Strings

    GL_ARB_sparse_buffer

Contact

    Graham Sellers (graham.sellers 'at' amd.com)

Contributors

    Graham Sellers, AMD
    Christophe Riccio, Unity

Notice

    Copyright (c) 2014 The Khronos Group Inc. Copyright terms at
        http://www.khronos.org/registry/speccopyright.html

Specification Update Policy

    Khronos-approved extension specifications are updated in response to
    issues and bugs prioritized by the Khronos OpenGL Working Group. For
    extensions which have been promoted to a core Specification, fixes will
    first appear in the latest version of that core Specification, and will
    eventually be backported to the extension document. This policy is
    described in more detail at
        https://www.khronos.org/registry/OpenGL/docs/update_policy.php

Status

    Complete.
    Approved by the ARB on June 26, 2014.
    Ratified by the Khronos Board of Promoters on August 7, 2014.

Version

    Last Modified Date:         5/31/2016
    Author Revision:            4

Number

    ARB Extension #172

Dependencies

    OpenGL 4.4 is required.

    This extension interacts with EXT_direct_state_access.

    This extension interacts with ARB_direct_state_access.

    This extension is written against the OpenGL 4.4 (core) specification.

Overview

    The ARB_sparse_texture extension adds to GL a mechanism to decouple the
    virtual and physical storage requirements of textures and allows an
    application to create partially populated textures that would
    over-subscribe available graphics memory if made fully resident. This
    extension provides like functionality for buffer objects, allowing
    applications to manage buffer object storage in a similar manner.

New Procedures and Functions

        void BufferPageCommitmentARB(enum target,
                                     intptr offset,
                                     sizeiptr size,
                                     boolean commit);

New Tokens

    Accepted as part of the the <flags> parameter to BufferStorage

        SPARSE_STORAGE_BIT_ARB                                  0x0400

    Accepted by the <pname> parameter of GetBooleanv, GetDoublev, GetFloatv,
    GetIntegerv, and GetInteger64v:

        SPARSE_BUFFER_PAGE_SIZE_ARB                             0x82F8

Additions to Chapter 6 of the OpenGL 4.4 (core) Specification (Buffer Objects)

    In Section 6.2, "Creating and Modifying Buffer Object Data Stores", add
    the following to the list of flags accepted by the <flags> parameter
    to BufferStorage:

        SPARSE_STORAGE_BIT_ARB The data store of the buffer object is sparse,
        consisting only of a virtual allocation. Physical storage for buffer
        contents may be later allocated and assigned using
        BufferPageCommitmentARB. Initially, the entire data store is
        uncommitted. As a side effect, the data specified in the <data>
        parameter is discarded, although the GL may still acces the client's
        address space within the specified region.

        If <flags> contains SPARSE_STORAGE_BIT_ARB, then it may not also
        contain any combination of MAP_READ_BIT or MAP_WRITE_BIT.

    Add the following to the end of the description of BufferSubData.

        If the target of the operation is sparse and the range specified by
    <offset> and <size> includes uncommited regions, data destined for those
    regions is silently discarded.

    Add the following introduction and description of BufferPageCommitmentARB:

        The command

        void BufferPageCommitmentARB(enum target,
                                     intptr offset,
                                     sizeiptr size,
                                     boolean commit);

    may be used to commit and de-commit regions of sparse buffer storage.
    <target> is set to one of the targets listed in table 6.1. <offset> and
    <size> indicate the range of the data store's virtual allocation to commit.
    <offset> must be an integer multiple of the implementation dependent
    constant SPARSE_BUFFER_PAGE_SIZE_ARB, and <size> must either be a multiple
    of SPARSE_BUFFER_PAGE_SIZE_ARB, or extend to the end of the buffer's
    data store. If <commit> is TRUE, then pages contained in the specified
    range become committed and become physically backed. If <commit> is
    FALSE, then physical storage associated with the data store in the
    specified region may be freed and those pages become uncommitted. Newly
    committed pages have undefined content. However, redundantly committing
    pages does not alter their content.

        Additionally, the commands

        void NamedBufferPageCommitmentEXT(uint buffer,
                                          intptr offset,
                                          sizeiptr size,
                                          boolean commit);

        void NamedBufferPageCommitmentARB(uint buffer,
                                          intptr offset,
                                          sizeiptr size,
                                          boolean commit);

    behaves similarly to BufferPageCommitmentARB except that the target of
    the operation is the buffer whose name is specified by <buffer>.

    Add subsection 6.4.1 "Effects of Accessing Uncommitted Regions of Sparse
    Buffers"

        When a buffer object's SPARSE_STORAGE_BIT_ARB is TRUE, it may be
    fully or partially uncommitted. Unless otherwise noted, reads from
    uncommitted regions of a sparse buffer, whether through fixed-function
    logic or shader access return undefined values, but otherwise do not
    negatively affect GL operation. Further, unless otherwise noted, attempts
    to write to such regions are silently ignored. Exceptions to this behavior
    are noted in the relevant sections of this specification.

Additions to the AGL/GLX/WGL Specifications

    None.

GLX Protocol

    TBD.

Errors

    INVALID_ENUM is generated by BufferPageCommitmentARB if <target> is not one
    of the accepted buffer targets.

    INVALID_VALUE is generated by BufferStorage if <flags> contains
    SPARSE_STORAGE_BIT_ARB and <flags> also contains any combination of
    MAP_READ_BIT or MAP_WRITE_BIT.

    INVALID_OPERATION is generated by BufferPageCommitmentARB if the
    SPARSE_STORAGE_BIT_ARB of the buffer bound to <target> is FALSE.

    INVALID_VALUE is generated by BufferPageCommitmentARB if <offset> is not
    an integer multiple of SPARSE_BUFFER_PAGE_SIZE_ARB, or if <size> is not
    an integer multiple of SPARSE_BUFFER_PAGE_SIZE_ARB and does not extend
    to the end of the buffer's data store.

    INVALID_VALUE is generated by BufferPageCommitmentARB if either of
    <offset> or <size> is negative, or if <offset> + <size> is greater than the
    value of BUFFER_SIZE for the buffer bound to <target>.

New State

    None.

New Implementation Dependent State

    Append to Table 23.55, Implementation Dependent Values

    +-----------------------------------+-------+----------------+----------------+-----------------------------------------+------+
    | Get Value                         | Type  | Get Command    | Minimum Value  | Description                             | Sec. |
    +-----------------------------------+-------+----------------+----------------+-----------------------------------------+------+
    | SPARSE_BUFFER_PAGE_SIZE_ARB       | Z+    | GetIntegerv    | 65536 **       | Page size of sparse buffers in bytes.   | 6.2  |
    +-----------------------------------+-------+----------------+----------------+-----------------------------------------+------+

    ** The value of SPARSE_BUFFER_PAGE_SIZE_ARB is the largest allowed value.
    Smaller values are permitted and it is recommended to implementors that it
    be a power of two.

Usage Examples

    TBD

Dependencies on GL_EXT_direct_state_access

    If GL_EXT_direct_state_access is not supported, remove references to
    NamedBufferPageCommitmentEXT.


Dependencies on GL_ARB_direct_state_access

    If GL_ARB_direct_state_access is not supported, remove references to
    NamedBufferPageCommitmentARB.


Issues

    1) What is the effect of reading from or writing to an uncommitted region
       of a buffer's data store.

       RESOLVED: This is defined (or undefined) on a case-by case basis. If it
       is not defined in this specification, then reads return undefined data,
       but never interrupt the GL, and writes are silently ignored. Atomics
       with return constitute a read-modify-write cycle, where the read
       produces undefined results and the write is discarded.

    2) Should mapping a sparse buffer be allowed? What is the defined content
       as seen for the client for unmapped parts of the buffer?

       RESOLVED: No, it's not possible to map a sparse buffer at all. Such
       functionality could always be added by a future extension. In this
       extension, we disallow creation of a mappable sparse buffer, which in
       turns will cause MapBuffer{Range} to fail if a mapping attempt is
       made.

Revision History

    Rev.    Date      Author    Changes
    ----  --------    --------  ---------------------------------------------
      4   5/31/2016   Jon Leech Change dependency from GL 1.5 + ARB_vbo to
                                GL 4.4 (Bug 14117).
      3   5/16/2014   criccio   Added interactions with
                                GL_ARB_direct_state_access
      2   4/17/2014   gsellers  Make it illegal to create a mappable sparse
                                buffer. Add DSA entry point. Change name of
                                SPARSE_BUFFER_PAGE_SIZE_ARB. Allow <size> in
                                BufferPageCommitmentARB to go to the end of
                                the buffer.
      1   1/1/2014    gsellers  Initial revision
