diff --git a/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramBuilder.cpp b/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramBuilder.cpp index 5d576548..385fe63e 100644 --- a/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramBuilder.cpp +++ b/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramBuilder.cpp @@ -263,6 +263,7 @@ public: ss << "# define IN in" << std::endl << "# define OUT out" << std::endl; m_part = ss.str(); } + m_part += "uniform lowp float uClipRatio; \n"; } }; @@ -454,6 +455,7 @@ public: ; } m_part += + " gl_Position.zw *= vec2(uClipRatio); \n" "} \n" ; } diff --git a/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramUniformFactory.cpp b/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramUniformFactory.cpp index 7f6cc097..bfaa1328 100644 --- a/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramUniformFactory.cpp +++ b/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramUniformFactory.cpp @@ -708,6 +708,22 @@ private: iUniform uClampMode; }; +class UClipRatio : public UniformGroup +{ +public: + UClipRatio(GLuint _program) { + LocateUniform(uClipRatio); + } + + void update(bool _force) override + { + uClipRatio.set(float(gSP.clipRatio), _force); + } + +private: + fUniform uClipRatio; +}; + class UPolygonOffset : public UniformGroup { public: @@ -1112,6 +1128,8 @@ void CombinerProgramUniformFactory::buildUniforms(GLuint _program, _uniforms.emplace_back(new UPolygonOffset(_program)); } + _uniforms.emplace_back(new UClipRatio(_program)); + _uniforms.emplace_back(new UScreenCoordsScale(_program)); _uniforms.emplace_back(new UColors(_program)); diff --git a/src/GraphicsDrawer.cpp b/src/GraphicsDrawer.cpp index 38fe26a4..415b9c24 100644 --- a/src/GraphicsDrawer.cpp +++ b/src/GraphicsDrawer.cpp @@ -238,6 +238,16 @@ float _adjustViewportX(f32 _X0) return (_X0 + halfVP - halfX) * dwnd().getAdjustScale() + halfX - halfVP; } +inline +void _adjustViewportToClipRatio(s32 & x, s32 & y, s32 & width, s32 & height) +{ + x -= (gSP.clipRatio - 1) * width / 2; + y -= (gSP.clipRatio - 1) * height / 2; + width *= gSP.clipRatio; + height *= gSP.clipRatio; +} + + void GraphicsDrawer::_updateViewport() const { DisplayWindow & wnd = DisplayWindow::get(); @@ -248,10 +258,12 @@ void GraphicsDrawer::_updateViewport() const float Xf = gSP.viewport.vscale[0] < 0 ? (gSP.viewport.x + gSP.viewport.vscale[0] * 2.0f) : gSP.viewport.x; if (_needAdjustCoordinate(wnd)) Xf = _adjustViewportX(Xf); - const s32 X = (s32)(Xf * scaleX); - const s32 Y = (s32)(gSP.viewport.y * scaleY); - gfxContext.setViewport(X, Y, - std::max((s32)(gSP.viewport.width * scaleX), 0), std::max((s32)(gSP.viewport.height * scaleY), 0)); + s32 X = (s32)(Xf * scaleX); + s32 Y = (s32)(gSP.viewport.y * scaleY); + s32 WIDTH = std::max((s32)(gSP.viewport.width * scaleX), 0); + s32 HEIGHT = std::max((s32)(gSP.viewport.height * scaleY), 0); + _adjustViewportToClipRatio(X, Y, WIDTH, HEIGHT); + gfxContext.setViewport(X, Y, WIDTH, HEIGHT); } else { const f32 scaleX = pCurrentBuffer->m_scale; const f32 scaleY = pCurrentBuffer->m_scale; @@ -259,12 +271,14 @@ void GraphicsDrawer::_updateViewport() const Xf += f32(pCurrentBuffer->m_originX); if (_needAdjustCoordinate(wnd)) Xf = _adjustViewportX(Xf); - const s32 X = roundup(Xf, scaleX); + s32 X = roundup(Xf, scaleX); float Yf = gSP.viewport.vscale[1] < 0 ? (gSP.viewport.y + gSP.viewport.vscale[1] * 2.0f) : gSP.viewport.y; Yf += f32(pCurrentBuffer->m_originY); - const s32 Y = roundup(Yf, scaleY); - gfxContext.setViewport(X, Y, - std::max(roundup(gSP.viewport.width, scaleX), 0), std::max(roundup(gSP.viewport.height, scaleY), 0)); + s32 Y = roundup(Yf, scaleY); + s32 WIDTH = std::max(roundup(gSP.viewport.width, scaleX), 0); + s32 HEIGHT = std::max(roundup(gSP.viewport.height, scaleY), 0); + _adjustViewportToClipRatio(X, Y, WIDTH, HEIGHT); + gfxContext.setViewport(X, Y, WIDTH, HEIGHT); } gSP.changed &= ~CHANGED_VIEWPORT; } @@ -289,8 +303,10 @@ void GraphicsDrawer::_updateScreenCoordsViewport(const FrameBuffer * _pBuffer) c X = roundup(f32(pCurrentBuffer->m_originX), viewportScaleX); Y = roundup(f32(pCurrentBuffer->m_originY), viewportScaleY); } - - gfxContext.setViewport(X, Y, roundup(f32(bufferWidth), viewportScaleX), roundup(f32(bufferHeight), viewportScaleY)); + s32 WIDTH = roundup(f32(bufferWidth), viewportScaleX); + s32 HEIGHT = roundup(f32(bufferHeight), viewportScaleY); + _adjustViewportToClipRatio(X, Y, WIDTH, HEIGHT); + gfxContext.setViewport(X, Y, WIDTH, HEIGHT); gSP.changed |= CHANGED_VIEWPORT; }