1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-06-30 08:24:05 +00:00

Remove duplicated uniforms in accurate texture coordinate path.

This commit is contained in:
s2s 2021-11-23 19:27:33 +01:00 committed by Sergey Lipskiy
parent 6b8b53f633
commit 4e0a4f700c
9 changed files with 209 additions and 144 deletions

View File

@ -67,6 +67,10 @@ public:
static u32 s_cycleType;
static TextureConvert s_textureConvert;
protected:
virtual const ShaderPart * getVertexShaderTexturedRect() const = 0;
virtual const ShaderPart * getVertexShaderTexturedTriangle() const = 0;
private:
CombinerInputs compileCombiner(const CombinerKey & _key, Combiner & _color, Combiner & _alpha, std::string & _strShader);

View File

@ -31,8 +31,7 @@ public:
"uniform mediump vec2 uAdjustTrans; \n"
"uniform mediump vec2 uAdjustScale; \n"
"uniform lowp ivec2 uCacheFrameBuffer; \n"
"OUT highp vec2 vTexCoord0; \n"
"OUT highp vec2 vTexCoord1; \n"
"OUT highp vec2 vTexCoord; \n"
"OUT mediump vec2 vLodTexCoord; \n"
"OUT lowp float vNumLights; \n"
"OUT lowp vec4 vShadeColor; \n"
@ -50,8 +49,7 @@ public:
" vec2 texCoord = aTexCoord; \n"
" texCoord *= uTexScale; \n"
" if (uTexturePersp == 0 && aModify[2] == 0.0) texCoord *= 0.5;\n"
" vTexCoord0 = texCoord; \n"
" vTexCoord1 = texCoord; \n"
" vTexCoord = texCoord; \n"
" vLodTexCoord = texCoord; \n"
" vNumLights = aNumLights; \n"
" if ((aModify[0]) != 0.0) { \n"
@ -84,6 +82,51 @@ public:
}
};
class VertexShaderTexturedRect : public ShaderPart
{
public:
VertexShaderTexturedRect(const opengl::GLInfo & _glinfo)
{
m_part =
"IN highp vec4 aRectPosition; \n"
"IN highp vec2 aTexCoord0; \n"
"IN highp vec2 aTexCoord1; \n"
"IN highp vec2 aBaryCoords; \n"
" \n"
"OUT highp vec2 vTexCoord; \n"
"OUT lowp vec4 vShadeColor; \n"
"OUT highp vec4 vBaryCoords; \n"
;
if (!_glinfo.isGLESX || _glinfo.noPerspective)
m_part += "noperspective OUT lowp vec4 vShadeColorNoperspective;\n";
else
m_part += "OUT lowp vec4 vShadeColorNoperspective; \n";
m_part +=
"uniform lowp vec4 uRectColor; \n"
"void main() \n"
"{ \n"
" gl_Position = aRectPosition; \n"
" vShadeColor = uRectColor; \n"
" vShadeColorNoperspective = uRectColor; \n"
" vTexCoord = aTexCoord0; \n"
" vBaryCoords = vec4(aBaryCoords, vec2(1.0) - aBaryCoords); \n"
;
}
};
class ShaderFragmentCorrectTexCoords : public ShaderPart {
public:
ShaderFragmentCorrectTexCoords() {
m_part +=
" highp vec2 mTexCoord = vTexCoord + vec2(0.0001); \n"
" mTexCoord += uTexCoordOffset; \n"
" if (uUseTexCoordBounds != 0) \n"
" mTexCoord = clamp(mTexCoord, uTexCoordBounds.xy, uTexCoordBounds.zw); \n"
" \n"
;
}
};
class ShaderFragmentGlobalVariablesTex : public ShaderPart
{
public:
@ -120,12 +163,11 @@ public:
"uniform highp vec2 uShiftScale[2]; \n"
"uniform highp vec2 uTexOffset[2]; \n"
"uniform highp vec2 uHDRatio[2]; \n"
"uniform highp vec2 uTexCoordOffset[2]; \n"
"uniform highp vec2 uTexCoordOffset; \n"
"uniform highp vec2 uBilinearOffset; \n"
"uniform highp vec2 uCacheOffset[2]; \n"
"uniform lowp int uUseTexCoordBounds; \n"
"uniform highp vec4 uTexCoordBounds0; \n"
"uniform highp vec4 uTexCoordBounds1; \n"
"uniform highp vec4 uTexCoordBounds; \n"
"uniform lowp int uScreenSpaceTriangle; \n"
"highp vec2 texCoord0; \n"
"highp vec2 texCoord1; \n"
@ -181,8 +223,7 @@ public:
m_part +=
"IN lowp vec4 vShadeColor; \n"
"IN highp vec2 vTexCoord0; \n"
"IN highp vec2 vTexCoord1; \n"
"IN highp vec2 vTexCoord; \n"
"IN mediump vec2 vLodTexCoord; \n"
"IN lowp float vNumLights; \n"
"IN highp vec4 vBaryCoords; \n"
@ -1136,7 +1177,7 @@ public:
ShaderFragmentTextureEngineTex0(const opengl::GLInfo _glinfo)
{
m_part =
"textureEngine0(mTexCoord0, tcData0); \n"
"textureEngine0(mTexCoord, tcData0); \n"
;
}
};
@ -1146,7 +1187,7 @@ public:
ShaderFragmentTextureEngineTex1(const opengl::GLInfo _glinfo)
{
m_part =
"textureEngine1(mTexCoord1, tcData1); \n"
"textureEngine1(mTexCoord, tcData1); \n"
;
}
};
@ -1156,8 +1197,10 @@ public:
namespace glsl {
CombinerProgramBuilderAccurate::CombinerProgramBuilderAccurate(const opengl::GLInfo & _glinfo, opengl::CachedUseProgram * _useProgram)
: CombinerProgramBuilderCommon(_glinfo, _useProgram, std::make_unique<CombinerProgramUniformFactoryAccurate>(_glinfo),
std::make_unique<VertexShaderTexturedTriangle>(_glinfo))
: CombinerProgramBuilderCommon(_glinfo, _useProgram, std::make_unique<CombinerProgramUniformFactoryAccurate>(_glinfo))
, m_vertexTexturedTriangle(new VertexShaderTexturedTriangle(_glinfo))
, m_vertexTexturedRect(new VertexShaderTexturedRect(_glinfo))
, m_fragmentCorrectTexCoords(new ShaderFragmentCorrectTexCoords())
, m_fragmentGlobalVariablesTex(new ShaderFragmentGlobalVariablesTex(_glinfo))
, m_fragmentHeaderTextureEngine(new ShaderFragmentHeaderTextureEngine(_glinfo))
, m_fragmentHeaderReadMSTex(new ShaderFragmentHeaderReadMSTex(_glinfo))
@ -1175,6 +1218,21 @@ CombinerProgramBuilderAccurate::CombinerProgramBuilderAccurate(const opengl::GLI
{
}
const ShaderPart * CombinerProgramBuilderAccurate::getVertexShaderTexturedRect() const
{
return m_vertexTexturedRect.get();
}
const ShaderPart * CombinerProgramBuilderAccurate::getVertexShaderTexturedTriangle() const
{
return m_vertexTexturedTriangle.get();
}
void CombinerProgramBuilderAccurate::_writeFragmentCorrectTexCoords(std::stringstream& ssShader)const
{
m_fragmentCorrectTexCoords->write(ssShader);
}
void CombinerProgramBuilderAccurate::_writeFragmentGlobalVariablesTex(std::stringstream& ssShader) const
{
m_fragmentGlobalVariablesTex->write(ssShader);

View File

@ -9,6 +9,10 @@ public:
CombinerProgramBuilderAccurate(const opengl::GLInfo & _glinfo, opengl::CachedUseProgram * _useProgram);
private:
const ShaderPart * getVertexShaderTexturedRect() const override;
const ShaderPart * getVertexShaderTexturedTriangle() const override;
void _writeFragmentCorrectTexCoords(std::stringstream& ssShader) const override;
void _writeFragmentGlobalVariablesTex(std::stringstream& ssShader) const override;
void _writeFragmentHeaderReadMSTex(std::stringstream& ssShader) const override;
void _writeFragmentHeaderReadTex(std::stringstream& ssShader) const override;
@ -24,6 +28,9 @@ private:
void _writeShaderReadtex(std::stringstream& ssShader) const override;
void _writeShaderReadtexCopyMode(std::stringstream& ssShader) const override;
ShaderPartPtr m_vertexTexturedTriangle;
ShaderPartPtr m_vertexTexturedRect;
ShaderPartPtr m_fragmentCorrectTexCoords;
ShaderPartPtr m_fragmentGlobalVariablesTex;
ShaderPartPtr m_fragmentHeaderTextureEngine;
ShaderPartPtr m_fragmentHeaderReadMSTex;

View File

@ -124,40 +124,6 @@ public:
}
};
class VertexShaderTexturedRect : public ShaderPart
{
public:
VertexShaderTexturedRect(const opengl::GLInfo & _glinfo)
{
m_part =
"IN highp vec4 aRectPosition; \n"
"IN highp vec2 aTexCoord0; \n"
"IN highp vec2 aTexCoord1; \n"
"IN highp vec2 aBaryCoords; \n"
" \n"
"OUT highp vec2 vTexCoord0; \n"
"OUT highp vec2 vTexCoord1; \n"
"OUT lowp vec4 vShadeColor; \n"
"OUT highp vec4 vBaryCoords; \n"
;
if (!_glinfo.isGLESX || _glinfo.noPerspective)
m_part += "noperspective OUT lowp vec4 vShadeColorNoperspective;\n";
else
m_part += "OUT lowp vec4 vShadeColorNoperspective; \n";
m_part +=
"uniform lowp vec4 uRectColor; \n"
"void main() \n"
"{ \n"
" gl_Position = aRectPosition; \n"
" vShadeColor = uRectColor; \n"
" vShadeColorNoperspective = uRectColor; \n"
" vTexCoord0 = aTexCoord0; \n"
" vTexCoord1 = aTexCoord1; \n"
" vBaryCoords = vec4(aBaryCoords, vec2(1.0) - aBaryCoords); \n"
;
}
};
class VertexShaderRect : public ShaderPart
{
public:
@ -1356,22 +1322,6 @@ public:
}
};
class ShaderFragmentCorrectTexCoords : public ShaderPart {
public:
ShaderFragmentCorrectTexCoords() {
m_part +=
" highp vec2 mTexCoord0 = vTexCoord0 + vec2(0.0001); \n"
" highp vec2 mTexCoord1 = vTexCoord1 + vec2(0.0001); \n"
" mTexCoord0 += uTexCoordOffset[0]; \n"
" mTexCoord1 += uTexCoordOffset[1]; \n"
" if (uUseTexCoordBounds != 0) { \n"
" mTexCoord0 = clamp(mTexCoord0, uTexCoordBounds0.xy, uTexCoordBounds0.zw); \n"
" mTexCoord1 = clamp(mTexCoord1, uTexCoordBounds1.xy, uTexCoordBounds1.zw); \n"
" } \n"
;
}
};
class ShaderCoverage : public ShaderPart {
public:
ShaderCoverage() {
@ -1394,7 +1344,7 @@ public:
/*---------------ShaderPartsEnd-------------*/
static
GLuint _createVertexShader(ShaderPart * _header, ShaderPart * _body, ShaderPart * _footer)
GLuint _createVertexShader(const ShaderPart* _header, const ShaderPart* _body, const ShaderPart* _footer)
{
std::stringstream ssShader;
_header->write(ssShader);
@ -1416,8 +1366,7 @@ GLuint _createVertexShader(ShaderPart * _header, ShaderPart * _body, ShaderPart
namespace glsl {
CombinerProgramBuilderCommon::CombinerProgramBuilderCommon(const opengl::GLInfo & _glinfo, opengl::CachedUseProgram * _useProgram,
std::unique_ptr<CombinerProgramUniformFactory> _uniformFactory,
std::unique_ptr<ShaderPart> _vertexTexturedTriangle)
std::unique_ptr<CombinerProgramUniformFactory> _uniformFactory)
: CombinerProgramBuilder(_glinfo, _useProgram, std::move(_uniformFactory))
, m_blender1(new ShaderBlender1(_glinfo))
, m_blender2(new ShaderBlender2(_glinfo))
@ -1433,7 +1382,6 @@ CombinerProgramBuilderCommon::CombinerProgramBuilderCommon(const opengl::GLInfo
, m_vertexHeader(new VertexShaderHeader(_glinfo))
, m_vertexEnd(new VertexShaderEnd(_glinfo))
, m_vertexRect(new VertexShaderRect(_glinfo))
, m_vertexTexturedRect(new VertexShaderTexturedRect(_glinfo))
, m_vertexTriangle(new VertexShaderTriangle(_glinfo))
, m_fragmentHeader(new FragmentShaderHeader(_glinfo))
, m_fragmentGlobalVariablesNotex(new ShaderFragmentGlobalVariablesNotex(_glinfo))
@ -1446,7 +1394,6 @@ CombinerProgramBuilderCommon::CombinerProgramBuilderCommon(const opengl::GLInfo
, m_fragmentMain(new ShaderFragmentMain(_glinfo))
, m_fragmentMain2Cycle(new ShaderFragmentMain2Cycle(_glinfo))
, m_fragmentBlendMux(new ShaderFragmentBlendMux(_glinfo))
, m_fragmentCorrectTexCoords(new ShaderFragmentCorrectTexCoords())
, m_fragmentReadTexMipmap(new ShaderFragmentReadTexMipmap(_glinfo))
, m_fragmentCallN64Depth(new ShaderFragmentCallN64Depth(_glinfo))
, m_fragmentRenderTarget(new ShaderFragmentRenderTarget(_glinfo))
@ -1460,10 +1407,6 @@ CombinerProgramBuilderCommon::CombinerProgramBuilderCommon(const opengl::GLInfo
, m_shaderCoverage(new ShaderCoverage())
, m_combinerOptionsBits(graphics::CombinerProgram::getShaderCombinerOptionsBits())
{
m_vertexShaderRect = _createVertexShader(m_vertexHeader.get(), m_vertexRect.get(), m_vertexEnd.get());
m_vertexShaderTriangle = _createVertexShader(m_vertexHeader.get(), m_vertexTriangle.get(), m_vertexEnd.get());
m_vertexShaderTexturedRect = _createVertexShader(m_vertexHeader.get(), m_vertexTexturedRect.get(), m_vertexEnd.get());
m_vertexShaderTexturedTriangle = _createVertexShader(m_vertexHeader.get(), _vertexTexturedTriangle.get(), m_vertexEnd.get());
}
CombinerProgramBuilderCommon::~CombinerProgramBuilderCommon()
@ -1496,21 +1439,29 @@ bool CombinerProgramBuilderCommon::isObsolete() const
GLuint CombinerProgramBuilderCommon::_getVertexShaderRect() const
{
if (m_vertexShaderRect == 0)
m_vertexShaderRect = _createVertexShader(m_vertexHeader.get(), m_vertexRect.get(), m_vertexEnd.get());
return m_vertexShaderRect;
}
GLuint CombinerProgramBuilderCommon::_getVertexShaderTriangle() const
{
if (m_vertexShaderTriangle == 0)
m_vertexShaderTriangle = _createVertexShader(m_vertexHeader.get(), m_vertexTriangle.get(), m_vertexEnd.get());
return m_vertexShaderTriangle;
}
GLuint CombinerProgramBuilderCommon::_getVertexShaderTexturedRect() const
{
if (m_vertexShaderTexturedRect == 0)
m_vertexShaderTexturedRect = _createVertexShader(m_vertexHeader.get(), getVertexShaderTexturedRect(), m_vertexEnd.get());
return m_vertexShaderTexturedRect;
}
GLuint CombinerProgramBuilderCommon::_getVertexShaderTexturedTriangle() const
{
if (m_vertexShaderTexturedTriangle == 0)
m_vertexShaderTexturedTriangle = _createVertexShader(m_vertexHeader.get(), getVertexShaderTexturedTriangle(), m_vertexEnd.get());
return m_vertexShaderTexturedTriangle;
}
@ -1629,11 +1580,6 @@ void CombinerProgramBuilderCommon::_writeShaderCoverage(std::stringstream& ssSha
m_shaderCoverage->write(ssShader);
}
void CombinerProgramBuilderCommon::_writeFragmentCorrectTexCoords(std::stringstream& ssShader)const
{
m_fragmentCorrectTexCoords->write(ssShader);
}
void CombinerProgramBuilderCommon::_writeFragmentReadTexMipmap(std::stringstream& ssShader)const
{
m_fragmentReadTexMipmap->write(ssShader);

View File

@ -7,8 +7,7 @@ class CombinerProgramBuilderCommon : public glsl::CombinerProgramBuilder
{
public:
CombinerProgramBuilderCommon(const opengl::GLInfo & _glinfo, opengl::CachedUseProgram * _useProgram,
std::unique_ptr<CombinerProgramUniformFactory> _uniformFactory,
std::unique_ptr<ShaderPart> _vertexTexturedTriangle);
std::unique_ptr<CombinerProgramUniformFactory> _uniformFactory);
~CombinerProgramBuilderCommon();
const ShaderPart * getVertexShaderHeader() const override;
@ -49,7 +48,6 @@ private:
void _writeFragmentMain(std::stringstream& ssShader) const override;
void _writeFragmentBlendMux(std::stringstream& ssShader) const override;
void _writeShaderCoverage(std::stringstream& ssShader) const override;
void _writeFragmentCorrectTexCoords(std::stringstream& ssShader) const override;
void _writeFragmentReadTexMipmap(std::stringstream& ssShader) const override;
void _writeFragmentCallN64Depth(std::stringstream& ssShader) const override;
void _writeFragmentRenderTarget(std::stringstream& ssShader) const override;
@ -76,7 +74,6 @@ private:
ShaderPartPtr m_vertexHeader;
ShaderPartPtr m_vertexEnd;
ShaderPartPtr m_vertexRect;
ShaderPartPtr m_vertexTexturedRect;
ShaderPartPtr m_vertexTriangle;
ShaderPartPtr m_fragmentHeader;
@ -90,7 +87,6 @@ private:
ShaderPartPtr m_fragmentMain;
ShaderPartPtr m_fragmentMain2Cycle;
ShaderPartPtr m_fragmentBlendMux;
ShaderPartPtr m_fragmentCorrectTexCoords;
ShaderPartPtr m_fragmentReadTexMipmap;
ShaderPartPtr m_fragmentCallN64Depth;
ShaderPartPtr m_fragmentRenderTarget;
@ -106,10 +102,10 @@ private:
u32 m_combinerOptionsBits;
GLuint m_vertexShaderRect;
GLuint m_vertexShaderTriangle;
GLuint m_vertexShaderTexturedRect;
GLuint m_vertexShaderTexturedTriangle;
mutable GLuint m_vertexShaderRect = 0u;
mutable GLuint m_vertexShaderTriangle = 0u;
mutable GLuint m_vertexShaderTexturedRect = 0u;
mutable GLuint m_vertexShaderTexturedTriangle = 0u;
};
}

View File

@ -98,6 +98,40 @@ public:
}
};
class VertexShaderTexturedRectFast : public ShaderPart
{
public:
VertexShaderTexturedRectFast(const opengl::GLInfo & _glinfo)
{
m_part =
"IN highp vec4 aRectPosition; \n"
"IN highp vec2 aTexCoord0; \n"
"IN highp vec2 aTexCoord1; \n"
"IN highp vec2 aBaryCoords; \n"
" \n"
"OUT highp vec2 vTexCoord0; \n"
"OUT highp vec2 vTexCoord1; \n"
"OUT lowp vec4 vShadeColor; \n"
"OUT highp vec4 vBaryCoords; \n"
;
if (!_glinfo.isGLESX || _glinfo.noPerspective)
m_part += "noperspective OUT lowp vec4 vShadeColorNoperspective;\n";
else
m_part += "OUT lowp vec4 vShadeColorNoperspective; \n";
m_part +=
"uniform lowp vec4 uRectColor; \n"
"void main() \n"
"{ \n"
" gl_Position = aRectPosition; \n"
" vShadeColor = uRectColor; \n"
" vShadeColorNoperspective = uRectColor; \n"
" vTexCoord0 = aTexCoord0; \n"
" vTexCoord1 = aTexCoord1; \n"
" vBaryCoords = vec4(aBaryCoords, vec2(1.0) - aBaryCoords); \n"
;
}
};
class ShaderFragmentGlobalVariablesTexFast : public ShaderPart
{
public:
@ -536,6 +570,22 @@ public:
}
};
class ShaderFragmentCorrectTexCoords : public ShaderPart {
public:
ShaderFragmentCorrectTexCoords() {
m_part +=
" highp vec2 mTexCoord0 = vTexCoord0 + vec2(0.0001); \n"
" highp vec2 mTexCoord1 = vTexCoord1 + vec2(0.0001); \n"
" mTexCoord0 += uTexCoordOffset[0]; \n"
" mTexCoord1 += uTexCoordOffset[1]; \n"
" if (uUseTexCoordBounds != 0) { \n"
" mTexCoord0 = clamp(mTexCoord0, uTexCoordBounds0.xy, uTexCoordBounds0.zw); \n"
" mTexCoord1 = clamp(mTexCoord1, uTexCoordBounds1.xy, uTexCoordBounds1.zw); \n"
" } \n"
;
}
};
class ShaderFragmentReadTexCopyModeFast : public ShaderPart
{
public:
@ -1090,8 +1140,9 @@ public:
namespace glsl {
CombinerProgramBuilderFast::CombinerProgramBuilderFast(const opengl::GLInfo & _glinfo, opengl::CachedUseProgram * _useProgram)
: CombinerProgramBuilderCommon(_glinfo, _useProgram, std::make_unique<CombinerProgramUniformFactoryFast>(_glinfo),
std::make_unique<VertexShaderTexturedTriangleFast>(_glinfo))
: CombinerProgramBuilderCommon(_glinfo, _useProgram, std::make_unique<CombinerProgramUniformFactoryFast>(_glinfo))
, m_vertexTexturedTriangle(new VertexShaderTexturedTriangleFast(_glinfo))
, m_vertexTexturedRect(new VertexShaderTexturedRectFast(_glinfo))
, m_fragmentGlobalVariablesTex(new ShaderFragmentGlobalVariablesTexFast(_glinfo))
, m_fragmentHeaderClampWrapMirror(new ShaderFragmentHeaderClampWrapMirror(_glinfo))
, m_fragmentHeaderReadMSTex(new ShaderFragmentHeaderReadMSTexFast(_glinfo))
@ -1101,6 +1152,7 @@ CombinerProgramBuilderFast::CombinerProgramBuilderFast(const opengl::GLInfo & _g
, m_fragmentReadTex1(new ShaderFragmentReadTex1Fast(_glinfo))
, m_fragmentClampWrapMirrorTex0(new ShaderFragmentClampWrapMirrorTex0(_glinfo))
, m_fragmentClampWrapMirrorTex1(new ShaderFragmentClampWrapMirrorTex1(_glinfo))
, m_fragmentCorrectTexCoords(new ShaderFragmentCorrectTexCoords())
, m_fragmentReadTexCopyMode(new ShaderFragmentReadTexCopyModeFast(_glinfo))
, m_shaderMipmap(new ShaderMipmapFast(_glinfo))
, m_shaderReadtex(new ShaderReadtexFast(_glinfo))
@ -1109,6 +1161,16 @@ CombinerProgramBuilderFast::CombinerProgramBuilderFast(const opengl::GLInfo & _g
{
}
const ShaderPart * CombinerProgramBuilderFast::getVertexShaderTexturedRect() const
{
return m_vertexTexturedRect.get();
}
const ShaderPart * CombinerProgramBuilderFast::getVertexShaderTexturedTriangle() const
{
return m_vertexTexturedTriangle.get();
}
void CombinerProgramBuilderFast::_writeFragmentGlobalVariablesTex(std::stringstream& ssShader) const
{
m_fragmentGlobalVariablesTex->write(ssShader);
@ -1144,6 +1206,10 @@ void CombinerProgramBuilderFast::_writeFragmentClampWrapMirrorEngineTex1(std::st
m_fragmentClampWrapMirrorTex1->write(ssShader);
}
void CombinerProgramBuilderFast::_writeFragmentCorrectTexCoords(std::stringstream& ssShader)const
{
m_fragmentCorrectTexCoords->write(ssShader);
}
void CombinerProgramBuilderFast::_writeFragmentReadTex0(std::stringstream& ssShader) const
{
m_fragmentReadTex0->write(ssShader);

View File

@ -9,6 +9,8 @@ public:
CombinerProgramBuilderFast(const opengl::GLInfo & _glinfo, opengl::CachedUseProgram * _useProgram);
private:
const ShaderPart * getVertexShaderTexturedRect() const override;
const ShaderPart * getVertexShaderTexturedTriangle() const override;
void _writeFragmentGlobalVariablesTex(std::stringstream& ssShader) const override;
void _writeFragmentHeaderReadMSTex(std::stringstream& ssShader) const override;
@ -17,6 +19,7 @@ private:
void _writeFragmentHeaderClampWrapMirrorEngine(std::stringstream& ssShader) const override;
void _writeFragmentClampWrapMirrorEngineTex0(std::stringstream& ssShader) const override;
void _writeFragmentClampWrapMirrorEngineTex1(std::stringstream& ssShader) const override;
void _writeFragmentCorrectTexCoords(std::stringstream& ssShader) const override;
void _writeFragmentReadTex0(std::stringstream& ssShader) const override;
void _writeFragmentReadTex1(std::stringstream& ssShader) const override;
void _writeFragmentReadTexCopyMode(std::stringstream& ssShader) const override;
@ -25,6 +28,8 @@ private:
void _writeShaderReadtex(std::stringstream& ssShader) const override;
void _writeShaderReadtexCopyMode(std::stringstream& ssShader) const override;
ShaderPartPtr m_vertexTexturedTriangle;
ShaderPartPtr m_vertexTexturedRect;
ShaderPartPtr m_fragmentGlobalVariablesTex;
ShaderPartPtr m_fragmentHeaderClampWrapMirror;
ShaderPartPtr m_fragmentHeaderReadMSTex;
@ -34,6 +39,7 @@ private:
ShaderPartPtr m_fragmentReadTex1;
ShaderPartPtr m_fragmentClampWrapMirrorTex0;
ShaderPartPtr m_fragmentClampWrapMirrorTex1;
ShaderPartPtr m_fragmentCorrectTexCoords;
ShaderPartPtr m_fragmentReadTexCopyMode;
ShaderPartPtr m_shaderMipmap;
ShaderPartPtr m_shaderReadtex;

View File

@ -18,11 +18,9 @@ class URasterInfo : public UniformGroup {
public:
URasterInfo(GLuint _program) {
LocateUniform(uVertexOffset);
LocateUniform(uTexCoordOffset[0]);
LocateUniform(uTexCoordOffset[1]);
LocateUniform(uTexCoordOffset);
LocateUniform(uUseTexCoordBounds);
LocateUniform(uTexCoordBounds0);
LocateUniform(uTexCoordBounds1);
LocateUniform(uTexCoordBounds);
}
void update(bool _force) override {
@ -36,7 +34,7 @@ public:
/* effective. Still, an heuristic is applied to render texture rectangles as correctly as possible */
/* in higher resolutions too. See issue #2324 for details. */
const float vertexOffset = isNativeRes ? 0.5f : 0.0f;
float texCoordOffset[2][2] = { 0.0f, 0.0f };
float texCoordOffset[2] = { 0.0f, 0.0f };
if (isTexRect && !isNativeRes) {
float scale[2] = { 0.0f, 0.0f };
if (config.graphics2D.enableNativeResTexrects != 0 && gDP.otherMode.textureFilter != G_TF_POINT) {
@ -45,74 +43,58 @@ public:
scale[0] = scale[1] = static_cast<float>(config.frameBufferEmulation.nativeResFactor);
}
for (int t = 0; t < 2; t++) {
const CachedTexture* _pTexture = textureCache().current[t];
if (_pTexture != nullptr) {
if (config.frameBufferEmulation.nativeResFactor != 0) {
if (gDP.otherMode.textureFilter != G_TF_POINT && gDP.otherMode.cycleType != G_CYC_COPY) {
texCoordOffset[t][0] = -0.5f * gDP.lastTexRectInfo.dsdx;
texCoordOffset[t][1] = -0.5f * gDP.lastTexRectInfo.dtdy;
} else {
texCoordOffset[t][0] = (gDP.lastTexRectInfo.dsdx >= 0.0f ? -0.5f / scale[0] : -1.0f + 0.5f / scale[0]) * gDP.lastTexRectInfo.dsdx;
texCoordOffset[t][1] = (gDP.lastTexRectInfo.dtdy >= 0.0f ? -0.5f / scale[1] : -1.0f + 0.5f / scale[1]) * gDP.lastTexRectInfo.dtdy;
}
} else {
texCoordOffset[t][0] = (gDP.lastTexRectInfo.dsdx >= 0.0f ? 0.0f : -1.0f) * gDP.lastTexRectInfo.dsdx;
texCoordOffset[t][1] = (gDP.lastTexRectInfo.dtdy >= 0.0f ? 0.0f : -1.0f) * gDP.lastTexRectInfo.dtdy;
if (gDP.otherMode.textureFilter != G_TF_POINT && gDP.otherMode.cycleType != G_CYC_COPY) {
texCoordOffset[t][0] -= 0.5f;
texCoordOffset[t][1] -= 0.5f;
}
}
if (config.frameBufferEmulation.nativeResFactor != 0) {
if (gDP.otherMode.textureFilter != G_TF_POINT && gDP.otherMode.cycleType != G_CYC_COPY) {
texCoordOffset[0] = -0.5f * gDP.lastTexRectInfo.dsdx;
texCoordOffset[1] = -0.5f * gDP.lastTexRectInfo.dtdy;
} else {
texCoordOffset[0] = (gDP.lastTexRectInfo.dsdx >= 0.0f ? -0.5f / scale[0] : -1.0f + 0.5f / scale[0]) * gDP.lastTexRectInfo.dsdx;
texCoordOffset[1] = (gDP.lastTexRectInfo.dtdy >= 0.0f ? -0.5f / scale[1] : -1.0f + 0.5f / scale[1]) * gDP.lastTexRectInfo.dtdy;
}
} else {
texCoordOffset[0] = (gDP.lastTexRectInfo.dsdx >= 0.0f ? 0.0f : -1.0f) * gDP.lastTexRectInfo.dsdx;
texCoordOffset[1] = (gDP.lastTexRectInfo.dtdy >= 0.0f ? 0.0f : -1.0f) * gDP.lastTexRectInfo.dtdy;
if (gDP.otherMode.textureFilter != G_TF_POINT && gDP.otherMode.cycleType != G_CYC_COPY) {
texCoordOffset[0] -= 0.5f;
texCoordOffset[1] -= 0.5f;
}
}
}
/* Hack for framebuffer textures. See #519 and #2112 */
if ((config.generalEmulation.hacks & hack_fbTextureOffset) != 0) {
for (int t = 0; t < 2; t++) {
const CachedTexture* _pTexture = textureCache().current[t];
if (_pTexture != nullptr) {
if (gDP.otherMode.textureFilter != G_TF_POINT && _pTexture->frameBufferTexture != CachedTexture::fbNone) {
texCoordOffset[t][0] -= 1.0f;
texCoordOffset[t][1] -= 1.0f;
}
const CachedTexture* _pTexture = textureCache().current[0];
if (_pTexture != nullptr) {
if (gDP.otherMode.textureFilter != G_TF_POINT && _pTexture->frameBufferTexture != CachedTexture::fbNone) {
texCoordOffset[0] -= 1.0f;
texCoordOffset[1] -= 1.0f;
}
}
}
float tcbounds[2][4] = {};
float tcbounds[4] = {};
if (useTexCoordBounds) {
f32 uls, lrs, ult, lrt, S, T;
for (int t = 0; t < 2; t++) {
const CachedTexture * _pTexture = textureCache().current[t];
if (_pTexture != nullptr) {
S = _FIXED2FLOAT(gDP.lastTexRectInfo.s, 5);
T = _FIXED2FLOAT(gDP.lastTexRectInfo.t, 5);
uls = S + (ceilf(gDP.lastTexRectInfo.ulx) - gDP.lastTexRectInfo.ulx) * gDP.lastTexRectInfo.dsdx;
lrs = S + (ceilf(gDP.lastTexRectInfo.lrx) - gDP.lastTexRectInfo.ulx - 1.0f) * gDP.lastTexRectInfo.dsdx;
ult = T + (ceilf(gDP.lastTexRectInfo.uly) - gDP.lastTexRectInfo.uly) * gDP.lastTexRectInfo.dtdy;
lrt = T + (ceilf(gDP.lastTexRectInfo.lry) - gDP.lastTexRectInfo.uly - 1.0f) * gDP.lastTexRectInfo.dtdy;
tcbounds[t][0] = fmin(uls, lrs);
tcbounds[t][1] = fmin(ult, lrt);
tcbounds[t][2] = fmax(uls, lrs);
tcbounds[t][3] = fmax(ult, lrt);
}
}
f32 S = _FIXED2FLOAT(gDP.lastTexRectInfo.s, 5);
f32 T = _FIXED2FLOAT(gDP.lastTexRectInfo.t, 5);
f32 uls = S + (ceilf(gDP.lastTexRectInfo.ulx) - gDP.lastTexRectInfo.ulx) * gDP.lastTexRectInfo.dsdx;
f32 lrs = S + (ceilf(gDP.lastTexRectInfo.lrx) - gDP.lastTexRectInfo.ulx - 1.0f) * gDP.lastTexRectInfo.dsdx;
f32 ult = T + (ceilf(gDP.lastTexRectInfo.uly) - gDP.lastTexRectInfo.uly) * gDP.lastTexRectInfo.dtdy;
f32 lrt = T + (ceilf(gDP.lastTexRectInfo.lry) - gDP.lastTexRectInfo.uly - 1.0f) * gDP.lastTexRectInfo.dtdy;
tcbounds[0] = fmin(uls, lrs);
tcbounds[1] = fmin(ult, lrt);
tcbounds[2] = fmax(uls, lrs);
tcbounds[3] = fmax(ult, lrt);
}
uVertexOffset.set(vertexOffset, vertexOffset, _force);
uTexCoordOffset[0].set(texCoordOffset[0][0], texCoordOffset[0][1], _force);
uTexCoordOffset[1].set(texCoordOffset[1][0], texCoordOffset[1][1], _force);
uTexCoordOffset.set(texCoordOffset[0], texCoordOffset[1], _force);
uUseTexCoordBounds.set(useTexCoordBounds ? 1 : 0, _force);
uTexCoordBounds0.set(tcbounds[0], _force);
uTexCoordBounds1.set(tcbounds[1], _force);
uTexCoordBounds.set(tcbounds, _force);
}
private:
fv2Uniform uVertexOffset;
fv2Uniform uTexCoordOffset[2];
fv2Uniform uTexCoordOffset;
iUniform uUseTexCoordBounds;
fv4Uniform uTexCoordBounds0;
fv4Uniform uTexCoordBounds1;
fv4Uniform uTexCoordBounds;
};
class UMipmap : public UniformGroup

View File

@ -20,7 +20,7 @@ namespace glsl {
bool _saveCombinerKeys(const graphics::Combiners & _combiners) const;
bool _loadFromCombinerKeys(graphics::Combiners & _combiners);
const u32 m_formatVersion = 0x39U;
const u32 m_formatVersion = 0x3AU;
const u32 m_keysFormatVersion = 0x05;
const opengl::GLInfo & m_glinfo;
opengl::CachedUseProgram * m_useProgram;