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 <pname> 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 <offset> 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 <offset> 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
    <offset> 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*<N>+24 for some integer <N>.

    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.
