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