Difference between revisions of "Wii Graphics Code/Blitting Processor"

From Custom Mario Kart
Jump to navigation Jump to search
(WIP - one section to go)
(→‎Shader operations: Stage combiners)
Line 335: Line 335:
  
 
Sets the texture map, texture coordinate and color channel for each TEV stage. At each address the texture references for two stages are set: 0x28 sets stage 0 and stage 1, 0x29 sets stage 2 and stage 3, etc. In total there can be eight stages. Similarly to the indirect texture stage, the texture map is a material layer index and the texture coords are a reference to one of the uv maps set in the object section. Offset 0x03 of the texture data block is used to enable or disable the texture drawing. The stage color channel sets the channel that will be used as raster color. Light channel 0 is often used as vertex color. The bump alpha is the value set by offset 0x0F at the indirect texture stage address, this value can be used to add shadow detail to faces whereas indirect texture maps on their own can only affect texture coordinates.
 
Sets the texture map, texture coordinate and color channel for each TEV stage. At each address the texture references for two stages are set: 0x28 sets stage 0 and stage 1, 0x29 sets stage 2 and stage 3, etc. In total there can be eight stages. Similarly to the indirect texture stage, the texture map is a material layer index and the texture coords are a reference to one of the uv maps set in the object section. Offset 0x03 of the texture data block is used to enable or disable the texture drawing. The stage color channel sets the channel that will be used as raster color. Light channel 0 is often used as vertex color. The bump alpha is the value set by offset 0x0F at the indirect texture stage address, this value can be used to add shadow detail to faces whereas indirect texture maps on their own can only affect texture coordinates.
 +
 +
=== Color TEV stage ===
 +
{| class="wikitable"
 +
! Offset !! Size !! Description
 +
|-
 +
| 0x14 || 4 || Argument A
 +
|-
 +
| 0x10 || 4 || Argument B
 +
|-
 +
| 0x0C || 4 || Argument C
 +
|-
 +
| 0x08 || 4 || Argument D
 +
|-
 +
| 0x06 || 2 || Bias
 +
{| class="wikitable"
 +
! Value !! Description
 +
|-
 +
| 0 || Zero
 +
|-
 +
| 1 || Add half
 +
|-
 +
| 2 || Subtract half
 +
|-
 +
| 3 || Special case
 +
|}
 +
|-
 +
| 0x05 || 1 || Operation
 +
{| class="wikitable"
 +
! Value !! Description
 +
|-
 +
| 0 || Addition
 +
|-
 +
| 1 || Subtraction
 +
|}
 +
|-
 +
| 0x04 || 1 || Clamp
 +
|-
 +
| 0x02 || 2 || Shift
 +
{| class="wikitable"
 +
! Value !! Description
 +
|-
 +
| 0 || Multiply by 1
 +
|-
 +
| 1 || Multiply by 2
 +
|-
 +
| 2 || Multiply by 4
 +
|-
 +
| 3 || Divide by 2
 +
|}
 +
|-
 +
| 0x00 || 2 || Destination
 +
{| class="wikitable"
 +
! Value !! Description
 +
|-
 +
| 0 || Pixel output
 +
|-
 +
| 1 || Temp 0
 +
|-
 +
| 2 || Temp 1
 +
|-
 +
| 3 || Temp 2
 +
|}
 +
|}
 +
 +
The four four-bit arguments can have the following values:
 +
{| class="wikitable"
 +
! Value !! Description
 +
|-
 +
| 0 || Pixel output
 +
|-
 +
| 1 || Pixel output alpha
 +
|-
 +
| 2 || Temp0
 +
|-
 +
| 3 || Temp0 alpha
 +
|-
 +
| 4 || Temp1
 +
|-
 +
| 5 || Temp1 alpha
 +
|-
 +
| 6 || Temp2
 +
|-
 +
| 7 || Temp2 alpha
 +
|-
 +
| 8 || Texture color
 +
|-
 +
| 9 || Texture alpha
 +
|-
 +
| 10 || Raster color
 +
|-
 +
| 11 || Raster alpha
 +
|-
 +
| 12 || One (white)
 +
|-
 +
| 13 || Half
 +
|-
 +
| 14 || Constant color
 +
|-
 +
| 15 || Zero (black)
 +
|}
 +
 +
This operation is the meat of each shader. It controls how colours are blended together and what is finally shown on the screen. Each shader stage has one such operation, each shader can have up to 8 stages. The texture color and raster (light channel) color are determined by the references set by the operation above. The input to Argument D is a bias, this value is always taken as base before further blending occurs. The bias value is added to argument D if it isn't set to 3.
 +
 +
