1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-07-02 09:03:37 +00:00

Fix out of bounds texel fetch issues.

Fixes #2257 Dark Rift background issue
This commit is contained in:
S2S 2020-05-11 19:31:24 +02:00 committed by Sergey Lipskiy
parent 2616ba9587
commit f5ee3523ef
2 changed files with 32 additions and 6 deletions

View File

@ -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"
;
}
};

View File

@ -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<f32, 2> aTexWrapEn[2] = { { 0.0f,0.0f },{ 0.0f,0.0f } };
std::array<f32, 2> aTexClampEn[2] = { { 0.0f,0.0f },{ 0.0f,0.0f } };
std::array<f32, 2> aTexMirrorEn[2] = { { 0.0f,0.0f },{ 0.0f,0.0f } };
std::array<f32, 2> 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