Name

    ARB_transpose_matrix

Name Strings

    GL_ARB_transpose_matrix

Contact

    David Blythe (blythe 'at' sgi.com)

Notice

    Copyright (c) 1999-2013 The Khronos Group Inc. Copyright terms at
        http://www.khronos.org/registry/speccopyright.html

Status

    Complete. Approved by ARB on 12/8/1999

Version

    Last Modified Date: January 3, 2000
    Author Revision: 1.3

Number

    ARB Extension #3

Dependencies

    This extensions is written against the OpenGL 1.2 Specification.
    May be implemented in any version of OpenGL.

Overview

    New functions and tokens are added allowing application matrices
    stored in row major order rather than column major order to be
    transferred to the OpenGL implementation.  This allows an application
    to use standard C-language 2-dimensional arrays (m[row][col]) and
    have the array indices match the expected matrix row and column indexes.
    These arrays are referred to as transpose matrices since they are
    the transpose of the standard matrices passed to OpenGL.

    This extension adds an interface for transfering data to and from the
    OpenGL pipeline, it does not change any OpenGL processing or imply any
    changes in state representation.

IP Status

    No IP is believed to be involved.

Issues

    * Why do this?

        It's very useful for layered libraries that desire to use two
        dimensional C arrays as matrices.  It avoids having the layered
        library perform the transpose itself before calling OpenGL since
        most OpenGL implementations can efficiently perform the transpose
        while reading the matrix from client memory.

    * Why not add a mode?

        It's substantially more confusing and complicated to add a mode.
        Simply adding two new entry points saves considerable confusion
        and avoids having layered libraries need to query the current mode
        in order to send a matrix with the correct memory layout.

    * Why not a utility routine in GLU

        It costs some performance.  It is believed that most OpenGL
        implementations can perform the transpose in place with negligble
        performance penalty.

    * Why use the name transpose?

        It's sure a lot less confusing than trying to ascribe unambiguous
        meaning to terms like row and column.  It could be matrix_transpose
        rather than transpose_matrix though.

    * Short Transpose to Trans?


New Procedures and Functions

    void LoadTransposeMatrix{fd}ARB(T m[16]);
    void MultTransposeMatrix{fd}ARB(T m[16]);

New Tokens

    Accepted by the <pname> parameter of GetBooleanv, GetIntegerv, GetFloatv,
    and GetDoublev

        TRANSPOSE_MODELVIEW_MATRIX_ARB    0x84E3
        TRANSPOSE_PROJECTION_MATRIX_ARB   0x84E4
        TRANSPOSE_TEXTURE_MATRIX_ARB      0x84E5
        TRANSPOSE_COLOR_MATRIX_ARB        0x84E6


Additions to Chapter 2 of the 1.2 OpenGL Specification (OpenGL Operation)

    Add to Section 2.10.2 Matrices  <before LoadIdentity>

    LoadTransposeMatrixARB takes a 4x4 matrix stored in row-major order as

    Let transpose(m,n) be defined as

        n[0] = m[0];
        n[1] = m[4];
        n[2] = m[8];
        n[3] = m[12];
        n[4] = m[1];
        n[5] = m[5];
        n[6] = m[9];
        n[7] = m[13];
        n[8] = m[2];
        n[9] = m[6];
        n[10] = m[10];
        n[11] = m[14];
        n[12] = m[3];
        n[13] = m[7];
        n[14] = m[11];
        n[15] = m[15];

    The effect of LoadTransposeMatrixARB(m) is then the same as the effect of
    the command sequence

        float n[16];
        transpose(m,n)
        LoadMatrix(n);

    The effect of MultTransposeMatrixARB(m) is then the same as the effect of
    the command sequence

        float n[16];
        transpose(m,n);
        MultMatrix(n);


Additions to Chapter 3 of the 1.2 OpenGL Specification (Rasterization)

    None

Additions to Chapter 4 of the 1.2 OpenGL Specification (Per-Fragment Operations
and the Framebuffer)

    None

Additions to Chapter 5 of the 1.2 OpenGL Specification (Special Functions)

    None

Additions to Chapter 6 of the 1.2 OpenGL Specification (State and State Requests)

    Matrices are queried and returned in their transposed form by calling
    GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev with <pname> set to
    TRANSPOSE_MODELVIEW_MATRIX_ARB, TRANSPOSE_PROJECTION_MATRIX_ARB,
    TRANSPOSE_TEXTURE_MATRIX_ARB, or TRANSPOSE_COLOR_MATRIX_ARB.
    The effect of GetFloatv(TRANSPOSE_MODELVIEW_MATRIX_ARB,m) is then the same
    as the effect of the command sequence

        float n[16];
        GetFloatv(MODELVIEW_MATRIX_ARB,n);
        transpose(n,m);

    Similar results occur for TRANSPOSE_PROJECTION_MATRIX_ARB,
    TRANSPOSE_TEXTURE_MATRIX_ARB, and TRANSPOSE_COLOR_MATRIX_ARB.


Additions to Appendix A of the OpenGL 1.2.1 Specification (Invariance)

    None

Additions to the GLX Specification

    None

GLX Protocol

    LoadTransposeMatrix and MultTransposeMatrix are layered
    on top of LoadMatrix and MultMatrix protocol
    performing client-side translation.  The Get commands
    are passed over the wire as part of the generic Get
    protocol with no translation required.

Errors

    No new errors, but error behavoir is inherited by the commands
    that the transpose commands are implemented on top of
    (LoadMatrix, MultMatrix, and Get*).

New State

    None

    TRANSPOSE_*_MATRIX_ARB refer to the same state as their non-transposed
    counterparts.

New Implementation Dependent State

    None

Revision History

    * Revision 1.1 - initial draft (18 Mar 1999)
    * Revision 1.2 - changed to use layered specification and ARB affix
                     (23 Nov 1999)
    * Revision 1.3 - Minor tweaks to GLX protocol and Errors. (7 Dec 1999)

Conformance Testing

    Load and Multiply the modelview matrix (initialized to identity
    each time) using LoadTransposeMatrixfARB and MultTransposeMatrixfARB
    with the matrix:

        ( 1  2  3  4 )
        ( 5  6  7  8 )
        ( 9 10 11 12 )
        (13 14 15 16 )

    and get the modelview matrix using TRANSPOSE_MODELVIEW_MATRIX_ARB and
    validate that the matrix is correct.  Get the matrix using
    MODELVIEW_MATRIX and verify that it is the transpose of the above
    matrix.  Load and Multiply the modelview matrix using LoadMatrixf
    and MultMatrixf with the above matrix and verify that the correct
    matrix is on the modelview stack using gets of MODELVIEW_MATRIX
    and TRANSPOSE_MODELVIEW_MATRIX_ARB.
