Name

    ARB_texture_rgb10_a2ui

Name Strings

    GL_ARB_texture_rgb10_a2ui

Contact

    Daniel Koch (daniel 'at' transgaming.com)

Contributors

    Daniel Koch, TransGaming
    Graham Sellers, AMD
    Jeff Bolz, NVIDIA
    Pat Brown, NVIDIA

Notice

    Copyright (c) 2010-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 at the 2010/01/22 F2F meeting.
    Approved by the Khronos Board of Promoters on March 10, 2010.

Version

    Last Modified Date: January 29, 2009
    Author Revision: 7

Number

    ARB Extension #83

Dependencies

    This extension is written against the OpenGL 3.2 specification, 
    compatibility profile, but it can apply against previous versions
    of OpenGL.

    Requires OpenGL 3.0 or EXT_texture_integer.

Overview

    This extension adds support for the following data format:

    A new texturing format for unsigned 10.10.10.2 integer textures. 

    OpenGL has supported RGB10 and RGB10_A2 formats for a very long time.  
    This extension provides a variant of RGB10_A2 which supports unsigned 
    integer data (in contrast to the above "unsigned normalized integer" 
    formats).

IP Status

    No known IP claims.

New Procedures and Functions

    None

New Tokens

    Accepted by the <internalFormat> parameter of TexImage1D, TexImage2D,
    TexImage3D, CopyTexImage1D, CopyTexImage2D, RenderbufferStorage and 
    RenderbufferStorageMultisample:

        RGB10_A2UI                           0x906F

Additions to Chapter 3 of the OpenGL 3.2 Specification (Compatibility Profile) (Rasterization)

    Modify Section 3.7.4 (Transfer of Pixel Rectangles), p. 183

    (modify Table 3.8, Packed pixel formats, p. 189, to allow the use of
     integer pixel formats with some packed pixel types)

                                   GL Data  #
      type Parameter Token Name     Type  Comps  Matching Pixel Formats
      ---------------------------  ------  ---  -----------------------------
      UNSIGNED_BYTE_3_3_2          ubyte    3   RGB, RGB_INTEGER
      UNSIGNED_BYTE_2_3_3_REV      ubyte    3   RGB, RGB_INTEGER
      UNSIGNED_SHORT_5_6_5         ushort   3   RGB, RGB_INTEGER
      UNSIGNED_SHORT_5_6_5_REV     ushort   3   RGB, RGB_INTEGER
      UNSIGNED_SHORT_4_4_4_4       ushort   4   RGBA, BGRA, RGBA_INTEGER, 
                                                  BGRA_INTEGER
      UNSIGNED_SHORT_4_4_4_4_REV   ushort   4   RGBA, BGRA, RGBA_INTEGER, 
                                                  BGRA_INTEGER
      UNSIGNED_SHORT_5_5_5_1       ushort   4   RGBA, BGRA, RGBA_INTEGER, 
                                                  BGRA_INTEGER
      UNSIGNED_SHORT_1_5_5_5_REV   ushort   4   RGBA, BGRA, RGBA_INTEGER, 
                                                  BGRA_INTEGER
      UNSIGNED_INT_8_8_8_8         uint     4   RGBA, BGRA, RGBA_INTEGER, 
                                                  BGRA_INTEGER
      UNSIGNED_INT_8_8_8_8_REV     uint     4   RGBA, BGRA, RGBA_INTEGER, 
                                                  BGRA_INTEGER
      UNSIGNED_INT_10_10_10_2      uint     4   RGBA, BGRA, RGBA_INTEGER, 
                                                  BGRA_INTEGER
      UNSIGNED_INT_2_10_10_10_REV  uint     4   RGBA, BGRA, RGBA_INTEGER, 
                                                  BGRA_INTEGER
      <other rows unchanged>


    Modify Section 3.9.1 (Texture Image Specification), p 212

    (add the following required Texture and renderbuffer color formats, p 216)
     
    - RGB10_A2UI

    (add the following to Table 3.17: "Correspondence of sized internal color 
    formats to base internal formats...", beginning on p 218)

     Sized                     Base                     R    G    B    A    Shared
     Internal Format           Internal Format          bits bits bits bits bits
     -----------------------   ---------------------    ---- ---- ---- ---- ------
     RGB10_A2UI                RGBA                     ui10 ui10 ui10 ui2


New State

    None.

New Implementation Dependent State

    None.

Issues

    1. What should the new enumerant be called?

       Possibilities include: 
       RGB10A2UI - difficult to read
       RGB10_A2UI - follows precedence of RGB10_A2 and other UI texture formats,
         however it could difficult to know at a glace if the the UI applies to 
         both the RGB and A components, or just the A component.
       RGB10UI_A2UI - follows the precedence of R11F_G11F_B10F
       RGB10_A2_UI - along the same lines as the _SNORM formats, but divergent
         from other UI formats.
      
       RESOLVED. Using RGB10_A2UI.  The UI applies to all 4 components.

    2. What should this extension be called?

       RESOLVED: ARB_texture_rgb10_a2ui, after the new internal format that is 
       added. Early drafts used the name texture_unsigned_10_10_10_2, but this 
       is only somewhat related type that isn't added by this extension.

    3. Should this new format be required to be renderable?

       RESOLVED: Yes. It appears to be renderable in other APIs that are 
       supported by the same hardware, and no hardware vendors have objected.

    4. It is possible to load packed 10_10_10_2 unsigned integer data into GL 
       via TexImage without this extension?  

       RESOLVED:  No.  The EXT_texture_integer extension, as later
       incorporated into OpenGL 3.0, added new integer pixel format enums
       (e.g., RGBA_INTEGER) and texture formats (e.g., RGBA16UI). All texture
       formats added by that extension had a "matching" non-packed format and
       type combination, so there wasn't a strong need to explicitly support
       packed pixel types for integer pixel formats.

       The texture format added by this extension logically maps to a "packed"
       format/type combination, so we add this support by adding RGB_INTEGER,
       RGBA_INTEGER, and BGRA_INTEGER (as appropriate) to the list of formats
       supported by packed pixel data types.

       Even though we are only adding one "packed" texture format, we chose to
       allow all packed types with corresponding integer formats for
       orthogonality.


Revision History

    Rev.  Date          Author    Changes
    ----  ------------  --------  ------------------------------------------------------
     7    Jan 29, 2010  pbrown    Update spec language to explicitly allow
                                  packed pixels data types with integer pixel
                                  formats; update issue 4 to indicate that
                                  packed pixels with integer formats wasn't
                                  previously allowed (bug 5674).
     6    Jan 26, 2010  pbrown    assign enum value
     5    Dec 10, 2009  dgkoch    de-ARBed new tokens
     4    Oct 23, 2009  dgkoch    fixed format typo
     3    Oct 23, 2009  dgkoch    added issue 4, resolved issues 1-3, renamed extension
     2    Oct 8, 2009   dgkoch    Enum can also be accepted for RenderbufferStorage*
     1    Oct 8, 2009   dgkoch    Initial revision

