| 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 |