Name ARB_map_buffer_alignment Name Strings GL_ARB_map_buffer_alignment Contact Piers Daniell, NVIDIA Corporation (pdaniell 'at' nvidia.com) Contributors Jeff Bolz, NVIDIA Pat Brown, NVIDIA Notice Copyright (c) 2011-2013 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 2011/06/20. Approved by the Khronos Promoters on 2011/07/29. Version Last Modified Date: July 28, 2011 Revision: 5 Number ARB Extension #113 Dependencies OpenGL 2.1 is required. If ARB_map_buffer_range is NOT supported, ignore references to MapBufferRange. This extension is written against The OpenGL 4.1 (Compatibility Profile) specification. Overview This extension adds a requirement to the pointer returned by MapBuffer and MapBufferRange that they provide a minimum of 64 byte alignment to support processing of the data directly with special CPU instructions like SSE and AVX. New Procedures and Functions None New Tokens Accepted by the parameter of GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv, and GetDoublev: MIN_MAP_BUFFER_ALIGNMENT 0x90BC Changes to Section 2.9.3 (Mapping and Unmapping Buffer Data), page 60 In the third paragraph of the section that starts: "Pointer values returned by MapBufferRange may not be passed..." insert the following sentence at the start of the paragraph: "If no error occurs, the pointer value returned by MapBufferRange must reflect an allocation aligned to the value of MIN_MAP_BUFFER_ALIGNMENT basic machine units. Subtracting basic machine units from the returned pointer will always produce a multiple of the value of MIN_MAP_BUFFER_ALIGNMENT." On page 63, which describes MapBuffer, after the sentence that ends: "... value of the access enum parameter passed to MapBuffer." Add the following sentence: "The pointer value returned by MapBuffer must be aligned to the value of MIN_MAP_BUFFER_ALIGNMENT basic machine units." Additions to the AGL/GLX/WGL Specifications None Errors None New State None New Implementation Dependent State Get Value Type Get Command Minimum Value Description Sec. Attribute --------- ---- ----------- ------------- ------------------- ----- --------- MIN_MAP_BUFFER_ALIGNMENT Z+ GetIntegerv 64 Minimum byte alignment 2.9.3 - of the pointer returned by MapBuffer and MapBufferRange. Issues 1) Why 64 byte alignment and not 16 (like DX) or something else? RESOLVED: A 16 byte alignment is good for SSE, which uses a 128 bit register file. However, with the advent of AVX, which has a 256 bit register file, and the potential for even wider register files in the near future, 64 byte alignment seemed like a safe choice. 2) What alignment should be used for MapBufferRange when is non-zero? RESOLVED: The pointer returned should be consistent with the base of the buffer being aligned. For example, if a buffer was mapped with an of 24 bytes on an implementation with a MIN_MAP_BUFFER_ALIGNMENT of 64, the value of the pointer returned would have a value of the form 64*+24 for some integer . 3) How should the minimum alignment be exposed? RESOLVED: Provide an implementation-dependent constant that can be queried. Implementations that align buffers to >64-byte boundaries for whatever reason could advertise higher alignment values. Since the minimum alignment is 64 bytes, an application using this extension need not check the implementation's advertised alignment unless it requires an alignment larger than this minimum. Revision History Rev. Date Author Changes ---- -------- -------- ----------------------------------------------- 5 07/28/11 pbrown Rename MINIMUM_MAP_BUFFER_ALIGNMENT to MIN_MAP_BUFFER_ALIGNMENT to match usual API naming conventions (bug 7825). 4 06/20/11 pdaniell Assign enum value. 3 06/06/11 Jon Leech Minor typos for consistency with core spec. 2 05/19/11 pbrown Change spec language to require MapBufferRange to return a pointer consistent with the base being aligned. Add a couple issues. Minor wording changes (bug 7663). 1 05/05/11 pdaniell Initial version.