GX Default TMEM configuration
Description
The GXInit function defines the default memory map for the TMEM (embedded texture memory) and allocates areas for the texture cache and texture look up table (TLUT). After that, unless the user changes the mapping method, the region for cache used for texture mapping called by the GXLoadTexObj function will be decided according to this default memory map.
This default memory map uses the first half of the 1MB TMEM (the address of which corresponds to 0x00000-0x7FFFF, known as the Low Memory Bank) as sixteen 32KB cache areas. The region that corresponds to the second half of the addresses, 0x80000-0xFFFFF, is divided into two parts: 0x80000-0xBFFFF is used as eight 32-KB cache areas, whereas 0xC0000-0xFFFFF is used as the TLUT area for CI textures.
When a texture is used, one of these cache areas will be allocated. There are three factors that decide how to allocate the areas.
- Texture map ID (
GX_TEXMAP0, GX_TEXMAP1, ...)
- Texture Format
- Mipmapped or non-mipmapped
There are three types of texture formats: CI textures, RGBA8 (32-bit) textures, and others (normal). The following indicates how the area would be used in each case:
Normal, Mipmap OFF:
For normal textures (non-CI, non-RGBA8), only one area that corresponds to each map ID in the Low Memory Bank will be used for each texture.
|
0x00000-0x07FFF |
0x08000-0x0FFFF |
0x10000-0x17FFF |
0x18000-0x1FFFF |
0x20000-0x27FFF |
0x28000-0x2FFFF |
0x30000-0x37FFF |
0x38000-0x3FFFF |
0x40000-0x47FFF |
0x48000-0x4FFFF |
0x50000-0x57FFF |
0x58000-0x5FFFF |
0x60000-0x67FFF |
0x68000-0x6FFFF |
0x70000-0x77FFF |
0x78000-0x7FFFF |
|
Low Memory Bank |
GX_TEXMAP0 |
|
GX_TEXMAP1 |
|
GX_TEXMAP2 |
|
GX_TEXMAP3 |
|
GX_TEXMAP4 |
|
GX_TEXMAP5 |
|
GX_TEXMAP6 |
|
GX_TEXMAP7 |
|
|
|
|
|
0x80000-0x87FFF |
0x88000-0x8FFFF |
0x90000-0x97FFF |
0x98000-0x9FFFF |
0xA0000-0xA7FFF |
0xA8000-0xAFFFF |
0xB0000-0xB7FFF |
0xB8000-0xBFFFF |
|
|
|
0xC0000-0xFFFFF |
|
|
|
|
|
Normal, Mipmap ON:
For a normal mipmapped texture, two cache areas for the even and odd LODs need to be allocated. Each needs to be located in Low and High Memory Banks separately, so they will be allocated like the following:
|
0x00000-0x07FFF |
0x08000-0x0FFFF |
0x10000-0x17FFF |
0x18000-0x1FFFF |
0x20000-0x27FFF |
0x28000-0x2FFFF |
0x30000-0x37FFF |
0x38000-0x3FFFF |
0x40000-0x47FFF |
0x48000-0x4FFFF |
0x50000-0x57FFF |
0x58000-0x5FFFF |
0x60000-0x67FFF |
0x68000-0x6FFFF |
0x70000-0x77FFF |
0x78000-0x7FFFF |
|
Low Memory Bank |
GX_TEXMAP0(EVEN) |
|
GX_TEXMAP1 (ODD) |
|
GX_TEXMAP2(EVEN) |
|
GX_TEXMAP3 (ODD) |
|
GX_TEXMAP4(EVEN) |
|
GX_TEXMAP5 (ODD) |
|
GX_TEXMAP6(EVEN) |
|
GX_TEXMAP7 (ODD) |
|
|
|
High Memory Bank |
GX_TEXMAP0 (ODD) |
GX_TEXMAP4 (ODD) |
GX_TEXMAP1(EVEN) |
GX_TEXMAP5(EVEN) |
GX_TEXMAP2 (ODD) |
GX_TEXMAP6 (ODD) |
GX_TEXMAP3(EVEN) |
GX_TEXMAP7(EVEN) |
TLUT |
|
|
0x80000-0x87FFF |
0x88000-0x8FFFF |
0x90000-0x97FFF |
0x98000-0x9FFFF |
0xA0000-0xA7FFF |
0xA8000-0xAFFFF |
0xB0000-0xB7FFF |
0xB8000-0xBFFFF |
|
|
|
0xC0000-0xFFFFF |
|
|
|
|
|
CI, Mipmap OFF:
Color index textures will be treated in the same way as the normal non-mipmapped textures. TLUT information located in High Memory Bank will also be used.
|
0x00000-0x07FFF |
0x08000-0x0FFFF |
0x10000-0x17FFF |
0x18000-0x1FFFF |
0x20000-0x27FFF |
0x28000-0x2FFFF |
0x30000-0x37FFF |
0x38000-0x3FFFF |
0x40000-0x47FFF |
0x48000-0x4FFFF |
0x50000-0x57FFF |
0x58000-0x5FFFF |
0x60000-0x67FFF |
0x68000-0x6FFFF |
0x70000-0x77FFF |
0x78000-0x7FFFF |
|
Low Memory Bank |
GX_TEXMAP0 |
|
GX_TEXMAP1 |
|
GX_TEXMAP2 |
|
GX_TEXMAP3 |
|
GX_TEXMAP4 |
|
GX_TEXMAP5 |
|
GX_TEXMAP6 |
|
GX_TEXMAP7 |
|
|
|
|
|
0x80000-0x87FFF |
0x88000-0x8FFFF |
0x90000-0x97FFF |
0x98000-0x9FFFF |
0xA0000-0xA7FFF |
0xA8000-0xAFFFF |
0xB0000-0xB7FFF |
0xB8000-0xBFFFF |
|
|
|
0xC0000-0xFFFFF |
|
|
|
|
|
CI, Mipmap ON:
For color index mipmapped textures, since the High Memory Bank will be used as the look up for TLUT, caches for both even and odd LODs need to be allocated in the Low Memory Bank. Hence, they will be allocated like the following:
|
0x00000-0x07FFF |
0x08000-0x0FFFF |
0x10000-0x17FFF |
0x18000-0x1FFFF |
0x20000-0x27FFF |
0x28000-0x2FFFF |
0x30000-0x37FFF |
0x38000-0x3FFFF |
0x40000-0x47FFF |
0x48000-0x4FFFF |
0x50000-0x57FFF |
0x58000-0x5FFFF |
0x60000-0x67FFF |
0x68000-0x6FFFF |
0x70000-0x77FFF |
0x78000-0x7FFFF |
|
Low Memory Bank |
GX_TEXMAP0(EVEN) |
GX_TEXMAP0 (ODD) |
GX_TEXMAP1(EVEN) |
GX_TEXMAP1 (ODD) |
GX_TEXMAP2(EVEN) |
GX_TEXMAP2 (ODD) |
GX_TEXMAP3(EVEN) |
GX_TEXMAP3 (ODD) |
GX_TEXMAP4(EVEN) |
GX_TEXMAP4 (ODD) |
GX_TEXMAP5(EVEN) |
GX_TEXMAP5 (ODD) |
GX_TEXMAP6(EVEN) |
GX_TEXMAP6 (ODD) |
GX_TEXMAP7(EVEN) |
GX_TEXMAP7 (ODD) |
|
|
|
|
0x80000-0x87FFF |
0x88000-0x8FFFF |
0x90000-0x97FFF |
0x98000-0x9FFFF |
0xA0000-0xA7FFF |
0xA8000-0xAFFFF |
0xB0000-0xB7FFF |
0xB8000-0xBFFFF |
|
|
|
0xC0000-0xFFFFF |
|
|
|
|
|
RGBA8, Mipmap OFF:
RGBA8(32bit) textures are a special case; even the non-mipmapped textures need cache areas in both the Low and High Memory Banks. So the memory allocation is similar to the mipmapped normal texture case.
|
0x00000-0x07FFF |
0x08000-0x0FFFF |
0x10000-0x17FFF |
0x18000-0x1FFFF |
0x20000-0x27FFF |
0x28000-0x2FFFF |
0x30000-0x37FFF |
0x38000-0x3FFFF |
0x40000-0x47FFF |
0x48000-0x4FFFF |
0x50000-0x57FFF |
0x58000-0x5FFFF |
0x60000-0x67FFF |
0x68000-0x6FFFF |
0x70000-0x77FFF |
0x78000-0x7FFFF |
|
Low Memory Bank |
GX_TEXMAP0 |
|
GX_TEXMAP1 |
|
GX_TEXMAP2 |
|
GX_TEXMAP3 |
|
GX_TEXMAP4 |
|
GX_TEXMAP5 |
|
GX_TEXMAP6 |
|
GX_TEXMAP7 |
|
|
|
High Memory Bank |
GX_TEXMAP0 |
GX_TEXMAP4 |
GX_TEXMAP1 |
GX_TEXMAP5 |
GX_TEXMAP2 |
GX_TEXMAP6 |
GX_TEXMAP3 |
GX_TEXMAP7 |
TLUT |
|
|
0x80000-0x87FFF |
0x88000-0x8FFFF |
0x90000-0x97FFF |
0x98000-0x9FFFF |
0xA0000-0xA7FFF |
0xA8000-0xAFFFF |
0xB0000-0xB7FFF |
0xB8000-0xBFFFF |
|
|
|
0xC0000-0xFFFFF |
|
|
|
|
|
RGBA8, Mipmap ON:
RGBA8 (32-bit) format mipmapped textures are even more special. Two consecutive cache areas are necessary in both the Low and High Memory Banks. As a result, it is not possible to allocate independent areas for all texture IDs in the High Memory Bank, therefore the same cache area is shared by GX_TEXMAP0 and GX_TEXMAP4. The user must be careful to avoid cache collision.
|
0x00000-0x07FFF |
0x08000-0x0FFFF |
0x10000-0x17FFF |
0x18000-0x1FFFF |
0x20000-0x27FFF |
0x28000-0x2FFFF |
0x30000-0x37FFF |
0x38000-0x3FFFF |
0x40000-0x47FFF |
0x48000-0x4FFFF |
0x50000-0x57FFF |
0x58000-0x5FFFF |
0x60000-0x67FFF |
0x68000-0x6FFFF |
0x70000-0x77FFF |
0x78000-0x7FFFF |
|
Low Memory Bank |
GX_TEXMAP0(EVEN) |
GX_TEXMAP1 (ODD) |
GX_TEXMAP2(EVEN) |
GX_TEXMAP3 (ODD) |
GX_TEXMAP4(EVEN) |
GX_TEXMAP5 (ODD) |
GX_TEXMAP6(EVEN) |
GX_TEXMAP7 (ODD) |
|
|
High Memory Bank |
GX_TEXMAP0 (ODD) GX_TEXMAP4 (ODD) |
GX_TEXMAP1(EVEN) GX_TEXMAP5(EVEN) |
GX_TEXMAP2 (ODD) GX_TEXMAP6 (ODD) |
GX_TEXMAP3(EVEN) GX_TEXMAP7(EVEN) |
TLUT |
|
|
0x80000-0x87FFF |
0x88000-0x8FFFF |
0x90000-0x97FFF |
0x98000-0x9FFFF |
0xA0000-0xA7FFF |
0xA8000-0xAFFFF |
0xB0000-0xB7FFF |
0xB8000-0xBFFFF |
|
|
|
0xC0000-0xFFFFF |
|
|
|
|
|
Cache Conflicts and Avoidance
As noted above, cache conflicts can occur with RGBA8 (32-bit) mipmapped textures. There is also a possibility that RGBA8 texture affects caches for other types of texture. Here's an example:
GX_TEXMAP0 |
GX_TF_RGBA8, Mipmap ON. |
GX_TEXMAP1 |
GX_TF_I8, Mipmap ON. |
GX_TEXMAP2 |
GX_TF_C8, Mipmap ON. |
GX_TEXMAP3 |
GX_TF_RGB565, Mipmap OFF. |
GX_TEXMAP4 |
GX_TF_RGBA8, Mipmap OFF. |
GX_TEXMAP5 |
GX_TF_RGBA8, Mipmap ON. |
If multi-texturing is performed under this environment, cache conflicts may occur in the shared area for GX_TEXMAP0 and GX_TEXMAP4 and also in the shared area for GX_TEXMAP1 and GX_TEXMAP5. (Corresponding to the red areas in the figure below.)
|
0x00000-0x07FFF |
0x08000-0x0FFFF |
0x10000-0x17FFF |
0x18000-0x1FFFF |
0x20000-0x27FFF |
0x28000-0x2FFFF |
0x30000-0x37FFF |
0x38000-0x3FFFF |
0x40000-0x47FFF |
0x48000-0x4FFFF |
0x50000-0x57FFF |
0x58000-0x5FFFF |
0x60000-0x67FFF |
0x68000-0x6FFFF |
0x70000-0x77FFF |
0x78000-0x7FFFF |
|
Low Memory Bank |
GX_TEXMAP0(EVEN) |
GX_TEXMAP1 (ODD) |
|
GX_TEXMAP2(EVEN) |
GX_TEXMAP2 (ODD) |
GX_TEXMAP3 |
|
GX_TEXMAP4 |
|
GX_TEXMAP5 (ODD) |
| |
|
| |
|
|
|
High Memory Bank |
GX_TEXMAP0 (ODD) |
GX_TEXMAP4 |
GX_TEXMAP1(EVEN) |
GX_TEXMAP5(EVEN) |
|
| |
|
| |
TLUT |
|
|
0x80000-0x87FFF |
0x88000-0x8FFFF |
0x90000-0x97FFF |
0x98000-0x9FFFF |
0xA0000-0xA7FFF |
0xA8000-0xAFFFF |
0xB0000-0xB7FFF |
0xB8000-0xBFFFF |
|
|
|
0xC0000-0xFFFFF |
|
|
|
|
|
Even though a cache collision occurs, corrupt graphics will not occur. However, performance may be affected. So it is best to avoid the collision if possible. In this example, by switching the use of GX_TEXMAP1 and GX_TEXMAP2, and also switching GX_TEXMAP3 and GX_TEXMAP4, no sections will need to be reused and the possibility of cache collision is avoided. This is shown in the table below.
|
0x00000-0x07FFF |
0x08000-0x0FFFF |
0x10000-0x17FFF |
0x18000-0x1FFFF |
0x20000-0x27FFF |
0x28000-0x2FFFF |
0x30000-0x37FFF |
0x38000-0x3FFFF |
0x40000-0x47FFF |
0x48000-0x4FFFF |
0x50000-0x57FFF |
0x58000-0x5FFFF |
0x60000-0x67FFF |
0x68000-0x6FFFF |
0x70000-0x77FFF |
0x78000-0x7FFFF |
|
Low Memory Bank |
GX_TEXMAP0(EVEN) |
GX_TEXMAP1(EVEN) |
GX_TEXMAP1 (ODD) |
GX_TEXMAP2(EVEN) |
|
GX_TEXMAP3 |
|
GX_TEXMAP4 |
|
GX_TEXMAP5 (ODD) |
| |
|
| |
|
|
|
High Memory Bank |
GX_TEXMAP0 (ODD) |
GX_TEXMAP5(EVEN) |
GX_TEXMAP2 (ODD) |
| |
GX_TEXMAP3 |
| |
TLUT |
|
|
0x80000-0x87FFF |
0x88000-0x8FFFF |
0x90000-0x97FFF |
0x98000-0x9FFFF |
0xA0000-0xA7FFF |
0xA8000-0xAFFFF |
0xB0000-0xB7FFF |
0xB8000-0xBFFFF |
|
|
|
0xC0000-0xFFFFF |
|
|
|
|
|
The use of a multi-texture environment with four or fewer textures (only GX_TEXMAP0 through GX_TEXMAP3) eliminates conflict concerns. Concerns therefore arise when five or more textures are used and there is an RGBA8 mipmapped texture.
TLUT
The addresses 0xC0000-0xFFFFF in the High Memory Bank are allocated as TLUT for color index textures: sixteen 256-entry tables (using eight kilobytes each), and four 1024-entry tables (using 32 KB each), as shown in the following table.
|
0xC0000-0xC1FFF |
0xC2000-0xC3FFF |
0xC4000-0xC5FFF |
0xC6000-0xC7FFF |
|
0xDA000-0xDBFFF |
0xDC000-0xDDFFF |
0xDE000-0xDFFFF |
0xE0000-0xE7FFF |
|
0xE8000-0xEFFFF |
|
0xF0000-0xF7FFF |
|
0xF8000-0xFFFFF |
|
|
TLUT |
GX_TLUT0 |
GX_TLUT1 |
GX_TLUT2 |
GX_TLUT3 |
: |
GX_TLUT13 |
GX_TLUT14 |
GX_TLUT15 |
GX_BIGTLUT0 |
GX_BIGTLUT1 |
GX_BIGTLUT2 |
GX_BIGTLUT3 |
|
|
See Also
GXInit,
GXLoadTexObj,
GXInitTexCacheRegion,
GXInitTlutRegion,
GXSetTexRegionCallBack,
GXSetTlutRegionCallBack
Revision History
2006/03/01 Initial version.
CONFIDENTIAL