If bias is below 3, a linear interpolation is performed over arguments A and B for argument C as parameter. If argument C is zero, then the result is argument A. If argument C is one, then it is argument B. The formula is as follows: lerp(a,b,c) = a + (b - a) * c. It can also be written as a * c + (1 - c) * b. The result of this function is either subtracted or added (depending on the operation bit) to the sum of argument D and the bias. Finally the shift operation is performed over this result and the result is moved to the destination. The final formula is: destination = shift * (bias + d op lerp(a,b,c)).
 +
 +
If bias is set to special case, then a comparison is performed between arguments A and B. If the comparison returns true, then argument C is returned. Otherwise black. The type of comparison depends on the values of shift and operation. The possible values for bitset ss|o (shift * 2 + operation) are:
 +
{| class="wikitable"
 +
! Value !! Description
 +
|-
 +
| 0 || ArgA.red > ArgB.red
 +
|-
 +
| 1 || ArgA.red == ArgB.red
 +
|-
 +
| 2 || ArgA.rg > ArgB.rg
 +
|-
 +
| 3 || ArgA.rg == ArgB.rg
 +
|-
 +
| 4 || ArgA.rgb > ArgB.rgb
 +
|-
 +
| 5 || ArgA.rgb == ArgB.rgb
 +
|-
 +
| 6 || ArgA > ArgB (per channel)
 +
|-
 +
| 7 || ArgA == ArgB (per channel)
 +
|}
 +
In the case of values 2 to 5, the blue comparison gets priority over green and red. If the blue channel is equal for both arguments, then the green channel is compared. Likewise green gets priority over red. 6 and 7 compare each channel individually.
 +
 +
=== Alpha TEV Stage ===
 +
The alpha TEV stage combiner works the same as the color TEV stage combiner. The only difference is the format of the least significant 16 bits of the data structure:
 +
{| class="wikitable"
 +
! Offset !! Size !! Description
 +
|-
 +
| 0x16 || 2 || Rswap
 +
|-
 +
| 0x14 || 2 || Lswap
 +
|-
 +
| 0x11 || 3 || Argument A
 +
|-
 +
| 0x0E || 3 || Argument B
 +
|-
 +
| 0x0B || 3 || Argument C
 +
|-
 +
| 0x08 || 3 || Argument D
 +
|}
 +
The four three-bit arguments can have the following values:
 +
{| class="wikitable"
 +
! Value !! Description
 +
|-
 +
| 0 || Pixel output
 +
|-
 +
| 1 || Temp0
 +
|-
 +
| 2 || Temp1
 +
|-
 +
| 3 || Temp2
 +
|-
 +
| 4 || Texture alpha
 +
|-
 +
| 5 || Raster alpha
 +
|-
 +
| 6 || Constant alpha
 +
|-
 +
| 7 || Zero
 +
|}
 +
 +
The Rswap and Lswap values are references to the color swap tables. The special case works the same as the color combiner special case, so the comparisons will be done on the color channels.

Revision as of 11:35, 23 September 2019

The blitting processor of the Wii's Hollywood GPU is responsible for applying materials to polygons that will be drawn. In the case of MDL0 files, this processor is mostly used for shader operations. Those operations control the texture map and coordinates to use, the color channel to use and how they are all blended together. MDL0 files access this processor directly by using Wii Graphics Code, whereas many other operations are hardcoded in the game code.

Register overview

The blitting processor has 82 known variables that are used for a large variety of tasks. The variables that are accessed by materials and shaders inside MDL0 files are as listed below:

Address Name
0x06 - 0x0E Three 2x3 indirect texture matrices
0x10 - 0x1F Indirect texture stages
0x25, 0x26 Indirect texture scale
0x27 Indirect texture references
0x28 - 0x2F Texture references
0x40 Z mode
0x41 Alpha blend mode
0x42 Constant alpha
0xC0 - 0xCE Color blending per TEV stage
0xC1 - 0xCF Alpha blending per TEV stage
0xE0 - 0xE7 Shader colors
0xF6 - 0xFD Color table selection per stage
0xFE Mask for next load operation

Material operations

Each material has a number of load calls to set variables used during blending. Variables in the blitting processor are used to control indirect texture matrices, scale and references, texture references, z mode, alpha blend mode and constant alpha. Each material also sets 3 hardcoded colors and 4 constant colors that may be used by the TEV stages. What each variable is used for is explained in the following sections. All tables are ordered from LSB to MSB.

Indirect texture matrix

Offset Size Description
0x0D 11 First row value
0x02 11 Second row value
0x00 2 Scale bits

At address 0x06 in the memory three 2x3 indirect texture matrices are stored together with a scale factor for each of them. To set a matrix three load operations are peformed, one for each column. Each load operation also sets two bits of the six bit scale factor is set; the first column sets the least significant bits, the third column sets the most significant bits. This matrix may be used to transform the texture coordinates of an indirect texture in an indirect texture stage.

