diff --git a/core/rend/gles/gltex.cpp b/core/rend/gles/gltex.cpp index 1f32be7e7..6820a5fc4 100644 --- a/core/rend/gles/gltex.cpp +++ b/core/rend/gles/gltex.cpp @@ -432,6 +432,17 @@ void createTexture(u32 w, u32 h, u32 textureFormat, u32 textureType, GLuint & te glTexImage2D(GL_TEXTURE_2D, 0, textureFormat, w, h, 0, textureFormat, textureType, 0); } +double binaryFractionToDouble(u32 numberIntegerPart, u32 numberFractionalPart, u32 fractionalPartLength) +{ + double sum = 0; + + for (u32 i = 1; i <= fractionalPartLength; ++i) { + sum += !!(numberFractionalPart & (1 << fractionalPartLength - i)) * pow(.5, i); + } + + return numberIntegerPart + sum; +} + map renderedTextures; void BindRTT(u32 addy, u32 fbw, u32 fbh, u32 channels, u32 fmt) @@ -446,6 +457,12 @@ void BindRTT(u32 addy, u32 fbw, u32 fbh, u32 channels, u32 fmt) renderedTexture = &renderedTextures[location]; } + u32 fbhViewport = fbh; + if (SCALER_CTL.vscalefactor != 0x0400) { + fbh = round(fbw * binaryFractionToDouble( + SCALER_CTL.vscalefactor >> 10, SCALER_CTL.vscalefactor & 0x3FF, 10)); + } + renderedTexture->texAddress = location; renderedTexture->fb_packmode = FB_W_CTRL.fb_packmode; renderedTexture->updated = true; @@ -526,7 +543,7 @@ void BindRTT(u32 addy, u32 fbw, u32 fbh, u32 channels, u32 fmt) glBindFramebuffer(GL_FRAMEBUFFER, renderedTexture->fbo); } - glViewport(0, 0, fbw, fbh); + glViewport(0, 0, fbw, fbhViewport); } GLint checkSupportedReadFormat()