diff --git a/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramBuilderAccurate.cpp b/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramBuilderAccurate.cpp index ead9a1f3..51f542ee 100644 --- a/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramBuilderAccurate.cpp +++ b/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramBuilderAccurate.cpp @@ -728,6 +728,7 @@ public: "uniform lowp int uEnableLod; \n" "uniform mediump float uMinLod; \n" "uniform lowp int uMaxTile; \n" + "uniform lowp int uNoAtlasTex; \n" "uniform lowp int uTextureDetail; \n" " \n" "mediump float mipmap(out lowp vec4 readtex0, out lowp vec4 readtex1) { \n" @@ -775,15 +776,11 @@ public: " lod_frac = clamp(lod_frac - 1.0, -1.0, 1.0); \n" " } \n" " \n" - " if (tile0 == 0) \n" - " readtex0 = TextureMipMap0(uTex0, tcData0); \n" - " else if (uEnableLod == 0 || uMaxTile == 1) \n" - " readtex0 = TextureMipMap0(uTex1, tcData1); \n" + " if (tile0 == 0) readtex0 = TextureMipMap0(uTex0, tcData0); \n" + " else if (uNoAtlasTex != 0) readtex0 = TextureMipMap0(uTex1, tcData1); \n" " else readtex0 = TextureMipMap1(uTex1, tcData1, float(tile0 - 1)); \n" - " if (tile1 == 0) \n" - " readtex1 = TextureMipMap0(uTex0, tcData0); \n" - " else if (uEnableLod == 0 || uMaxTile == 1) \n" - " readtex1 = TextureMipMap0(uTex1, tcData1); \n" + " if (tile1 == 0) readtex1 = TextureMipMap0(uTex0, tcData0); \n" + " else if (uNoAtlasTex != 0) readtex1 = TextureMipMap0(uTex1, tcData1); \n" " else readtex1 = TextureMipMap1(uTex1, tcData1, float(tile1 - 1)); \n" " return lod_frac; \n" "} \n" @@ -857,6 +854,7 @@ public: "uniform lowp int uEnableLod; \n" "uniform mediump float uMinLod; \n" "uniform lowp int uMaxTile; \n" + "uniform lowp int uNoAtlasTex; \n" "uniform lowp int uTextureDetail; \n" " \n" "mediump float mipmap(out lowp vec4 readtex0, out lowp vec4 readtex1) { \n" @@ -898,10 +896,10 @@ public: " } \n" " \n" " if(tile0 == 0) {READ_TEX0_MIPMAP(readtex0, uTex0, tcData0);} \n" - " else if (uEnableLod == 0 || uMaxTile == 1) {READ_TEX0_MIPMAP(readtex0, uTex1, tcData1);}\n" + " else if (uNoAtlasTex != 0) {READ_TEX0_MIPMAP(readtex0, uTex1, tcData1);}\n" " else {READ_TEX1_MIPMAP(readtex0, uTex1, tcData1, tile0 - 1);} \n" " if(tile1 == 0) {READ_TEX0_MIPMAP(readtex1, uTex0, tcData0);} \n" - " else if (uEnableLod == 0 || uMaxTile == 1) {READ_TEX0_MIPMAP(readtex1, uTex1, tcData1);}\n" + " else if (uNoAtlasTex != 0) {READ_TEX0_MIPMAP(readtex1, uTex1, tcData1);}\n" " else {READ_TEX1_MIPMAP(readtex1, uTex1, tcData1, tile1 - 1);} \n" " return lod_frac; \n" "} \n" diff --git a/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramUniformFactoryAccurate.cpp b/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramUniformFactoryAccurate.cpp index 2332cdbc..9cb64616 100644 --- a/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramUniformFactoryAccurate.cpp +++ b/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramUniformFactoryAccurate.cpp @@ -99,26 +99,32 @@ public: LocateUniform(uMinLod); LocateUniform(uMaxTile); LocateUniform(uEnableLod); + LocateUniform(uNoAtlasTex); LocateUniform(uTextureDetail); } void update(bool _force) override { uMinLod.set(gDP.primColor.m, _force); - const CachedTexture * _pTexture = textureCache().current[1]; - if (_pTexture == nullptr) - uMaxTile.set(gSP.texture.level, _force); - else - uMaxTile.set(_pTexture->max_level > 0 ? gSP.texture.level : std::min(gSP.texture.level, 1u), _force); - const int uCalcLOD = (gDP.otherMode.textureLOD == G_TL_LOD) ? 1 : 0; - uEnableLod.set(uCalcLOD, _force); + uEnableLod.set(gDP.otherMode.textureLOD == G_TL_LOD ? 1 : 0, _force); uTextureDetail.set(gDP.otherMode.textureDetail, _force); + + u32 maxTile = gSP.texture.level; + const CachedTexture * _pTexture = textureCache().current[1]; + if (_pTexture != nullptr && _pTexture->max_level == 0) + maxTile = std::min(gSP.texture.level, 1u); // Hack for HD textures + uMaxTile.set(maxTile, _force); + + bool bNoAtlasTex = maxTile == 0 || gDP.otherMode.textureLOD != G_TL_LOD || + (gDP.otherMode.textureDetail != G_TD_DETAIL && maxTile == 1); + uNoAtlasTex.set(bNoAtlasTex ? 1 : 0, _force); } private: fUniform uMinLod; iUniform uMaxTile; iUniform uEnableLod; + iUniform uNoAtlasTex; iUniform uTextureDetail; };