mirror of
https://github.com/blawar/GLideN64.git
synced 2024-07-07 03:13:49 +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"
|
" return texCoord; \n"
|
||||||
"} \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"
|
"highp vec2[5] textureEngine0(in highp vec2 texCoord) \n"
|
||||||
"{ \n"
|
"{ \n"
|
||||||
" highp vec2[5] tcData; \n" // {tc00, tc01, tc10, tc11, frPart}
|
" highp vec2[5] tcData; \n" // {tc00, tc01, tc10, tc11, frPart}
|
||||||
" mediump vec2 intPart = floor(texCoord); \n"
|
" mediump vec2 intPart = floor(texCoord); \n"
|
||||||
" tcData[0] = clampWrapMirror(intPart, uTexWrap0, uTexClamp0, uTexWrapEn0, uTexClampEn0, uTexMirrorEn0); \n"
|
" highp vec2 tc00 = 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 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[1] = vec2(tcData[0].s, tcData[3].t); \n"
|
||||||
" tcData[2] = vec2(tcData[3].s, tcData[0].t); \n"
|
" tcData[2] = vec2(tcData[3].s, tcData[0].t); \n"
|
||||||
" tcData[4] = texCoord - intPart; \n"
|
" tcData[4] = texCoord - intPart; \n"
|
||||||
" return tcData;"
|
" return tcData;"
|
||||||
"} \n"
|
"} \n"
|
||||||
|
|
||||||
|
"uniform mediump vec2 uTexSize1; \n"
|
||||||
"highp vec2[5] textureEngine1(in highp vec2 texCoord) \n"
|
"highp vec2[5] textureEngine1(in highp vec2 texCoord) \n"
|
||||||
"{ \n"
|
"{ \n"
|
||||||
" highp vec2[5] tcData; \n" // {tc00, tc01, tc10, tc11, frPart}
|
" highp vec2[5] tcData; \n" // {tc00, tc01, tc10, tc11, frPart}
|
||||||
" mediump vec2 intPart = floor(texCoord); \n"
|
" mediump vec2 intPart = floor(texCoord); \n"
|
||||||
" tcData[0] = clampWrapMirror(intPart, uTexWrap1, uTexClamp1, uTexWrapEn1, uTexClampEn1, uTexMirrorEn1); \n"
|
" highp vec2 tc00 = 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 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[1] = vec2(tcData[0].s, tcData[3].t); \n"
|
||||||
" tcData[2] = vec2(tcData[3].s, tcData[0].t); \n"
|
" tcData[2] = vec2(tcData[3].s, tcData[0].t); \n"
|
||||||
" tcData[4] = texCoord - intPart; \n"
|
" tcData[4] = texCoord - intPart; \n"
|
||||||
" return tcData;"
|
" return tcData;"
|
||||||
"} \n"
|
"} \n"
|
||||||
|
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -876,6 +876,8 @@ public:
|
||||||
LocateUniform(uCacheOffset[0]);
|
LocateUniform(uCacheOffset[0]);
|
||||||
LocateUniform(uCacheOffset[1]);
|
LocateUniform(uCacheOffset[1]);
|
||||||
LocateUniform(uTexScale);
|
LocateUniform(uTexScale);
|
||||||
|
LocateUniform(uTexSize[0]);
|
||||||
|
LocateUniform(uTexSize[1]);
|
||||||
LocateUniform(uCacheFrameBuffer);
|
LocateUniform(uCacheFrameBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -932,6 +934,7 @@ private:
|
||||||
fv2Uniform uCacheScale[2];
|
fv2Uniform uCacheScale[2];
|
||||||
fv2Uniform uCacheOffset[2];
|
fv2Uniform uCacheOffset[2];
|
||||||
fv2Uniform uTexScale;
|
fv2Uniform uTexScale;
|
||||||
|
fv2Uniform uTexSize[2];
|
||||||
iv2Uniform uCacheFrameBuffer;
|
iv2Uniform uCacheFrameBuffer;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -952,6 +955,8 @@ public:
|
||||||
LocateUniform(uTexClampEn1);
|
LocateUniform(uTexClampEn1);
|
||||||
LocateUniform(uTexMirrorEn0);
|
LocateUniform(uTexMirrorEn0);
|
||||||
LocateUniform(uTexMirrorEn1);
|
LocateUniform(uTexMirrorEn1);
|
||||||
|
LocateUniform(uTexSize0);
|
||||||
|
LocateUniform(uTexSize1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void update(bool _force) override
|
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> 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> 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> 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();
|
TextureCache & cache = textureCache();
|
||||||
const bool replaceTex1ByTex0 = needReplaceTex1ByTex0();
|
const bool replaceTex1ByTex0 = needReplaceTex1ByTex0();
|
||||||
|
@ -974,6 +980,9 @@ public:
|
||||||
if (pTile == nullptr || pTexture == nullptr)
|
if (pTile == nullptr || pTexture == nullptr)
|
||||||
continue;
|
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 */
|
/* Not sure if special treatment of framebuffer textures is correct */
|
||||||
if (pTexture->frameBufferTexture != CachedTexture::fbNone ||
|
if (pTexture->frameBufferTexture != CachedTexture::fbNone ||
|
||||||
pTile->textureMode != TEXTUREMODE_NORMAL ||
|
pTile->textureMode != TEXTUREMODE_NORMAL ||
|
||||||
|
@ -996,8 +1005,8 @@ public:
|
||||||
aTexClamp[t][1] = (pTile->flrt - pTile->fult + 1.0f) * pTexture->hdRatioT - 1.0f;
|
aTexClamp[t][1] = (pTile->flrt - pTile->fult + 1.0f) * pTexture->hdRatioT - 1.0f;
|
||||||
aTexWrapEn[t][0] = f32(pTile->masks == 0 ? 0 : 1);
|
aTexWrapEn[t][0] = f32(pTile->masks == 0 ? 0 : 1);
|
||||||
aTexWrapEn[t][1] = f32(pTile->maskt == 0 ? 0 : 1);
|
aTexWrapEn[t][1] = f32(pTile->maskt == 0 ? 0 : 1);
|
||||||
aTexClampEn[t][0] = f32(pTile->masks == 0 ? 1 : pTile->clamps);
|
aTexClampEn[t][0] = f32(gDP.otherMode.cycleType == G_CYC_COPY ? 0 : (pTile->masks == 0 ? 1 : pTile->clamps));
|
||||||
aTexClampEn[t][1] = f32(pTile->maskt == 0 ? 1 : pTile->clampt);
|
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][0] = f32(pTile->masks == 0 ? 0 : pTile->mirrors);
|
||||||
aTexMirrorEn[t][1] = f32(pTile->maskt == 0 ? 0 : pTile->mirrort);
|
aTexMirrorEn[t][1] = f32(pTile->maskt == 0 ? 0 : pTile->mirrort);
|
||||||
}
|
}
|
||||||
|
@ -1013,6 +1022,8 @@ public:
|
||||||
uTexClampEn1.set(aTexClampEn[1][0], aTexClampEn[1][1], _force);
|
uTexClampEn1.set(aTexClampEn[1][0], aTexClampEn[1][1], _force);
|
||||||
uTexMirrorEn0.set(aTexMirrorEn[0][0], aTexMirrorEn[0][1], _force);
|
uTexMirrorEn0.set(aTexMirrorEn[0][0], aTexMirrorEn[0][1], _force);
|
||||||
uTexMirrorEn1.set(aTexMirrorEn[1][0], aTexMirrorEn[1][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 uTexClampEn1;
|
||||||
fv2Uniform uTexMirrorEn0;
|
fv2Uniform uTexMirrorEn0;
|
||||||
fv2Uniform uTexMirrorEn1;
|
fv2Uniform uTexMirrorEn1;
|
||||||
|
fv2Uniform uTexSize0;
|
||||||
|
fv2Uniform uTexSize1;
|
||||||
};
|
};
|
||||||
|
|
||||||
class ULights : public UniformGroup
|
class ULights : public UniformGroup
|
||||||
|
|
Loading…
Reference in New Issue
Block a user