diff --git a/src/FrameBuffer.cpp b/src/FrameBuffer.cpp index 28f18aa4..71787f6b 100644 --- a/src/FrameBuffer.cpp +++ b/src/FrameBuffer.cpp @@ -499,19 +499,8 @@ CachedTexture * FrameBuffer::getTexture(u32 _t) pTexture->scaleS = m_scale / static_cast(pTexture->width); pTexture->scaleT = m_scale / static_cast(pTexture->height); - if (gSP.textureTile[_t]->shifts > 10) - pTexture->shiftScaleS = static_cast(1 << (16 - gSP.textureTile[_t]->shifts)); - else if (gSP.textureTile[_t]->shifts > 0) - pTexture->shiftScaleS = 1.0f / static_cast(1 << gSP.textureTile[_t]->shifts); - else - pTexture->shiftScaleS = 1.0f; - - if (gSP.textureTile[_t]->shiftt > 10) - pTexture->shiftScaleT = static_cast(1 << (16 - gSP.textureTile[_t]->shiftt)); - else if (gSP.textureTile[_t]->shiftt > 0) - pTexture->shiftScaleT = 1.0f / static_cast(1 << gSP.textureTile[_t]->shiftt); - else - pTexture->shiftScaleT = 1.0f; + pTexture->shiftScaleS = calcShiftScaleS(*gSP.textureTile[_t]); + pTexture->shiftScaleT = calcShiftScaleT(*gSP.textureTile[_t]); return pTexture; } diff --git a/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramUniformFactoryAccurate.cpp b/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramUniformFactoryAccurate.cpp index b38b8594..ae6df2e6 100644 --- a/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramUniformFactoryAccurate.cpp +++ b/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramUniformFactoryAccurate.cpp @@ -274,8 +274,8 @@ public: aTexSize[t][0] = pTexture->width * pTexture->hdRatioS; aTexSize[t][1] = pTexture->height * pTexture->hdRatioT; - aShiftScale[t][0] = pTile->shifts > 10 ? static_cast(1 << (16 - pTile->shifts)) : 1.0f / static_cast(1 << pTile->shifts); - aShiftScale[t][1] = pTile->shiftt > 10 ? static_cast(1 << (16 - pTile->shiftt)) : 1.0f / static_cast(1 << pTile->shiftt); + aShiftScale[t][0] = calcShiftScaleS(*pTile); + aShiftScale[t][1] = calcShiftScaleT(*pTile); if (pTile->textureMode != TEXTUREMODE_BGIMAGE && pTile->textureMode != TEXTUREMODE_FRAMEBUFFER_BG) { aTexOffset[t][0] = pTile->fuls; diff --git a/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramUniformFactoryFast.cpp b/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramUniformFactoryFast.cpp index 489d44e8..2567cd8b 100644 --- a/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramUniformFactoryFast.cpp +++ b/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramUniformFactoryFast.cpp @@ -78,33 +78,18 @@ public: float tcbounds[2][4] = {}; if (useTexCoordBounds) { f32 uls, lrs, ult, lrt, S, T, shiftScaleS, shiftScaleT; - s16 shiftedS, shiftedT; - u32 shifts, shiftt; for (int t = 0; t < 2; t++) { const CachedTexture * _pTexture = textureCache().current[t]; const gDPTile * _pTile = gSP.textureTile[t]; - if (_pTexture != nullptr && _pTile != nullptr){ - if (_pTile->shifts > 10) { - shifts = 16 - _pTile->shifts; - shiftedS = static_cast(gDP.lastTexRectInfo.s << shifts); - shiftScaleS = static_cast(1 << shifts); - } else { - shifts = _pTile->shifts; - shiftedS = static_cast(gDP.lastTexRectInfo.s >> shifts); - shiftScaleS = 1.0f / static_cast(1 << shifts); - } - if (_pTile->shiftt > 10) { - shiftt = 16 - _pTile->shiftt; - shiftedT = static_cast(gDP.lastTexRectInfo.t << shiftt); - shiftScaleT = static_cast(1 << shiftt); - } else { - shiftt = _pTile->shiftt; - shiftedT = static_cast(gDP.lastTexRectInfo.t >> shiftt); - shiftScaleT = 1.0f / static_cast(1 << shiftt); - } - + if (_pTexture != nullptr && _pTile != nullptr) { + s16 shiftedS = gDP.lastTexRectInfo.s; + shiftScaleS = calcShiftScaleS(*_pTile, &shiftedS); S = _FIXED2FLOAT(shiftedS, 5); + + s16 shiftedT = gDP.lastTexRectInfo.t; + shiftScaleT = calcShiftScaleT(*_pTile, &shiftedT); T = _FIXED2FLOAT(shiftedT, 5); + uls = S + (ceilf(gDP.lastTexRectInfo.ulx) - gDP.lastTexRectInfo.ulx) * gDP.lastTexRectInfo.dsdx * shiftScaleS; lrs = S + (ceilf(gDP.lastTexRectInfo.lrx) - gDP.lastTexRectInfo.ulx - 1.0f) * gDP.lastTexRectInfo.dsdx * shiftScaleS; ult = T + (ceilf(gDP.lastTexRectInfo.uly) - gDP.lastTexRectInfo.uly) * gDP.lastTexRectInfo.dtdy * shiftScaleT; diff --git a/src/GraphicsDrawer.cpp b/src/GraphicsDrawer.cpp index 656fdb40..7b303023 100644 --- a/src/GraphicsDrawer.cpp +++ b/src/GraphicsDrawer.cpp @@ -1283,28 +1283,12 @@ void GraphicsDrawer::drawTexturedRect(const TexturedRectParams & _params) f32 shiftScaleT = 1.0f; s16 S = _params.s; - if (gSP.textureTile[t]->shifts > 10) { - const u32 shifts = 16 - gSP.textureTile[t]->shifts; - S = static_cast(S << shifts); - shiftScaleS = static_cast(1 << shifts); - } else if (gSP.textureTile[t]->shifts > 0) { - const u32 shifts = gSP.textureTile[t]->shifts; - S = static_cast(S >> shifts); - shiftScaleS /= static_cast(1 << shifts); - } + shiftScaleS = calcShiftScaleS(*gSP.textureTile[t], &S); const f32 uls = _FIXED2FLOAT(S, 5); const f32 lrs = uls + offsetX * shiftScaleS; s16 T = _params.t; - if (gSP.textureTile[t]->shiftt > 10) { - const u32 shiftt = 16 - gSP.textureTile[t]->shiftt; - T = static_cast(T << shiftt); - shiftScaleT = static_cast(1 << shiftt); - } else if (gSP.textureTile[t]->shiftt > 0) { - const u32 shiftt = gSP.textureTile[t]->shiftt; - T = static_cast(T >> shiftt); - shiftScaleT /= static_cast(1 << shiftt); - } + shiftScaleT = calcShiftScaleT(*gSP.textureTile[t], &T); const f32 ult = _FIXED2FLOAT(T, 5); const f32 lrt = ult + offsetY * shiftScaleT; diff --git a/src/Textures.cpp b/src/Textures.cpp index 8203fec4..be15631c 100644 --- a/src/Textures.cpp +++ b/src/Textures.cpp @@ -1915,7 +1915,8 @@ void TextureCache::update(u32 _t) void getTextureShiftScale(u32 t, const TextureCache & cache, f32 & shiftScaleS, f32 & shiftScaleT) { - if (gSP.textureTile[t]->textureMode != TEXTUREMODE_NORMAL) { + gDPTile & tile = *gSP.textureTile[t]; + if (tile.textureMode != TEXTUREMODE_NORMAL) { shiftScaleS = cache.current[t]->shiftScaleS; shiftScaleT = cache.current[t]->shiftScaleT; return; @@ -1924,15 +1925,8 @@ void getTextureShiftScale(u32 t, const TextureCache & cache, f32 & shiftScaleS, if (gDP.otherMode.textureLOD == G_TL_LOD && gSP.texture.level == 0 && !currentCombiner()->usesLOD()) t = 0; - if (gSP.textureTile[t]->shifts > 10) - shiftScaleS = (f32)(1 << (16 - gSP.textureTile[t]->shifts)); - else if (gSP.textureTile[t]->shifts > 0) - shiftScaleS /= (f32)(1 << gSP.textureTile[t]->shifts); - - if (gSP.textureTile[t]->shiftt > 10) - shiftScaleT = (f32)(1 << (16 - gSP.textureTile[t]->shiftt)); - else if (gSP.textureTile[t]->shiftt > 0) - shiftScaleT /= (f32)(1 << gSP.textureTile[t]->shiftt); + shiftScaleS = calcShiftScaleS(tile); + shiftScaleT = calcShiftScaleT(tile); } bool needReplaceTex1ByTex0() diff --git a/src/gDP.cpp b/src/gDP.cpp index b56abf06..d8dff335 100644 --- a/src/gDP.cpp +++ b/src/gDP.cpp @@ -43,6 +43,38 @@ bool isDepthCompareEnabled() ((gSP.geometryMode & G_ZBUFFER) || gDP.otherMode.depthSource == G_ZS_PRIM); } +f32 calcShiftScaleS(const gDPTile & _tile, s16 * _s) +{ + if (_tile.shifts > 10) { + const u32 shifts = 16 - _tile.shifts; + if (_s != nullptr) + *_s = static_cast(*_s << shifts); + return static_cast(1 << shifts); + } else if (_tile.shifts > 0) { + const u32 shifts = _tile.shifts; + if (_s != nullptr) + *_s = static_cast(*_s >> shifts); + return 1.0f / static_cast(1 << shifts); + } + return 1.0f; +} + +f32 calcShiftScaleT(const gDPTile & _tile, s16 * _t) +{ + if (_tile.shiftt > 10) { + const u32 shiftt = 16 - _tile.shiftt; + if (_t != nullptr) + *_t = static_cast(*_t << shiftt); + return static_cast(1 << shiftt); + } else if (_tile.shiftt > 0) { + const u32 shiftt = _tile.shiftt; + if (_t != nullptr) + *_t = static_cast(*_t >> shiftt); + return 1.0f / static_cast(1 << shiftt); + } + return 1.0f; +} + void gDPSetOtherMode( u32 mode0, u32 mode1 ) { gDP.otherMode.h = mode0; diff --git a/src/gDP.h b/src/gDP.h index a8458950..8b2a509e 100644 --- a/src/gDP.h +++ b/src/gDP.h @@ -329,4 +329,7 @@ void gDPTriShadeTxtrZ( u32 w0, u32 w1 ); bool isCurrentColorImageDepthImage(); bool isDepthCompareEnabled(); +f32 calcShiftScaleS(const gDPTile & _tile, s16 * _s = nullptr); +f32 calcShiftScaleT(const gDPTile & _tile, s16 * _t = nullptr); + #endif