From 9417c75ca7234b4ba434606f6087fade38420a77 Mon Sep 17 00:00:00 2001 From: GPUCode Date: Wed, 9 Aug 2023 11:49:19 +0300 Subject: [PATCH] gsp: Fix setbufferswap framebuffer selection --- include/PICA/regs.hpp | 3 +-- src/core/renderer_gl/renderer_gl.cpp | 8 ++++++-- src/core/services/gsp_gpu.cpp | 8 ++++---- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/include/PICA/regs.hpp b/include/PICA/regs.hpp index d67c2025..55b3e20b 100644 --- a/include/PICA/regs.hpp +++ b/include/PICA/regs.hpp @@ -191,8 +191,7 @@ namespace PICA { VramBankControl = 0xB, GPUBusy = 0xC, BacklightControl = 0xBC, - // TODO: Framebuffer regs - Framebuffer0Size = 0x2F, + Framebuffer0Size = 0x118, Framebuffer0AFirstAddr = 0x119, Framebuffer0ASecondAddr = 0x11A, Framebuffer0Config = 0x11B, diff --git a/src/core/renderer_gl/renderer_gl.cpp b/src/core/renderer_gl/renderer_gl.cpp index cd4a988f..e99e3196 100644 --- a/src/core/renderer_gl/renderer_gl.cpp +++ b/src/core/renderer_gl/renderer_gl.cpp @@ -462,13 +462,17 @@ void RendererGL::display() { gl.disableClipPlane(1); using namespace PICA::ExternalRegs; - const u32 topScreenAddr = externalRegs[Framebuffer0AFirstAddr]; - const u32 bottomScreenAddr = externalRegs[Framebuffer1AFirstAddr]; + const u32 topActiveFb = externalRegs[Framebuffer0Select] & 1; + const u32 topScreenAddr = externalRegs[topActiveFb == 0 ? Framebuffer0AFirstAddr : Framebuffer0ASecondAddr]; + const u32 bottomActiveFb = externalRegs[Framebuffer1Select] & 1; + const u32 bottomScreenAddr = externalRegs[bottomActiveFb == 0 ? Framebuffer1AFirstAddr : Framebuffer1ASecondAddr]; auto topScreen = colourBufferCache.findFromAddress(topScreenAddr); auto bottomScreen = colourBufferCache.findFromAddress(bottomScreenAddr); screenFramebuffer.bind(OpenGL::DrawFramebuffer); + OpenGL::clearColor(); + if (topScreen) { topScreen->get().texture.bind(); OpenGL::setViewport(0, 240, 400, 240); // Top screen viewport diff --git a/src/core/services/gsp_gpu.cpp b/src/core/services/gsp_gpu.cpp index 25628e4b..bfecfbf8 100644 --- a/src/core/services/gsp_gpu.cpp +++ b/src/core/services/gsp_gpu.cpp @@ -398,16 +398,16 @@ void GPUService::setBufferSwapImpl(u32 screenId, const FramebufferInfo& info) { constexpr static std::array fb_addresses = { Framebuffer0AFirstAddr, - Framebuffer0ASecondAddr, Framebuffer0BFirstAddr, - Framebuffer0BSecondAddr, Framebuffer1AFirstAddr, - Framebuffer1ASecondAddr, Framebuffer1BFirstAddr, + Framebuffer0ASecondAddr, + Framebuffer0BSecondAddr, + Framebuffer1ASecondAddr, Framebuffer1BSecondAddr, }; - const u32 fb_index = screenId * 4 + info.activeFb * 2; + const u32 fb_index = info.activeFb * 4 + screenId * 2; gpu.writeExternalReg(fb_addresses[fb_index], VaddrToPaddr(info.leftFramebufferVaddr)); gpu.writeExternalReg(fb_addresses[fb_index + 1], VaddrToPaddr(info.rightFramebufferVaddr));