1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-07-04 10:03:36 +00:00

Optimize blender shaders. Thanks to Logan McNaughton aka loganmc10 and standard-two-simplex for the new code.

This commit is contained in:
Sergey Lipskiy 2017-09-21 13:27:52 +07:00
parent a2a96f3d92
commit 231463e368

View File

@ -464,77 +464,38 @@ public:
class ShaderBlender1 : public ShaderPart
{
public:
ShaderBlender1(const opengl::GLInfo & _glinfo)
ShaderBlender1()
{
if (_glinfo.isGLESX) {
m_part =
" muxPM[0] = clampedColor; \n"
" if (uForceBlendCycle1 != 0) { \n"
" muxA[0] = clampedColor.a; \n"
" lowp float muxa; \n"
" if (uBlendMux1[1] == 0) \n"
" muxa = muxA[0]; \n"
" else if (uBlendMux1[1] == 1) \n"
" muxa = muxA[1]; \n"
" else if (uBlendMux1[1] == 2) \n"
" muxa = muxA[2]; \n"
" else if (uBlendMux1[1] == 3) \n"
" muxa = muxA[3]; \n"
" muxB[0] = 1.0 - muxa; \n"
" lowp vec4 muxpm0; \n"
" if (uBlendMux1[0] == 0) \n"
" muxpm0 = muxPM[0]; \n"
" else if (uBlendMux1[0] == 1) \n"
" muxpm0 = muxPM[1]; \n"
" else if (uBlendMux1[0] == 2) \n"
" muxpm0 = muxPM[2]; \n"
" else if (uBlendMux1[0] == 3) \n"
" muxpm0 = muxPM[3]; \n"
" lowp vec4 muxpm2; \n"
" if (uBlendMux1[2] == 0) \n"
" muxpm2 = muxPM[0]; \n"
" else if (uBlendMux1[2] == 1) \n"
" muxpm2 = muxPM[1]; \n"
" else if (uBlendMux1[2] == 2) \n"
" muxpm2 = muxPM[2]; \n"
" else if (uBlendMux1[2] == 3) \n"
" muxpm2 = muxPM[3]; \n"
" lowp float muxb; \n"
" if (uBlendMux1[3] == 0) \n"
" muxb = muxB[0]; \n"
" else if (uBlendMux1[3] == 1) \n"
" muxb = muxB[1]; \n"
" else if (uBlendMux1[3] == 2) \n"
" muxb = muxB[2]; \n"
" else if (uBlendMux1[3] == 3) \n"
" muxb = muxB[3]; \n"
" lowp vec4 blend1 = (muxpm0 * muxa) + (muxpm2 * muxb); \n"
" clampedColor.rgb = clamp(blend1.rgb, 0.0, 1.0); \n"
" } else { \n"
" lowp vec4 muxpm0; \n"
" if (uBlendMux1[0] == 0) \n"
" muxpm0 = muxPM[0]; \n"
" else if (uBlendMux1[0] == 1) \n"
" muxpm0 = muxPM[1]; \n"
" else if (uBlendMux1[0] == 2) \n"
" muxpm0 = muxPM[2]; \n"
" else if (uBlendMux1[0] == 3) \n"
" muxpm0 = muxPM[3]; \n"
" clampedColor.rgb = muxpm0.rgb; \n"
" } \n"
;
} else {
m_part =
" muxPM[0] = clampedColor; \n"
" if (uForceBlendCycle1 != 0) { \n"
" muxA[0] = clampedColor.a; \n"
" muxB[0] = 1.0 - muxA[uBlendMux1[1]]; \n"
" lowp vec4 blend1 = (muxPM[uBlendMux1[0]] * muxA[uBlendMux1[1]]) + (muxPM[uBlendMux1[2]] * muxB[uBlendMux1[3]]); \n"
" clampedColor.rgb = clamp(blend1.rgb, 0.0, 1.0); \n"
" } else clampedColor.rgb = muxPM[uBlendMux1[0]].rgb; \n"
;
}
#if 1
m_part =
" muxPM[0] = clampedColor; \n"
" lowp vec4 vprobe = vec4(0.0, 1.0, 2.0, 3.0); \n"
" if (uForceBlendCycle1 != 0) { \n"
" muxA[0] = clampedColor.a; \n"
" lowp float muxa = dot(muxA, vec4(equal(vec4(uBlendMux1[1]), vprobe))); \n"
" muxB[0] = 1.0 - muxa; \n"
" lowp vec4 muxpm0 = muxPM * vec4(equal(vec4(uBlendMux1[0]), vprobe)); \n"
" lowp vec4 muxpm2 = muxPM * vec4(equal(vec4(uBlendMux1[2]), vprobe)); \n"
" lowp float muxb = dot(muxB, vec4(equal(vec4(uBlendMux1[3]), vprobe))); \n"
" lowp vec4 blend1 = (muxpm0 * muxa) + (muxpm2 * muxb); \n"
" clampedColor.rgb = clamp(blend1.rgb, 0.0, 1.0); \n"
" } else { \n"
" lowp vec4 muxpm0 = muxPM * vec4(equal(vec4(uBlendMux1[0]), vprobe)); \n"
" clampedColor.rgb = muxpm0.rgb; \n"
" } \n"
;
#else
// Keep old code for reference
m_part =
" muxPM[0] = clampedColor; \n"
" if (uForceBlendCycle1 != 0) { \n"
" muxA[0] = clampedColor.a; \n"
" muxB[0] = 1.0 - muxA[uBlendMux1[1]]; \n"
" lowp vec4 blend1 = (muxPM[uBlendMux1[0]] * muxA[uBlendMux1[1]]) + (muxPM[uBlendMux1[2]] * muxB[uBlendMux1[3]]); \n"
" clampedColor.rgb = clamp(blend1.rgb, 0.0, 1.0); \n"
" } else clampedColor.rgb = muxPM[uBlendMux1[0]].rgb; \n"
;
#endif
}
void write(std::stringstream & shader) const override
@ -549,79 +510,39 @@ public:
class ShaderBlender2 : public ShaderPart
{
public:
ShaderBlender2(const opengl::GLInfo & _glinfo)
ShaderBlender2()
{
if (_glinfo.isGLESX) {
m_part =
" muxPM[0] = clampedColor; \n"
" muxPM[1] = vec4(0.0); \n"
" if (uForceBlendCycle2 != 0) { \n"
" muxA[0] = clampedColor.a; \n"
" lowp float muxa; \n"
" if (uBlendMux2[1] == 0) \n"
" muxa = muxA[0]; \n"
" else if (uBlendMux2[1] == 1) \n"
" muxa = muxA[1]; \n"
" else if (uBlendMux2[1] == 2) \n"
" muxa = muxA[2]; \n"
" else if (uBlendMux2[1] == 3) \n"
" muxa = muxA[3]; \n"
" muxB[0] = 1.0 - muxa; \n"
" lowp vec4 muxpm0; \n"
" if (uBlendMux2[0] == 0) \n"
" muxpm0 = muxPM[0]; \n"
" else if (uBlendMux2[0] == 1) \n"
" muxpm0 = muxPM[1]; \n"
" else if (uBlendMux2[0] == 2) \n"
" muxpm0 = muxPM[2]; \n"
" else if (uBlendMux2[0] == 3) \n"
" muxpm0 = muxPM[3]; \n"
" lowp vec4 muxpm2; \n"
" if (uBlendMux2[2] == 0) \n"
" muxpm2 = muxPM[0]; \n"
" else if (uBlendMux2[2] == 1) \n"
" muxpm2 = muxPM[1]; \n"
" else if (uBlendMux2[2] == 2) \n"
" muxpm2 = muxPM[2]; \n"
" else if (uBlendMux2[2] == 3) \n"
" muxpm2 = muxPM[3]; \n"
" lowp float muxb; \n"
" if (uBlendMux2[3] == 0) \n"
" muxb = muxB[0]; \n"
" else if (uBlendMux2[3] == 1) \n"
" muxb = muxB[1]; \n"
" else if (uBlendMux2[3] == 2) \n"
" muxb = muxB[2]; \n"
" else if (uBlendMux2[3] == 3) \n"
" muxb = muxB[3]; \n"
" lowp vec4 blend2 = muxpm0 * muxa + muxpm2 * muxb; \n"
" clampedColor.rgb = clamp(blend2.rgb, 0.0, 1.0); \n"
" } else { \n"
" lowp vec4 muxpm0; \n"
" if (uBlendMux2[0] == 0) \n"
" muxpm0 = muxPM[0]; \n"
" else if (uBlendMux2[0] == 1) \n"
" muxpm0 = muxPM[1]; \n"
" else if (uBlendMux2[0] == 2) \n"
" muxpm0 = muxPM[2]; \n"
" else if (uBlendMux2[0] == 3) \n"
" muxpm0 = muxPM[3]; \n"
" clampedColor.rgb = muxpm0.rgb; \n"
" } \n"
;
}
else {
m_part =
" muxPM[0] = clampedColor; \n"
" muxPM[1] = vec4(0.0); \n"
" if (uForceBlendCycle2 != 0) { \n"
" muxA[0] = clampedColor.a; \n"
" muxB[0] = 1.0 - muxA[uBlendMux2[1]]; \n"
" lowp vec4 blend2 = muxPM[uBlendMux2[0]] * muxA[uBlendMux2[1]] + muxPM[uBlendMux2[2]] * muxB[uBlendMux2[3]]; \n"
" clampedColor.rgb = clamp(blend2.rgb, 0.0, 1.0); \n"
" } else clampedColor.rgb = muxPM[uBlendMux2[0]].rgb; \n"
;
}
#if 1
m_part =
" muxPM[0] = clampedColor; \n"
" muxPM[1] = vec4(0.0); \n"
" if (uForceBlendCycle2 != 0) { \n"
" muxA[0] = clampedColor.a; \n"
" lowp float muxa = dot(muxA,vec4(equal(vec4(uBlendMux2[1]), vprobe))); \n"
" muxB[0] = 1.0 - muxa; \n"
" lowp vec4 muxpm0 = muxPM*vec4(equal(vec4(uBlendMux2[0]), vprobe)); \n"
" lowp vec4 muxpm2 = muxPM*vec4(equal(vec4(uBlendMux2[2]), vprobe)); \n"
" lowp float muxb = dot(muxB,vec4(equal(vec4(uBlendMux2[3]), vprobe))); \n"
" lowp vec4 blend2 = muxpm0 * muxa + muxpm2 * muxb; \n"
" clampedColor.rgb = clamp(blend2.rgb, 0.0, 1.0); \n"
" } else { \n"
" lowp vec4 muxpm0 = muxPM * vec4(equal(vec4(uBlendMux2[0]), vprobe)); \n"
" clampedColor.rgb = muxpm0.rgb; \n"
" } \n"
;
#else
// Keep old code for reference
m_part =
" muxPM[0] = clampedColor; \n"
" muxPM[1] = vec4(0.0); \n"
" if (uForceBlendCycle2 != 0) { \n"
" muxA[0] = clampedColor.a; \n"
" muxB[0] = 1.0 - muxA[uBlendMux2[1]]; \n"
" lowp vec4 blend2 = muxPM[uBlendMux2[0]] * muxA[uBlendMux2[1]] + muxPM[uBlendMux2[2]] * muxB[uBlendMux2[3]]; \n"
" clampedColor.rgb = clamp(blend2.rgb, 0.0, 1.0); \n"
" } else clampedColor.rgb = muxPM[uBlendMux2[0]].rgb; \n"
;
#endif
}
};
@ -2020,8 +1941,8 @@ GLuint _createVertexShader(ShaderPart * _header, ShaderPart * _body)
}
CombinerProgramBuilder::CombinerProgramBuilder(const opengl::GLInfo & _glinfo, opengl::CachedUseProgram * _useProgram)
: m_blender1(new ShaderBlender1(_glinfo))
, m_blender2(new ShaderBlender2(_glinfo))
: m_blender1(new ShaderBlender1)
, m_blender2(new ShaderBlender2)
, m_legacyBlender(new ShaderLegacyBlender)
, m_clamp(new ShaderClamp)
, m_signExtendColorC(new ShaderSignExtendColorC)