summaryrefslogtreecommitdiffstats
path: root/src/core/hle/service/gsp.cpp
diff options
context:
space:
mode:
authorTony Wasserka <NeoBrainX@gmail.com>2014-07-25 11:23:28 +0200
committerTony Wasserka <NeoBrainX@gmail.com>2014-08-25 22:03:18 +0200
commit590c206ac8836f0e4544d2cb84191d77d07b9f36 (patch)
treec6fe97637f83094e93ca74225f52dd655ab393fd /src/core/hle/service/gsp.cpp
parentGSP: Add a helper function for convenience. (diff)
downloadyuzu-590c206ac8836f0e4544d2cb84191d77d07b9f36.tar
yuzu-590c206ac8836f0e4544d2cb84191d77d07b9f36.tar.gz
yuzu-590c206ac8836f0e4544d2cb84191d77d07b9f36.tar.bz2
yuzu-590c206ac8836f0e4544d2cb84191d77d07b9f36.tar.lz
yuzu-590c206ac8836f0e4544d2cb84191d77d07b9f36.tar.xz
yuzu-590c206ac8836f0e4544d2cb84191d77d07b9f36.tar.zst
yuzu-590c206ac8836f0e4544d2cb84191d77d07b9f36.zip
Diffstat (limited to '')
-rw-r--r--src/core/hle/service/gsp.cpp36
1 files changed, 35 insertions, 1 deletions
diff --git a/src/core/hle/service/gsp.cpp b/src/core/hle/service/gsp.cpp
index f793b592c..417c01b83 100644
--- a/src/core/hle/service/gsp.cpp
+++ b/src/core/hle/service/gsp.cpp
@@ -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"},