GSP Shared Memory: Difference between revisions
Move FBInfo from SetBufferSwap |
No edit summary |
||
| 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 36: | Line 36: | ||
PDC interrupts are sent to all processes; other interrupts are only sent to the process with GPU rights. | PDC interrupts are sent to all processes; other interrupts are only sent to the process with GPU rights. | ||
=Framebuffer | = Framebuffer Info = | ||
The framebuffer info structure for the | |||
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 55: | Line 59: | ||
|} | |} | ||
==Framebuffer | == Framebuffer Info Structure == | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
| Line 87: | 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 99: | 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 121: | 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 162: | 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 189: | Line 207: | ||
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. | 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 == | === Trigger Memory Fill === | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
| Line 225: | 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 261: | 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 294: | 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" | ||
|- | |- | ||