Skip to content

Instantly share code, notes, and snippets.

@Pokechu22
Last active May 2, 2022 21:10
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Pokechu22/f9c6f22388f1c37570a546b80fdd7ddc to your computer and use it in GitHub Desktop.
Save Pokechu22/f9c6f22388f1c37570a546b80fdd7ddc to your computer and use it in GitHub Desktop.
Rygar: The Battle of Argus bloom writeup

Rygar: The Battle of Argus (a port of the PS2 game Rygar: The Legendary Adventure) has a broken bloom effect. In Dolphin, the bloom effect results in the top-left part of the screen being drawn over the entire screen. If the top-left part of the screen is particularly bright, then the whole screen will end up being white.

This writeup analyzes the RygarBloom2.dff fifolog on issue 12763.

First bloom step

EFB copy 4, 5, and 6 are relevant; however, EFB copy 6 is only for restoring the previous screen state and can mostly be ignored. After those EFB copies is object 268, which handles combining the earlier EFB copies and is the start of the bloom logic. EFB copy 7 makes a copy of the area that was drawn to by object 268, which is used for further processing later on.

EFB copy 4 (00045a56)
BP register BPMEM_EFB_TL
EFB Left: 0
EFB Top: 0

BP register BPMEM_EFB_WH
EFB Width: 640
EFB Height: 456

BP register BPMEM_MIPMAP_STRIDE (a0)
No description available

BP register BPMEM_EFB_ADDR
EFB Target address (32 byte aligned): 0x1057D20

BP register BPMEM_TRIGGER_EFB_COPY
Clamping: Top and Bottom
Converting from RGB to YUV: No
Target pixel format: RGBA8 (6)
Gamma correction: 1.0
Half scale: Yes
Vertical scaling: No
Clear: No
Frame to field: Progressive (0)
Copy to XFB: No
Intensity format: No
Automatic color conversion: Yes
EFB copy 5 (00045aaa6)
BP register BPMEM_EFB_TL
EFB Left: 0
EFB Top: 0

BP register BPMEM_EFB_WH
EFB Width: 640
EFB Height: 456

BP register BPMEM_MIPMAP_STRIDE (50)
No description available

BP register BPMEM_EFB_ADDR
EFB Target address (32 byte aligned): 0x109F1A0

BP register BPMEM_TRIGGER_EFB_COPY
Clamping: Top and Bottom
Converting from RGB to YUV: No
Target pixel format: RA8/IA8 (Z16 too?) (3)
Gamma correction: 1.0
Half scale: Yes
Vertical scaling: No
Clear: No
Frame to field: Progressive (0)
Copy to XFB: No
Intensity format: Yes
Automatic color conversion: Yes
EFB copy 6 (00045af6)
BP register BPMEM_EFB_TL
EFB Left: 0
EFB Top: 0

BP register BPMEM_EFB_WH
EFB Width: 320
EFB Height: 228

BP register BPMEM_MIPMAP_STRIDE (a0)
No description available

BP register BPMEM_EFB_ADDR
EFB Target address (32 byte aligned): 0x10108A0

BP register BPMEM_TRIGGER_EFB_COPY
Clamping: Top and Bottom
Converting from RGB to YUV: No
Target pixel format: RGBA8 (6)
Gamma correction: 1.0
Half scale: No
Vertical scaling: No
Clear: No
Frame to field: Progressive (0)
Copy to XFB: No
Intensity format: No
Automatic color conversion: Yes
Object 268
Z and alpha modes (00045a24)

These are actually set in EFB copy 4, but they only become relevant here.

BP register BPMEM_ALPHACOMPARE
Test 1: Always (7) (ref: 0x00)
Test 2: Always (7) (ref: 0x00)
Logic: And (0)

BP register BPMEM_ZCOMPARE
EFB pixel format: RGB8_Z24 (0)
Depth format: linear (0)
Early depth test: Yes

BP register BPMEM_ZMODE
Z mode: Enable test: Yes
Compare function: LEqual (3)
Enable updates: No

BP register BPMEM_BLENDMODE
Enable: Yes
Logic ops: No
Dither: Yes
Color write: Yes
Alpha write: Yes
Dest factor: 1-src_alpha (5)
Source factor: src_alpha (4)
Subtract: No
Logic mode: Clear (0) (0)
Texture 0 (00045b46)

Texture 0 points to EFB copy 4.

BP register BPMEM_TX_SETMODE0 Texture Unit 0
Wrap S: Clamp (0)
Wrap T: Clamp (0)
Mag filter: Linear (1)
Mipmap filter: None (0)
Min filter: Linear (1)
LOD type: Edge LOD (0)
LOD bias: 0 (0)
Max anisotropic filtering: 1 (0)
LOD/bias clamp: No

BP register BPMEM_TX_SETMODE1 Texture Unit 0
Min LOD: 0 (0)
Max LOD: 0 (0)

BP register BPMEM_TX_SETIMAGE0 Texture Unit 0
Width: 320
Height: 228
Format: RGBA8 (6)

BP register BPMEM_TX_SETIMAGE1 Texture Unit 0
Even TMEM Offset: 0
Even TMEM Width: 3
Even TMEM Height: 3
Cache is manually managed: No

BP register BPMEM_TX_SETIMAGE2 Texture Unit 0
Odd TMEM Offset: 4000
Odd TMEM Width: 3
Odd TMEM Height: 3

BP register BPMEM_TX_SETIMAGE3 Texture Unit 0
Source address (32 byte aligned): 0x1057D20
Texture 1 (00045b6e)

Texture 1 points to EFB copy 5.

BP register BPMEM_TX_SETMODE0 Texture Unit 1
Wrap S: Clamp (0)
Wrap T: Clamp (0)
Mag filter: Linear (1)
Mipmap filter: None (0)
Min filter: Linear (1)
LOD type: Edge LOD (0)
LOD bias: 0 (0)
Max anisotropic filtering: 1 (0)
LOD/bias clamp: No

BP register BPMEM_TX_SETMODE1 Texture Unit 1
Min LOD: 0 (0)
Max LOD: 0 (0)

BP register BPMEM_TX_SETIMAGE0 Texture Unit 1
Width: 320
Height: 228
Format: IA8 (3)

BP register BPMEM_TX_SETIMAGE1 Texture Unit 1
Even TMEM Offset: 800
Even TMEM Width: 3
Even TMEM Height: 3
Cache is manually managed: No

BP register BPMEM_TX_SETIMAGE2 Texture Unit 1
Odd TMEM Offset: c00
Odd TMEM Width: 3
Odd TMEM Height: 3

BP register BPMEM_TX_SETIMAGE3 Texture Unit 1
Source address (32 byte aligned): 0x109F1A0
Texture ref configuration (00045b91)

TEV stage 0 uses texture 1 (EFB copy 5), while stages 1 and 2 use texture 0 (EFB copy 4).

BP register BPMEM_TREF number 0
Stage 0 texmap: 1
Stage 0 tex coord: 0
Stage 0 enable texmap: Yes
Stage 0 color channel: Color chan 0 (0)
Stage 1 texmap: 0
Stage 1 tex coord: 0
Stage 1 enable texmap: Yes
Stage 1 color channel: Color chan 0 (0)

BP register BPMEM_TREF number 1
Stage 0 texmap: 0
Stage 0 tex coord: 0
Stage 0 enable texmap: Yes
Stage 0 color channel: Color chan 0 (0)
Stage 1 texmap: 3
Stage 1 tex coord: 3
Stage 1 enable texmap: Yes
Stage 1 color channel: Color chan 0 (0)
TEV configuration (00045b9b)

Partially-written values that are set once and then overwritten have been omitted.

BP register BPMEM_TEV_ALPHA_ENV Tev stage 0
dest.a = ras.a*tex.a

a: ZERO (7)
b: tex (4)
c: ras (5)
d: ZERO (7)
Bias: 0 (0)
Op: Add (0) / Comparison: Greater than (0)
Clamp: Yes
Scale factor: 1 (0) / Compare mode: R8 (0)
Dest: prev (0)
Ras sel: 0
Tex sel: 0

BP register BPMEM_TEV_ALPHA_ENV Tev stage 1
dest.a = prev.a*tex.a

a: ZERO (7)
b: tex (4)
c: prev (0)
d: ZERO (7)
Bias: 0 (0)
Op: Add (0) / Comparison: Greater than (0)
Clamp: Yes
Scale factor: 1 (0) / Compare mode: R8 (0)
Dest: prev (0)
Ras sel: 0
Tex sel: 0

BP register BPMEM_TEV_ALPHA_ENV Tev stage 2
dest.a = prev.a*tex.a

a: ZERO (7)
b: tex (4)
c: prev (0)
d: ZERO (7)
Bias: 0 (0)
Op: Add (0) / Comparison: Greater than (0)
Clamp: Yes
Scale factor: 1 (0) / Compare mode: R8 (0)
Dest: prev (0)
Ras sel: 0
Tex sel: 0

BP register BPMEM_TEV_COLOR_ENV Tev stage 0
dest.rgb = tex.rgb - konst.rgb*1

a: ZERO (15)
b: ONE (12)
c: konst.rgb (14)
d: tex.rgb (8)
Bias: 0 (0)
Op: Subtract (1) / Comparison: Equal to (1)
Clamp: Yes
Scale factor: 1 (0) / Compare mode: R8 (0)
Dest: prev (0)

BP register BPMEM_TEV_COLOR_ENV Tev stage 1
dest.rgb = prev.rgb*1

a: ZERO (15)
b: ONE (12)
c: prev.rgb (0)
d: ZERO (15)
Bias: 0 (0)
Op: Add (0) / Comparison: Greater than (0)
Clamp: Yes
Scale factor: 1 (0) / Compare mode: R8 (0)
Dest: prev (0)

BP register BPMEM_TEV_COLOR_ENV Tev stage 2
dest.rgb = (tex.rgb*prev.rgb) * 2

a: ZERO (15)
b: prev.rgb (0)
c: tex.rgb (8)
d: ZERO (15)
Bias: 0 (0)
Op: Add (0) / Comparison: Greater than (0)
Clamp: Yes
Scale factor: 2 (1) / Compare mode: GR16 (1)
Dest: prev (0)
TEV color configuration (00045b64 and 00045bd7)
BP register BPMEM_TEV_COLOR_RA Tev register 0
Type: Constant (1)
Alpha: 0ff
Red: 07a

BP register BPMEM_TEV_COLOR_BG Tev register 0
Type: Constant (1)
Green: 07a
Blue: 07a
BP register BPMEM_TEV_KSEL number 0
Swap 1: 0
Swap 2: 1
Color sel 0: Konst 0 RGB (invalid for alpha) (12)
Alpha sel 0: 1 (0)
Color sel 1: 1/4 (6)
Alpha sel 1: 1 (0)
Genmode (00045bfa)
BP register BPMEM_GENMODE
Num tex gens: 1
Num color channels: 1
Unused bit: 0
Flat shading (unconfirmed): No
Multisampling: No
Num TEV stages: 3
Cull mode: None (0)
Num indirect stages: 0
ZFreeze: No
Primitive data (00045c65)

This draws a rectangle with x and y coordinates ranging from 0 to 128, a z-coordinate of 0, a color of ffffffff (white), and texture coordinates ranging from 0 to 1.

VAT 2 refers to vertex attribute table 2. The game actually configures two separate VATs (1 and 2), both in object 0 at offset 000001a7. One of them uses indexed values (where each vertex specifies an index into various arrays), and the other uses direct values (where each vertex has the data put right into it). Primitive commands can specify which VAT to use (from VAT 0 to VAT 7), but a lot of games choose to only use one VAT and reconfigure it when needed instead of setting up several and choosing the right one as needed.

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 43000000 (128) 00000000 (0)  ffffffff  00000000 (0) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffffff  00000000 (0) 00000000 (0)  
43000000 (128) 00000000 (0) 00000000 (0)  ffffffff  3f800000 (1) 00000000 (0)  
43000000 (128) 43000000 (128) 00000000 (0)  ffffffff  3f800000 (1) 3f800000 (1)  
EFB copy 7 (00045ceb)
BP register BPMEM_EFB_TL
EFB Left: 0
EFB Top: 0

BP register BPMEM_EFB_WH
EFB Width: 128
EFB Height: 128

BP register BPMEM_MIPMAP_STRIDE (40)
No description available

BP register BPMEM_EFB_ADDR
EFB Target address (32 byte aligned): 0x10CC380

BP register BPMEM_TRIGGER_EFB_COPY
Clamping: Top and Bottom
Converting from RGB to YUV: No
Target pixel format: RGBA8 (6)
Gamma correction: 1.0
Half scale: No
Vertical scaling: No
Clear: No
Frame to field: Progressive (0)
Copy to XFB: No
Intensity format: No
Automatic color conversion: Yes

The EFB format in use here is RGB8, meaning each pixel in the framebuffer has 8 bits of red, green, and blue data, and no alpha data.

