Line 1: |
Line 1: |
| [[Category:GPU]] | | [[Category:GPU]] |
− | (this page is hugely WIP)
| |
| | | |
| == Overview == | | == Overview == |
| | | |
| GPU internal registers are written to through GPU commands. They are used to control the GPU's behavior, that is to say tell it to draw stuff and how we want it drawn. | | GPU internal registers are written to through GPU commands. They are used to control the GPU's behavior, that is to say tell it to draw stuff and how we want it drawn. |
| + | |
| + | Each command is at least 8 bytes wide. The first word is the command parameter and the second word constitutes the command header. Optionally, more parameter words may follow (potentially including a padding word to align commands to multiples of 8 bytes). |
| + | |
| + | In the simplest case, a command is exactly 8 bytes wide. You can think of such a command as writing the parameter word to an internal register (the index of which is given in the command header). The more general case where more than one parameter word is given is equivalent to multiple simple commands (one for each parameter word). If consecutive writing mode is enabled in the command header, the current command index will be incremented after each parameter write. Otherwise, the parameters will be consecutively written to the same register. |
| + | |
| + | For example, the sequence "0xAAAAAAAA 0x802F011C 0xBBBBBBBB 0xCCCCCCCC" is equivalent to a call to commands 0xF011C with parameter 0xAAAAAAAA, 0xF011D with parameter 0xBBBBBBBB and 0xF011E with parameter 0xCCCCCCCC. If consecutive writing mode were disabled, the command would be equivalent to three consecutive calls to 0xF011C (once with parameter 0xAAAAAAAA, once with 0xBBBBBBBB, and finally with 0xCCCCCCCC). |
| + | |
| + | Invalid GPU command parameters including NaN floats can cause the GPU to hang, which then causes the GSP module to hang as well. |
| + | |
| + | The size of GPU command buffers must be 0x10-byte aligned; the lower 3 bits of the size are cleared. A common pitfall is having the finalization command (write to register 0x0010) not executed because it was the last 8 bytes of a non-0x10 byte aligned command buffer, and having the GPU hang as a result. |
| + | |
| + | === Command Header === |
| + | {| class="wikitable" border="1" |
| + | ! Bit |
| + | ! Description |
| + | |- |
| + | | 0-15 |
| + | | Command ID |
| + | |- |
| + | | 16-19 |
| + | | Parameter mask |
| + | |- |
| + | | 20-30 |
| + | | Number of extra parameters (may be zero) |
| + | |- |
| + | | 31 |
| + | | Consecutive writing mode |
| + | |} |
| + | |
| + | === Parameter masking === |
| + | |
| + | Using a value other than 0xF, parts of a word in internal GPU memory can be updated without touching the other bits of it. For example, setting bit 16 to zero indicates that the least significant byte of the parameter will not be overwritten, setting bit 17 to zero indicates that the parameter's second LSB will not be overwritten, etc. This means that for instance commands 0x00010107 and 0x00020107 refer to the same thing but write different parts of the parameter. |
| | | |
| === Types === | | === Types === |