Back to the OpenGL extension cross reference

GL_NV_register_combiners2


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$ $Revision$
$Id: //sw/main/docs/OpenGL/specs/GL_NV_register_combiners2.txt#5 $

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.

Implementation Support


   List of OpenGL implementations supporting the GL_NV_register_combiners2 extension

Original File


   Original text file for the GL_NV_register_combiners2 extension


Page generated on Sun Nov 20 18:39:17 2005