Name
    
     NV_register_combiners2

Name Strings

     GL_NV_register_combiners2

Contact

    Mark J. Kilgard, NVIDIA Corporation (mjk 'at' nvidia.com)

Contributors

    Thomas Roell

Notice

     Copyright NVIDIA Corporation, 2000, 2001, 2004.

IP Status

    NVIDIA Proprietary.

Status

    Implemented.

Version

    NVIDIA Date: December 13, 2004
    Version 1.2

Number

    227

Dependencies

    Written based on the wording of the OpenGL 1.2.1 specification.

    Assumes support for the NV_register_combiners extension (version 1.4).

Overview

    The NV_register_combiners extension provides a powerful fragment
    coloring mechanism.  This specification extends the register combiners
    functionality to support more color constant values that are unique
    for each general combiner stage.

    The base register combiners functionality supports only two color
    constants.  These two constants are available in every general
    combiner stage and in the final combiner.

    When many general combiner stages are supported, more than two
    unique color constants is often required.  The obvious way to extend
    the register combiners is to add several more color constant
    registers.  But adding new unique color constant registers is
    expensive for hardware implementation because every color constant
    register must be available as an input to any stage.

    In practice however, it is the total set of general combiner stages
    that requires more color constants, not each and every individual
    general combiner stage.  Each individual general combiner stage
    typically requires only one or two color constants.

    By keeping two color constant registers but making these two registers
    contain two unique color constant values for each general combiner
    stage, the hardware expense of supporting multiple color constants
    is minimized.  Additionally, this scheme scales appropriately as
    more general combiner stages are added.

Issues

    How do is compatibility maintained with the original register
    combiners?
      
      RESOLUTION:  Initially, per general combiner stage constants are
      disabled and the register combiners operate as described in the
      original NV_register_combiners specification.  A distinct "per
      stage constants" enable exposes this extension's new functionality.

    Where do the final combiner color constant values come from?

      RESOLUTION:  When "per stage constants" is enabled, the final
      combiner color constants continue to use the constant colors set
      with glCombinerParameterfvNV.

    Is the alpha component of the SECONDARY_COLOR_NV register now
    initialized with the expected interpolated secondary color's alpha
    component.

       RESOLUTION:  Yes, see Revision History for details.

New Procedures and Functions

    void CombinerStageParameterfvNV(GLenum stage,
                                    GLenum pname,
                                    const GLfloat *params);

    void GetCombinerStageParameterfvNV(GLenum stage,
                                       GLenum pname,
                                       GLfloat *params);

New Tokens

    Accepted by the <cap> parameter of Disable, Enable, and IsEnabled,
    and by the <pname> parameter of GetBooleanv, GetIntegerv, GetFloatv,
    and GetDoublev:

        PER_STAGE_CONSTANTS_NV                         0x8535

    Accepted by the <pname> parameter of CombinerStageParameterfvNV
    and GetCombinerStageParameterfvNV:

        CONSTANT_COLOR0_NV                             (see NV_register_combiners)
        CONSTANT_COLOR1_NV                             (see NV_register_combiners)

    Accepted by the <stage> parameter of CombinerStageParameterfvNV and
    GetCombinerStageParameterfvNV: 

        COMBINER0_NV                                   (see NV_register_combiners)
        COMBINER1_NV                                   (see NV_register_combiners)
        COMBINER2_NV                                   (see NV_register_combiners)
        COMBINER3_NV                                   (see NV_register_combiners)
        COMBINER4_NV                                   (see NV_register_combiners)
        COMBINER5_NV                                   (see NV_register_combiners)
        COMBINER6_NV                                   (see NV_register_combiners)
        COMBINER7_NV                                   (see NV_register_combiners)

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

    None

Additions to Chapter 3 of the 1.2 Specification (Rasterization)

 --  Section 3.8.12 "Register Combiners Application"

    Because the alpha component of the SECONDARY_COLOR_NV register is
    well-defined now (see Revision History) to be the alpha value of csec,
    STRIKE this sentence:

    "The initial value of the alpha portion of register SECONDARY_COLOR_NV
    is undefined."
 
    Add a paragraph immediately before section 3.8.12.1:

    "The ccc0 and ccc1 values map to particular constant color values.
    The ccc0 and ccc1 mappings depend on whether per-stage constants
    are enabled or not.  Per-stage constants are enabled and disabled
    with the Enable and Disable commands using the symbolic constant
    PER_STAGE_CONSTANTS_NV.

    When per-stage constants are disabled, ccc0 and ccc1 are mapped to
    the register combiners' global color constant values, gccc0 and
    gccc1.

    When per-stage constants are enabled, ccc0 and ccc1 depend
    on the combiner stage that inputs the COLOR_CONSTANT0_NV and
    COLOR_CONSTANT1_NV registers.  Each general combiner stage # maps
    ccc0 and ccc1 to the per-stage values s#ccc0 and s#ccc1 respectively.
    The final combiner maps ccc0 and ccc1 to the values gccc0 and gccc1
    (the same as if per-stage constants are disabled).

    gccc0, gccc1, s#ccc0, and s#ccc1 are further described in the
    following section."

 --  Section 3.8.12.1 "Combiner Parameters"
 
    Change Table NV_register_combiners.3 to read "gccc0" instead of
    "ccc0" and "gccc1" instead of "ccc1".

    Change the first sentence of the last paragraph to read:

    "The values gccc0 and gccc1 named by CONSTANT_COLOR0_NV and
    CONSTANT_COLOR1_NV are global constant colors available for inputs to
    the final combiner stage and, when per-stage constants is disabled,
    to the general combiner stages."

    Add the following after the last paragraph in the section:

    "Per-stage combiner parameters are specified by

        void CombinerStageParameterfvNV(GLenum stage,
                                        GLenum pname,
                                        const GLfloat *params);

    The <stage> parameter is a symbolic constant of the form
    COMBINER<#>_NV, indicating the general combiner stage <#> whose
    parameter named by <pname> is to be updated.  <pname> must be either
    CONSTANT_COLOR0_NV or CONSTANT_COLOR1_NV.  <params> is a pointer
    to a group of four values to which to set the indicated parameter.
    The parameter names CONSTANT_COLOR0_NV and CONSTANT_COLOR1_NV
    update the per-stage color constants s#ccc0 and s#ccc1 respectively
    where # is the number of the specified general combiner stage.
    The floating-point color values are clamped to the range [0,1]
    when specified."

