Skip to content

Commit

Permalink
OpenGL: add support for changing BG0HOFS midframe. fixes melonDS-emu#…
Browse files Browse the repository at this point in the history
  • Loading branch information
Arisotura committed Jun 18, 2024
1 parent 626d237 commit e234385
Show file tree
Hide file tree
Showing 4 changed files with 9 additions and 11 deletions.
6 changes: 5 additions & 1 deletion src/GPU2D_Soft.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
6 changes: 0 additions & 6 deletions src/GPU_OpenGL.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@ std::optional<GLCompositor> 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");
Expand Down Expand Up @@ -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),
Expand All @@ -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
Expand Down Expand Up @@ -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);

Expand Down
1 change: 0 additions & 1 deletion src/GPU_OpenGL.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,6 @@ class GLCompositor

GLuint CompShader {};
GLuint CompScaleLoc = 0;
GLuint Comp3DXPosLoc = 0;

GLuint CompVertexBufferID = 0;
GLuint CompVertexArrayID = 0;
Expand Down
7 changes: 4 additions & 3 deletions src/GPU_OpenGL_shaders.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down

0 comments on commit e234385

Please sign in to comment.