The address of the command determines which column of which matrix is set. Addresses 0x06, 0x07 and 0x08 are used for columns one, two and three respectively of matrix 0, addresses 0x09, 0x0A and 0x0B are used for matrix 1 and 0x0C, 0x0D and 0x0E for matrix 2.

Indirect texture scale

Offset Size Description
0x14 4 S Scale stage 0
0x10 4 T Scale stage 0
0x0C 4 S Scale stage 1
0x08 4 T Scale stage 1

Sets the scale of the indirect texture map for each stage. Address 0x25 sets the scale for stages 0 and 1, 0x26 sets the scale for stages 2 and 3. The coordinates are bitwise shifted right by the scale value, which means that actual scale factor is a negative power of two.

Z mode

Offset Size Description
0x17 1 Enable depth test
0x14 3 Compare operation
Value Description
0 Never
1 Less than
2 Equal to
3 Less or equal
4 Greater than
5 Not equal to
6 Greater or equal
7 Always
0x13 1 Enable depth update

Z-buffering settings. Determines which object should be drawn in front.

Alpha blend mode

Offset Size Description
0x17 1 Enable blend
0x16 1 Enable logic operation
0x15 1 Enable dither
0x14 1 Enable color update
0x13 1 Enable alpha update
0x10 3 Destination factor
Value Description
0 Zero
1 One
2 Source color
3 Inverted source color
4 Destination color
5 Inverted destination color
6 Source alpha
7 Inverted source alpha
0x0D 3 Source factor (same values as destination factor)
0x0C 1 Subtract
0x08 4 Logic operation
Value Description
0 CLEAR
1 AND
2 AND_REVERSE
3 COPY
4 AND_INVERTED
5 NOOP
6 XOR
7 OR
8 NOR
9 EQUIV
10 INVERT
11 OR_REVERSE
12 COPY_INVERTED
13 OR_INVERTED
14 NAND
15 SET

Sets the blending mode. How blending mode exactly affects blending is unknown.

Constant alpha

Offset Size Description
0x17 1 Enable
0x0F 8 Alpha value

If enabled, the output alpha of the TEV result will always be changed to the number provided by this load function.

Shader colors

Offset Size Description
0x0D 11 Red/Blue
0x0C 1 Unused
0x01 11 Alpha/Green
0x00 1 Constant

Sets color variables that can be used by each TEV stage. If the LSB of the address is 0, then red and alpha are set, otherwise blue and green are set. If the constant bit is set, a constant color is set instead of a regular color. Although the addresses together can hold only four colors, they can still be used to set the three regular colors and four constant colors supported by the TEV stage combiners thanks to the constant bit, it will map internally to the right variable. In the case of regular colors addresses 0xe0 and 0xe1 remain unused, so 0xe2 and 0xe3 are used to set the first color.

Shader operations

Indirect texture stage

Offset Size Description
0x16 2 Indirect tex stage ID
0x14 2 Indirect texture coordinate format
Value Description
0 8-bit coordinates
1 5-bit coordinates
2 4-bit coordinates
3 3-bit coordinates
0x11 3 S (LSB), T and U (MSB) bias
0x0F 2 Bump alpha axis
Value Description
0 Disabled
1 S
2 T
3 U
0x0D 2 Matrix multiplication method
Value Description
0 Normal multiplication
1 Multiply with S value
2 Multiply with T value
3 Multiply with U value
0x0B 2 Indirect texture matrix
Value Description
0 No matrix
1 Matrix 0
2 Matrix 1
3 Matrix 2
0x08 3 S wrapping factor
0x05 3 T wrapping factor
0x04 1 Use unmodified LOD
0x03 1 Add previous TEV stage tex coordinates

Each address in range 0x10 - 0x1F contains an indirect texture TEV stage. Indirect textures are used to generate a new texture mapping grid that is altered by the provided texture and its mapping. This technique is mostly used to generate bump or normal maps on materials, which makes faces seem to have more detail than they really have. The provided matrix is multiplied with the green and blue color values of the indirect texture to shift the texture mapping. An indirect texture stage only affects the current TEV stage, no other TEV stages are affected directly.

Indirect texture references

Offset Size Description
0x15 3 Stage 0 texture
0x12 3 Stage 0 texture coords
0x0F 3 Stage 1 texture
0x0C 3 Stage 1 texture coords
0x09 3 Stage 2 texture
0x06 3 Stage 2 texture coords
0x03 3 Stage 3 texture
0x00 3 Stage 3 texture coords