Additions to Chapter 4 of the 1.2 Specification (Per-Fragment Operations
and the Frame Buffer)

    None

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

    None

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

 --  Section 6.1.3 "Enumerated Queries"

    Add to the bottom of the list of function prototypes (page 183):

        void GetCombinerStageParameterfvNV(GLenum stage,
                                           GLenum pname,
                                           GLfloat *params);

    Change the first sentence describing the register combiner queries
    to mention GetCombinerStageParameterfvNV so the sentence reads:

    "The GetCombinerInputParameterfvNV, GetCombinerInputParameterivNV,
    GetCombinerOutputParameterfvNV, GetCombinerOutputParameterivNV,
    and GetCombinerStageParameterfvNV parameter <stage> may be one of
    COMBINER0_NV, COMBINER1_NV, and so on, indicating which general
    combiner stage to query."

Additions to the GLX Specification

    None

GLX Protocol

    Two new GL commands are added.

    The following rendering command is sent to the sever as part of a
    glXRender request:

        CombinerStageParameterfvNV
            2           12+4*n          rendering command length
            2           4280            rendering command opcode
            4           ENUM            stage
            4           ENUM            pname
                        0x852A   n=4    GL_CONSANT_COLOR0_NV
                        0x852B   n=4    GL_CONSANT_COLOR1_NV
                        else     n=0
            4*n         LISTofFLOAT32   params

    The remaining command is a non-rendering command.  This commands
    is sent separately (i.e., not as part of a glXRender or glXRenderLarge
    request), using the glXVendorPrivateWithReply request:

        GetCombinerStageParameterfvNV
            1           CARD8           opcode (X assigned)
            1           17              GLX opcode (glXVendorPrivateWithReply)
            2           5               request length
            4           1327            vendor specific opcode
            4           GLX_CONTEXT_TAG context tag
            4           ENUM            stage
            4           ENUM            pname
          =>
            1           1               reply
            1                           unused
            2           CARD16          sequence number
            4           m               reply length, m = (n==1 ? 0 : n)
            4                           unused
            4           CARD32          unused

            if (n=1) this follows:

            4           FLOAT32         params
            12                          unused

            otherwise this follows:

            16                          unused
            n*4         LISTofFLOAT32   params

Errors

    None

New State

Get Value               Type  Get Command                    Initial Value  Description         Sec       Attribute
----------------------  ----  -----------------------------  -------------  ------------------  --------  --------------
PER_STAGE_CONSTANTS_NV  B     IsEnabled                      False          enable for          3.8.12    texture/enable
CONSTANT_COLOR0_NV      Cx#   GetCombinerStageParameterfvNV  0,0,0,0        per-stage constant  3.8.12.1  texture
                                                                            color zero
CONSTANT_COLOR1_NV      Cx#   GetCombinerStageParameterfvNV  0,0,0,0        per-stage constant  3.8.12.1  texture
                                                                             color one

[ where # is the value of MAX_GENERAL_COMBINERS_NV ]

New Implementation State

     None

Revision History

     December 13, 2004: Assigned GLX protocl opcodes and fixed protocol
     with help from Thomas Roell.

     Version 1.2 (February 11, 2004) - When describing the
     per-fragment register initialization within the combiners, the
     NV_register_combiners specification says "The initial value of the
     alpha portion of register SECONDARY_COLOR_NV is undefined." While
     this is true of NV1x GPUs, NV2x and beyond GPUs can properly
     initialize the alpha component of the SECONDARY_COLOR_NV
     register with the expected interpolated secondary color alpha.
     Unfortunately, due to a driver bug, the alpha components was always
     initialized to 1.0 in driver versions 56.90 (circa February 2004)
     and before.  Drivers subsequent to 56.90 have this problem fixed.
     This specification is updated to indicate that SECONDARY_COLOR_NV
     initialization is well-defined and what you would expect now.

     Version 1.1 (April 28, 2003) - The original specification failed
     to specify what should happen if a color component parameter for
     CombinerStageParameter*NV is outside the [0,1] range.  Such values
     should be clamped to the [0,1] range.

     NVIDIA drivers prior to May 2003 incorrectly failed to clamp color
     component values specified with CombinerStageParameter*NV to [0,1].
     Instead, approximately "x-floor(x)" where x is a component value
     is used for rendering.
