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:
parent
2616ba9587
commit
f5ee3523ef
|
@ -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"
|
||||
|
||||
;
|
||||
}
|
||||
};
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue
Block a user