GPU/External Registers: Difference between revisions
mNo edit summary  | 
				 PPF rewrites + add T2L stuff  | 
				||
| Line 475: | Line 475: | ||
|-  | |-  | ||
| 0x1EF00C08  | | 0x1EF00C08  | ||
| DisplayTransfer output width (bits 0-15) and height (bits 16-31)  | | DisplayTransfer output width (bits 0-15) and height (bits 16-31)  | ||
|-  | |-  | ||
| 0x1EF00C0C  | | 0x1EF00C0C  | ||
| DisplayTransfer input width and height  | | DisplayTransfer input width and height  | ||
|-  | |-  | ||
| 0x1EF00C10  | | 0x1EF00C10  | ||
| Transfer flags  | | Transfer flags  | ||
|-  | |-  | ||
| 0x1EF00C14  | | 0x1EF00C14  | ||
| GSP   | | ?, GSP writes value 0 here prior to writing to 0x1EF00C18 for DisplayTransfer  | ||
|-  | |-  | ||
| 0x1EF00C18  | | 0x1EF00C18  | ||
|  Setting bit0 starts the transfer  | |  Setting bit0 starts the transfer; upon completion, bit0 is unset and bit8 is set  | ||
|-  | |-  | ||
| 0x1EF00C1C  | | 0x1EF00C1C  | ||
| Line 493: | Line 493: | ||
|-  | |-  | ||
| 0x1EF00C20  | | 0x1EF00C20  | ||
| TextureCopy total amount of data to copy, in bytes  | | TextureCopy total amount of data to copy, in bytes  | ||
|-  | |-  | ||
| 0x1EF00C24  | | 0x1EF00C24  | ||
| TextureCopy input line width (bits 0-15) and gap (bits 16-31), in 16 byte units  | | TextureCopy input line width (bits 0-15) and gap (bits 16-31), in 16 byte units  | ||
|-  | |-  | ||
| 0x1EF00C28  | | 0x1EF00C28  | ||
| TextureCopy output line width and gap  | | TextureCopy output line width and gap  | ||
|}  | |}  | ||
Transfer flags:  | |||
{| class="wikitable" border="1"  | {| class="wikitable" border="1"  | ||
!  Bit  | !  Bit  | ||
| Line 512: | Line 509: | ||
|-  | |-  | ||
| 0  | | 0  | ||
| When set, the framebuffer data is flipped vertically  | | When set, the framebuffer data is flipped vertically  | ||
|-  | |-  | ||
| 1  | | 1  | ||
|   | | Linear->tiled mode (overrides tiled->linear mode)  | ||
|-  | |-  | ||
| 2  | | 2  | ||
| This bit is required when the output width is less than the input width for the hardware to properly crop the lines, otherwise the output will be mis-aligned  | | This bit is required when the output width is less than the input width for the hardware to properly crop the lines, otherwise the output will be mis-aligned  | ||
|-  | |-  | ||
| 3  | | 3  | ||
|   | | TextureCopy mode (overrides all other modes)  | ||
|-  | |-  | ||
| 4  | | 4  | ||
| Line 527: | Line 524: | ||
|-  | |-  | ||
| 5  | | 5  | ||
|   | | Tiled->tiled mode (overrides tiled->linear, linear->tiled modes)  | ||
|-  | |-  | ||
| 7-6  | | 7-6  | ||
| Line 533: | Line 530: | ||
|-  | |-  | ||
| 10-8  | | 10-8  | ||
| Input   | | Input [[GPU/External_Registers#Framebuffer_color_formats|color format]]  | ||
|-  | |-  | ||
| 11  | | 11  | ||
| Line 539: | Line 536: | ||
|-  | |-  | ||
| 14-12  | | 14-12  | ||
| Output   | | Output color format  | ||
|-  | |-  | ||
| 15  | | 15  | ||
| Line 545: | Line 542: | ||
|-  | |-  | ||
| 16  | | 16  | ||
| Use 32x32 block tiling mode, instead of the usual 8x8 one  | | Use 32x32 block tiling mode, instead of the usual 8x8 one (output dimensions must be multiples of 32, even if cropping with bit 2 set above)  | ||
|-  | |-  | ||
| 17-23  | | 17-23  | ||
| Line 551: | Line 548: | ||
|-  | |-  | ||
| 24-25  | | 24-25  | ||
| Scale down the input image using a box filter  | | Scale down the input image using a box filter (0 = No downscale, 1 = 2x1 downscale, 2 = 2x2 downscale, 3 = invalid)  | ||
|-  | |-  | ||
| 31-26  | | 31-26  | ||
| Not writable  | | Not writable  | ||
|}  | |||
These registers are used by [[GSP_Shared_Memory#Commands|GSP]] for DisplayTransfer and TextureCopy. TextureCopy registers are only used in TextureCopy mode; likewise, DisplayTransfer registers are only used when TextureCopy mode is not set. By default, DisplayTransfer will work in tiled->linear mode.  | |||
=== Tiled to linear ===  | |||
Unswizzles the input buffer, this is usually used for transferring GPU framebuffer data onto LCD framebuffers. The following constraints apply:  | |||
* Output dimensions must not be bigger than input ones.  | |||
* Width dimensions must be >= 64.  | |||
* Height dimensions must be >= 16.  | |||
* Width dimensions are required to be aligned to 16 bytes when doing RGB8 transfers.  | |||
** Otherwise they are required to be aligned to 8 bytes.  | |||
* If downscale is used, input and output dimensions should be the same, and width/2 must also follow alignment constraints.  | |||
Format conversion results:  | |||
{| class="wikitable" border="1"  | |||
!  Conversion  | |||
!  Result  | |||
|-  | |||
| RGBA8 -> RGBA8  | |||
| style="background: lightgreen" | Has interrupt, correct output  | |||
|-  | |||
| RGBA8 -> RGB8  | |||
| style="background: lightgreen" | Has interrupt, correct output  | |||
|-  | |||
| RGBA8 -> RGB565  | |||
| style="background: lightgreen" | Has interrupt, correct output  | |||
|-  | |||
| RGBA8 -> RGB5A1  | |||
| style="background: lightgreen" | Has interrupt, correct output  | |||
|-  | |||
| RGBA8 -> RGBA4  | |||
| style="background: lightgreen" | Has interrupt, correct output  | |||
|-  | |||
| RGB8 -> RGBA8  | |||
| style="background: salmon" | No interrupt  | |||
|-  | |||
| RGB8 -> RGB8  | |||
| style="background: lightgreen" | Has interrupt, correct output  | |||
|-  | |||
| RGB8 -> RGB565  | |||
| style="background: salmon" | No interrupt  | |||
|-  | |||
| RGB8 -> RGB5A1  | |||
| style="background: salmon" | No interrupt  | |||
|-  | |||
| RGB8 -> RGBA4  | |||
| style="background: salmon" | No interrupt  | |||
|-  | |||
| RGB565 -> RGBA8  | |||
| style="background: salmon" | No interrupt  | |||
|-  | |||
| RGB565 -> RGB8  | |||
| style="background: salmon" | No interrupt  | |||
|-  | |||
| RGB565 -> RGB565  | |||
| style="background: yellow" | Has interrupt, output not tested  | |||
|-  | |||
| RGB565 -> RGB5A1  | |||
| style="background: yellow" | Has interrupt, output not tested  | |||
|-  | |||
| RGB565 -> RGBA4  | |||
| style="background: yellow" | Has interrupt, output not tested  | |||
|-  | |||
| RGB5A1 -> RGBA8  | |||
| style="background: salmon" | No interrupt  | |||
|-  | |||
| RGB5A1 -> RGB8  | |||
| style="background: salmon" | No interrupt  | |||
|-  | |||
| RGB5A1 -> RGB565  | |||
| style="background: yellow" | Has interrupt, output not tested  | |||
|-  | |||
| RGB5A1 -> RGB5A1  | |||
| style="background: yellow" | Has interrupt, output not tested  | |||
|-  | |||
| RGB5A1 -> RGBA4  | |||
| style="background: yellow" | Has interrupt, output not tested  | |||
|-  | |||
| RGBA4 -> RGBA8  | |||
| style="background: salmon" | No interrupt  | |||
|-  | |||
| RGBA4 -> RGB8  | |||
| style="background: salmon" | No interrupt  | |||
|-  | |||
| RGBA4 -> RGB565  | |||
| style="background: yellow" | Has interrupt, output not tested  | |||
|-  | |||
| RGBA4 -> RGB5A1  | |||
| style="background: yellow" | Has interrupt, output not tested  | |||
|-  | |||
| RGBA4 -> RGBA4  | |||
| style="background: yellow" | Has interrupt, output not tested  | |||
|}  | |}  | ||