EFB copy 4 copies the whole screen. Half-size mode is enabled, so the final image is reduced from 640 by 456 to 320 by 228. Since the bloom effect involves blurring the image, reducing the texture size at this point has no downsides and reduces the amount of memory used by a factor of 4. EFB copy 4 uses the RGBA8 texture format, so the destination texture has 8 bits of red, green, blue, and alpha data; red, green, and blue come from the EFB, but the alpha channel needs a default value. This value is 1.0 (or 255). See Z_EFB_copy_4.png.

EFB copy 5 also copies the whole screen with half-size mode enabled. It uses the IA8 texture format, which is composed of an 8-bit intensity channel and an 8-bit alpha channel. The intensity channel is based on the red, green, and blue components of the EFB, weighted to produce a nice-looking greyscale image (using BT.601). Note that black receives a value of 16 and white receives a value of 235, with values outside of that range being reserved for other purposes. When drawing, the IA8 format uses the intensity channel value for the red, green, and blue channels (all of which get the same value). See Z_EFB_copy_5.png.

These two EFB copies are then combined together in a 128 by 128 region anchored at the top-left of the screen. The colors created via this process are computed through 3 TEV stages. The first TEV stage's color result is tex.rgb - konst.rgb*1, the second stage's color result is prev.rgb*1, and the third stage's color result is (tex.rgb*prev.rgb) * 2. In the first stage, tex refers to EFB copy 5, and konst refers to Konst color 0's RGB values, which are all 0x7a. The second stage is a no-op. In the third stage, tex refers to EFB copy 4. Also note that all of these stages have clamp enabled, which restricts values to 0-255, so it is impossible for the value to go negative between stages.

In effect, what this produces is this:

float brightness = 2 * clamp(screen.intensity - (0x7a / 255.0), 0.0, 1.0);
dest.rgb = brightness * screen.rgb;

The overall brightness of the intensity EFB copy is reduced, so only particularly bright regions remain (see Z_EFB_copy_5_subtract.png). The brightness is then multiplied by 2, so that subtraction doesn't mean everything in the final result is dark (see Z_EFB_copy_5_subtract_multiply.png). That brightness amount is then multiplied by the original color data. See Z_EFB_copy_7.png for the result it has produced so far.

The bug

The GameCube/Wii's GPU can only work with a single framebuffer. If a developer wishes to make other computations using the GPU, such as creating a texture for dynamic shadows, then they will need to draw on top of what's already been drawn on the screen. The usual approach here is to make an EFB copy of what was already there, and then draw whatever is needed, and then later draw back over the screen with that EFB copy. Rygar does this (EFB copy 6). Sometimes, this process goes wrong, as happened with SpongeBob Squarepants: Battle for Bikini Bottom (and other Heavy Iron Studios titles). However, there's another aspect: you can back up what's on the screen for later use, but there's still stuff on the screen in the place you plan to draw. One option to solve this is to clear the screen at the same time as the EFB copy is made (there's a field in the EFB copy command to do this); Rygar does not use this functionality. Another option is to draw something over the screen that you know will show up. Of course, if you plan on drawing over the whole region anyways, this is not a needed step... as long as you know for sure it will be drawn over completely.

Now's when I mention that the TEV configuration for object 268 also covers the alpha channel. Specifically, stage 0 uses the rasterized color multiplied by the texture alpha, and then stages 1 and 2 multiply the previous stage's result with the texture alpha. Since stage 0 uses tex1 (EFB copy) 5 and stages 1 and 2 use (EFB copy 4), this results in a final alpha of ras * tex1.a * tex0.a * tex0.a. The rasterized color's alpha is 0xff, and I previously stated that an EFB copy from an EFB without an alpha channel should have the resulting alpha be 1. So, this should always result in a final alpha value of 1, right?

Unfortunately, Dolphin was handling this incorrectly. An EFB copy using a normal texture format would always have an alpha channel of 1, but an EFB copy using an intensity format ended up with an alpha channel of 0. So the final alpha value ended up being 0 instead.

Even still, the alpha value wouldn't matter in most cases, as it's only used if the game specifies that blending should be enabled, and if you always want to update part of the screen, you generally won't want blending or the alpha enabled. Here, the alpha test is set to always pass, so pixels are always drawn (even if the alpha is 0)... but blending is configured to still use alpha, and it blends with the new color multiplied by the new color's alpha plus the color already in the framebuffer times 1 minus the new color's alpha. If the new color's alpha were always 1 (as it should be on real hardware), then this would always set it to the new color... but instead, since the new color's alpha is always 0, the color already used in the framebuffer is used. In short, nothing is actually drawn, and what was already on screen in the relevant area (in this case, Z_EFB_copy_7_bad.png) ends up being used as the input to the bloom effect.

Fixing the way Dolphin handles the alpha channel for intensity texture formats fixes the bloom, but I'll continue analyzing how the bloom effect works because it's interesting.

