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 parameter to BufferStorage SPARSE_STORAGE_BIT_ARB 0x0400 Accepted by the 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 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 parameter is discarded, although the GL may still acces the client's address space within the specified region. If 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 and 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. is set to one of the targets listed in table 6.1. and indicate the range of the data store's virtual allocation to commit. must be an integer multiple of the implementation dependent constant SPARSE_BUFFER_PAGE_SIZE_ARB, and must either be a multiple of SPARSE_BUFFER_PAGE_SIZE_ARB, or extend to the end of the buffer's data store. If is TRUE, then pages contained in the specified range become committed and become physically backed. If 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 . 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 is not one of the accepted buffer targets. INVALID_VALUE is generated by BufferStorage if contains SPARSE_STORAGE_BIT_ARB and 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 is FALSE. INVALID_VALUE is generated by BufferPageCommitmentARB if is not an integer multiple of SPARSE_BUFFER_PAGE_SIZE_ARB, or if 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 or is negative, or if + is greater than the value of BUFFER_SIZE for the buffer bound to . 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 in BufferPageCommitmentARB to go to the end of the buffer. 1 1/1/2014 gsellers Initial revision