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 parameter of Disable, Enable, and IsEnabled, and by the parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev: PER_STAGE_CONSTANTS_NV 0x8535 Accepted by the parameter of CombinerStageParameterfvNV and GetCombinerStageParameterfvNV: CONSTANT_COLOR0_NV (see NV_register_combiners) CONSTANT_COLOR1_NV (see NV_register_combiners) Accepted by the 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 parameter is a symbolic constant of the form COMBINER<#>_NV, indicating the general combiner stage <#> whose parameter named by is to be updated. must be either CONSTANT_COLOR0_NV or CONSTANT_COLOR1_NV. 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 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.