blob: 6d493076b49c770538f40f7a523194bd0fd3f4d3 [file] [log] [blame]
Name
NV_uniform_buffer_unified_memory
Name Strings
GL_NV_uniform_buffer_unified_memory
Contact
Markus Tavenrath, NVIDIA Corporation (matavenrath 'at' nvidia.com)
Contributors
Markus Tavenrath, NVIDIA
Christoph Kubisch, NVIDIA
Status
SHIPPING
Version
Last Modified Date: August 28, 2014
Revision: 1
Number
OpenGL Extension #459
Dependencies
Written based on the wording of the OpenGL 4.4 Specification, Core Profile.
This extension interacts with ARB_uniform_buffer_object.
This extension interacts with NV_vertex_buffer_unified_memory.
This extension interacts with NV_shader_buffer_load.
Overview
This extension provides a mechanism to specify uniform buffers
using GPU addresses.
Binding uniform buffers is one of the most frequent and expensive
operations in many GL applications, due to the cost of chasing
pointers and binding objects described in the overview of
NV_shader_buffer_load. The intent of this extension is to enable a
way for the application to specify uniform buffer state that alleviates
the overhead of object binds and driver memory management.
New Procedures and Functions
New Tokens
Accepted by the <cap> parameter of DisableClientState,
EnableClientState, IsEnabled:
UNIFORM_BUFFER_UNIFIED_NV 0x936E
Accepted by the <pname> parameter of BufferAddressRangeNV
and the <value> parameter of GetIntegerui64i_vNV:
UNIFORM_BUFFER_ADDRESS_NV 0x936F
Accepted by the <target> parameter of GetIntegeri_vNV:
UNIFORM_BUFFER_LENGTH_NV 0x9370
Additions to Chapter 7 of the OpenGL 4.4 (Core) Specification (Programs and Shaders)
Section 7.6.3 Uniform Buffer Object Bindings (p. 132)
Add to second paragraph:
If UNIFORM_BUFFER_UNIFIED_NV is enabled these bindings are overridden
by the bindings specified by the command
void BufferAddressRangeNV(enum pname, uint index, uint64EXT address,
sizeiptr length);
where <pname> is UNIFORM_BUFFER_ADDRESS_NV and <index> identifies
the uniform buffer binding whose address is being specified.
<address> specifies the GPU address from which arrays will be sourced,
and addresses beyond and including (<address> + <length>) will return
undefined values. If the address range of the used uniform buffer
does not belong to a buffer object that is resident at the time of
the Draw or Dispatch, undefined results, possibly
including program termination, may occur.
Additions to the AGL/EGL/GLX/WGL Specifications
None.
Errors
The error INVALID_VALUE is generated by BufferAddressRange if <length>
is negative.
The error INVALID_VALUE is generated by BufferAddressRange if <pname>
is UNIFORM_BUFFER_UNIFIED_NV and <index> is equal or greater than
MAX_UNIFORM_BUFFER_BINDINGS.
The error INVALID_VALUE is generated by BufferAddressRange if <address>
is not aligned to UNIFORM_BUFFER_OFFSET_ALIGNMENT.
New State
Add to Table 23.49 p. 574 (Uniform Buffer Binding State)
Get Value Type Get Command Initial Value Sec Attribute
--------- ---- ----------- ------------- --- ---------
UNIFORM_BUFFER_UNIFIED_NV B IsEnabled FALSE 7.6.3 none
UNIFORM_BUFFER_ADDRESS_NV MAX_UBO*Z64+ GetIntegerui64i_vNV 0 7.6.3 none
UNIFORM_BUFFER_LENGTH_NV MAX_UBO*Z+ GetIntegeri_v 0 7.6.3 none
Dependencies on ARB_uniform_buffer_object:
This extension relies on the availability of uniform buffer objects.
Dependencies on NV_vertex_buffer_unified_memory:
This extension relies on the mechanisms to provide buffer addresses
that NV_vertex_buffer_unified_memory provides, but does not
rely on other changes.
Dependencies on NV_shader_buffer_load:
This extension relies on the mechanisms to get addresses and make
buffers resident that NV_shader_buffer_load provides, but does not
rely on either the LOAD instruction or the changes to the Shading
Language.
Examples
In a bindless driven pipeline, high frequency bindings such
as vertex buffers and uniform buffers can now be achieved
efficiently.
// initialization of UBOs
GenBuffers(3, ubos);
GLuint64 uboAddrs[3];
for (i = 0; i < 3; ++i) {
BindBuffer(UNIFORM_BUFFER, ubos[i]);
BufferStorage(UNIFORM_BUFFER, uboSizes[i], uboData[i], DYNAMIC_STORAGE_BIT);
}
// example rendering loop
// vertex format / attrib binding setup, data transfers...
// enable buffer unified memory usage,
// which globally overrides all bindings via BufferAddressRange
// for this extension
EnableClientState(UNIFORM_BUFFER_UNIFIED_NV);
// for NV_vertex_buffer_unified_memory
EnableClientState(GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV);
// unextended:
// BindBufferRange(UNIFORM_BUFFER, 0, ubos[0], 0, sizeof(View));
BufferAddressRangeNV(UNIFORM_BUFFER_ADDRESS_NV, 0, uboAddrs[0], sizeof(View));
for (object in scene) {
if (object.vbo != lastvbo){
// unextended:
// BindVertexBuffer(0, object.vbo, 0, sizeof(Vertex));
// from NV_vertex_buffer_unified_memory
BufferAddressRangeNV(VERTEX_ATTRIB_ARRAY_ADDRESS_NV, 0, object.vboAddr, object.numVertices * sizeof(Vertex));
}
if (object.material != lastmaterial){
// unextended: BindBufferRange(UNIFORM_BUFFER, 1, ubos[1], sizeof(Material) * object.material, sizeof(Material));
BufferAddressRangeNV(UNIFORM_BUFFER_ADDRESS_NV, 1, uboAddrs[1] + sizeof(Material) * object.material, sizeof(Material));
}
if (object.node != lastnode){
// unextended: BindBufferRange(UNIFORM_BUFFER, 2, ubos[2], sizeof(Node) * object.node, sizeof(Node));
BufferAddressRangeNV(UNIFORM_BUFFER_ADDRESS_NV, 2, uboAddrs[2] + sizeof(Node) * object.node, sizeof(Node));
}
MultiDrawArrays(..)
}
Issues
Revision History
Rev. Date Author Changes
---- -------- -------- -----------------------------------------
1 ckubisch Internal revisions.