Name NV_vertex_attrib_integer_64bit Name Strings GL_NV_vertex_attrib_integer_64bit Contact Jeff Bolz, NVIDIA (jbolz 'at' nvidia.com) Contributors Pat Brown, NVIDIA Status Shipping Version Last Modified Date: 03/21/2010 Revision: 4 Number 392 Dependencies This extension is written against the OpenGL 3.2 specification (Compatibility Profile). This extension is written against version 1.50 (revision 09) of the OpenGL Shading Language Specification. OpenGL 3.0 and GLSL 1.30 are required. NV_gpu_shader5 or equivalent functionality is required. This extension requires EXT_vertex_attrib_64bit. This extension interacts with NV_vertex_buffer_unified_memory. This extension interacts with NV_gpu_program5 and NV_gpu_shader5. This extension interacts with EXT_vertex_attrib_64bit. Overview This extension provides support for specifying vertex attributes with 64-bit integer components, analagous to the 64-bit floating point support added in EXT_vertex_attrib_64bit. Additionally, it provides the VertexAttribLFormatNV entry point to specify bindless vertex attribute arrays with 64-bit integer or floating-point components in conjunction with the NV_vertex_buffer_unified_memory extension. New Procedures and Functions void VertexAttribL1i64NV(uint index, int64EXT x); void VertexAttribL2i64NV(uint index, int64EXT x, int64EXT y); void VertexAttribL3i64NV(uint index, int64EXT x, int64EXT y, int64EXT z); void VertexAttribL4i64NV(uint index, int64EXT x, int64EXT y, int64EXT z, int64EXT w); void VertexAttribL1i64vNV(uint index, const int64EXT *v); void VertexAttribL2i64vNV(uint index, const int64EXT *v); void VertexAttribL3i64vNV(uint index, const int64EXT *v); void VertexAttribL4i64vNV(uint index, const int64EXT *v); void VertexAttribL1ui64NV(uint index, uint64EXT x); void VertexAttribL2ui64NV(uint index, uint64EXT x, uint64EXT y); void VertexAttribL3ui64NV(uint index, uint64EXT x, uint64EXT y, uint64EXT z); void VertexAttribL4ui64NV(uint index, uint64EXT x, uint64EXT y, uint64EXT z, uint64EXT w); void VertexAttribL1ui64vNV(uint index, const uint64EXT *v); void VertexAttribL2ui64vNV(uint index, const uint64EXT *v); void VertexAttribL3ui64vNV(uint index, const uint64EXT *v); void VertexAttribL4ui64vNV(uint index, const uint64EXT *v); void GetVertexAttribLi64vNV(uint index, enum pname, int64EXT *params); void GetVertexAttribLui64vNV(uint index, enum pname, uint64EXT *params); void VertexAttribLFormatNV(uint index, int size, enum type, sizei stride); (note: VertexAttribLFormatNV is provided only if NV_vertex_buffer_unified_memory is supported.) New Tokens Accepted by the parameter of VertexAttribLPointerEXT, VertexArrayVertexAttribLOffsetEXT, and VertexAttribLFormatNV: INT64_NV 0x140E UNSIGNED_INT64_NV 0x140F Additions to Chapter 2 of the OpenGL 3.2 (Compatibility Profile) Specification (OpenGL Operation) Modify Section 2.7, Vertex Specification (p. 24) (delete third paragraph, p. 33, beginning with "The resulting attribute values are undefined") (rework the description of the VertexAttribI* commands, and add support for new VertexAttribL* commands, p. 33) To load values into a generic shader attribute declared as a signed or unsigned integer or integer vector, except for 64-bit integer types, use the commands void VertexAttribI{1,2,3,4}{i,ui}( uint index, T values ); void VertexAttribI{1,2,3,4}{i,ui}v( uint index, T values ); void VertexAttribI4{b,s,ub,us}v( uint index, T values ); These commands specify values that are extended to full signed or unsigned integers, then loaded into the generic attribute at slot index in the same fashion as described above. To load values into a generic shader attribute declared as a double, 64-bit signed integer, 64-bit unsigned integer, or into vectors or matrices thereof, use the commands void VertexAttribL{1,2,3,4}dEXT(uint index, T values); void VertexAttribL{1,2,3,4}dvEXT(uint index, T values); void VertexAttribL{1,2,3,4}{i64,ui64}EXT(uint index, T values); void VertexAttribL{1,2,3,4}{i64,ui64}vEXT(uint index, T values); These commands specify one, two, three or four values. Note that attribute variables declared with "double" types must be loaded with VertexAttribL*d{v}EXT; loading attributes with VertexAttrib*d{v} will produce undefined results. Similarly, attributes declared with 64-bit integer types must be loaded with VertexAttribL*{i64,ui64}{v}. For all VertexAttrib* commands, the error INVALID_VALUE is generated if is greater than or equal to MAX_VERTEX_ATTRIBS. The full set of VertexAttrib* commands specify generic attributes with components one of six data types: * floating-point values (VertexAttrib*), * signed or unsigned integers (VertexAttribI*), * double-precision floating-point values (VertexAttribL*d*), and * 64-bit signed or unsigned integers (VertexAttribL*{i64,ui64}*). The values loaded into a shader attribute variable bound to generic attribute are undefined if the data type of the attribute components specified by the most recent VertexAttrib* command do not match the data type of the variable. Modify Section 2.8, Vertex Arrays, p. 34 (insert new paragraph after first paragraph, p. 37) The command void VertexAttribLPointerEXT(uint index, int size, enum type, sizei stride, const void *pointer); specifies state for a generic vertex attribute array associated with a shader attribute variable declared with 64-bit double precision components. must be one of DOUBLE, INT64_NV, or UNSIGNED_INT64_NV, specifying components of type double, int64EXT, and uint64EXT, respectively. , , and behave as defined in all other vertex commands; may be one, two, three or four. Each component of an array specified by VertexAttribLPointerEXT will be encoded into one or more generic attribute components as specified for the VertexAttribL* commands in Section 2.7. The error INVALID_VALUE is generated if is greater than or equal to MAX_VERTEX_ATTRIBS. Modify "Add to Section 2.9" edits from NV_vertex_buffer_unified_memory (add to following to the list of *FormatNV commands) void VertexAttribLFormatNV(uint index, int size, enum type, sizei stride); Modify Section 2.14.3, Vertex Attributes, p. 86 (replace last paragraph, p. 86) When an attribute variable declared using one of the scalar or vector data types enumerated in Table X.1 and is bound to a generic attribute index , its value(s) are taken from the components of generic attribute . Scalars are extracted from the x component; two-, three-, and four-component vectors are extracted from the, (x, y), (x, y, z), or (x, y, z, w) components, respectively. Data type Command ------------------------------- ---------------------------------- int int8_t int16_t int32_t VertexAttribI1i ivec2 i8vec2 i16vec2 i32vec2 VertexAttribI2i ivec3 i8vec3 i16vec3 i32vec3 VertexAttribI3i ivec4 i8vec4 i16vec4 i32vec4 VertexAttribI4i uint uint8_t uint16_t uint32_t VertexAttribI1ui ivec2 i8vec2 i16vec2 u32vec2 VertexAttribI2ui ivec3 i8vec3 i16vec3 u32vec3 VertexAttribI3ui uvec4 u8vec4 u16vec4 u32vec4 VertexAttribI4ui float int16_t int32_t VertexAttrib1{f,b,s,i,ub,us,ui,d} vec2 f16vec2 f32vec2 VertexAttrib2{f,b,s,i,ub,us,ui,d} vec3 f16vec3 f32vec3 VertexAttrib3{f,b,s,i,ub,us,ui,d} vec4 f16vec4 f32vec4 VertexAttrib4{f,b,s,i,ub,us,ui,d} double float64_t VertexAttribL1dEXT dvec2 f64vec2 VertexAttribL2dEXT dvec3 f64vec3 VertexAttribL3dEXT dvec4 f64vec4 VertexAttribL4dEXT int64_t VertexAttribL1i64NV i64vec2 VertexAttribL2i64NV i64vec3 VertexAttribL3i64NV i64vec4 VertexAttribL4i64NV uint64_t VertexAttribL1ui64NV u64vec2 VertexAttribL2ui64NV u64vec3 VertexAttribL3ui64NV u64vec4 VertexAttribL4ui64NV Table X.1: Scalar and vector vertex attribute types and VertexAttrib* commands used to set the values of the corresponding generic attribute. For the 64-bit types listed in Table X.1, no default attribute values are provided if the values of the vertex attribute variable are specified with fewer components than required for the attribute variable. For example, the fourth component of a variable of type dvec4 will be undefined if specified using VertexAttribL3dvEXT or using a vertex array specified with VertexAttribLPointerEXT and a size of three. Additions to Chapter 3 of the OpenGL 3.2 (Compatibility Profile) Specification (Rasterization) None. Additions to Chapter 4 of the OpenGL 3.2 (Compatibility Profile) Specification (Per-Fragment Operations and the Frame Buffer) None. Additions to Chapter 5 of the OpenGL 3.2 (Compatibility Profile) Specification (Special Functions) None. Additions to Chapter 6 of the OpenGL 3.2 (Compatibility Profile) Specification (State and State Requests) Modify Section 6.1.15, Shader and Program Queries, p. 384 (add to the last list of commands, p. 387) void GetVertexAttribLi64vNV(uint index, enum pname, int64EXT *params); void GetVertexAttribLui64vNV(uint index, enum pname, uint64EXT *params); (modify the third paragraph, p. 388) The query CURRENT_VERTEX_ATTRIB returns the current value for the generic attribute . GetVertexAttribdv and GetVertexAttribfv read and return the current attribute values as four single-precision floating-point values; GetVertexAttribiv reads them as floating-point values and converts them to four integer values; GetVertexAttribIiv reads and returns them as signed integers; GetVertexAttribIuiv reads and returns them as four unsigned integers; GetVertexAttribLdvEXT reads and returns them as four double- precision floating-point values. GetVertexAttribLi64vNV reads and returns them as four 64-bit signed integer values. GetVertexAttribLui64vNV reads and returns them as four 64-bit unsigned integer values. The results of the query are undefined if the current attribute values are read using one data type but were specified using a different one. The error INVALID_OPERATION is generated if index is zero, as there is no current value for generic attribute zero. Additions to Appendix A of the OpenGL 3.2 (Compatibility Profile) Specification (Invariance) None. Additions to the AGL/GLX/WGL Specifications None. GLX Protocol TBD Dependencies on NV_vertex_buffer_unified_memory If NV_vertex_buffer_unified_memory is not supported, remove the VertexAttribLFormatNV command. Dependencies on NV_gpu_program5 and NV_gpu_shader5 This extension provides the ability to specify the values of vertex attributes with 64-bit components. To use these vertex attributes, separate extensions are required to read the values. The NV_gpu_program5 extension provides support for 64-bit integer inputs in assembly programs; NV_gpu_shader5 provides similar support for GLSL vertex shaders. To enable this capability in a GLSL vertex shader on implementations supporting NV_gpu_shader5, it is necessary to include #extension GL_NV_gpu_shader5 : enable in the vertex shader text. The NV_vertex_attrib_integer_64bit extension does not provide any separate new GLSL capabilities and can not be used with "#extension". 64-bit components are not supported by the fixed-function vertex processing pipeline stage. Dependencies on EXT_vertex_attrib_64bit If EXT_vertex_attrib_64bit is supported, vertex shaders are permitted to use 64-bit floating-point components for their inputs. Even if an application only uses 64-bit floating-point values in their vertex shader, this extension may still be useful. In particular, it provides the VertexAttribLFormatNV function, which allows the "bindless" vertex attribute array support provided by the NV_vertex_buffer_unified_memory extension to be used with 64-bit components, integer or floating-point. Errors None. New State None. New Implementation Dependent State None. Issues (1) What GLSL "#extension" should be required to enable 64-bit integer vertex sahder inputs. RESOLVED: NV_gpu_shader5 provides general-purpose support for 64-bit integer types in shaders, and we have written it to explicitly permit 64-bit integer vertex shader inputs. Since this is the only GLSL capability required for this extension and NV_gpu_shader5 or equivalent functionality is required, there is no separate "#extension" provided for just this extension. Revision History Rev. Date Author Changes ---- -------- -------- ----------------------------------------- 4 03/21/10 pbrown Minor wording updates to the spec overview, dependencies, issues, and body. 3 03/08/10 pbrown Rename to "NV_vertex_attrib_integer_64bit" to avoid possible confusion with the floating- point EXT_vertex_attrib_64bit. The previous spec name was "NV_vertex_attrib_64bit". 2 -- jbolz Rewrite as (u)int64-only extension of EXT. 1 -- pbrown Internal revisions.