| Name |
| |
| ARB_vertex_array_object |
| |
| Name Strings |
| |
| GL_ARB_vertex_array_object |
| |
| Contact |
| |
| Ian Romanick, IBM Corporation (idr 'at' us.ibm.com) |
| |
| Notice |
| |
| Copyright (c) 2008-2013 The Khronos Group Inc. Copyright terms at |
| http://www.khronos.org/registry/speccopyright.html |
| |
| Status |
| |
| Approved by the ARB on July 11, 2008 |
| |
| Version |
| |
| Last Modified Data: October 8, 2012 |
| Author revision: 13 |
| |
| Number |
| |
| ARB Extension #54 |
| |
| Dependencies |
| |
| This extension is written against the OpenGL 2.1 specification (December |
| 1st, 2006). |
| |
| APPLE_vertex_array_object affects the definition of this extension. |
| |
| Overview |
| |
| This extension introduces named vertex array objects which encapsulate |
| vertex array state on the client side. These objects allow applications |
| to rapidly switch between large sets of array state. In addition, layered |
| libraries can return to the default array state by simply creating and |
| binding a new vertex array object. |
| |
| This extension differs from GL_APPLE_vertex_array_object in that client |
| memory cannot be accessed through a non-zero vertex array object. It also |
| differs in that vertex array objects are explicitly not sharable between |
| contexts. |
| |
| New Procedures and Functions |
| |
| void BindVertexArray(uint array); |
| |
| void DeleteVertexArrays(sizei n, const uint *arrays); |
| |
| void GenVertexArrays(sizei n, uint *arrays); |
| |
| boolean IsVertexArray(uint array); |
| |
| New Tokens |
| |
| Accepted by the <pname> parameter of GetBooleanv, GetIntegerv, |
| GetFloatv, and GetDoublev: |
| |
| VERTEX_ARRAY_BINDING 0x85B5 |
| |
| Additions to Chapter 2 of the OpenGL 2.1 Specification (OpenGL Operation) |
| |
| Add new section "2.X Vertex Array Objects" between sections "2.9 Buffer |
| Objects" and "2.10 Rectangles". |
| |
| The buffer objects that are to be used by the vertex and geometry stages |
| of the GL are collected together to form a vertex array object. All |
| state related to the definition of data used by the vertex processor is |
| encapsulated in a vertex array object. |
| |
| The command |
| |
| void GenVertexArrays(sizei n, uint *arrays); |
| |
| returns <n> previous unused vertex array object names in <arrays>. These |
| names are marked as used, for the purposes of GenVertexArrays only, but |
| they acquire array state only when they are first bound. |
| |
| Vertex array objects are deleted by calling |
| |
| void DeleteVertexArrays(sizei n, const uint *arrays); |
| |
| <arrays> contains <n> names of vertex array objects to be deleted. Once |
| a vertex array object is deleted it has no contents and its name is |
| again unused. If a vertex array object that is currently bound is |
| deleted, the binding for that object reverts to zero and the default |
| vertex array becomes current. Unused names in <arrays> are silently |
| ignored, as is the value zero. |
| |
| A vertex array object is created by binding a name returned by |
| GenVertexArrays with the command |
| |
| void BindVertexArray(uint array); |
| |
| <array> is the vertex array object name. The resulting vertex array |
| object is a new state vector, comprising all the state values listed in |
| tables 6.6 (except for the CLIENT_ACTIVE_TEXTURE selector state), 6.7, |
| and 6.8 (except for the ARRAY_BUFFER_BINDING state). |
| |
| BindVertexArray may also be used to bind an existing vertex array |
| object. If the bind is successful no change is made to the state of the |
| bound vertex array object, and any previous binding is broken. |
| |
| The currently bound vertex array object is used for all commands |
| which modify vertex array state, such as VertexAttribPointer and |
| EnableVertexAttribArray; all commands which draw from vertex arrays, |
| such as DrawArrays and DrawElements; and all queries of vertex |
| array state (see chapter 6). |
| |
| BindVertexArray fails and an INVALID_OPERATION error is generated if |
| array is not zero or a name returned from a previous call to |
| GenVertexArrays, or if such a name has since been deleted with |
| DeleteVertexArrays. |
| |
| An INVALID_OPERATION error is generated if any of the *Pointer commands |
| specifying the location and organization of vertex data are called while |
| a non-zero vertex array object is bound, zero is bound to the |
| ARRAY_BUFFER buffer object, and the pointer is not NULL[fn]. |
| [fn: This error makes it impossible to create a vertex array |
| object containing client array pointers.] |
| |
| Additions to Chapter 3 of the OpenGL 2.1 Specification (Rasterization) |
| |
| None |
| |
| Additions to Chapter 4 of the OpenGL 2.1 Specification (Per-Fragment |
| Operations and the Framebuffer) |
| |
| None |
| |
| Additions to Chapter 5 of the OpenGL 2.1 Specification (Special Functions) |
| |
| Modify Section 5.4, Display Lists (p. 240) |
| |
| (add new paragraph after 10th paragraph on p. 244) |
| |
| Vertex array objects: GenVertexArrays, DeleteVertexArrays, |
| BindVertexArray |
| |
| Additions to Chapter 6 of the OpenGL 2.1 Specification (Querying GL State) |
| |
| Modify Section 6.1.2, Data Conversions (p. 248) |
| |
| (add new paragraph after last paragraph of section, p. 249) |
| |
| Vertex-array state variables are qualified by the value of |
| VERTEX_ARRAY_BINDING to determine which vertex array object is queried. |
| Tables 6.6, 6.7, and 6.8 define the set of state stored in a vertex array |
| object. |
| |
| Modify Section 6.1.11, Pointer and String Queries (p. 257) |
| |
| (add new paragraph after 1st paragraph of section, p. 257) |
| |
| Queries for VERTEX_ARRAY_POINTER, NORMAL_ARRAY_POINTER, |
| COLOR_ARRAY_POINTER, SECONDARY_COLOR_ARRAY_POINTER, INDEX_ARRAY_POINTER, |
| TEXTURE_COORD_ARRAY_POINTER, FOG_COORD_ARRAY_POINTER, or |
| EDGE_FLAG_ARRAY_POINTER return the value stored in the currently bound |
| vertex array object. |
| |
| Add new section "6.1.X Vertex Array Object Queries" between sections |
| "6.1.13 Buffer Object Queries" and "6.1.14 Shader and Program Queries". |
| |
| The command |
| |
| boolean IsVertexArray(uint array); |
| |
| returns TRUE if <array> is the name of a vertex array object. If <array> |
| is zero, or a non-zero value that is not the name of a vertex array |
| object, IsVertexArray returns FALSE. No error is generated is <array> is |
| not a valid vertex array object name. |
| |
| Modify Section 6.1.14, Shader and Program Queries, p. 260 |
| |
| (modify the first paragraph on page 263) |
| |
| Replace the text |
| |
| "Note that all the queries except CURRENT_VERTEX_ATTRIB return client |
| state." |
| |
| with |
| |
| "Note that all the queries except CURRENT_VERTEX_ATTRIB return values |
| stored in the currently bound vertex array object (the value of |
| VERTEX_ARRAY_BINDING). If the zero object is bound, these values |
| are client state." |
| |
| (modify the 3rd paragraph on page 263 to read) |
| |
| The command |
| |
| void GetVertexAttribPointerv(uint index, enum pname, void **pointer); |
| |
| obtains the pointer named <pname> for vertex attribute numbered <index> |
| and places the information in <pointer>. <pname> must be |
| VERTEX_ATTRIB_ARRAY_POINTER. The value returned is queried from the |
| currently bound vertex array object. If the zero object is bound, the |
| value is queried from client state. An INVALID_VALUE error is generated |
| if <index> is greater than or equal to the value of MAX_VERTEX_ATTRIBS. |
| |
| Additions to Appendix X of the OpenGL X.X specification (Sharing) |
| |
| Vertex array objects are not sharable between contexts. |
| |
| Additions to the GLX Specification |
| |
| No change is made to the GLX API. |
| |
| Interactions with APPLE_vertex_array_object |
| |
| Vertex array objects as defined by this spec fill the same role as the |
| objects defined in APPLE_vertex_array_object but have some significant |
| semantic differences. If both types of object are supported by an |
| implementation, BindVertexArray will accept object names from either |
| type of object. Names passed to BindVertexArray must have been |
| previously returned by GenVertexArrays, previously returned by |
| GenVertexArraysAPPLE, or previously bound by BindVertexArrayAPPLE. |
| BindVertexArrayAPPLE must also accept names that were previously returned |
| by GenVertexArrays and bound with BindVertexArray. |
| |
| In addition, the enumerant value for VERTEX_ARRAY_BINDING is the same |
| as VERTEX_ARRAY_BINDING_APPLE. |
| |
| This allows applications using ARB VAOs to safely call into libraries that |
| internally use Apple VAOs, and vice-versa. |
| |
| The first bind call, either BindVertexArray or BindVertexArrayAPPLE, |
| determines the semantic of the object. |
| |
| GLX Protocol |
| |
| The following rendering commands are sent to the server as part of a |
| glXRender request. |
| |
| BindVertexArray |
| |
| 2 8 rendering command length |
| 2 350 rendering command opcode |
| 4 CARD32 array |
| |
| DeleteVertexArrays |
| |
| 2 8+(n*4) rendering command length |
| 2 351 rendering command opcode |
| 4 CARD32 n |
| n*4 LISTofCARD32 arrays |
| |
| The following non-rendering commands are sent using glx single requests: |
| |
| GenVertexArrays |
| |
| 1 CARD8 opcode (X assigned) |
| 1 206 GLX opcode |
| 2 3 request length |
| 4 GLX_CONTEXT_TAG context tag |
| 4 CARD32 n |
| => |
| 1 1 reply |
| 1 unused |
| 2 CARD16 sequence number |
| 4 n reply length |
| 24 unused |
| n*4 LISTofCARD32 arrays |
| |
| IsVertexArray |
| |
| 1 CARD8 opcode (X assigned) |
| 1 207 GLX opcode |
| 2 3 request length |
| 4 GLX_CONTEXT_TAG context tag |
| 4 CARD32 array |
| => |
| 1 1 reply |
| 1 unused |
| 2 CARD16 sequence number |
| 4 0 reply length |
| 4 BOOL32 return value |
| 20 unused |
| |
| New protocols for GetPointerv and GetVertexAttribPointerv are specified |
| |
| GetPointerv |
| |
| 1 CARD8 opcode (X assigned) |
| 1 208 GLX opcode |
| 2 3 request length |
| 4 GLX_CONTEXT_TAG context tag |
| 4 ENUM pname |
| => |
| 1 1 reply |
| 1 1 unused |
| 2 CARD16 sequence number |
| 4 m reply length, m = (n + p) / 4 |
| 4 unused |
| 4 CARD32 n |
| 16 unused |
| n LISTofBYTE params |
| p unused, p=pad(n) |
| |
| GetVertexAttribPointerv |
| |
| 1 CARD8 opcode (X assigned) |
| 1 209 GLX opcode |
| 2 4 request length |
| 4 GLX_CONTEXT_TAG context tag |
| 4 CARD32 index |
| 4 ENUM pname |
| => |
| 1 1 reply |
| 1 1 unused |
| 2 CARD16 sequence number |
| 4 m reply length, m = (n + p) / 4 |
| 4 unused |
| 4 CARD32 n |
| 16 unused |
| n LISTofBYTE pointer |
| p unused, p=pad(n) |
| |
| Errors |
| |
| INVALID_OPERATION is generated if any of the commands defined in this |
| extension is executed between the execution of Begin and the corresponding |
| execution of End. |
| |
| New State |
| |
| Get Value Get Command Type Value Attrib |
| --------- ----------- ---- ------- ------ |
| VERTEX_ARRAY_BINDING GetIntegerv Z+ 0 vertex-array |
| |
| New Implementation Dependent State |
| |
| None |
| |
| Issues |
| |
| (1) Are vertex array objects client or server state? |
| |
| DISCUSSION: Ideally they should be server state, like texture objects. |
| However, much of the state that is encapsulated by VAOs is client-state. |
| |
| RESOLUTION: Resolved. VAOs are server state. This essentially means that |
| client array state must be duplicated on the server. For practical |
| purposes, VBOs already require this duplication. |
| |
| (2) What happens when a buffer object that is attached to a non-current |
| VAO is deleted? |
| |
| RESOLUTION: Nothing (though a reference count may be decremented). |
| A buffer object that is deleted while attached to a non-current VAO |
| is treated just like a buffer object bound to another context (or to |
| a current VAO in another context). |
| |
| (3) Are VAOs sharable? |
| |
| DISCUSSION: There are many difficulties and complications involved in |
| guaranteeing correct behavior when "container" objects are sharable. |
| |
| RESOLUTION: RESOLVED: NO. |
| |
| (4) Can buffer objects attached to a VAO be modified? |
| |
| DISCUSSION: Operations such as updating the contents of a buffer object, |
| either via mapping the buffer or calling BufferSubData, are not |
| problematic. However, operations that cause a change in the underlying |
| data structure can be very problematic from a hardware / driver |
| perspective. Currently the only such operation is BufferData which causes |
| the buffer to be reallocated. |
| |
| RESOLUTION: RESOLVED. Yes. Calling BufferData on a buffer attached |
| to a VAO is allowed. |
| |
| (5) What are the interactions with this extension and |
| APPLE_vertex_array_object? |
| |
| DISCUSSION: The only question is what the behavior should be when both an |
| ARB vertex array object and an Apple vertex array object are bound at the |
| same time. |
| |
| RESOLUTION: Resolved. If both extensions are supported by an |
| implementation, both object types share a name space. Most of the useful |
| interactions fall out as a result of that. Please refer to the section |
| "Interactions with APPLE_vertex_array_object" above for more details. |
| |
| (6) Why don't the new tokens and entry points in this extension have |
| "ARB" suffixes like other ARB extensions? |
| |
| RESOLVED: Unlike most ARB extensions, this is a strict subset of |
| functionality already approved in OpenGL 3.0. This extension exists |
| only to support that functionality on older hardware that cannot |
| implement a full OpenGL 3.0 driver. Since there are no possible |
| behavior changes between the ARB extension and core features, source |
| code compatibility is improved by not using suffixes on the |
| extension. |
| |
| (7) How does this extension affect the GLX protocol of the commands that |
| modify or query vertex array state? |
| |
| RESOLVED: This extension changes the behaviour of all the commands that |
| modify or query vertex array state to use currently bound vertex array |
| object when a non-zero vertex array object is bound. |
| Since vertex array object is stored in the server, new protocol must be |
| specified for GetPointerv and GetVertexAttribPointerv. |
| Additionally, commands GetVertexAttribdv, GetVertexAttribfv and |
| GetVertexAttribiv must query state from the server and commands |
| VertexAttrib*Pointer, EnableVertexAttribArray and DisableVertexAttribArray |
| must modify state in the server when a non-zero vertex array object is |
| bound. If the zero object is bound, the value is queried from client state. |
| |
| Revision History |
| |
| Rev. Date Author Changes |
| ---- ---------- -------- ---------------------------------------------- |
| 1 04/17/2008 idr Initial version based on |
| GL_APPLE_vertex_array_object spec. |
| |
| 2 04/18/2008 idr Added sharability issue. |
| |
| 3 05/02/2008 idr Added issues #4 and #5. |
| |
| 4 05/15/2008 idr Resolved issue #1. VAOs are server state. |
| Resolved issue #5. ARB and APPLE VAOs share |
| a name space. |
| |
| 5 06/04/200 Jon Leech Minor typos, rearrange errors. |
| |
| 6 06/15/2008 Jon Leech More minor typos, clarify GenVertexArrays |
| behavior. |
| |
| 7 07/08/2008 js - noted that VAO is not supposed to include |
| CLIENT_ACTIVE_TEXTURE (bugzilla 3611) |
| - resolved all other open issues as per working |
| group discussions |
| - deleted obsolete INVALID_OPERATION on |
| draw with client arrays since it's no |
| longer possible to define a VAOs with client |
| arrays, as per working group discussions |
| - synced up BindVertexArray language with GL 3 spec |
| draft glspec30.20080708.1.pdf. |
| |
| 8 08/07/2008 Jon Leech Remove ARB suffixes. |
| |
| 9 08/20/2008 Jon Leech Cleanup formatting errors. |
| |
| 10 09/21/2011 Jon Leech Clarify that all *Pointer commands generate |
| errors when attempting to specify client |
| array pointers in a VAO (Bug 3696). |
| 11 09/22/2011 Jon Leech Exclude ARRAY_BUFFER_BINDING from VAO |
| state (Bug 5659). |
| 12 09/19/2012 Jon Leech Language tweaks for consistency with |
| OpenGL 3.1 specification (Bug 4306). |
| |
| 13 10/08/2012 srahman Added GLX protocol and issue #7. |