One other oddity is that tex0.a is used twice; TEV stage 1 exists only to multiply by alpha a second time (as it simply passes through the color from the previous stage without making any further changes). This implies that they were trying to handle alpha with the bloom effect, but it's not clear exactly what that would entail, and if the alpha was expected to be something other than 1 then they would run into the same issue Dolphin did (albeit to a lesser extent) unless they manually clear their draw region in that case only. I don't myself know whether the game uses an EFB with alpha in some cases, so it might be that they do handle this correctly when needed and just re-used the same TEV logic elsewhere because it worked fine. (Also note that the alpha value for both textures should be the same, as intensity texture formats don't modify alpha, so all they're doing is taking the cube of the EFB's alpha value.)

Blurring

Most of the remaining process is repeated blurring.

Object 269
Configuration (00045d1d)
BP register BPMEM_TREF number 0
Stage 0 texmap: 0
Stage 0 tex coord: 0
Stage 0 enable texmap: No
Stage 0 color channel: Color chan 0 (0)
Stage 1 texmap: 0
Stage 1 tex coord: 0
Stage 1 enable texmap: Yes
Stage 1 color channel: Color chan 0 (0)

BP register BPMEM_TEV_COLOR_ENV Tev stage 0
dest.rgb = tex.rgb*ras.rgb

a: ZERO (15)
b: ras.rgb (10)
c: tex.rgb (8)
d: ZERO (15)
Bias: 0 (0)
Op: Add (0) / Comparison: Greater than (0)
Clamp: Yes
Scale factor: 1 (0) / Compare mode: R8 (0)
Dest: prev (0)

BP register BPMEM_TEV_ALPHA_ENV Tev stage 0
dest.a = tex.a*ras.a

a: ZERO (7)
b: ras (5)
c: tex (4)
d: ZERO (7)
Bias: 0 (0)
Op: Add (0) / Comparison: Greater than (0)
Clamp: Yes
Scale factor: 1 (0) / Compare mode: R8 (0)
Dest: prev (0)
Ras sel: 0
Tex sel: 0

BP register BPMEM_GENMODE
Num tex gens: 0
Num color channels: 1
Unused bit: 0
Flat shading (unconfirmed): No
Multisampling: No
Num TEV stages: 1
Cull mode: None (0)
Num indirect stages: 0
ZFreeze: No
Primitives (00045d62)
Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42800000 (64) 00000000 (0)  000000ff  
00000000 (0) 00000000 (0) 00000000 (0)  000000ff  
42800000 (64) 00000000 (0) 00000000 (0)  000000ff  
42800000 (64) 42800000 (64) 00000000 (0)  000000ff  
Objects 270-282

For whatever reason, the game re-configures genmode and the xfmem channel information to the same value between each set of primitives. I've skipped this, but that's why this is listed as 13 objects.

Configuration (00045da5)

The texture is EFB copy 7.

BP register BPMEM_TX_SETMODE0 Texture Unit 0
Wrap S: Clamp (0)
Wrap T: Clamp (0)
Mag filter: Linear (1)
Mipmap filter: None (0)
Min filter: Linear (1)
LOD type: Edge LOD (0)
LOD bias: 0 (0)
Max anisotropic filtering: 1 (0)
LOD/bias clamp: No

BP register BPMEM_TX_SETMODE1 Texture Unit 0
Min LOD: 0 (0)
Max LOD: 0 (0)

BP register BPMEM_TX_SETIMAGE0 Texture Unit 0
Width: 128
Height: 128
Format: RGBA8 (6)

BP register BPMEM_TX_SETIMAGE1 Texture Unit 0
Even TMEM Offset: 0
Even TMEM Width: 3
Even TMEM Height: 3
Cache is manually managed: No

BP register BPMEM_TX_SETIMAGE2 Texture Unit 0
Odd TMEM Offset: 4000
Odd TMEM Width: 3
Odd TMEM Height: 3

BP register BPMEM_TX_SETIMAGE3 Texture Unit 0
Source address (32 byte aligned): 0x10CC380

BP register BPMEM_BLENDMODE
Enable: Yes
Logic ops: No
Dither: Yes
Color write: Yes
Alpha write: Yes
Dest factor: 1 (1)
Source factor: src_alpha (4)
Subtract: No
Logic mode: Clear (0) (0)

BP register BPMEM_TREF number 0
Stage 0 texmap: 0
Stage 0 tex coord: 0
Stage 0 enable texmap: Yes
Stage 0 color channel: Color chan 0 (0)
Stage 1 texmap: 0
Stage 1 tex coord: 0
Stage 1 enable texmap: Yes
Stage 1 color channel: Color chan 0 (0)

BP register BPMEM_TEV_COLOR_ENV Tev stage 0
dest.rgb = tex.rgb*ras.rgb

a: ZERO (15)
b: ras.rgb (10)
c: tex.rgb (8)
d: ZERO (15)
Bias: 0 (0)
Op: Add (0) / Comparison: Greater than (0)
Clamp: Yes
Scale factor: 1 (0) / Compare mode: R8 (0)
Dest: prev (0)

BP register BPMEM_TEV_ALPHA_ENV Tev stage 0
dest.a = tex.a*ras.a

a: ZERO (7)
b: ras (5)
c: tex (4)
d: ZERO (7)
Bias: 0 (0)
Op: Add (0) / Comparison: Greater than (0)
Clamp: Yes
Scale factor: 1 (0) / Compare mode: R8 (0)
Dest: prev (0)
Ras sel: 0
Tex sel: 0

BP register BPMEM_GENMODE
Num tex gens: 1
Num color channels: 1
Unused bit: 0
Flat shading (unconfirmed): No
Multisampling: No
Num TEV stages: 1
Cull mode: None (0)
Num indirect stages: 0
ZFreeze: No
Primitives (00045e47)
Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42800000 (64) 00000000 (0)  ffffff1b  00000000 (0) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff1b  00000000 (0) 00000000 (0)  
42800000 (64) 00000000 (0) 00000000 (0)  ffffff1b  3f800000 (1) 00000000 (0)  
42800000 (64) 42800000 (64) 00000000 (0)  ffffff1b  3f800000 (1) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42800000 (64) 00000000 (0)  ffffff16  3c8ccccd (0.0171875) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff16  3c8ccccd (0.0171875) 00000000 (0)  
42800000 (64) 00000000 (0) 00000000 (0)  ffffff16  3f823333 (1.01719) 00000000 (0)  
42800000 (64) 42800000 (64) 00000000 (0)  ffffff16  3f823333 (1.01719) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42800000 (64) 00000000 (0)  ffffff15  3d0ccccd (0.034375) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff15  3d0ccccd (0.034375) 00000000 (0)  
42800000 (64) 00000000 (0) 00000000 (0)  ffffff15  3f846666 (1.03437) 00000000 (0)  
42800000 (64) 42800000 (64) 00000000 (0)  ffffff15  3f846666 (1.03437) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42800000 (64) 00000000 (0)  ffffff14  3d533334 (0.0515625) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff14  3d533334 (0.0515625) 00000000 (0)  
42800000 (64) 00000000 (0) 00000000 (0)  ffffff14  3f86999a (1.05156) 00000000 (0)  
42800000 (64) 42800000 (64) 00000000 (0)  ffffff14  3f86999a (1.05156) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42800000 (64) 00000000 (0)  ffffff13  3d8ccccd (0.06875) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff13  3d8ccccd (0.06875) 00000000 (0)  
42800000 (64) 00000000 (0) 00000000 (0)  ffffff13  3f88cccd (1.06875) 00000000 (0)  
42800000 (64) 42800000 (64) 00000000 (0)  ffffff13  3f88cccd (1.06875) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42800000 (64) 00000000 (0)  ffffff11  3db00000 (0.0859375) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff11  3db00000 (0.0859375) 00000000 (0)  
42800000 (64) 00000000 (0) 00000000 (0)  ffffff11  3f8b0000 (1.08594) 00000000 (0)  
42800000 (64) 42800000 (64) 00000000 (0)  ffffff11  3f8b0000 (1.08594) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42800000 (64) 00000000 (0)  ffffff0f  3dd33334 (0.103125) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff0f  3dd33334 (0.103125) 00000000 (0)  
42800000 (64) 00000000 (0) 00000000 (0)  ffffff0f  3f8d3333 (1.10312) 00000000 (0)  
42800000 (64) 42800000 (64) 00000000 (0)  ffffff0f  3f8d3333 (1.10312) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42800000 (64) 00000000 (0)  ffffff16  80000000 (0) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff16  80000000 (0) 00000000 (0)  
42800000 (64) 00000000 (0) 00000000 (0)  ffffff16  3f800000 (1) 00000000 (0)  
42800000 (64) 42800000 (64) 00000000 (0)  ffffff16  3f800000 (1) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42800000 (64) 00000000 (0)  ffffff15  bc8ccccd (-0.0171875) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff15  bc8ccccd (-0.0171875) 00000000 (0)  
42800000 (64) 00000000 (0) 00000000 (0)  ffffff15  3f7b999a (0.982813) 00000000 (0)  
42800000 (64) 42800000 (64) 00000000 (0)  ffffff15  3f7b999a (0.982813) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42800000 (64) 00000000 (0)  ffffff14  bd0ccccd (-0.034375) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff14  bd0ccccd (-0.034375) 00000000 (0)  
42800000 (64) 00000000 (0) 00000000 (0)  ffffff14  3f773333 (0.965625) 00000000 (0)  
42800000 (64) 42800000 (64) 00000000 (0)  ffffff14  3f773333 (0.965625) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42800000 (64) 00000000 (0)  ffffff13  bd533334 (-0.0515625) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff13  bd533334 (-0.0515625) 00000000 (0)  
42800000 (64) 00000000 (0) 00000000 (0)  ffffff13  3f72cccd (0.948438) 00000000 (0)  
42800000 (64) 42800000 (64) 00000000 (0)  ffffff13  3f72cccd (0.948438) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42800000 (64) 00000000 (0)  ffffff11  bd8ccccd (-0.06875) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff11  bd8ccccd (-0.06875) 00000000 (0)  
42800000 (64) 00000000 (0) 00000000 (0)  ffffff11  3f6e6666 (0.93125) 00000000 (0)  
42800000 (64) 42800000 (64) 00000000 (0)  ffffff11  3f6e6666 (0.93125) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42800000 (64) 00000000 (0)  ffffff0f  bdb00000 (-0.0859375) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff0f  bdb00000 (-0.0859375) 00000000 (0)  
42800000 (64) 00000000 (0) 00000000 (0)  ffffff0f  3f6a0000 (0.914063) 00000000 (0)  
42800000 (64) 42800000 (64) 00000000 (0)  ffffff0f  3f6a0000 (0.914063) 3f800000 (1)  
EFB copy 8 (000463f6)
BP register BPMEM_EFB_TL
EFB Left: 0
EFB Top: 0

BP register BPMEM_EFB_WH
EFB Width: 64
EFB Height: 64

BP register BPMEM_MIPMAP_STRIDE (20)
No description available

BP register BPMEM_EFB_ADDR
EFB Target address (32 byte aligned): 0x10DC940

BP register BPMEM_TRIGGER_EFB_COPY
Clamping: Top and Bottom
Converting from RGB to YUV: No
Target pixel format: RGBA8 (6)
Gamma correction: 1.0
Half scale: No
Vertical scaling: No
Clear: No
Frame to field: Progressive (0)
Copy to XFB: No
Intensity format: No
Automatic color conversion: Yes
Object 283 (00046472)

Configuration is the same as object 269.

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42800000 (64) 00000000 (0)  000000ff  
00000000 (0) 00000000 (0) 00000000 (0)  000000ff  
42800000 (64) 00000000 (0) 00000000 (0)  000000ff  
42800000 (64) 42800000 (64) 00000000 (0)  000000ff  
Objects 284-296
Configuration (000464ba)

The TEV configuration is the same as object 270. The texture is EFB copy 8.

BP register BPMEM_TX_SETMODE0 Texture Unit 0
Wrap S: Clamp (0)
Wrap T: Clamp (0)
Mag filter: Linear (1)
Mipmap filter: None (0)
Min filter: Linear (1)
LOD type: Edge LOD (0)
LOD bias: 0 (0)
Max anisotropic filtering: 1 (0)
LOD/bias clamp: No

BP register BPMEM_TX_SETMODE1 Texture Unit 0
Min LOD: 0 (0)
Max LOD: 0 (0)

BP register BPMEM_TX_SETIMAGE0 Texture Unit 0
Width: 64
Height: 64
Format: RGBA8 (6)

BP register BPMEM_TX_SETIMAGE1 Texture Unit 0
Even TMEM Offset: 0
Even TMEM Width: 3
Even TMEM Height: 3
Cache is manually managed: No

BP register BPMEM_TX_SETIMAGE2 Texture Unit 0
Odd TMEM Offset: 4000
Odd TMEM Width: 3
Odd TMEM Height: 3

BP register BPMEM_TX_SETIMAGE3 Texture Unit 0
Source address (32 byte aligned): 0x10DC940
Primitives (00046557)
Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42800000 (64) 00000000 (0)  ffffff1b  00000000 (0) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff1b  00000000 (0) 00000000 (0)  
42800000 (64) 00000000 (0) 00000000 (0)  ffffff1b  3f800000 (1) 00000000 (0)  
42800000 (64) 42800000 (64) 00000000 (0)  ffffff1b  3f800000 (1) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42800000 (64) 00000000 (0)  ffffff16  00000000 (0) 3f823333 (1.01719)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff16  00000000 (0) 3c8ccccd (0.0171875)  
42800000 (64) 00000000 (0) 00000000 (0)  ffffff16  3f800000 (1) 3c8ccccd (0.0171875)  
42800000 (64) 42800000 (64) 00000000 (0)  ffffff16  3f800000 (1) 3f823333 (1.01719)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42800000 (64) 00000000 (0)  ffffff15  00000000 (0) 3f846666 (1.03437)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff15  00000000 (0) 3d0ccccd (0.034375)  
42800000 (64) 00000000 (0) 00000000 (0)  ffffff15  3f800000 (1) 3d0ccccd (0.034375)  
42800000 (64) 42800000 (64) 00000000 (0)  ffffff15  3f800000 (1) 3f846666 (1.03437)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42800000 (64) 00000000 (0)  ffffff14  00000000 (0) 3f86999a (1.05156)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff14  00000000 (0) 3d533334 (0.0515625)  
42800000 (64) 00000000 (0) 00000000 (0)  ffffff14  3f800000 (1) 3d533334 (0.0515625)  
42800000 (64) 42800000 (64) 00000000 (0)  ffffff14  3f800000 (1) 3f86999a (1.05156)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42800000 (64) 00000000 (0)  ffffff13  00000000 (0) 3f88cccd (1.06875)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff13  00000000 (0) 3d8ccccd (0.06875)  
42800000 (64) 00000000 (0) 00000000 (0)  ffffff13  3f800000 (1) 3d8ccccd (0.06875)  
42800000 (64) 42800000 (64) 00000000 (0)  ffffff13  3f800000 (1) 3f88cccd (1.06875)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42800000 (64) 00000000 (0)  ffffff11  00000000 (0) 3f8b0000 (1.08594)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff11  00000000 (0) 3db00000 (0.0859375)  
42800000 (64) 00000000 (0) 00000000 (0)  ffffff11  3f800000 (1) 3db00000 (0.0859375)  
42800000 (64) 42800000 (64) 00000000 (0)  ffffff11  3f800000 (1) 3f8b0000 (1.08594)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42800000 (64) 00000000 (0)  ffffff0f  00000000 (0) 3f8d3333 (1.10312)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff0f  00000000 (0) 3dd33334 (0.103125)  
42800000 (64) 00000000 (0) 00000000 (0)  ffffff0f  3f800000 (1) 3dd33334 (0.103125)  
42800000 (64) 42800000 (64) 00000000 (0)  ffffff0f  3f800000 (1) 3f8d3333 (1.10312)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42800000 (64) 00000000 (0)  ffffff16  00000000 (0) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff16  00000000 (0) 80000000 (0)  
42800000 (64) 00000000 (0) 00000000 (0)  ffffff16  3f800000 (1) 80000000 (0)  
42800000 (64) 42800000 (64) 00000000 (0)  ffffff16  3f800000 (1) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42800000 (64) 00000000 (0)  ffffff15  00000000 (0) 3f7b999a (0.982813)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff15  00000000 (0) bc8ccccd (-0.0171875)  
42800000 (64) 00000000 (0) 00000000 (0)  ffffff15  3f800000 (1) bc8ccccd (-0.0171875)  
42800000 (64) 42800000 (64) 00000000 (0)  ffffff15  3f800000 (1) 3f7b999a (0.982813)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42800000 (64) 00000000 (0)  ffffff14  00000000 (0) 3f773333 (0.965625)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff14  00000000 (0) bd0ccccd (-0.034375)  
42800000 (64) 00000000 (0) 00000000 (0)  ffffff14  3f800000 (1) bd0ccccd (-0.034375)  
42800000 (64) 42800000 (64) 00000000 (0)  ffffff14  3f800000 (1) 3f773333 (0.965625)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42800000 (64) 00000000 (0)  ffffff13  00000000 (0) 3f72cccd (0.948438)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff13  00000000 (0) bd533334 (-0.0515625)  
42800000 (64) 00000000 (0) 00000000 (0)  ffffff13  3f800000 (1) bd533334 (-0.0515625)  
42800000 (64) 42800000 (64) 00000000 (0)  ffffff13  3f800000 (1) 3f72cccd (0.948438)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42800000 (64) 00000000 (0)  ffffff11  00000000 (0) 3f6e6666 (0.93125)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff11  00000000 (0) bd8ccccd (-0.06875)  
42800000 (64) 00000000 (0) 00000000 (0)  ffffff11  3f800000 (1) bd8ccccd (-0.06875)  
42800000 (64) 42800000 (64) 00000000 (0)  ffffff11  3f800000 (1) 3f6e6666 (0.93125)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42800000 (64) 00000000 (0)  ffffff0f  00000000 (0) 3f6a0000 (0.914063)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff0f  00000000 (0) bdb00000 (-0.0859375)  
42800000 (64) 00000000 (0) 00000000 (0)  ffffff0f  3f800000 (1) bdb00000 (-0.0859375)  
42800000 (64) 42800000 (64) 00000000 (0)  ffffff0f  3f800000 (1) 3f6a0000 (0.914063)  
EFB copy 9 (00046b06)
BP register BPMEM_EFB_TL
EFB Left: 0
EFB Top: 0

BP register BPMEM_EFB_WH
EFB Width: 64
EFB Height: 64

BP register BPMEM_MIPMAP_STRIDE (20)
No description available

BP register BPMEM_EFB_ADDR
EFB Target address (32 byte aligned): 0x10DC940

BP register BPMEM_TRIGGER_EFB_COPY
Clamping: Top and Bottom
Converting from RGB to YUV: No
Target pixel format: RGBA8 (6)
Gamma correction: 1.0
Half scale: No
Vertical scaling: No
Clear: No
Frame to field: Progressive (0)
Copy to XFB: No
Intensity format: No
Automatic color conversion: Yes

First, the game draws a black region from (0, 0) to (64, 64), as it is about to draw with alpha enabled and it doesn't want to use what's currently on the screen there. (Hmmm...)

Then, using EFB copy 7 as the texture, the game repeatedly draws over the same region (from (0, 0) to (64, 64)) but with slightly different texture coordinates and alpha values. The blend state is set so that the new color multiplied by alpha is added directly to the color in the framebuffer, and the alpha values across all of the draws eventually sum to 0xff, so this only serves to blur it without changing the overall brightness. The texture has clamping enabled, so texture coordinates outside of the range [0, 1) use the nearest in-bounds texel.

This first pass blends horizontally, with the top-left coordinates being (0, 0), (1.1/64, 0), (2.2/64, 0), ..., up to (6.6/64, 0), followed by (-0, 0), (-1.1/64), ..., (-5.5/64, 0). Apart from the duplication of (0, 0) and the incomplete mirroring caused by that, this is mostly reasonable... except that since the texture has clamping enabled, results will be brighter than intended if the the edge of the texture is not black. This is easiest to see when using free-look, by positioning a torch right at the edge of the screen (or even on the corner of the screen); the bloom for it will be brighter than normal. This could have been avoided by keeping the texture coordinates in the range (0, 1) and changing the position coordinates as needed instead, but it doesn't seem to be that big of a deal for normal situations, especially since bloom can't work with things that are off screen since they're not in the initial EFB copies, so the extra brightness somewhat compensates for that.

This is followed by a 64 by 64 EFB copy, then drawing over the same 64 by 64 region in black, then repeating the same process with texture coordinates changing vertically instead of horizontally (but now, the texture from that EFB copy is used instead of the one from the 128 by 128 EFB copy), and then another 64 by 64 EFB copy is made.

Object 279 (00046b82)

Configured to clear to black.

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42000000 (32) 00000000 (0)  000000ff  
00000000 (0) 00000000 (0) 00000000 (0)  000000ff  
42000000 (32) 00000000 (0) 00000000 (0)  000000ff  
42000000 (32) 42000000 (32) 00000000 (0)  000000ff  
Objects 298-310
Configuration (00046bc5)

The TEV configuration is the same as object 270. The texture is EFB copy 7.

BP register BPMEM_TX_SETMODE0 Texture Unit 0
Wrap S: Clamp (0)
Wrap T: Clamp (0)
Mag filter: Linear (1)
Mipmap filter: None (0)
Min filter: Linear (1)
LOD type: Edge LOD (0)
LOD bias: 0 (0)
Max anisotropic filtering: 1 (0)
LOD/bias clamp: No

BP register BPMEM_TX_SETMODE1 Texture Unit 0
Min LOD: 0 (0)
Max LOD: 0 (0)

BP register BPMEM_TX_SETIMAGE0 Texture Unit 0
Width: 128
Height: 128
Format: RGBA8 (6)

BP register BPMEM_TX_SETIMAGE1 Texture Unit 0
Even TMEM Offset: 0
Even TMEM Width: 3
Even TMEM Height: 3
Cache is manually managed: No

BP register BPMEM_TX_SETIMAGE2 Texture Unit 0
Odd TMEM Offset: 4000
Odd TMEM Width: 3
Odd TMEM Height: 3

BP register BPMEM_TX_SETIMAGE3 Texture Unit 0
Source address (32 byte aligned): 0x10CC380
Primitives (00046c67)
Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42000000 (32) 00000000 (0)  ffffff1b  00000000 (0) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff1b  00000000 (0) 00000000 (0)  
42000000 (32) 00000000 (0) 00000000 (0)  ffffff1b  3f800000 (1) 00000000 (0)  
42000000 (32) 42000000 (32) 00000000 (0)  ffffff1b  3f800000 (1) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42000000 (32) 00000000 (0)  ffffff16  3d0ccccd (0.034375) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff16  3d0ccccd (0.034375) 00000000 (0)  
42000000 (32) 00000000 (0) 00000000 (0)  ffffff16  3f846666 (1.03437) 00000000 (0)  
42000000 (32) 42000000 (32) 00000000 (0)  ffffff16  3f846666 (1.03437) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42000000 (32) 00000000 (0)  ffffff15  3d8ccccd (0.06875) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff15  3d8ccccd (0.06875) 00000000 (0)  
42000000 (32) 00000000 (0) 00000000 (0)  ffffff15  3f88cccd (1.06875) 00000000 (0)  
42000000 (32) 42000000 (32) 00000000 (0)  ffffff15  3f88cccd (1.06875) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42000000 (32) 00000000 (0)  ffffff14  3dd33334 (0.103125) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff14  3dd33334 (0.103125) 00000000 (0)  
42000000 (32) 00000000 (0) 00000000 (0)  ffffff14  3f8d3333 (1.10312) 00000000 (0)  
42000000 (32) 42000000 (32) 00000000 (0)  ffffff14  3f8d3333 (1.10312) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42000000 (32) 00000000 (0)  ffffff13  3e0ccccd (0.1375) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff13  3e0ccccd (0.1375) 00000000 (0)  
42000000 (32) 00000000 (0) 00000000 (0)  ffffff13  3f91999a (1.1375) 00000000 (0)  
42000000 (32) 42000000 (32) 00000000 (0)  ffffff13  3f91999a (1.1375) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42000000 (32) 00000000 (0)  ffffff11  3e300000 (0.171875) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff11  3e300000 (0.171875) 00000000 (0)  
42000000 (32) 00000000 (0) 00000000 (0)  ffffff11  3f960000 (1.17188) 00000000 (0)  
42000000 (32) 42000000 (32) 00000000 (0)  ffffff11  3f960000 (1.17188) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42000000 (32) 00000000 (0)  ffffff0f  3e533334 (0.20625) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff0f  3e533334 (0.20625) 00000000 (0)  
42000000 (32) 00000000 (0) 00000000 (0)  ffffff0f  3f9a6666 (1.20625) 00000000 (0)  
42000000 (32) 42000000 (32) 00000000 (0)  ffffff0f  3f9a6666 (1.20625) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42000000 (32) 00000000 (0)  ffffff16  80000000 (0) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff16  80000000 (0) 00000000 (0)  
42000000 (32) 00000000 (0) 00000000 (0)  ffffff16  3f800000 (1) 00000000 (0)  
42000000 (32) 42000000 (32) 00000000 (0)  ffffff16  3f800000 (1) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42000000 (32) 00000000 (0)  ffffff15  bd0ccccd (-0.034375) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff15  bd0ccccd (-0.034375) 00000000 (0)  
42000000 (32) 00000000 (0) 00000000 (0)  ffffff15  3f773333 (0.965625) 00000000 (0)  
42000000 (32) 42000000 (32) 00000000 (0)  ffffff15  3f773333 (0.965625) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42000000 (32) 00000000 (0)  ffffff14  bd8ccccd (-0.06875) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff14  bd8ccccd (-0.06875) 00000000 (0)  
42000000 (32) 00000000 (0) 00000000 (0)  ffffff14  3f6e6666 (0.93125) 00000000 (0)  
42000000 (32) 42000000 (32) 00000000 (0)  ffffff14  3f6e6666 (0.93125) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42000000 (32) 00000000 (0)  ffffff13  bdd33334 (-0.103125) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff13  bdd33334 (-0.103125) 00000000 (0)  
42000000 (32) 00000000 (0) 00000000 (0)  ffffff13  3f65999a (0.896875) 00000000 (0)  
42000000 (32) 42000000 (32) 00000000 (0)  ffffff13  3f65999a (0.896875) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42000000 (32) 00000000 (0)  ffffff11  be0ccccd (-0.1375) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff11  be0ccccd (-0.1375) 00000000 (0)  
42000000 (32) 00000000 (0) 00000000 (0)  ffffff11  3f5ccccd (0.8625) 00000000 (0)  
42000000 (32) 42000000 (32) 00000000 (0)  ffffff11  3f5ccccd (0.8625) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42000000 (32) 00000000 (0)  ffffff0f  be300000 (-0.171875) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff0f  be300000 (-0.171875) 00000000 (0)  
42000000 (32) 00000000 (0) 00000000 (0)  ffffff0f  3f540000 (0.828125) 00000000 (0)  
42000000 (32) 42000000 (32) 00000000 (0)  ffffff0f  3f540000 (0.828125) 3f800000 (1)  
EFB copy 10 (00047216)
BP register BPMEM_EFB_TL
EFB Left: 0
EFB Top: 0

BP register BPMEM_EFB_WH
EFB Width: 32
EFB Height: 32

BP register BPMEM_MIPMAP_STRIDE (10)
No description available

BP register BPMEM_EFB_ADDR
EFB Target address (32 byte aligned): 0x10E0F00

BP register BPMEM_TRIGGER_EFB_COPY
Clamping: Top and Bottom
Converting from RGB to YUV: No
Target pixel format: RGBA8 (6)
Gamma correction: 1.0
Half scale: No
Vertical scaling: No
Clear: No
Frame to field: Progressive (0)
Copy to XFB: No
Intensity format: No
Automatic color conversion: Yes
Object 311 (00047292)

Configured to clear to black.

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42000000 (32) 00000000 (0)  000000ff  
00000000 (0) 00000000 (0) 00000000 (0)  000000ff  
42000000 (32) 00000000 (0) 00000000 (0)  000000ff  
42000000 (32) 42000000 (32) 00000000 (0)  000000ff  
Objects 312-324
Configuration (000472da)

The TEV configuration is the same as object 270. The texture is EFB copy 10.

BP register BPMEM_TX_SETMODE0 Texture Unit 0
Wrap S: Clamp (0)
Wrap T: Clamp (0)
Mag filter: Linear (1)
Mipmap filter: None (0)
Min filter: Linear (1)
LOD type: Edge LOD (0)
LOD bias: 0 (0)
Max anisotropic filtering: 1 (0)
LOD/bias clamp: No

BP register BPMEM_TX_SETMODE1 Texture Unit 0
Min LOD: 0 (0)
Max LOD: 0 (0)

BP register BPMEM_TX_SETIMAGE0 Texture Unit 0
Width: 32
Height: 32
Format: RGBA8 (6)

BP register BPMEM_TX_SETIMAGE1 Texture Unit 0
Even TMEM Offset: 0
Even TMEM Width: 3
Even TMEM Height: 3
Cache is manually managed: No

BP register BPMEM_TX_SETIMAGE2 Texture Unit 0
Odd TMEM Offset: 4000
Odd TMEM Width: 3
Odd TMEM Height: 3

BP register BPMEM_TX_SETIMAGE3 Texture Unit 0
Source address (32 byte aligned): 0x10E0F00
Primitives (00047377)
Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42000000 (32) 00000000 (0)  ffffff1b  00000000 (0) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff1b  00000000 (0) 00000000 (0)  
42000000 (32) 00000000 (0) 00000000 (0)  ffffff1b  3f800000 (1) 00000000 (0)  
42000000 (32) 42000000 (32) 00000000 (0)  ffffff1b  3f800000 (1) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42000000 (32) 00000000 (0)  ffffff16  00000000 (0) 3f846666 (1.03437)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff16  00000000 (0) 3d0ccccd (0.034375)  
42000000 (32) 00000000 (0) 00000000 (0)  ffffff16  3f800000 (1) 3d0ccccd (0.034375)  
42000000 (32) 42000000 (32) 00000000 (0)  ffffff16  3f800000 (1) 3f846666 (1.03437)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42000000 (32) 00000000 (0)  ffffff15  00000000 (0) 3f88cccd (1.06875)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff15  00000000 (0) 3d8ccccd (0.06875)  
42000000 (32) 00000000 (0) 00000000 (0)  ffffff15  3f800000 (1) 3d8ccccd (0.06875)  
42000000 (32) 42000000 (32) 00000000 (0)  ffffff15  3f800000 (1) 3f88cccd (1.06875)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42000000 (32) 00000000 (0)  ffffff14  00000000 (0) 3f8d3333 (1.10312)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff14  00000000 (0) 3dd33334 (0.103125)  
42000000 (32) 00000000 (0) 00000000 (0)  ffffff14  3f800000 (1) 3dd33334 (0.103125)  
42000000 (32) 42000000 (32) 00000000 (0)  ffffff14  3f800000 (1) 3f8d3333 (1.10312)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42000000 (32) 00000000 (0)  ffffff13  00000000 (0) 3f91999a (1.1375)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff13  00000000 (0) 3e0ccccd (0.1375)  
42000000 (32) 00000000 (0) 00000000 (0)  ffffff13  3f800000 (1) 3e0ccccd (0.1375)  
42000000 (32) 42000000 (32) 00000000 (0)  ffffff13  3f800000 (1) 3f91999a (1.1375)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42000000 (32) 00000000 (0)  ffffff11  00000000 (0) 3f960000 (1.17188)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff11  00000000 (0) 3e300000 (0.171875)  
42000000 (32) 00000000 (0) 00000000 (0)  ffffff11  3f800000 (1) 3e300000 (0.171875)  
42000000 (32) 42000000 (32) 00000000 (0)  ffffff11  3f800000 (1) 3f960000 (1.17188)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42000000 (32) 00000000 (0)  ffffff0f  00000000 (0) 3f9a6666 (1.20625)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff0f  00000000 (0) 3e533334 (0.20625)  
42000000 (32) 00000000 (0) 00000000 (0)  ffffff0f  3f800000 (1) 3e533334 (0.20625)  
42000000 (32) 42000000 (32) 00000000 (0)  ffffff0f  3f800000 (1) 3f9a6666 (1.20625)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42000000 (32) 00000000 (0)  ffffff16  00000000 (0) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff16  00000000 (0) 80000000 (0)  
42000000 (32) 00000000 (0) 00000000 (0)  ffffff16  3f800000 (1) 80000000 (0)  
42000000 (32) 42000000 (32) 00000000 (0)  ffffff16  3f800000 (1) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42000000 (32) 00000000 (0)  ffffff15  00000000 (0) 3f773333 (0.965625)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff15  00000000 (0) bd0ccccd (-0.034375)  
42000000 (32) 00000000 (0) 00000000 (0)  ffffff15  3f800000 (1) bd0ccccd (-0.034375)  
42000000 (32) 42000000 (32) 00000000 (0)  ffffff15  3f800000 (1) 3f773333 (0.965625)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42000000 (32) 00000000 (0)  ffffff14  00000000 (0) 3f6e6666 (0.93125)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff14  00000000 (0) bd8ccccd (-0.06875)  
42000000 (32) 00000000 (0) 00000000 (0)  ffffff14  3f800000 (1) bd8ccccd (-0.06875)  
42000000 (32) 42000000 (32) 00000000 (0)  ffffff14  3f800000 (1) 3f6e6666 (0.93125)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42000000 (32) 00000000 (0)  ffffff13  00000000 (0) 3f65999a (0.896875)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff13  00000000 (0) bdd33334 (-0.103125)  
42000000 (32) 00000000 (0) 00000000 (0)  ffffff13  3f800000 (1) bdd33334 (-0.103125)  
42000000 (32) 42000000 (32) 00000000 (0)  ffffff13  3f800000 (1) 3f65999a (0.896875)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42000000 (32) 00000000 (0)  ffffff11  00000000 (0) 3f5ccccd (0.8625)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff11  00000000 (0) be0ccccd (-0.1375)  
42000000 (32) 00000000 (0) 00000000 (0)  ffffff11  3f800000 (1) be0ccccd (-0.1375)  
42000000 (32) 42000000 (32) 00000000 (0)  ffffff11  3f800000 (1) 3f5ccccd (0.8625)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 42000000 (32) 00000000 (0)  ffffff0f  00000000 (0) 3f540000 (0.828125)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff0f  00000000 (0) be300000 (-0.171875)  
42000000 (32) 00000000 (0) 00000000 (0)  ffffff0f  3f800000 (1) be300000 (-0.171875)  
42000000 (32) 42000000 (32) 00000000 (0)  ffffff0f  3f800000 (1) 3f540000 (0.828125)  
EFB copy 11 (00047926)
BP register BPMEM_EFB_TL
EFB Left: 0
EFB Top: 0

BP register BPMEM_EFB_WH
EFB Width: 32
EFB Height: 32

BP register BPMEM_MIPMAP_STRIDE (10)
No description available

BP register BPMEM_EFB_ADDR
EFB Target address (32 byte aligned): 0x10E0F00

BP register BPMEM_TRIGGER_EFB_COPY
Clamping: Top and Bottom
Converting from RGB to YUV: No
Target pixel format: RGBA8 (6)
Gamma correction: 1.0
Half scale: No
Vertical scaling: No
Clear: No
Frame to field: Progressive (0)
Copy to XFB: No
Intensity format: No
Automatic color conversion: Yes

The same process is performed using a 32x32 area. Note that this starts with the 128x128 texture (EFB copy 7), not the 64x64 texture generated earlier. The step size is now 1.1/32 instead of 1.1/64.

Object 325 (000479a2)

Configured to clear to black.

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 41800000 (16) 00000000 (0)  000000ff  
00000000 (0) 00000000 (0) 00000000 (0)  000000ff  
41800000 (16) 00000000 (0) 00000000 (0)  000000ff  
41800000 (16) 41800000 (16) 00000000 (0)  000000ff  
Objects 326-338
Configuration (000479e5)

The TEV configuration is the same as object 270. The texture is EFB copy 7.

BP register BPMEM_TX_SETMODE0 Texture Unit 0
Wrap S: Clamp (0)
Wrap T: Clamp (0)
Mag filter: Linear (1)
Mipmap filter: None (0)
Min filter: Linear (1)
LOD type: Edge LOD (0)
LOD bias: 0 (0)
Max anisotropic filtering: 1 (0)
LOD/bias clamp: No

BP register BPMEM_TX_SETMODE1 Texture Unit 0
Min LOD: 0 (0)
Max LOD: 0 (0)

BP register BPMEM_TX_SETIMAGE0 Texture Unit 0
Width: 128
Height: 128
Format: RGBA8 (6)

BP register BPMEM_TX_SETIMAGE1 Texture Unit 0
Even TMEM Offset: 0
Even TMEM Width: 3
Even TMEM Height: 3
Cache is manually managed: No

BP register BPMEM_TX_SETIMAGE2 Texture Unit 0
Odd TMEM Offset: 4000
Odd TMEM Width: 3
Odd TMEM Height: 3

BP register BPMEM_TX_SETIMAGE3 Texture Unit 0
Source address (32 byte aligned): 0x10CC380
Primitives (00047a87)
Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 41800000 (16) 00000000 (0)  ffffff1b  00000000 (0) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff1b  00000000 (0) 00000000 (0)  
41800000 (16) 00000000 (0) 00000000 (0)  ffffff1b  3f800000 (1) 00000000 (0)  
41800000 (16) 41800000 (16) 00000000 (0)  ffffff1b  3f800000 (1) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 41800000 (16) 00000000 (0)  ffffff16  3d8ccccd (0.06875) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff16  3d8ccccd (0.06875) 00000000 (0)  
41800000 (16) 00000000 (0) 00000000 (0)  ffffff16  3f88cccd (1.06875) 00000000 (0)  
41800000 (16) 41800000 (16) 00000000 (0)  ffffff16  3f88cccd (1.06875) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 41800000 (16) 00000000 (0)  ffffff15  3e0ccccd (0.1375) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff15  3e0ccccd (0.1375) 00000000 (0)  
41800000 (16) 00000000 (0) 00000000 (0)  ffffff15  3f91999a (1.1375) 00000000 (0)  
41800000 (16) 41800000 (16) 00000000 (0)  ffffff15  3f91999a (1.1375) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 41800000 (16) 00000000 (0)  ffffff14  3e533334 (0.20625) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff14  3e533334 (0.20625) 00000000 (0)  
41800000 (16) 00000000 (0) 00000000 (0)  ffffff14  3f9a6666 (1.20625) 00000000 (0)  
41800000 (16) 41800000 (16) 00000000 (0)  ffffff14  3f9a6666 (1.20625) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 41800000 (16) 00000000 (0)  ffffff13  3e8ccccd (0.275) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff13  3e8ccccd (0.275) 00000000 (0)  
41800000 (16) 00000000 (0) 00000000 (0)  ffffff13  3fa33333 (1.275) 00000000 (0)  
41800000 (16) 41800000 (16) 00000000 (0)  ffffff13  3fa33333 (1.275) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 41800000 (16) 00000000 (0)  ffffff11  3eb00000 (0.34375) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff11  3eb00000 (0.34375) 00000000 (0)  
41800000 (16) 00000000 (0) 00000000 (0)  ffffff11  3fac0000 (1.34375) 00000000 (0)  
41800000 (16) 41800000 (16) 00000000 (0)  ffffff11  3fac0000 (1.34375) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 41800000 (16) 00000000 (0)  ffffff0f  3ed33334 (0.4125) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff0f  3ed33334 (0.4125) 00000000 (0)  
41800000 (16) 00000000 (0) 00000000 (0)  ffffff0f  3fb4cccd (1.4125) 00000000 (0)  
41800000 (16) 41800000 (16) 00000000 (0)  ffffff0f  3fb4cccd (1.4125) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 41800000 (16) 00000000 (0)  ffffff16  80000000 (0) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff16  80000000 (0) 00000000 (0)  
41800000 (16) 00000000 (0) 00000000 (0)  ffffff16  3f800000 (1) 00000000 (0)  
41800000 (16) 41800000 (16) 00000000 (0)  ffffff16  3f800000 (1) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 41800000 (16) 00000000 (0)  ffffff15  bd8ccccd (-0.06875) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff15  bd8ccccd (-0.06875) 00000000 (0)  
41800000 (16) 00000000 (0) 00000000 (0)  ffffff15  3f6e6666 (0.93125) 00000000 (0)  
41800000 (16) 41800000 (16) 00000000 (0)  ffffff15  3f6e6666 (0.93125) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 41800000 (16) 00000000 (0)  ffffff14  be0ccccd (-0.1375) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff14  be0ccccd (-0.1375) 00000000 (0)  
41800000 (16) 00000000 (0) 00000000 (0)  ffffff14  3f5ccccd (0.8625) 00000000 (0)  
41800000 (16) 41800000 (16) 00000000 (0)  ffffff14  3f5ccccd (0.8625) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 41800000 (16) 00000000 (0)  ffffff13  be533334 (-0.20625) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff13  be533334 (-0.20625) 00000000 (0)  
41800000 (16) 00000000 (0) 00000000 (0)  ffffff13  3f4b3333 (0.79375) 00000000 (0)  
41800000 (16) 41800000 (16) 00000000 (0)  ffffff13  3f4b3333 (0.79375) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 41800000 (16) 00000000 (0)  ffffff11  be8ccccd (-0.275) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff11  be8ccccd (-0.275) 00000000 (0)  
41800000 (16) 00000000 (0) 00000000 (0)  ffffff11  3f39999a (0.725) 00000000 (0)  
41800000 (16) 41800000 (16) 00000000 (0)  ffffff11  3f39999a (0.725) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 41800000 (16) 00000000 (0)  ffffff0f  beb00000 (-0.34375) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff0f  beb00000 (-0.34375) 00000000 (0)  
41800000 (16) 00000000 (0) 00000000 (0)  ffffff0f  3f280000 (0.65625) 00000000 (0)  
41800000 (16) 41800000 (16) 00000000 (0)  ffffff0f  3f280000 (0.65625) 3f800000 (1)  
EFB copy 12 (00048036)
BP register BPMEM_EFB_TL
EFB Left: 0
EFB Top: 0

BP register BPMEM_EFB_WH
EFB Width: 16
EFB Height: 16

BP register BPMEM_MIPMAP_STRIDE (8)
No description available

BP register BPMEM_EFB_ADDR
EFB Target address (32 byte aligned): 0x10E24C0

BP register BPMEM_TRIGGER_EFB_COPY
Clamping: Top and Bottom
Converting from RGB to YUV: No
Target pixel format: RGBA8 (6)
Gamma correction: 1.0
Half scale: No
Vertical scaling: No
Clear: No
Frame to field: Progressive (0)
Copy to XFB: No
Intensity format: No
Automatic color conversion: Yes
Object 339 (000480b2)

Configured to clear to black.

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 41800000 (16) 00000000 (0)  000000ff  
00000000 (0) 00000000 (0) 00000000 (0)  000000ff  
41800000 (16) 00000000 (0) 00000000 (0)  000000ff  
41800000 (16) 41800000 (16) 00000000 (0)  000000ff  
Objects 340-352
Configuration (000480fa)

The TEV configuration is the same as object 270. The texture is EFB copy 12.

BP register BPMEM_TX_SETMODE0 Texture Unit 0
Wrap S: Clamp (0)
Wrap T: Clamp (0)
Mag filter: Linear (1)
Mipmap filter: None (0)
Min filter: Linear (1)
LOD type: Edge LOD (0)
LOD bias: 0 (0)
Max anisotropic filtering: 1 (0)
LOD/bias clamp: No

BP register BPMEM_TX_SETMODE1 Texture Unit 0
Min LOD: 0 (0)
Max LOD: 0 (0)

BP register BPMEM_TX_SETIMAGE0 Texture Unit 0
Width: 16
Height: 16
Format: RGBA8 (6)

BP register BPMEM_TX_SETIMAGE1 Texture Unit 0
Even TMEM Offset: 0
Even TMEM Width: 3
Even TMEM Height: 3
Cache is manually managed: No

BP register BPMEM_TX_SETIMAGE2 Texture Unit 0
Odd TMEM Offset: 4000
Odd TMEM Width: 3
Odd TMEM Height: 3

BP register BPMEM_TX_SETIMAGE3 Texture Unit 0
Source address (32 byte aligned): 0x10E24C0
Primitives (00048197)
Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 41800000 (16) 00000000 (0)  ffffff1b  00000000 (0) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff1b  00000000 (0) 00000000 (0)  
41800000 (16) 00000000 (0) 00000000 (0)  ffffff1b  3f800000 (1) 00000000 (0)  
41800000 (16) 41800000 (16) 00000000 (0)  ffffff1b  3f800000 (1) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 41800000 (16) 00000000 (0)  ffffff16  00000000 (0) 3f88cccd (1.06875)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff16  00000000 (0) 3d8ccccd (0.06875)  
41800000 (16) 00000000 (0) 00000000 (0)  ffffff16  3f800000 (1) 3d8ccccd (0.06875)  
41800000 (16) 41800000 (16) 00000000 (0)  ffffff16  3f800000 (1) 3f88cccd (1.06875)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 41800000 (16) 00000000 (0)  ffffff15  00000000 (0) 3f91999a (1.1375)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff15  00000000 (0) 3e0ccccd (0.1375)  
41800000 (16) 00000000 (0) 00000000 (0)  ffffff15  3f800000 (1) 3e0ccccd (0.1375)  
41800000 (16) 41800000 (16) 00000000 (0)  ffffff15  3f800000 (1) 3f91999a (1.1375)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 41800000 (16) 00000000 (0)  ffffff14  00000000 (0) 3f9a6666 (1.20625)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff14  00000000 (0) 3e533334 (0.20625)  
41800000 (16) 00000000 (0) 00000000 (0)  ffffff14  3f800000 (1) 3e533334 (0.20625)  
41800000 (16) 41800000 (16) 00000000 (0)  ffffff14  3f800000 (1) 3f9a6666 (1.20625)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 41800000 (16) 00000000 (0)  ffffff13  00000000 (0) 3fa33333 (1.275)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff13  00000000 (0) 3e8ccccd (0.275)  
41800000 (16) 00000000 (0) 00000000 (0)  ffffff13  3f800000 (1) 3e8ccccd (0.275)  
41800000 (16) 41800000 (16) 00000000 (0)  ffffff13  3f800000 (1) 3fa33333 (1.275)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 41800000 (16) 00000000 (0)  ffffff11  00000000 (0) 3fac0000 (1.34375)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff11  00000000 (0) 3eb00000 (0.34375)  
41800000 (16) 00000000 (0) 00000000 (0)  ffffff11  3f800000 (1) 3eb00000 (0.34375)  
41800000 (16) 41800000 (16) 00000000 (0)  ffffff11  3f800000 (1) 3fac0000 (1.34375)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 41800000 (16) 00000000 (0)  ffffff0f  00000000 (0) 3fb4cccd (1.4125)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff0f  00000000 (0) 3ed33334 (0.4125)  
41800000 (16) 00000000 (0) 00000000 (0)  ffffff0f  3f800000 (1) 3ed33334 (0.4125)  
41800000 (16) 41800000 (16) 00000000 (0)  ffffff0f  3f800000 (1) 3fb4cccd (1.4125)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 41800000 (16) 00000000 (0)  ffffff16  00000000 (0) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff16  00000000 (0) 80000000 (0)  
41800000 (16) 00000000 (0) 00000000 (0)  ffffff16  3f800000 (1) 80000000 (0)  
41800000 (16) 41800000 (16) 00000000 (0)  ffffff16  3f800000 (1) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 41800000 (16) 00000000 (0)  ffffff15  00000000 (0) 3f6e6666 (0.93125)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff15  00000000 (0) bd8ccccd (-0.06875)  
41800000 (16) 00000000 (0) 00000000 (0)  ffffff15  3f800000 (1) bd8ccccd (-0.06875)  
41800000 (16) 41800000 (16) 00000000 (0)  ffffff15  3f800000 (1) 3f6e6666 (0.93125)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 41800000 (16) 00000000 (0)  ffffff14  00000000 (0) 3f5ccccd (0.8625)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff14  00000000 (0) be0ccccd (-0.1375)  
41800000 (16) 00000000 (0) 00000000 (0)  ffffff14  3f800000 (1) be0ccccd (-0.1375)  
41800000 (16) 41800000 (16) 00000000 (0)  ffffff14  3f800000 (1) 3f5ccccd (0.8625)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 41800000 (16) 00000000 (0)  ffffff13  00000000 (0) 3f4b3333 (0.79375)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff13  00000000 (0) be533334 (-0.20625)  
41800000 (16) 00000000 (0) 00000000 (0)  ffffff13  3f800000 (1) be533334 (-0.20625)  
41800000 (16) 41800000 (16) 00000000 (0)  ffffff13  3f800000 (1) 3f4b3333 (0.79375)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 41800000 (16) 00000000 (0)  ffffff11  00000000 (0) 3f39999a (0.725)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff11  00000000 (0) be8ccccd (-0.275)  
41800000 (16) 00000000 (0) 00000000 (0)  ffffff11  3f800000 (1) be8ccccd (-0.275)  
41800000 (16) 41800000 (16) 00000000 (0)  ffffff11  3f800000 (1) 3f39999a (0.725)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 41800000 (16) 00000000 (0)  ffffff0f  00000000 (0) 3f280000 (0.65625)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff0f  00000000 (0) beb00000 (-0.34375)  
41800000 (16) 00000000 (0) 00000000 (0)  ffffff0f  3f800000 (1) beb00000 (-0.34375)  
41800000 (16) 41800000 (16) 00000000 (0)  ffffff0f  3f800000 (1) 3f280000 (0.65625)  
EFB copy 13 (00048746)
BP register BPMEM_EFB_TL
EFB Left: 0
EFB Top: 0

BP register BPMEM_EFB_WH
EFB Width: 16
EFB Height: 16

BP register BPMEM_MIPMAP_STRIDE (8)
No description available

BP register BPMEM_EFB_ADDR
EFB Target address (32 byte aligned): 0x10E24C0

BP register BPMEM_TRIGGER_EFB_COPY
Clamping: Top and Bottom
Converting from RGB to YUV: No
Target pixel format: RGBA8 (6)
Gamma correction: 1.0
Half scale: No
Vertical scaling: No
Clear: No
Frame to field: Progressive (0)
Copy to XFB: No
Intensity format: No
Automatic color conversion: Yes

The process is performed yet again, this time using a 16x16 area (but still starting with the 128x128 texture (EFB copy 7)). The step size is now 1.1/16 instead of 1.1/64.

Object 353 (000487c2)

Configured to clear to black.

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 43000000 (128) 00000000 (0)  000000ff  
00000000 (0) 00000000 (0) 00000000 (0)  000000ff  
43000000 (128) 00000000 (0) 00000000 (0)  000000ff  
43000000 (128) 43000000 (128) 00000000 (0)  000000ff  
Objects 354-366
Configuration (00048805)

The TEV configuration is the same as object 270. The texture is EFB copy 7.

BP register BPMEM_TX_SETMODE0 Texture Unit 0
Wrap S: Clamp (0)
Wrap T: Clamp (0)
Mag filter: Linear (1)
Mipmap filter: None (0)
Min filter: Linear (1)
LOD type: Edge LOD (0)
LOD bias: 0 (0)
Max anisotropic filtering: 1 (0)
LOD/bias clamp: No

BP register BPMEM_TX_SETMODE1 Texture Unit 0
Min LOD: 0 (0)
Max LOD: 0 (0)

BP register BPMEM_TX_SETIMAGE0 Texture Unit 0
Width: 128
Height: 128
Format: RGBA8 (6)

BP register BPMEM_TX_SETIMAGE1 Texture Unit 0
Even TMEM Offset: 0
Even TMEM Width: 3
Even TMEM Height: 3
Cache is manually managed: No

BP register BPMEM_TX_SETIMAGE2 Texture Unit 0
Odd TMEM Offset: 4000
Odd TMEM Width: 3
Odd TMEM Height: 3

BP register BPMEM_TX_SETIMAGE3 Texture Unit 0
Source address (32 byte aligned): 0x10CC380
Primitives (000488a7)
Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 43000000 (128) 00000000 (0)  ffffff1b  00000000 (0) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff1b  00000000 (0) 00000000 (0)  
43000000 (128) 00000000 (0) 00000000 (0)  ffffff1b  3f800000 (1) 00000000 (0)  
43000000 (128) 43000000 (128) 00000000 (0)  ffffff1b  3f800000 (1) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 43000000 (128) 00000000 (0)  ffffff16  3c0ccccd (0.00859375) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff16  3c0ccccd (0.00859375) 00000000 (0)  
43000000 (128) 00000000 (0) 00000000 (0)  ffffff16  3f81199a (1.00859) 00000000 (0)  
43000000 (128) 43000000 (128) 00000000 (0)  ffffff16  3f81199a (1.00859) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 43000000 (128) 00000000 (0)  ffffff15  3c8ccccd (0.0171875) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff15  3c8ccccd (0.0171875) 00000000 (0)  
43000000 (128) 00000000 (0) 00000000 (0)  ffffff15  3f823333 (1.01719) 00000000 (0)  
43000000 (128) 43000000 (128) 00000000 (0)  ffffff15  3f823333 (1.01719) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 43000000 (128) 00000000 (0)  ffffff14  3cd33334 (0.0257813) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff14  3cd33334 (0.0257813) 00000000 (0)  
43000000 (128) 00000000 (0) 00000000 (0)  ffffff14  3f834ccd (1.02578) 00000000 (0)  
43000000 (128) 43000000 (128) 00000000 (0)  ffffff14  3f834ccd (1.02578) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 43000000 (128) 00000000 (0)  ffffff13  3d0ccccd (0.034375) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff13  3d0ccccd (0.034375) 00000000 (0)  
43000000 (128) 00000000 (0) 00000000 (0)  ffffff13  3f846666 (1.03437) 00000000 (0)  
43000000 (128) 43000000 (128) 00000000 (0)  ffffff13  3f846666 (1.03437) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 43000000 (128) 00000000 (0)  ffffff11  3d300000 (0.0429688) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff11  3d300000 (0.0429688) 00000000 (0)  
43000000 (128) 00000000 (0) 00000000 (0)  ffffff11  3f858000 (1.04297) 00000000 (0)  
43000000 (128) 43000000 (128) 00000000 (0)  ffffff11  3f858000 (1.04297) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 43000000 (128) 00000000 (0)  ffffff0f  3d533334 (0.0515625) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff0f  3d533334 (0.0515625) 00000000 (0)  
43000000 (128) 00000000 (0) 00000000 (0)  ffffff0f  3f86999a (1.05156) 00000000 (0)  
43000000 (128) 43000000 (128) 00000000 (0)  ffffff0f  3f86999a (1.05156) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 43000000 (128) 00000000 (0)  ffffff16  80000000 (0) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff16  80000000 (0) 00000000 (0)  
43000000 (128) 00000000 (0) 00000000 (0)  ffffff16  3f800000 (1) 00000000 (0)  
43000000 (128) 43000000 (128) 00000000 (0)  ffffff16  3f800000 (1) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 43000000 (128) 00000000 (0)  ffffff15  bc0ccccd (-0.00859375) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff15  bc0ccccd (-0.00859375) 00000000 (0)  
43000000 (128) 00000000 (0) 00000000 (0)  ffffff15  3f7dcccd (0.991406) 00000000 (0)  
43000000 (128) 43000000 (128) 00000000 (0)  ffffff15  3f7dcccd (0.991406) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 43000000 (128) 00000000 (0)  ffffff14  bc8ccccd (-0.0171875) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff14  bc8ccccd (-0.0171875) 00000000 (0)  
43000000 (128) 00000000 (0) 00000000 (0)  ffffff14  3f7b999a (0.982813) 00000000 (0)  
43000000 (128) 43000000 (128) 00000000 (0)  ffffff14  3f7b999a (0.982813) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 43000000 (128) 00000000 (0)  ffffff13  bcd33334 (-0.0257813) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff13  bcd33334 (-0.0257813) 00000000 (0)  
43000000 (128) 00000000 (0) 00000000 (0)  ffffff13  3f796666 (0.974219) 00000000 (0)  
43000000 (128) 43000000 (128) 00000000 (0)  ffffff13  3f796666 (0.974219) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 43000000 (128) 00000000 (0)  ffffff11  bd0ccccd (-0.034375) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff11  bd0ccccd (-0.034375) 00000000 (0)  
43000000 (128) 00000000 (0) 00000000 (0)  ffffff11  3f773333 (0.965625) 00000000 (0)  
43000000 (128) 43000000 (128) 00000000 (0)  ffffff11  3f773333 (0.965625) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 43000000 (128) 00000000 (0)  ffffff0f  bd300000 (-0.0429688) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff0f  bd300000 (-0.0429688) 00000000 (0)  
43000000 (128) 00000000 (0) 00000000 (0)  ffffff0f  3f750000 (0.957031) 00000000 (0)  
43000000 (128) 43000000 (128) 00000000 (0)  ffffff0f  3f750000 (0.957031) 3f800000 (1)  
EFB copy 14 (00048e56)
BP register BPMEM_EFB_TL
EFB Left: 0
EFB Top: 0

BP register BPMEM_EFB_WH
EFB Width: 128
EFB Height: 128

BP register BPMEM_MIPMAP_STRIDE (40)
No description available

BP register BPMEM_EFB_ADDR
EFB Target address (32 byte aligned): 0x10CC380

BP register BPMEM_TRIGGER_EFB_COPY
Clamping: Top and Bottom
Converting from RGB to YUV: No
Target pixel format: RGBA8 (6)
Gamma correction: 1.0
Half scale: No
Vertical scaling: No
Clear: No
Frame to field: Progressive (0)
Copy to XFB: No
Intensity format: No
Automatic color conversion: Yes
Object 367 (00048ed2)

Configured to clear to black.

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 43000000 (128) 00000000 (0)  000000ff  
00000000 (0) 00000000 (0) 00000000 (0)  000000ff  
43000000 (128) 00000000 (0) 00000000 (0)  000000ff  
43000000 (128) 43000000 (128) 00000000 (0)  000000ff  
Objects 368-380
Configuration (00048f1a)

The TEV configuration is the same as object 270. The texture is EFB copy 14.

BP register BPMEM_TX_SETMODE0 Texture Unit 0
Wrap S: Clamp (0)
Wrap T: Clamp (0)
Mag filter: Linear (1)
Mipmap filter: None (0)
Min filter: Linear (1)
LOD type: Edge LOD (0)
LOD bias: 0 (0)
Max anisotropic filtering: 1 (0)
LOD/bias clamp: No

BP register BPMEM_TX_SETMODE1 Texture Unit 0
Min LOD: 0 (0)
Max LOD: 0 (0)

BP register BPMEM_TX_SETIMAGE0 Texture Unit 0
Width: 128
Height: 128
Format: RGBA8 (6)

BP register BPMEM_TX_SETIMAGE1 Texture Unit 0
Even TMEM Offset: 0
Even TMEM Width: 3
Even TMEM Height: 3
Cache is manually managed: No

BP register BPMEM_TX_SETIMAGE2 Texture Unit 0
Odd TMEM Offset: 4000
Odd TMEM Width: 3
Odd TMEM Height: 3

BP register BPMEM_TX_SETIMAGE3 Texture Unit 0
Source address (32 byte aligned): 0x10CC380
Primitives (00048fb7)
Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 43000000 (128) 00000000 (0)  ffffff1b  00000000 (0) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff1b  00000000 (0) 00000000 (0)  
43000000 (128) 00000000 (0) 00000000 (0)  ffffff1b  3f800000 (1) 00000000 (0)  
43000000 (128) 43000000 (128) 00000000 (0)  ffffff1b  3f800000 (1) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 43000000 (128) 00000000 (0)  ffffff16  00000000 (0) 3f81199a (1.00859)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff16  00000000 (0) 3c0ccccd (0.00859375)  
43000000 (128) 00000000 (0) 00000000 (0)  ffffff16  3f800000 (1) 3c0ccccd (0.00859375)  
43000000 (128) 43000000 (128) 00000000 (0)  ffffff16  3f800000 (1) 3f81199a (1.00859)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 43000000 (128) 00000000 (0)  ffffff15  00000000 (0) 3f823333 (1.01719)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff15  00000000 (0) 3c8ccccd (0.0171875)  
43000000 (128) 00000000 (0) 00000000 (0)  ffffff15  3f800000 (1) 3c8ccccd (0.0171875)  
43000000 (128) 43000000 (128) 00000000 (0)  ffffff15  3f800000 (1) 3f823333 (1.01719)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 43000000 (128) 00000000 (0)  ffffff14  00000000 (0) 3f834ccd (1.02578)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff14  00000000 (0) 3cd33334 (0.0257813)  
43000000 (128) 00000000 (0) 00000000 (0)  ffffff14  3f800000 (1) 3cd33334 (0.0257813)  
43000000 (128) 43000000 (128) 00000000 (0)  ffffff14  3f800000 (1) 3f834ccd (1.02578)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 43000000 (128) 00000000 (0)  ffffff13  00000000 (0) 3f846666 (1.03437)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff13  00000000 (0) 3d0ccccd (0.034375)  
43000000 (128) 00000000 (0) 00000000 (0)  ffffff13  3f800000 (1) 3d0ccccd (0.034375)  
43000000 (128) 43000000 (128) 00000000 (0)  ffffff13  3f800000 (1) 3f846666 (1.03437)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 43000000 (128) 00000000 (0)  ffffff11  00000000 (0) 3f858000 (1.04297)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff11  00000000 (0) 3d300000 (0.0429688)  
43000000 (128) 00000000 (0) 00000000 (0)  ffffff11  3f800000 (1) 3d300000 (0.0429688)  
43000000 (128) 43000000 (128) 00000000 (0)  ffffff11  3f800000 (1) 3f858000 (1.04297)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 43000000 (128) 00000000 (0)  ffffff0f  00000000 (0) 3f86999a (1.05156)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff0f  00000000 (0) 3d533334 (0.0515625)  
43000000 (128) 00000000 (0) 00000000 (0)  ffffff0f  3f800000 (1) 3d533334 (0.0515625)  
43000000 (128) 43000000 (128) 00000000 (0)  ffffff0f  3f800000 (1) 3f86999a (1.05156)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 43000000 (128) 00000000 (0)  ffffff16  00000000 (0) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff16  00000000 (0) 80000000 (0)  
43000000 (128) 00000000 (0) 00000000 (0)  ffffff16  3f800000 (1) 80000000 (0)  
43000000 (128) 43000000 (128) 00000000 (0)  ffffff16  3f800000 (1) 3f800000 (1)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 43000000 (128) 00000000 (0)  ffffff15  00000000 (0) 3f7dcccd (0.991406)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff15  00000000 (0) bc0ccccd (-0.00859375)  
43000000 (128) 00000000 (0) 00000000 (0)  ffffff15  3f800000 (1) bc0ccccd (-0.00859375)  
43000000 (128) 43000000 (128) 00000000 (0)  ffffff15  3f800000 (1) 3f7dcccd (0.991406)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 43000000 (128) 00000000 (0)  ffffff14  00000000 (0) 3f7b999a (0.982813)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff14  00000000 (0) bc8ccccd (-0.0171875)  
43000000 (128) 00000000 (0) 00000000 (0)  ffffff14  3f800000 (1) bc8ccccd (-0.0171875)  
43000000 (128) 43000000 (128) 00000000 (0)  ffffff14  3f800000 (1) 3f7b999a (0.982813)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 43000000 (128) 00000000 (0)  ffffff13  00000000 (0) 3f796666 (0.974219)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff13  00000000 (0) bcd33334 (-0.0257813)  
43000000 (128) 00000000 (0) 00000000 (0)  ffffff13  3f800000 (1) bcd33334 (-0.0257813)  
43000000 (128) 43000000 (128) 00000000 (0)  ffffff13  3f800000 (1) 3f796666 (0.974219)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 43000000 (128) 00000000 (0)  ffffff11  00000000 (0) 3f773333 (0.965625)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff11  00000000 (0) bd0ccccd (-0.034375)  
43000000 (128) 00000000 (0) 00000000 (0)  ffffff11  3f800000 (1) bd0ccccd (-0.034375)  
43000000 (128) 43000000 (128) 00000000 (0)  ffffff11  3f800000 (1) 3f773333 (0.965625)  

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 43000000 (128) 00000000 (0)  ffffff0f  00000000 (0) 3f750000 (0.957031)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff0f  00000000 (0) bd300000 (-0.0429688)  
43000000 (128) 00000000 (0) 00000000 (0)  ffffff0f  3f800000 (1) bd300000 (-0.0429688)  
43000000 (128) 43000000 (128) 00000000 (0)  ffffff0f  3f800000 (1) 3f750000 (0.957031)  
EFB copy 15 (00049566)
BP register BPMEM_EFB_TL
EFB Left: 0
EFB Top: 0

BP register BPMEM_EFB_WH
EFB Width: 128
EFB Height: 128

BP register BPMEM_MIPMAP_STRIDE (40)
No description available

BP register BPMEM_EFB_ADDR
EFB Target address (32 byte aligned): 0x10CC380

BP register BPMEM_TRIGGER_EFB_COPY
Clamping: Top and Bottom
Converting from RGB to YUV: No
Target pixel format: RGBA8 (6)
Gamma correction: 1.0
Half scale: No
Vertical scaling: No
Clear: No
Frame to field: Progressive (0)
Copy to XFB: No
Intensity format: No
Automatic color conversion: Yes

The process is performed one final time, now time using a 128x128 area (and still the 128x128 texture from EFB copy 7). The step size is now 1.1/128 instead of 1.1/64.

Now, there are several blurred textures based on the content of the screen that was bright, in various dimensions: 64x64 (EFB copy 9), 32x32 (EFB copy 11), 16x16 (EFB copy 13), and 128x128 (EFB copy 15). Although this order might seem odd, doing the 128x128 version last makes sense: it is able to re-use the memory originally used by EFB copy 7, as nothing else will rely on it after that point. (The others, however, could be in any order; it could have also been done as 16x16, 32x32, 64x64, 128x128 with no immediately apparent downsides.)

Final bloom step

Object 381 (000495e2)

Configured to clear to black.

Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 43000000 (128) 00000000 (0)  000000ff  
00000000 (0) 00000000 (0) 00000000 (0)  000000ff  
43000000 (128) 00000000 (0) 00000000 (0)  000000ff  
43000000 (128) 43000000 (128) 00000000 (0)  000000ff  
Object 382
Configuration (0004962a)

The TEV configuration is the same as object 270. The texture is EFB copy 15.

BP register BPMEM_TX_SETMODE0 Texture Unit 0
Wrap S: Clamp (0)
Wrap T: Clamp (0)
Mag filter: Linear (1)
Mipmap filter: None (0)
Min filter: Linear (1)
LOD type: Edge LOD (0)
LOD bias: 0 (0)
Max anisotropic filtering: 1 (0)
LOD/bias clamp: No

BP register BPMEM_TX_SETMODE1 Texture Unit 0
Min LOD: 0 (0)
Max LOD: 0 (0)

BP register BPMEM_TX_SETIMAGE0 Texture Unit 0
Width: 128
Height: 128
Format: RGBA8 (6)

BP register BPMEM_TX_SETIMAGE1 Texture Unit 0
Even TMEM Offset: 0
Even TMEM Width: 3
Even TMEM Height: 3
Cache is manually managed: No

BP register BPMEM_TX_SETIMAGE2 Texture Unit 0
Odd TMEM Offset: 4000
Odd TMEM Width: 3
Odd TMEM Height: 3

BP register BPMEM_TX_SETIMAGE3 Texture Unit 0
Source address (32 byte aligned): 0x10CC380
Primitive data (000496c7)
Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 43000000 (128) 00000000 (0)  fffffff6  00000000 (0) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  fffffff6  00000000 (0) 00000000 (0)  
43000000 (128) 00000000 (0) 00000000 (0)  fffffff6  3f800000 (1) 00000000 (0)  
43000000 (128) 43000000 (128) 00000000 (0)  fffffff6  3f800000 (1) 3f800000 (1)  
Object 383
Configuration (0004972a)

The TEV configuration is the same as object 270. The texture is EFB copy 9.

BP register BPMEM_TX_SETMODE0 Texture Unit 0
Wrap S: Clamp (0)
Wrap T: Clamp (0)
Mag filter: Linear (1)
Mipmap filter: None (0)
Min filter: Linear (1)
LOD type: Edge LOD (0)
LOD bias: 0 (0)
Max anisotropic filtering: 1 (0)
LOD/bias clamp: No

BP register BPMEM_TX_SETMODE1 Texture Unit 0
Min LOD: 0 (0)
Max LOD: 0 (0)

BP register BPMEM_TX_SETIMAGE0 Texture Unit 0
Width: 64
Height: 64
Format: RGBA8 (6)

BP register BPMEM_TX_SETIMAGE1 Texture Unit 0
Even TMEM Offset: 0
Even TMEM Width: 3
Even TMEM Height: 3
Cache is manually managed: No

BP register BPMEM_TX_SETIMAGE2 Texture Unit 0
Odd TMEM Offset: 4000
Odd TMEM Width: 3
Odd TMEM Height: 3

BP register BPMEM_TX_SETIMAGE3 Texture Unit 0
Source address (32 byte aligned): 0x10DC940
Primitive data (00049760)
Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 43000000 (128) 00000000 (0)  fffffff6  00000000 (0) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  fffffff6  00000000 (0) 00000000 (0)  
43000000 (128) 00000000 (0) 00000000 (0)  fffffff6  3f800000 (1) 00000000 (0)  
43000000 (128) 43000000 (128) 00000000 (0)  fffffff6  3f800000 (1) 3f800000 (1)  
Object 384
Configuration (000497c3)

The TEV configuration is the same as object 270. The texture is EFB copy 11.

BP register BPMEM_TX_SETMODE0 Texture Unit 0
Wrap S: Clamp (0)
Wrap T: Clamp (0)
Mag filter: Linear (1)
Mipmap filter: None (0)
Min filter: Linear (1)
LOD type: Edge LOD (0)
LOD bias: 0 (0)
Max anisotropic filtering: 1 (0)
LOD/bias clamp: No

BP register BPMEM_TX_SETMODE1 Texture Unit 0
Min LOD: 0 (0)
Max LOD: 0 (0)

BP register BPMEM_TX_SETIMAGE0 Texture Unit 0
Width: 32
Height: 32
Format: RGBA8 (6)

BP register BPMEM_TX_SETIMAGE1 Texture Unit 0
Even TMEM Offset: 0
Even TMEM Width: 3
Even TMEM Height: 3
Cache is manually managed: No

BP register BPMEM_TX_SETIMAGE2 Texture Unit 0
Odd TMEM Offset: 4000
Odd TMEM Width: 3
Odd TMEM Height: 3

BP register BPMEM_TX_SETIMAGE3 Texture Unit 0
Source address (32 byte aligned): 0x10E0F00
Primitive data (000497f9)
Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 43000000 (128) 00000000 (0)  fffffff6  00000000 (0) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  fffffff6  00000000 (0) 00000000 (0)  
43000000 (128) 00000000 (0) 00000000 (0)  fffffff6  3f800000 (1) 00000000 (0)  
43000000 (128) 43000000 (128) 00000000 (0)  fffffff6  3f800000 (1) 3f800000 (1)  
Object 385
Configuration (0004985c)

The TEV configuration is the same as object 270. The texture is EFB copy 13.

BP register BPMEM_TX_SETMODE0 Texture Unit 0
Wrap S: Clamp (0)
Wrap T: Clamp (0)
Mag filter: Linear (1)
Mipmap filter: None (0)
Min filter: Linear (1)
LOD type: Edge LOD (0)
LOD bias: 0 (0)
Max anisotropic filtering: 1 (0)
LOD/bias clamp: No

BP register BPMEM_TX_SETMODE1 Texture Unit 0
Min LOD: 0 (0)
Max LOD: 0 (0)

BP register BPMEM_TX_SETIMAGE0 Texture Unit 0
Width: 16
Height: 16
Format: RGBA8 (6)

BP register BPMEM_TX_SETIMAGE1 Texture Unit 0
Even TMEM Offset: 0
Even TMEM Width: 3
Even TMEM Height: 3
Cache is manually managed: No

BP register BPMEM_TX_SETIMAGE2 Texture Unit 0
Odd TMEM Offset: 4000
Odd TMEM Width: 3
Odd TMEM Height: 3

BP register BPMEM_TX_SETIMAGE3 Texture Unit 0
Source address (32 byte aligned): 0x10E24C0
Primitive data (00049892)
BP register BPMEM_TX_SETMODE0 Texture Unit 0
Wrap S: Clamp (0)
Wrap T: Clamp (0)
Mag filter: Linear (1)
Mipmap filter: None (0)
Min filter: Linear (1)
LOD type: Edge LOD (0)
LOD bias: 0 (0)
Max anisotropic filtering: 1 (0)
LOD/bias clamp: No

BP register BPMEM_TX_SETMODE1 Texture Unit 0
Min LOD: 0 (0)
Max LOD: 0 (0)

BP register BPMEM_TX_SETIMAGE0 Texture Unit 0
Width: 16
Height: 16
Format: RGBA8 (6)

BP register BPMEM_TX_SETIMAGE1 Texture Unit 0
Even TMEM Offset: 0
Even TMEM Width: 3
Even TMEM Height: 3
Cache is manually managed: No

BP register BPMEM_TX_SETIMAGE2 Texture Unit 0
Odd TMEM Offset: 4000
Odd TMEM Width: 3
Odd TMEM Height: 3

BP register BPMEM_TX_SETIMAGE3 Texture Unit 0
Source address (32 byte aligned): 0x10E24C0
EFB copy 16 (000498f5)
BP register BPMEM_EFB_TL
EFB Left: 0
EFB Top: 0

BP register BPMEM_EFB_WH
EFB Width: 128
EFB Height: 128

BP register BPMEM_MIPMAP_STRIDE
No description available

BP register BPMEM_EFB_ADDR
EFB Target address (32 byte aligned): 0x10CC380

BP register BPMEM_TRIGGER_EFB_COPY
Clamping: Top and Bottom
Converting from RGB to YUV: No
Target pixel format: RGBA8 (6)
Gamma correction: 1.0
Half scale: No
Vertical scaling: No
Clear: No
Frame to field: Progressive (0)
Copy to XFB: No
Intensity format: No
Automatic color conversion: Yes

As a final step, all 4 of those blurred textures are additively blended together atop a black background (with an alpha value of 0xf6 (about 96%) each, which makes the result a little bit darker than it would be at 100%, but the brightness is still increased fairly significantly). This then becomes EFB copy 16.

Object 368
TEV configuration (00049927)
BP register BPMEM_BLENDMODE
Enable: No
Logic ops: No
Dither: Yes
Color write: Yes
Alpha write: Yes
Dest factor: 0 (0)
Source factor: 1 (1)
Subtract: No
Logic mode: Clear (0) (0)

BP register BPMEM_TEV_COLOR_ENV Tev stage 0
dest.rgb = tex.rgb*ras.rgb

a: ZERO (15)
b: ras.rgb (10)
c: tex.rgb (8)
d: ZERO (15)
Bias: 0 (0)
Op: Add (0) / Comparison: Greater than (0)
Clamp: Yes
Scale factor: 1 (0) / Compare mode: R8 (0)
Dest: prev (0)

BP register BPMEM_TEV_ALPHA_ENV Tev stage 0
dest.a = tex.a*ras.a

a: ZERO (7)
b: ras (5)
c: tex (4)
d: ZERO (7)
Bias: 0 (0)
Op: Add (0) / Comparison: Greater than (0)
Clamp: Yes
Scale factor: 1 (0) / Compare mode: R8 (0)
Dest: prev (0)
Ras sel: 0
Tex sel: 0
Texture configuration (0004996d)

The texture is EFB copy 6.

BP register BPMEM_TX_SETMODE0 Texture Unit 0
Wrap S: Clamp (0)
Wrap T: Clamp (0)
Mag filter: Near (0)
Mipmap filter: None (0)
Min filter: Near (0)
LOD type: Edge LOD (0)
LOD bias: 0 (0)
Max anisotropic filtering: 1 (0)
LOD/bias clamp: No

BP register BPMEM_TX_SETMODE1 Texture Unit 0
Min LOD: 0 (0)
Max LOD: 0 (0)

BP register BPMEM_TX_SETIMAGE0 Texture Unit 0
Width: 320
Height: 228
Format: RGBA8 (6)

BP register BPMEM_TX_SETIMAGE1 Texture Unit 0
Even TMEM Offset: 0
Even TMEM Width: 3
Even TMEM Height: 3
Cache is manually managed: No

BP register BPMEM_TX_SETIMAGE2 Texture Unit 0
Odd TMEM Offset: 4000
Odd TMEM Width: 3
Odd TMEM Height: 3

BP register BPMEM_TX_SETIMAGE3 Texture Unit 0
Source address (32 byte aligned): 0x10108A0
Primitive data (000499a3)
Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 43640000 (228) 00000000 (0)  ffffffff  00000000 (0) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffffff  00000000 (0) 00000000 (0)  
43a00000 (320) 00000000 (0) 00000000 (0)  ffffffff  3f800000 (1) 00000000 (0)  
43a00000 (320) 43640000 (228) 00000000 (0)  ffffffff  3f800000 (1) 3f800000 (1)  
Object 387
TEV configuration (00049a06 and 00049a33)
BP register BPMEM_BLENDMODE
Enable: Yes
Logic ops: No
Dither: Yes
Color write: Yes
Alpha write: Yes
Dest factor: 1 (1)
Source factor: src_alpha (4)
Subtract: No
Logic mode: Clear (0) (0)

BP register BPMEM_TEV_ALPHA_ENV Tev stage 0
dest.a = ras.a*tex.a

a: ZERO (7)
b: tex (4)
c: ras (5)
d: ZERO (7)
Bias: 0 (0)
Op: Add (0) / Comparison: Greater than (0)
Clamp: Yes
Scale factor: 1 (0) / Compare mode: R8 (0)
Dest: prev (0)
Ras sel: 0
Tex sel: 0

BP register BPMEM_TEV_COLOR_ENV Tev stage 0
dest.rgb = (ras.rgb*tex.rgb) * 4

a: ZERO (15)
b: tex.rgb (8)
c: ras.rgb (10)
d: ZERO (15)
Bias: 0 (0)
Op: Add (0) / Comparison: Greater than (0)
Clamp: Yes
Scale factor: 4 (2) / Compare mode: BGR24 (2)
Dest: prev (0)
Texture configuration (00049a0b)

The texture is EFB copy 16.

BP register BPMEM_TX_SETMODE0 Texture Unit 0
Wrap S: Clamp (0)
Wrap T: Clamp (0)
Mag filter: Linear (1)
Mipmap filter: None (0)
Min filter: Linear (1)
LOD type: Edge LOD (0)
LOD bias: 0 (0)
Max anisotropic filtering: 1 (0)
LOD/bias clamp: No

BP register BPMEM_TX_SETMODE1 Texture Unit 0
Min LOD: 0 (0)
Max LOD: 0 (0)

BP register BPMEM_TX_SETIMAGE0 Texture Unit 0
Width: 128
Height: 128
Format: RGBA8 (6)

BP register BPMEM_TX_SETIMAGE1 Texture Unit 0
Even TMEM Offset: 0
Even TMEM Width: 3
Even TMEM Height: 3
Cache is manually managed: No

BP register BPMEM_TX_SETIMAGE2 Texture Unit 0
Odd TMEM Offset: 4000
Odd TMEM Width: 3
Odd TMEM Height: 3

BP register BPMEM_TX_SETIMAGE3 Texture Unit 0
Source address (32 byte aligned): 0x10CC380
Primitive data (00049a63)
Primitive GX_DRAW_QUADS (0) VAT 2

00000000 (0) 43e40000 (456) 00000000 (0)  ffffff4c  00000000 (0) 3f800000 (1)  
00000000 (0) 00000000 (0) 00000000 (0)  ffffff4c  00000000 (0) 00000000 (0)  
44200000 (640) 00000000 (0) 00000000 (0)  ffffff4c  3f800000 (1) 00000000 (0)  
44200000 (640) 43e40000 (456) 00000000 (0)  ffffff4c  3f800000 (1) 3f800000 (1)  

The top-left of the screen is then restored (using EFB copy 6). Following that, the bloom effect is drawn over the screen using additive blending. However, the TEV is configured to multiply rgb values by 4 here (see Z_EFB_copy_16_bad_multiply.png), and those values are still clamped into the range of 0-1 (0-0xff). The drawing also has alpha enabled, which results in the brightness being reduced when blending; here, alpha is set to 0x4c (a bit over a fourth), mostly canceling out the multiplication by 4 earlier (see Z_EFB_copy_16_multiply_divide.png).

After that, the HUD is drawn, and then the game is finished rendering. The end result is in Z_Final.png.

White screens

The original bug report (12763) wasn't about broken bloom in general, though. As bad as the broken version of the effect looks in these examples, there are also cases where the screen becomes completely white and it is impossible to see anything.

On a seemingly-unrelated note, there are several magic numbers throughout this bloom process: the initial konst color of #7a7a7a, the offset of 1.1 during the blurring process, the alpha values during the blurring process, the alpha value of 0xf6 when combining the blurred textures, and the alpha value of 0x4c when drawing the final texture over the screen. These all seem somewhat arbitrary, don't they?

It turns out that the game uses different values during different situations. In the problematic fifolog in that issue (White_Screen_Rygar_Battle_of_Argus.zip), the konst color is instead #ffffff, the blurring alpha is 0x6a, an the final alpha is 0xff (the blurring process seems to be unchanged). Since the konst color is 0xff, and any intensity value is between 0 and 0xff (as they're between 16 and 235), subtracting the konst color from intensity always results in black, so EFB copy 7 and everything after it are completely black. So under normal operation, the bloom effect is effectively disabled in that scene. However, with Dolphin's bug, EFB copy 7 instead got what was already on the screen, and the rest of the bloom effect continued as normal... except that the final alpha configuration of 0xff instead of 0x4c means there is no equivalent to the final division by 4, so the end result is extremely bright, completely washing everything out when the additive blending is applied. (If freelook is used so that the top-left of the screen is looking at something dark (such as the black void that is seen when looking up), then the rest of the game can be seen rendering properly behind this bloom.

Presumably, the game turned off the bloom effect here because it is an outdoors (or at least well-lit) area, and applying bloom to it would be somewhat silly (though in this case, it isn't bright enough for the original intensity value of 0x7a to actually do anything). Presumably, the game's designers adjusted the bloom configuration for different areas to give ideal results.

It's somewhat odd that the game disables the bloom effect this way. I initially assumed that the bloom effect was broken (and the game was trying to subtract intensity from the color, which would work if clamping weren't enabled); since I have been working only off of fifologs of the game, I didn't know that it was configured differently elsewhere. It's a bit of a performance loss to run the bloom logic in situations where it should always do nothing, but I don't think the bloom effect is that expensive performance-wise either.

@TryTwo
Copy link

TryTwo commented Mar 20, 2022

This is a really interesting write-up! I have no idea how to follow the graphics engine like you did. Is half scale always properly picked up in TextureCacheBase on roughly line 2100 "scalebyhalf"? Or can it pop up elsewhere? I haven't seen scalebyhalf on most bloom stuff.

I thought you might be able to detect bloom by looking for a pair of mirrored/orthogonal offsets being used, but it seems like games can do the offset in various ways, I think Xenoblade sends a float in a vertex call, which is a percentage offset distance. Not an expert though. There are also blur algos for detecting blurred images, but that seemed like overkill.

@Pokechu22
Copy link
Author

Is half scale always properly picked up in TextureCacheBase on roughly line 2100 "scalebyhalf"?

Yes, see this line. (It's only set for EFB copies, and not XFB copies, but XFB copies aren't used for anything other than the final copy to the screen, so that doesn't matter).

I have no idea how to follow the graphics engine like you did.

Use Tools → FIFO Player, and load a DFF file (you can record one during normal emulation with the FIFO player and then play it back when emulation is not already running, or download one from various bug reports). The analyze tab lists all of the graphics commands, but actually understanding what they're doing is a lot harder (the easiest way is to look at how Dolphin uses those values in the software renderer, since the software renderer directly uses graphics registers instead of the values being used to compile a shader with several layers of indirection).

I thought you might be able to detect bloom by looking for a pair of mirrored/orthogonal offsets being used, but it seems like games can do the offset in various ways

I think that is indeed what you would need to do, but games do indeed do things wrong (e.g. here it does (0, 0) and (-0, 0) and ends at (6.6, 0) and (-5.5, 0), which isn't properly mirrored), and I'm guessing many other games do things that are technically wrong but aren't noticeable normally.

There are also blur algos for detecting blurred images, but that seemed like overkill.

I don't think that would even work, since the algorithm would be detecting images that are properly blurred, while when bloom fails at higher resolutions the blurring stops working properly.

@TryTwo
Copy link

TryTwo commented Mar 20, 2022

Software renderer sounds like a great place to start.

There was also an idea of not downscaling bloom, but rather applying gaussian blur to the upscaled image with a strength related to the IR. I couldn't figure out where to even inject something like that, unfortunately. Would still need to identify bloom copies so you dont blur the wrong thing.

@TryTwo
Copy link

TryTwo commented May 2, 2022

Hey @Pokechu22 do you know where these texture coord offsets are picked up and used in dolphin for normal backends? Or are they pretty much just passed to the GPU?

@Pokechu22
Copy link
Author

It depends on what the game is doing, but here, the offsets are just supplied by the game (on the emulated CPU) as part of the vertex data, if I recall correctly.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment