<<

Copyright 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 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