diff --git a/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramBuilder.cpp b/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramBuilder.cpp index a1fea7aa..b959880d 100644 --- a/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramBuilder.cpp +++ b/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramBuilder.cpp @@ -2431,29 +2431,42 @@ public: " return texCoord; \n" "} \n" + "highp vec2 wrap2D(in highp vec2 tc, in highp float width) \n" + "{ \n" + " float address = tc.s + tc.t * width; \n" + " return vec2(mod(address, width), floor(address/width)); \n" + "} \n" + + "uniform mediump vec2 uTexSize0; \n" "highp vec2[5] textureEngine0(in highp vec2 texCoord) \n" "{ \n" " highp vec2[5] tcData; \n" // {tc00, tc01, tc10, tc11, frPart} " mediump vec2 intPart = floor(texCoord); \n" - " tcData[0] = clampWrapMirror(intPart, uTexWrap0, uTexClamp0, uTexWrapEn0, uTexClampEn0, uTexMirrorEn0); \n" - " tcData[3] = clampWrapMirror(intPart + vec2(1.0,1.0), uTexWrap0, uTexClamp0, uTexWrapEn0, uTexClampEn0, uTexMirrorEn0); \n" + " highp vec2 tc00 = clampWrapMirror(intPart, uTexWrap0, uTexClamp0, uTexWrapEn0, uTexClampEn0, uTexMirrorEn0); \n" + " highp vec2 tc11 = clampWrapMirror(intPart + vec2(1.0,1.0), uTexWrap0, uTexClamp0, uTexWrapEn0, uTexClampEn0, uTexMirrorEn0); \n" + " tcData[0] = wrap2D(tc00, uTexSize0.s); \n" + " tcData[3] = wrap2D(tc11, uTexSize0.s); \n" " tcData[1] = vec2(tcData[0].s, tcData[3].t); \n" " tcData[2] = vec2(tcData[3].s, tcData[0].t); \n" " tcData[4] = texCoord - intPart; \n" " return tcData;" "} \n" + "uniform mediump vec2 uTexSize1; \n" "highp vec2[5] textureEngine1(in highp vec2 texCoord) \n" "{ \n" " highp vec2[5] tcData; \n" // {tc00, tc01, tc10, tc11, frPart} " mediump vec2 intPart = floor(texCoord); \n" - " tcData[0] = clampWrapMirror(intPart, uTexWrap1, uTexClamp1, uTexWrapEn1, uTexClampEn1, uTexMirrorEn1); \n" - " tcData[3] = clampWrapMirror(intPart + vec2(1.0,1.0), uTexWrap1, uTexClamp1, uTexWrapEn1, uTexClampEn1, uTexMirrorEn1); \n" + " highp vec2 tc00 = clampWrapMirror(intPart, uTexWrap1, uTexClamp1, uTexWrapEn1, uTexClampEn1, uTexMirrorEn1); \n" + " highp vec2 tc11 = clampWrapMirror(intPart + vec2(1.0,1.0), uTexWrap1, uTexClamp1, uTexWrapEn1, uTexClampEn1, uTexMirrorEn1); \n" + " tcData[0] = wrap2D(tc00, uTexSize1.s); \n" + " tcData[3] = wrap2D(tc11, uTexSize1.s); \n" " tcData[1] = vec2(tcData[0].s, tcData[3].t); \n" " tcData[2] = vec2(tcData[3].s, tcData[0].t); \n" " tcData[4] = texCoord - intPart; \n" " return tcData;" "} \n" + ; } }; diff --git a/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramUniformFactory.cpp b/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramUniformFactory.cpp index 42207d70..7ab58813 100644 --- a/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramUniformFactory.cpp +++ b/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramUniformFactory.cpp @@ -876,6 +876,8 @@ public: LocateUniform(uCacheOffset[0]); LocateUniform(uCacheOffset[1]); LocateUniform(uTexScale); + LocateUniform(uTexSize[0]); + LocateUniform(uTexSize[1]); LocateUniform(uCacheFrameBuffer); } @@ -932,6 +934,7 @@ private: fv2Uniform uCacheScale[2]; fv2Uniform uCacheOffset[2]; fv2Uniform uTexScale; + fv2Uniform uTexSize[2]; iv2Uniform uCacheFrameBuffer; }; @@ -952,6 +955,8 @@ public: LocateUniform(uTexClampEn1); LocateUniform(uTexMirrorEn0); LocateUniform(uTexMirrorEn1); + LocateUniform(uTexSize0); + LocateUniform(uTexSize1); } void update(bool _force) override @@ -961,6 +966,7 @@ public: std::array aTexWrapEn[2] = { { 0.0f,0.0f },{ 0.0f,0.0f } }; std::array aTexClampEn[2] = { { 0.0f,0.0f },{ 0.0f,0.0f } }; std::array aTexMirrorEn[2] = { { 0.0f,0.0f },{ 0.0f,0.0f } }; + std::array aTexSize[2] = { { 0.0f,0.0f },{ 0.0f,0.0f } }; TextureCache & cache = textureCache(); const bool replaceTex1ByTex0 = needReplaceTex1ByTex0(); @@ -974,6 +980,9 @@ public: if (pTile == nullptr || pTexture == nullptr) continue; + aTexSize[t][0] = pTexture->width * pTexture->hdRatioS; + aTexSize[t][1] = pTexture->height * pTexture->hdRatioT; + /* Not sure if special treatment of framebuffer textures is correct */ if (pTexture->frameBufferTexture != CachedTexture::fbNone || pTile->textureMode != TEXTUREMODE_NORMAL || @@ -996,8 +1005,8 @@ public: aTexClamp[t][1] = (pTile->flrt - pTile->fult + 1.0f) * pTexture->hdRatioT - 1.0f; aTexWrapEn[t][0] = f32(pTile->masks == 0 ? 0 : 1); aTexWrapEn[t][1] = f32(pTile->maskt == 0 ? 0 : 1); - aTexClampEn[t][0] = f32(pTile->masks == 0 ? 1 : pTile->clamps); - aTexClampEn[t][1] = f32(pTile->maskt == 0 ? 1 : pTile->clampt); + aTexClampEn[t][0] = f32(gDP.otherMode.cycleType == G_CYC_COPY ? 0 : (pTile->masks == 0 ? 1 : pTile->clamps)); + aTexClampEn[t][1] = f32(gDP.otherMode.cycleType == G_CYC_COPY ? 0 : (pTile->maskt == 0 ? 1 : pTile->clampt)); aTexMirrorEn[t][0] = f32(pTile->masks == 0 ? 0 : pTile->mirrors); aTexMirrorEn[t][1] = f32(pTile->maskt == 0 ? 0 : pTile->mirrort); } @@ -1013,6 +1022,8 @@ public: uTexClampEn1.set(aTexClampEn[1][0], aTexClampEn[1][1], _force); uTexMirrorEn0.set(aTexMirrorEn[0][0], aTexMirrorEn[0][1], _force); uTexMirrorEn1.set(aTexMirrorEn[1][0], aTexMirrorEn[1][1], _force); + uTexSize0.set(aTexSize[0][0], aTexSize[0][1], _force); + uTexSize1.set(aTexSize[1][0], aTexSize[1][1], _force); } @@ -1028,6 +1039,8 @@ private: fv2Uniform uTexClampEn1; fv2Uniform uTexMirrorEn0; fv2Uniform uTexMirrorEn1; + fv2Uniform uTexSize0; + fv2Uniform uTexSize1; }; class ULights : public UniformGroup