From e234385c2008c29b1ac4aab5f512802280342c6a Mon Sep 17 00:00:00 2001 From: Arisotura Date: Tue, 18 Jun 2024 13:11:42 +0200 Subject: [PATCH] OpenGL: add support for changing BG0HOFS midframe. fixes #2072 --- src/GPU2D_Soft.cpp | 6 +++++- src/GPU_OpenGL.cpp | 6 ------ src/GPU_OpenGL.h | 1 - src/GPU_OpenGL_shaders.h | 7 ++++--- 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/GPU2D_Soft.cpp b/src/GPU2D_Soft.cpp index 31ff4ca834..cf168f82aa 100644 --- a/src/GPU2D_Soft.cpp +++ b/src/GPU2D_Soft.cpp @@ -254,7 +254,11 @@ void SoftRenderer::DrawScanline(u32 line, Unit* unit) if (GPU.GPU3D.IsRendererAccelerated()) { - dst[256*3] = masterBrightness | (CurUnit->DispCnt & 0x30000); + u32 xpos = GPU.GPU3D.GetRenderXPos(); + + dst[256*3] = masterBrightness | + (CurUnit->DispCnt & 0x30000) | + (xpos << 24) | ((xpos & 0x100) << 15); return; } diff --git a/src/GPU_OpenGL.cpp b/src/GPU_OpenGL.cpp index ad77f8a0ab..a58dbedb4b 100644 --- a/src/GPU_OpenGL.cpp +++ b/src/GPU_OpenGL.cpp @@ -51,7 +51,6 @@ std::optional GLCompositor::New() noexcept GLCompositor::GLCompositor(GLuint compShader) noexcept : CompShader(compShader) { CompScaleLoc = glGetUniformLocation(CompShader, "u3DScale"); - Comp3DXPosLoc = glGetUniformLocation(CompShader, "u3DXPos"); glUseProgram(CompShader); GLuint screenTextureUniform = glGetUniformLocation(CompShader, "ScreenTex"); @@ -140,7 +139,6 @@ GLCompositor::GLCompositor(GLCompositor&& other) noexcept : ScreenH(other.ScreenH), ScreenW(other.ScreenW), CompScaleLoc(other.CompScaleLoc), - Comp3DXPosLoc(other.Comp3DXPosLoc), CompVertices(other.CompVertices), CompShader(other.CompShader), CompVertexBufferID(other.CompVertexBufferID), @@ -165,7 +163,6 @@ GLCompositor& GLCompositor::operator=(GLCompositor&& other) noexcept ScreenH = other.ScreenH; ScreenW = other.ScreenW; CompScaleLoc = other.CompScaleLoc; - Comp3DXPosLoc = other.Comp3DXPosLoc; CompVertices = other.CompVertices; // Clean up these resources before overwriting them @@ -258,9 +255,6 @@ void GLCompositor::RenderFrame(const GPU& gpu, Renderer3D& renderer) noexcept glUseProgram(CompShader); glUniform1ui(CompScaleLoc, Scale); - // TODO: support setting this midframe, if ever needed - glUniform1i(Comp3DXPosLoc, ((int)gpu.GPU3D.GetRenderXPos() << 23) >> 23); - glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, CompScreenInputTex); diff --git a/src/GPU_OpenGL.h b/src/GPU_OpenGL.h index 3379e943fc..2e482861c1 100644 --- a/src/GPU_OpenGL.h +++ b/src/GPU_OpenGL.h @@ -52,7 +52,6 @@ class GLCompositor GLuint CompShader {}; GLuint CompScaleLoc = 0; - GLuint Comp3DXPosLoc = 0; GLuint CompVertexBufferID = 0; GLuint CompVertexArrayID = 0; diff --git a/src/GPU_OpenGL_shaders.h b/src/GPU_OpenGL_shaders.h index e59e23350d..3c463ab8f2 100644 --- a/src/GPU_OpenGL_shaders.h +++ b/src/GPU_OpenGL_shaders.h @@ -43,7 +43,6 @@ void main() const char* kCompositorFS_Nearest = R"(#version 140 uniform uint u3DScale; -uniform int u3DXPos; uniform usampler2D ScreenTex; uniform sampler2D _3DTex; @@ -56,11 +55,13 @@ void main() { ivec4 pixel = ivec4(texelFetch(ScreenTex, ivec2(fTexcoord), 0)); - float _3dxpos = float(u3DXPos); - ivec4 mbright = ivec4(texelFetch(ScreenTex, ivec2(256*3, int(fTexcoord.y)), 0)); int dispmode = mbright.b & 0x3; + // mbright.a == HOFS bit0..7 + // mbright.b bit7 == HOFS bit8 (sign) + float _3dxpos = float(mbright.a - ((mbright.b & 0x80) * 2)); + if (dispmode == 1) { ivec4 val1 = pixel;