|
|
|
@ -105,6 +105,40 @@ void ReadHWRegs(Service::Interface* self) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SetBufferSwap(u32 screen_id, const FrameBufferInfo& info) {
|
|
|
|
|
u32 base_address = 0x400000;
|
|
|
|
|
if (info.active_fb == 0) {
|
|
|
|
|
WriteHWRegs(base_address + 4 * GPU_REG_INDEX(framebuffer_config[screen_id].address_left1), 4, &info.address_left);
|
|
|
|
|
WriteHWRegs(base_address + 4 * GPU_REG_INDEX(framebuffer_config[screen_id].address_right1), 4, &info.address_right);
|
|
|
|
|
} else {
|
|
|
|
|
WriteHWRegs(base_address + 4 * GPU_REG_INDEX(framebuffer_config[screen_id].address_left2), 4, &info.address_left);
|
|
|
|
|
WriteHWRegs(base_address + 4 * GPU_REG_INDEX(framebuffer_config[screen_id].address_right2), 4, &info.address_right);
|
|
|
|
|
}
|
|
|
|
|
WriteHWRegs(base_address + 4 * GPU_REG_INDEX(framebuffer_config[screen_id].stride), 4, &info.stride);
|
|
|
|
|
WriteHWRegs(base_address + 4 * GPU_REG_INDEX(framebuffer_config[screen_id].color_format), 4, &info.format);
|
|
|
|
|
WriteHWRegs(base_address + 4 * GPU_REG_INDEX(framebuffer_config[screen_id].active_fb), 4, &info.shown_fb);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* GSP_GPU::SetBufferSwap service function
|
|
|
|
|
*
|
|
|
|
|
* Updates GPU display framebuffer configuration using the specified parameters.
|
|
|
|
|
*
|
|
|
|
|
* Inputs:
|
|
|
|
|
* 1 : Screen ID (0 = top screen, 1 = bottom screen)
|
|
|
|
|
* 2-7 : FrameBufferInfo structure
|
|
|
|
|
* Outputs:
|
|
|
|
|
* 1: Result code
|
|
|
|
|
*/
|
|
|
|
|
void SetBufferSwap(Service::Interface* self) {
|
|
|
|
|
u32* cmd_buff = Service::GetCommandBuffer();
|
|
|
|
|
u32 screen_id = cmd_buff[1];
|
|
|
|
|
FrameBufferInfo* fb_info = (FrameBufferInfo*)&cmd_buff[2];
|
|
|
|
|
SetBufferSwap(screen_id, *fb_info);
|
|
|
|
|
|
|
|
|
|
cmd_buff[1] = 0; // No error
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* GSP_GPU::RegisterInterruptRelayQueue service function
|
|
|
|
|
* Inputs:
|
|
|
|
@ -283,7 +317,7 @@ const Interface::FunctionInfo FunctionTable[] = {
|
|
|
|
|
{0x00020084, nullptr, "WriteHWRegsWithMask"},
|
|
|
|
|
{0x00030082, nullptr, "WriteHWRegRepeat"},
|
|
|
|
|
{0x00040080, ReadHWRegs, "ReadHWRegs"},
|
|
|
|
|
{0x00050200, nullptr, "SetBufferSwap"},
|
|
|
|
|
{0x00050200, SetBufferSwap, "SetBufferSwap"},
|
|
|
|
|
{0x00060082, nullptr, "SetCommandList"},
|
|
|
|
|
{0x000700C2, nullptr, "RequestDma"},
|
|
|
|
|
{0x00080082, nullptr, "FlushDataCache"},
|
|
|
|
|