All texture maps and coordiates for the four indirect texture stages are set at this address. The texture ID is a material layer index which references a texture by name. So if the provided material has layers for TexA, TexB and TexC, a value of 2 will load TexB. The texture coords value references one of the coordinates set in the object section. All references at this address are then used by one or more indirect texture stages for further calculations, the stage ID value is used as index in this table.

Texture references

Offset Size Description
0x0E 10 Stage 0 data
0x02 10 Stage 1 data

The 10-bit data blocks have the following layout:

Offset Size Description
0x08 3 Stage texture map
0x04 3 Stage texture coords
0x03 1 Stage texture enabled
0x00 3 Stage color channel
Value Description
0 Light channel 0
1 Light channel 1
5 Bump alpha
6 Normalized bump alpha

Other values disable the color channel for this stage.

Sets the texture map, texture coordinate and color channel for each TEV stage. At each address the texture references for two stages are set: 0x28 sets stage 0 and stage 1, 0x29 sets stage 2 and stage 3, etc. In total there can be eight stages. Similarly to the indirect texture stage, the texture map is a material layer index and the texture coords are a reference to one of the uv maps set in the object section. Offset 0x03 of the texture data block is used to enable or disable the texture drawing. The stage color channel sets the channel that will be used as raster color. Light channel 0 is often used as vertex color. The bump alpha is the value set by offset 0x0F at the indirect texture stage address, this value can be used to add shadow detail to faces whereas indirect texture maps on their own can only affect texture coordinates.

Color TEV stage

Offset Size Description
0x14 4 Argument A
0x10 4 Argument B
0x0C 4 Argument C
0x08 4 Argument D
0x06 2 Bias
Value Description
0 Zero
1 Add half
2 Subtract half
3 Special case
0x05 1 Operation
Value Description
0 Addition
1 Subtraction
0x04 1 Clamp
0x02 2 Shift
Value Description
0 Multiply by 1
1 Multiply by 2
2 Multiply by 4
3 Divide by 2
0x00 2 Destination
Value Description
0 Pixel output
1 Temp 0
2 Temp 1
3 Temp 2

The four four-bit arguments can have the following values:

Value Description
0 Pixel output
1 Pixel output alpha
2 Temp0
3 Temp0 alpha
4 Temp1
5 Temp1 alpha
6 Temp2
7 Temp2 alpha
8 Texture color
9 Texture alpha
10 Raster color
11 Raster alpha
12 One (white)
13 Half
14 Constant color
15 Zero (black)

This operation is the meat of each shader. It controls how colours are blended together and what is finally shown on the screen. Each shader stage has one such operation, each shader can have up to 8 stages. The texture color and raster (light channel) color are determined by the references set by the operation above. The input to Argument D is a bias, this value is always taken as base before further blending occurs. The bias value is added to argument D if it isn't set to 3.

If bias is below 3, a linear interpolation is performed over arguments A and B for argument C as parameter. If argument C is zero, then the result is argument A. If argument C is one, then it is argument B. The formula is as follows: lerp(a,b,c) = a + (b - a) * c. It can also be written as a * c + (1 - c) * b. The result of this function is either subtracted or added (depending on the operation bit) to the sum of argument D and the bias. Finally the shift operation is performed over this result and the result is moved to the destination. The final formula is: destination = shift * (bias + d op lerp(a,b,c)).

If bias is set to special case, then a comparison is performed between arguments A and B. If the comparison returns true, then argument C is returned. Otherwise black. The type of comparison depends on the values of shift and operation. The possible values for bitset ss|o (shift * 2 + operation) are:

Value Description
0 ArgA.red > ArgB.red
1 ArgA.red == ArgB.red
2 ArgA.rg > ArgB.rg
3 ArgA.rg == ArgB.rg
4 ArgA.rgb > ArgB.rgb
5 ArgA.rgb == ArgB.rgb
6 ArgA > ArgB (per channel)
7 ArgA == ArgB (per channel)

In the case of values 2 to 5, the blue comparison gets priority over green and red. If the blue channel is equal for both arguments, then the green channel is compared. Likewise green gets priority over red. 6 and 7 compare each channel individually.

Alpha TEV Stage

The alpha TEV stage combiner works the same as the color TEV stage combiner. The only difference is the format of the least significant 16 bits of the data structure:

Offset Size Description
0x16 2 Rswap
0x14 2 Lswap
0x11 3 Argument A
0x0E 3 Argument B
0x0B 3 Argument C
0x08 3 Argument D

The four three-bit arguments can have the following values:

Value Description
0 Pixel output
1 Temp0
2 Temp1
3 Temp2
4 Texture alpha
5 Raster alpha
6 Constant alpha
7 Zero

The Rswap and Lswap values are references to the color swap tables. The special case works the same as the color combiner special case, so the comparisons will be done on the color channels.