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

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

