1Name 2 3 NV_uniform_buffer_unified_memory 4 5Name Strings 6 7 GL_NV_uniform_buffer_unified_memory 8 9Contact 10 11 Markus Tavenrath, NVIDIA Corporation (matavenrath 'at' nvidia.com) 12 13Contributors 14 15 Markus Tavenrath, NVIDIA 16 Christoph Kubisch, NVIDIA 17 18Status 19 20 SHIPPING 21 22Version 23 24 Last Modified Date: August 28, 2014 25 Revision: 1 26 27Number 28 29 OpenGL Extension #459 30 31Dependencies 32 33 Written based on the wording of the OpenGL 4.4 Specification, Core Profile. 34 35 This extension interacts with ARB_uniform_buffer_object. 36 37 This extension interacts with NV_vertex_buffer_unified_memory. 38 39 This extension interacts with NV_shader_buffer_load. 40 41Overview 42 43 This extension provides a mechanism to specify uniform buffers 44 using GPU addresses. 45 46 Binding uniform buffers is one of the most frequent and expensive 47 operations in many GL applications, due to the cost of chasing 48 pointers and binding objects described in the overview of 49 NV_shader_buffer_load. The intent of this extension is to enable a 50 way for the application to specify uniform buffer state that alleviates 51 the overhead of object binds and driver memory management. 52 53New Procedures and Functions 54 55New Tokens 56 57 Accepted by the <cap> parameter of DisableClientState, 58 EnableClientState, IsEnabled: 59 60 UNIFORM_BUFFER_UNIFIED_NV 0x936E 61 62 Accepted by the <pname> parameter of BufferAddressRangeNV 63 and the <value> parameter of GetIntegerui64i_vNV: 64 65 UNIFORM_BUFFER_ADDRESS_NV 0x936F 66 67 Accepted by the <target> parameter of GetIntegeri_vNV: 68 69 UNIFORM_BUFFER_LENGTH_NV 0x9370 70 71 72Additions to Chapter 7 of the OpenGL 4.4 (Core) Specification (Programs and Shaders) 73 74 Section 7.6.3 Uniform Buffer Object Bindings (p. 132) 75 76 Add to second paragraph: 77 78 If UNIFORM_BUFFER_UNIFIED_NV is enabled these bindings are overridden 79 by the bindings specified by the command 80 81 void BufferAddressRangeNV(enum pname, uint index, uint64EXT address, 82 sizeiptr length); 83 84 where <pname> is UNIFORM_BUFFER_ADDRESS_NV and <index> identifies 85 the uniform buffer binding whose address is being specified. 86 87 <address> specifies the GPU address from which arrays will be sourced, 88 and addresses beyond and including (<address> + <length>) will return 89 undefined values. If the address range of the used uniform buffer 90 does not belong to a buffer object that is resident at the time of 91 the Draw or Dispatch, undefined results, possibly 92 including program termination, may occur. 93 94 95Additions to the AGL/EGL/GLX/WGL Specifications 96 97 None. 98 99Errors 100 101 The error INVALID_VALUE is generated by BufferAddressRange if <length> 102 is negative. 103 104 The error INVALID_VALUE is generated by BufferAddressRange if <pname> 105 is UNIFORM_BUFFER_UNIFIED_NV and <index> is equal or greater than 106 MAX_UNIFORM_BUFFER_BINDINGS. 107 108 The error INVALID_VALUE is generated by BufferAddressRange if <address> 109 is not aligned to UNIFORM_BUFFER_OFFSET_ALIGNMENT. 110 111 New State 112 113 Add to Table 23.49 p. 574 (Uniform Buffer Binding State) 114 115 Get Value Type Get Command Initial Value Sec Attribute 116 --------- ---- ----------- ------------- --- --------- 117 UNIFORM_BUFFER_UNIFIED_NV B IsEnabled FALSE 7.6.3 none 118 UNIFORM_BUFFER_ADDRESS_NV MAX_UBO*Z64+ GetIntegerui64i_vNV 0 7.6.3 none 119 UNIFORM_BUFFER_LENGTH_NV MAX_UBO*Z+ GetIntegeri_v 0 7.6.3 none 120 121Dependencies on ARB_uniform_buffer_object: 122 123 This extension relies on the availability of uniform buffer objects. 124 125Dependencies on NV_vertex_buffer_unified_memory: 126 127 This extension relies on the mechanisms to provide buffer addresses 128 that NV_vertex_buffer_unified_memory provides, but does not 129 rely on other changes. 130 131Dependencies on NV_shader_buffer_load: 132 133 This extension relies on the mechanisms to get addresses and make 134 buffers resident that NV_shader_buffer_load provides, but does not 135 rely on either the LOAD instruction or the changes to the Shading 136 Language. 137 138Examples 139 140 In a bindless driven pipeline, high frequency bindings such 141 as vertex buffers and uniform buffers can now be achieved 142 efficiently. 143 144 // initialization of UBOs 145 146 GenBuffers(3, ubos); 147 GLuint64 uboAddrs[3]; 148 149 for (i = 0; i < 3; ++i) { 150 BindBuffer(UNIFORM_BUFFER, ubos[i]); 151 BufferStorage(UNIFORM_BUFFER, uboSizes[i], uboData[i], DYNAMIC_STORAGE_BIT); 152 } 153 154 // example rendering loop 155 // vertex format / attrib binding setup, data transfers... 156 157 158 // enable buffer unified memory usage, 159 // which globally overrides all bindings via BufferAddressRange 160 161 // for this extension 162 EnableClientState(UNIFORM_BUFFER_UNIFIED_NV); 163 // for NV_vertex_buffer_unified_memory 164 EnableClientState(GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV); 165 166 // unextended: 167 // BindBufferRange(UNIFORM_BUFFER, 0, ubos[0], 0, sizeof(View)); 168 169 BufferAddressRangeNV(UNIFORM_BUFFER_ADDRESS_NV, 0, uboAddrs[0], sizeof(View)); 170 171 for (object in scene) { 172 173 if (object.vbo != lastvbo){ 174 // unextended: 175 // BindVertexBuffer(0, object.vbo, 0, sizeof(Vertex)); 176 177 // from NV_vertex_buffer_unified_memory 178 BufferAddressRangeNV(VERTEX_ATTRIB_ARRAY_ADDRESS_NV, 0, object.vboAddr, object.numVertices * sizeof(Vertex)); 179 } 180 181 if (object.material != lastmaterial){ 182 // unextended: BindBufferRange(UNIFORM_BUFFER, 1, ubos[1], sizeof(Material) * object.material, sizeof(Material)); 183 184 BufferAddressRangeNV(UNIFORM_BUFFER_ADDRESS_NV, 1, uboAddrs[1] + sizeof(Material) * object.material, sizeof(Material)); 185 } 186 187 if (object.node != lastnode){ 188 // unextended: BindBufferRange(UNIFORM_BUFFER, 2, ubos[2], sizeof(Node) * object.node, sizeof(Node)); 189 190 BufferAddressRangeNV(UNIFORM_BUFFER_ADDRESS_NV, 2, uboAddrs[2] + sizeof(Node) * object.node, sizeof(Node)); 191 } 192 193 MultiDrawArrays(..) 194 } 195 196 197Issues 198 199 200Revision History 201 202 Rev. Date Author Changes 203 ---- -------- -------- ----------------------------------------- 204 1 ckubisch Internal revisions. 205 206