Copyright NVIDIA Corporation, 1999. NVIDIA Proprietary.
GeForce 256 and RIVA TNT Combiners
How to best utilize the per-pixel operations using OpenGL on NVIDIA Graphics Processors
11/02/1999 1 Copyright NVIDIA Corporation, 1999. NVIDIA Proprietary. NVIDIA OpenGL Combiners (see Figure 3.1 of OpenGL 1.2 spec)
Point Texture Rasterization Fetching
From Line Primitive Rasterization Texture Assembly Environment Application Register Polygon Combiners Rasterization Texture Unit 0 General Stage 0 Texture Unit 1 DrawPixels Pixel Rectangle General Stage 1 Rasterization
Final Stage Color Sum Bitmap Bitmap Rasterization
Coverage Fog Application To fragment processing 11/02/1999 2 Copyright NVIDIA Corporation, Which Texture Environment or 1999. NVIDIA Proprietary. Combiner Extension to use?
•Base OpenGL texture environment •supports modulate, replace, blend, decal •all OpenGL implementation support this • EXT_texture_env_add •supports add •widely supported extension, but not guaranteed •EXT_texture_env_combine •supports AB+C, AB+(1-A)C •additional scale & bias capability •user-defined constant •multi-vendor extension (NVIDIA & ATI) •NV_texture_env_combine4 •supports AB+CD, generalizes EXT_texture_env_combine •TNT & later NVIDIA graphics processors •NV_register_combiners •register model, non-linear data flow •signed math, input mappings, multiple dot products •subsumes texture environment, color sum, & fog stages •additional inputs: fog color & factor, & secondary color •number of stages independent of active textures •GeForce & future NVIDIA graphics processors (not TNT) 11/02/1999 3 Copyright NVIDIA Corporation, NV_texture_env_combine4 1999. NVIDIA Proprietary.
combiner inputs (RGBA)
RGB portion zero Alpha zero constant color portion constant colorprimary color Texture texture 0 Unit 0 primary color A ´ B + C ´textureD 0 texture 1 A ´ B + C ´ D texture 1
combiner 0 result combiner 0 resultzero Texture zero constant color Unit 1 constant colorprimary color A ´ B + C ´primaryD colortexture 0 A ´ B + C ´ D texture 0 texture 1 texture 1
post-combiner color (RGBA) 11/02/1999 4 Copyright NVIDIA Corporation, NV_register_combiners 1999. NVIDIA Proprietary. Functional Overview
•overrides texture stages/environment, color sum, and fog in current APIs
•signed math (negative one to positive range) •extended range through scaling
•dot products for lighting and image processing applications •specially designed for specular, diffuse, and ambient per-pixel lighting •object space bump map lighting •tangent space bump map lighting •non-photorealistic lighting models •post-filtering 3x3 color matrix for color space conversions
•register model supports non-linear data flows •superior to linear chain in current APIs
•effectively, a VLIW instruction set for fragment coloring
•very efficient hardware implementation
11/02/1999 5 Copyright NVIDIA Corporation, NV_register_combiners 1999. NVIDIA Proprietary. Examples
11/02/1999 6 Copyright NVIDIA Corporation, NV_register_combiners 1999. NVIDIA Proprietary. Register Combiner Operational Overview
initialize RGB Portion Alpha Portion registers
stage #0 AB+CD, AB, CD AB+CD, AB, CD
general combiner stages
stage #1 (optional) AB+CD, AB, CD AB+CD, AB, CD
final combiner AB+(1-A)C+D, EF, G RGBA fragment
11/02/1999 7 Copyright NVIDIA Corporation, NV_register_combiners 1999. NVIDIA Proprietary. Register Set
•primary (diffuse) color •initialized to RGBA of fragment’s primary color •secondary (specular) color •initialized to RGB of fragment’s secondary color •alpha initially undefined •texture 0 & texture 1 •initialized to fragment’s filtered RGBA texel from numbered texture unit •undefined if numbered texture unit is disabled •spare 0 & spare 1 •initially undefined •fog •RGB is current fog color •Alpha is fragment’s fog factor (only available in final combiner) •read-only •constant color 0 & constant color 1 •initialized to user-defined RGBA value •read-only •zero •constant, read-only value of zero
11/02/1999 8 Copyright NVIDIA Corporation, NV_register_combiners 1999. NVIDIA Proprietary.
General Combiner Operation, RGB portion written output registers must be mutually exclusive
input registers output registers
RGB A RGB A input input input input primary color map map map map primary color secondary color secondary color A B C D
texture 0 texture 0 A B + C D texture 1 -or- texture 1 A B mux C D spare 0 spare 0
spare 1 spare 1 A B scale and fog -or- fog bias A · B constant color 0 constant color 0 constant color 1 constant color 1 C D -or- zero zero C · D
not readable not writeable 11/02/1999 computations 9 Copyright NVIDIA Corporation, NV_register_combiners 1999. NVIDIA Proprietary. General Combiner Stage RGB Computations
A = (Ar, Ag, Ab) B = (Br, Bg, Bb) C = (Cr, Cg, Cb) D = (Dr, Dg, Db)
A B C D
(Ar Br, Ag Bg, Ab Bb) (Cr Dr, Cg Dg, Cb Db)
A · B A B + C D A B mux C D C · D
(Ar Br + Cr Dr, (Ar Br mux Cr Dr, (Ar Br + Ag Bg + Ab Bb, (Cr Dr + Cg Dg + Cb Db, Ag Bg + Cg Bg, Ag Bg mux Cg Bg, Ar Br + Ag Bg + Ab Bb, Cr Dr + Cg Dg + Cb Db, Ab Bb + Cb Db) Ab Bb mux Cb Db) Ar Br + Ag Bg + Ab Bb) Cr Dr + Cg Dg + Cb Db)
AB output ABCD output CD output 11/02/1999 10 Copyright NVIDIA Corporation, NV_register_combiners 1999. NVIDIA Proprietary. General Combiner Mux Computation
the AB mux CD computation is
if (texture 0 alpha > 0.5) output AB else output CD
note that texture 0 alpha is initially undefined if texture unit zero is not enabled
11/02/1999 11 Copyright NVIDIA Corporation, NV_register_combiners 1999. NVIDIA Proprietary. General Combiner Input Mapping Modes
•unsigned identity •half bias normal [0, 1] -> [0, 1] [0, 1] -> [-0.5, 0.5] max(0.0, x) max(0.0, x) - 0.5
•unsigned invert •half bias negate [0, 1] -> [1, 0] [0, 1] -> [0.5, -0.5] 1.0 - min(max(x, 0.0, 1.0)) -max(0.0, x) + 0.5
•expand normal •signed identity [0, 1] -> [-1, 1] [-1, 1] -> [-1 1] 2.0 * max(0, x) - 1.0 x
•expand negate •signed negate [0, 1] -> [1, -1] [-1, 1] -> [1, -1] -2.0 * max(0.0, x) + 1.0 -x
11/02/1999 12 Copyright NVIDIA Corporation, NV_register_combiners 1999. NVIDIA Proprietary. General Combiner Scale & Bias Modes
•Scale by 1.0, no bias •Scale by 2.0, no bias x 2.0 * x
•Scale by 1.0, bias by -0.5 •Scale by 2.0, bias by -0.5 x - 0.5 2.0 * x - 0.5
•Scale by 0.5, no bias •Scale by 4.0, no bias 0.5 * x 4.0 * x
11/02/1999 13 Copyright NVIDIA Corporation, NV_register_combiners 1999. NVIDIA Proprietary. General Combiner Stage Register Outputs
six outputs per general combiner stage:
three RGB outputs (AB, CD, ABCD) written to RGB portion of writable registers
three Alpha outputs (AB, CD, ABCD) written to Alpha portion of writable registers
RGB outputs must be written to distinct registers Alpha outputs must be written to distinct registers I.e., outputs can not be written to same register portion
if either the RGB AB or CD output of a stage computes a dot product, the RGB ABCD output for the stage must be discarded
any output can be discarded
11/02/1999 14 Copyright NVIDIA Corporation, NV_register_combiners 1999. NVIDIA Proprietary.
General Combiner Operation, Alpha portion written output registers must be mutually exclusive
input registers output registers
RGB A RGB A input input input input primary color map map map map primary color
secondary color secondary color A B C D
texture 0 texture 0 A B + C D texture 1 -or- texture 1 A B mux C D spare 0 spare 0
spare 1 spare 1 scale and fog A B fog bias
constant color 0 constant color 0
constant color 1 constant color 1
C D zero zero only blue component is readable from RGB not readable not writeable 11/02/1999 computations 15 Copyright NVIDIA Corporation, NV_register_combiners 1999. NVIDIA Proprietary. General Combiner Stage Alpha Computations
A = (Aa) B = (Ba) C = (Ca) D = (Da)
A B C D
(Aa Ba) (Ca Da)
A B + C D A B mux C D
(Aa Ba + Ca Da) (Aa Ba mux Ca Da)
AB output ABCD output CD output 11/02/1999 16 Copyright NVIDIA Corporation, NV_register_combiners 1999. NVIDIA Proprietary. Final Combiner Operation
input registers input input map map RGB A
primary color E F
secondary color E F
texture 0 spare 0 + texture 1 secondary color
input input input input input spare 0 map map map map map
spare 1 A B C D G fog fragment RGB out A B + ( 1 - A) C + D constant color 0
constant color 1 fragment Alpha out G zero
11/02/1999 computations 17 Copyright NVIDIA Corporation, NV_register_combiners 1999. NVIDIA Proprietary. Final Combiner Input Mapping Modes
•unsigned identity [0, 1] -> [0, 1] max(0.0, x)
•unsigned invert [0, 1] -> [1, 0] 1.0 - min(max(x, 0.0, 1.0))
11/02/1999 18 Copyright NVIDIA Corporation, NV_register_combiners 1999. NVIDIA Proprietary. Final Combiner Color Sum Clamping
•spare 0 + secondary color clamping options clamp to [0,1] range or sum has [0, 2] range •A B + (1-A) C + D operates in [0, 4] range
But bug in GeForce and Quadro hardware means useful range is [0, 2].
This bug is fixed in subsequent hardware!
11/02/1999 19 Copyright NVIDIA Corporation, NV_register_combiners 1999. NVIDIA Proprietary. OpenGL API Register Combiners Enable/Disable
Enable register combiners
glEnable(GL_REGISTER_COMBINERS_NV);
Disable register combiners
glDisable(GL_REGISTER_COMBINERS_NV);
11/02/1999 20 Copyright NVIDIA Corporation, NV_register_combiners 1999. NVIDIA Proprietary. OpenGL API General Combiner Input/Output Control
glCombinerInputNV(GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage);
glCombinerOutputNV(GLenum stage, Red indicates specifiers GLenum portion , Blue indicates state values GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum);
11/02/1999 21 Copyright NVIDIA Corporation, NV_register_combiners 1999. NVIDIA Proprietary. OpenGL API General Combiner Input/Output Control Tokens
stage = { GL_COMBINER0_NV, GL_COMBINER1_NV } portion = { GL_RGB, GL_ALPHA } variable = { GL_VARIABLE_A_NV, GL_VARIABLE_B_NV, GL_VARIABLE_C_NV, GL_VARIABLE_D_NV } input = { GL_ZERO, GL_PRIMARY_COLOR_NV, GL_SECONDARY_COLOR_NV, GL_CONSTANT_COLOR0_NV, GL_CONSTANT_COLOR1_NV, GL_TEXTURE0_ARB, GL_TEXTURE1_ARB, GL_FOG, GL_SPARE0_NV, GL_SPARE1_NV } mapping = { GL_UNSIGNED_IDENTITY_NV, GL_UNSIGNED_INVERT_NV, GL_EXPAND_NORMAL_NV, GL_EXPAND_NEGATE_NV, GL_HALF_BIAS_NORMAL_NV, GL_HALF_BIAS_NEGATE_NV, GL_SIGNED_IDENTITY_NV, GL_SIGNED_NEGATE_NV } componentUsage = { GL_RGB, GL_BLUE, GL_ALPHA } abOutput, cdOutput, sumOutput = { GL_DISCARD_NV, GL_PRIMARY_COLOR_NV, GL_SECONDARY_COLOR_NV, GL_TEXTURE0_ARB, GL_TEXTURE1_ARB, GL_SPARE0_NV, GL_SPARE1_NV } scale = { GL_NONE, GL_SCALE_BY_TWO_NV, GL_SCALE_BY_FOUR_NV, GL_SCALE_BY_ONE_HALF_NV } bias = { GL_NONE, GL_BIAS_BY_NEGATIVE_ONE_HALF_NV }
11/02/1999 22 Copyright NVIDIA Corporation, NV_register_combiners 1999. NVIDIA Proprietary. OpenGL API Final Combiner Input Control
glFinalCombinerInputNV(GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage);
Red indicates specifiers Blue indicates state values
11/02/1999 23 Copyright NVIDIA Corporation, NV_register_combiners 1999. NVIDIA Proprietary. OpenGL API Final Combiner Input Control Tokens
variable = { GL_VARIABLE_A_NV, GL_VARIABLE_B_NV, GL_VARIABLE_C_NV, GL_VARIABLE_D_NV, GL_VARIABLE_E_NV, GL_VARIABLE_F_NV, GL_VARIABLE_G_NV } input = { GL_ZERO, GL_PRIMARY_COLOR_NV, GL_SECONDARY_COLOR_NV, GL_CONSTANT_COLOR0_NV, GL_CONSTANT_COLOR1_NV, GL_TEXTURE0_ARB, GL_TEXTURE1_ARB, GL_FOG, GL_SPARE0_NV, GL_SPARE1_NV, GL_E_TIMES_F_NV, GL_SPARE0_PLUS_SECONDARY_COLOR_NV } mapping = { GL_UNSIGNED_IDENTITY_NV, GL_UNSIGNED_INVERT_NV } componentUsage = { GL_RGB, GL_BLUE, GL_ALPHA }
11/02/1999 24 Copyright NVIDIA Corporation, NV_register_combiners 1999. NVIDIA Proprietary. OpenGL API Combiner Parameter Control
glCombinerParameterfvNV(GLenum pnamev, const GLfloat *params);
glCombinerParameterivNV(GLenum pname, const GLint *params);
glCombinerParameterfNV(GLenum pname, GLfloat param);
glCombinerParameteriNV(GLenum pnamev, GLint param);
11/02/1999 25 Copyright NVIDIA Corporation, NV_register_combiners 1999. NVIDIA Proprietary. OpenGL API Combiner Parameter Control Tokens
pname = { GL_NUM_COMBINERS_NV, GL_COLOR_SUM_CLAMP_NV }
pnamev = { GL_NUM_COMBINERS_NV, GL_COLOR_SUM_CLAMP_NV, GL_CONSTANT_COLOR0_NV, GL_CONSTANT_COLOR1_NV }
11/02/1999 26 Copyright NVIDIA Corporation, NV_register_combiners 1999. NVIDIA Proprietary. OpenGL API Combiner State Queries
glGetCombinerInputParameterfvNV(GLenum stage, GLenum portion, GLenum variable, GLenum pname_i, GLfloat *params);
glGetCombinerInputParameterivNV(GLenum stage, GLenum portion, GLenum variable, GLenum pname_i, GLint *params);
glGetCombinerOutputParameterfvNV(GLenum stage, GLenum portion, Red indicates specifiers GLenum pname_o, GLfloat *params);
glGetCombinerOutputParameterivNV(GLenum stage, GLenum portion, GLenum pname_o, GLint *params);
glGetFinalCombinerInputParameterfvNV(GLenum fvariable, GLenum pname_i, GLfloat *params);
glGetFinalCombinerInputParameterivNV(GLenum fvariable, GLenum pname_i, GLfloat *params); 11/02/1999 27 Copyright NVIDIA Corporation, NV_register_combiners 1999. NVIDIA Proprietary. OpenGL API Combiner State Queries Tokens
stage = { GL_COMBINER0_NV, GL_COMBINER1_NV } portion = { GL_RGB, GL_ALPHA } variable = { GL_VARIABLE_A_NV, GL_VARIABLE_B_NV, GL_VARIABLE_C_NV, GL_VARIABLE_D_NV } fvariable = { GL_VARIABLE_A_NV, GL_VARIABLE_B_NV, GL_VARIABLE_C_NV, GL_VARIABLE_D_NV, GL_VARIABLE_E_NV, GL_VARIABLE_F_NV, GL_VARIABLE_G_NV }
pname_i = { GL_COMBINER_INPUT_NV, GL_COMBINER_MAPPING_NV, GL_COMPONENT_USAGE_NV }
pname_o = { GL_COMBINER_AB_DOT_PRODUCT_NV, GL_COMBINER_CD_DOT_PRODUCT_NV, GL_COMBINER_MUX_SUM_NV, GL_COMBINER_SCALE_NV, GL_COMBINER_BIAS_NV, GL_COMBINER_AB_OUTPUT_NV, GL_COMBINER_CD_OUTPUT_NV, GL_COMBINER_SUM_OUTPUT_NV }
11/02/1999 28