GSP Shared Memory: Difference between revisions
Steveice10 (talk | contribs) |
No edit summary |
||
(4 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
This page describes the structure of the GSP [[GSPGPU:RegisterInterruptRelayQueue|shared]] memory. GX | This page describes the structure of the GSP [[GSPGPU:RegisterInterruptRelayQueue|shared]] memory. Interrupt, framebuffer, and GX command data is stored here. | ||
=Interrupt Queue= | |||
The Interrupt queue is located at sharedMemBase + (clientID * 0x40). | |||
The Interrupt | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 13: | Line 11: | ||
|- | |- | ||
| 0x0 | | 0x0 | ||
| | | Offset from the count where to save incoming interrupts | ||
|- | |- | ||
| 0x1 | | 0x1 | ||
| | | Count (max 0x20 for PDC, 0x34 for others) | ||
|- | |- | ||
| 0x2 | | 0x2 | ||
| | | Missed other interrupts (set to 1 when 0 and count >= 0x34) | ||
|- | |- | ||
| 0x3 | | 0x3 | ||
| | | Flags (bit0 = skip PDC) | ||
|- | |- | ||
| 0x4-0x7 | | 0x4-0x7 | ||
| | | Missed PDC0 (incremented when flags.bit0 is clear and count >= 0x20) | ||
|- | |- | ||
| 0x8-0xB | | 0x8-0xB | ||
| | | Missed PDC1 (same as above) | ||
|- | |- | ||
| 0xC-0x3F | | 0xC-0x3F | ||
| u8 | | Interrupt list (u8) (0=PSC0, 1=PSC1, 2=PDC0/VBlankTop, 3=PDC1/VBlankBottom, 4=PPF, 5=P3D, 6=DMA) | ||
|} | |} | ||
=Framebuffer | GSP fills the interrupt list, then triggers the event set with [[GSPGPU:RegisterInterruptRelayQueue|RegisterInterruptRelayQueue]] for the specified process(es). | ||
The framebuffer info structure for the | |||
PDC interrupts are sent to all processes; other interrupts are only sent to the process with GPU rights. | |||
= Framebuffer Info = | |||
The framebuffer info structure for the top LCD is located at sharedMemBase + 0x200 + (clientID * 0x80). | |||
The framebuffer info structure for the bottom LCD is located at sharedMemBase + 0x240 + (clientID * 0x80). | |||
== Framebuffer Info Header == | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
Line 47: | Line 53: | ||
|- | |- | ||
| 1 | | 1 | ||
| | | Flags (bit0 = client has set new data) | ||
|- | |- | ||
| 3-2 | | 3-2 | ||
| Padding | | Padding | ||
|} | |||
== Framebuffer Info Structure == | |||
{| class="wikitable" border="1" | |||
|- | |||
! Index Word | |||
! Description | |||
|- | |||
| 0 | |||
| Active framebuffer (0 = first, 1 = second) | |||
|- | |||
| 1 | |||
| Left framebuffer VA | |||
|- | |||
| 2 | |||
| Right framebuffer VA (top screen only) | |||
|- | |||
| 3 | |||
| [[GPU/External_Registers#LCD_Source_Framebuffer_Setup|Stride]] (offset 0x90) | |||
|- | |||
| 4 | |||
| [[GPU/External_Registers#Framebuffer_format|Format]] | |||
|- | |||
| 5 | |||
| [[GPU/External_Registers#LCD_Source_Framebuffer_Setup|Status]] (offset 0x78) | |||
|- | |||
| 6 | |||
| ? ("Attribute") | |||
|} | |} | ||
Line 57: | Line 92: | ||
The two 0x1C-byte framebuffer info entries are located at framebufferinfo+4. | The two 0x1C-byte framebuffer info entries are located at framebufferinfo+4. | ||
=3D Slider and 3D [[GSPGPU:SetLedForceOff|LED]]= | = 3D Slider and 3D [[GSPGPU:SetLedForceOff|LED]] = | ||
See [[Configuration Memory]]. | See [[Configuration Memory]]. | ||
=Command | = Command Queue = | ||
The command queue is located at sharedMemBase + 0x800 + (clientID * 0x200). It consists of an header followed by at most 15 command entries. Each command entry is of size 0x20 and has an header followed by command specific parameters. | |||
After adding a command, [[GSPGPU:TriggerCmdReqQueue|TriggerCmdReqQueue]] must be used to trigger GSP processing when the total commands field is value 1. | |||
== Command Queue Header == | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 69: | Line 109: | ||
! Description | ! Description | ||
|- | |- | ||
| | | 0 | ||
| | | Index of the command to process, this is incremented by GSP before handling the command | ||
|- | |- | ||
| | | 1 | ||
| | | Total commands to process, this is incremented by the application when adding the command to the queue, and decremented by GSP before handling the command | ||
|- | |- | ||
| | | 2 | ||
| | | Flags (bit0 = completed?, bit7 = fatal error) | ||
|- | |- | ||
| | | 3 | ||
| | | ? (bit0 = set flags.bit0) | ||
|- | |- | ||
| 4 | | 4 | ||
| | | Result code for the last GX command which failed | ||
|} | |} | ||
=Command Header= | == Command Header == | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
Line 91: | Line 132: | ||
! Description | ! Description | ||
|- | |- | ||
| | | 0 | ||
| | | Command ID | ||
|- | |- | ||
| | | 1 | ||
| | | ? | ||
|- | |||
| 2 | |||
| ? (bit0 = set queue.flags.bit0 after processing) | |||
|- | |- | ||
| | | 3 | ||
| | | When set, the command fails if GSP is busy handling any other command; otherwise, it only fails if GSP is busy handling a command of the same kind | ||
|} | |} | ||
== Commands == | |||
= | Addresses specified in parameters are virtual addresses. For applications these are normally located in GSP memory, while for other processes they are located in VRAM. | ||
Address and size parameters except for command 0 and command 5 must be 8-byte aligned. | |||
=== Trigger DMA Request === | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
Line 132: | Line 179: | ||
This command is normally used to DMA data from the application GSP [[Memory_layout|heap]] to VRAM. When flushing is enabled and the source buffer is not located within VRAM, svcFlushProcessDataCache is used to flush the source buffer. | This command is normally used to DMA data from the application GSP [[Memory_layout|heap]] to VRAM. When flushing is enabled and the source buffer is not located within VRAM, svcFlushProcessDataCache is used to flush the source buffer. | ||
== Trigger Command List Processing == | === Trigger Command List Processing === | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
Line 148: | Line 196: | ||
|- | |- | ||
| 3 | | 3 | ||
| | | Update gas additive blend results (0 = don't update, 1 = update) | ||
|- | |- | ||
| 6-4 | | 6-4 | ||
Line 154: | Line 202: | ||
|- | |- | ||
| 7 | | 7 | ||
| | | Flush buffer (0 = don't flush, 1 = flush) | ||
|} | |} | ||
This command converts the specified address to a physical address, then writes the physical address and size to the [[GPU]] registers at 0x1EF018E0. This buffer contains [[GPU/Internal_Registers|GPU commands]]. | This command converts the specified address to a physical address, then writes the physical address and size to the [[GPU]] registers at 0x1EF018E0. This buffer contains [[GPU/Internal_Registers|GPU commands]]. When flushing is enabled, svcFlushProcessDataCache is used to flush the buffer. | ||
=== Trigger Memory Fill === | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
Line 195: | Line 244: | ||
The values of Control0 and Control1 give information about the type of memory fill. See [[GPU/External_Registers#Memory Fill|here]] for more information about memory fill parameters. | The values of Control0 and Control1 give information about the type of memory fill. See [[GPU/External_Registers#Memory Fill|here]] for more information about memory fill parameters. | ||
== Trigger Display Transfer == | === Trigger Display Transfer === | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
Line 231: | Line 281: | ||
Some color formats seem to require specific input / output sizes when performing a display transfer, doing an RGB5A1->RGBA4 display transfer would never fire the PPF interrupt with a 32x32 buffer, increasing the buffer to 128x128 made it fire correctly. | Some color formats seem to require specific input / output sizes when performing a display transfer, doing an RGB5A1->RGBA4 display transfer would never fire the PPF interrupt with a 32x32 buffer, increasing the buffer to 128x128 made it fire correctly. | ||
== Trigger Texture Copy == | === Trigger Texture Copy === | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
Line 264: | Line 315: | ||
This command is similar to cmd3. It also triggers the [[GPU/External_Registers#Transfer_Engine|GPU Transfer Engine]], but setting the TextureCopy parameters. | This command is similar to cmd3. It also triggers the [[GPU/External_Registers#Transfer_Engine|GPU Transfer Engine]], but setting the TextureCopy parameters. | ||
== Flush Cache Regions == | === Flush Cache Regions === | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- |