Name
    
     NV_register_combiners2

Name Strings

     GL_NV_register_combiners2

Notice

     Copyright NVIDIA Corporation, 2000, 2001, 2004.

IP Status

    NVIDIA Proprietary.

Status

    Implemented.

Version

    NVIDIA Date: February 11, 2004
    Version 1.2
    $Date: 2005/06/02 18:11:48 $ $Revision: 1.1 $
    $Id: register_combiners2.txt,v 1.1 2005/06/02 18:11:48 nightspawn Exp $

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:

        CombinerParameterfvNV
            2           8+4*n           rendering command length
            2           ????            rendering command opcode
            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           ????            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

     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.
