diff --git a/binaries/data/config/default.cfg b/binaries/data/config/default.cfg
index 83f4957bdb..6ff18deae0 100644
--- a/binaries/data/config/default.cfg
+++ b/binaries/data/config/default.cfg
@@ -156,9 +156,6 @@ materialmgr.PARALLAX_HQ_DIST.max = 75
materialmgr.PARALLAX_VHQ_DIST.max = 0
;;;;;;;;;;;;;;;;;;;;;;;;
-; Replace alpha-blending with alpha-testing, for performance experiments
-forcealphatest = false
-
; Color of the sky (in "r g b" format)
skycolor = "0 0 0"
diff --git a/binaries/data/mods/public/art/materials/alphatest.xml b/binaries/data/mods/public/art/materials/alphatest.xml
deleted file mode 100644
index d356b0d03d..0000000000
--- a/binaries/data/mods/public/art/materials/alphatest.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/binaries/data/mods/public/art/materials/alphatest_ao_parallax_spec.xml b/binaries/data/mods/public/art/materials/alphatest_ao_parallax_spec.xml
deleted file mode 100644
index d57a4d23e9..0000000000
--- a/binaries/data/mods/public/art/materials/alphatest_ao_parallax_spec.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/binaries/data/mods/public/art/materials/alphatest_spec.xml b/binaries/data/mods/public/art/materials/alphatest_spec.xml
deleted file mode 100644
index 7acfc1d4d7..0000000000
--- a/binaries/data/mods/public/art/materials/alphatest_spec.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/binaries/data/mods/public/art/materials/basic_glow.xml b/binaries/data/mods/public/art/materials/basic_glow.xml
index 447f9f4ed6..f95132f342 100644
--- a/binaries/data/mods/public/art/materials/basic_glow.xml
+++ b/binaries/data/mods/public/art/materials/basic_glow.xml
@@ -2,7 +2,6 @@
-
diff --git a/binaries/data/mods/public/art/materials/basic_glow_norm.xml b/binaries/data/mods/public/art/materials/basic_glow_norm.xml
index 5acbc04f41..548a47648f 100644
--- a/binaries/data/mods/public/art/materials/basic_glow_norm.xml
+++ b/binaries/data/mods/public/art/materials/basic_glow_norm.xml
@@ -2,7 +2,6 @@
-
diff --git a/binaries/data/mods/public/art/materials/basic_glow_wind.xml b/binaries/data/mods/public/art/materials/basic_glow_wind.xml
index 82374ce306..7f91bc7898 100644
--- a/binaries/data/mods/public/art/materials/basic_glow_wind.xml
+++ b/binaries/data/mods/public/art/materials/basic_glow_wind.xml
@@ -2,7 +2,6 @@
-
diff --git a/binaries/data/mods/public/art/materials/basic_trans.xml b/binaries/data/mods/public/art/materials/basic_trans.xml
index 728f31f5ab..efc5c96f32 100644
--- a/binaries/data/mods/public/art/materials/basic_trans.xml
+++ b/binaries/data/mods/public/art/materials/basic_trans.xml
@@ -1,7 +1,6 @@
-
diff --git a/binaries/data/mods/public/art/materials/basic_trans_ao.xml b/binaries/data/mods/public/art/materials/basic_trans_ao.xml
index ffc507f591..3d36d1b50e 100644
--- a/binaries/data/mods/public/art/materials/basic_trans_ao.xml
+++ b/binaries/data/mods/public/art/materials/basic_trans_ao.xml
@@ -2,7 +2,6 @@
-
diff --git a/binaries/data/mods/public/art/materials/basic_trans_ao_parallax_spec.xml b/binaries/data/mods/public/art/materials/basic_trans_ao_parallax_spec.xml
index 867e5c30a2..7cc6af72d2 100644
--- a/binaries/data/mods/public/art/materials/basic_trans_ao_parallax_spec.xml
+++ b/binaries/data/mods/public/art/materials/basic_trans_ao_parallax_spec.xml
@@ -2,7 +2,6 @@
-
diff --git a/binaries/data/mods/public/art/materials/basic_trans_norm_spec.xml b/binaries/data/mods/public/art/materials/basic_trans_norm_spec.xml
index 45c57fbf4a..b9b59838c6 100644
--- a/binaries/data/mods/public/art/materials/basic_trans_norm_spec.xml
+++ b/binaries/data/mods/public/art/materials/basic_trans_norm_spec.xml
@@ -3,7 +3,6 @@
-
diff --git a/binaries/data/mods/public/art/materials/basic_trans_parallax_spec.xml b/binaries/data/mods/public/art/materials/basic_trans_parallax_spec.xml
index fe1824a813..e79a985513 100644
--- a/binaries/data/mods/public/art/materials/basic_trans_parallax_spec.xml
+++ b/binaries/data/mods/public/art/materials/basic_trans_parallax_spec.xml
@@ -4,7 +4,6 @@
-
diff --git a/binaries/data/mods/public/art/materials/basic_trans_spec.xml b/binaries/data/mods/public/art/materials/basic_trans_spec.xml
index 242ec65523..4b7af4c793 100644
--- a/binaries/data/mods/public/art/materials/basic_trans_spec.xml
+++ b/binaries/data/mods/public/art/materials/basic_trans_spec.xml
@@ -2,7 +2,6 @@
-
diff --git a/binaries/data/mods/public/art/materials/blend_spec.xml b/binaries/data/mods/public/art/materials/blend_spec.xml
index f2bfa2afd7..4debfa207c 100644
--- a/binaries/data/mods/public/art/materials/blend_spec.xml
+++ b/binaries/data/mods/public/art/materials/blend_spec.xml
@@ -1,7 +1,6 @@
-
diff --git a/binaries/data/mods/public/shaders/effects/model_transparent.xml b/binaries/data/mods/public/shaders/effects/model_transparent.xml
index 4af4ae7ed9..c052dc1c82 100644
--- a/binaries/data/mods/public/shaders/effects/model_transparent.xml
+++ b/binaries/data/mods/public/shaders/effects/model_transparent.xml
@@ -38,26 +38,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/source/graphics/MaterialManager.cpp b/source/graphics/MaterialManager.cpp
index 48f3c15daa..bd6fb07d22 100644
--- a/source/graphics/MaterialManager.cpp
+++ b/source/graphics/MaterialManager.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2021 Wildfire Games.
+/* Copyright (C) 2022 Wildfire Games.
* This file is part of 0 A.D.
*
* 0 A.D. is free software: you can redistribute it and/or modify
@@ -79,7 +79,6 @@ CMaterial CMaterialManager::LoadMaterial(const VfsPath& pathname)
#undef EL
CPreprocessorWrapper preprocessor;
- preprocessor.AddDefine("CFG_FORCE_ALPHATEST", g_RenderingOptions.GetForceAlphaTest() ? "1" : "0");
CMaterial material;
material.AddStaticUniform("qualityLevel", CVector4D(qualityLevel, 0, 0, 0));
diff --git a/source/graphics/ShaderManager.cpp b/source/graphics/ShaderManager.cpp
index d3f9ac1ea8..b3d502224a 100644
--- a/source/graphics/ShaderManager.cpp
+++ b/source/graphics/ShaderManager.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2021 Wildfire Games.
+/* Copyright (C) 2022 Wildfire Games.
* This file is part of 0 A.D.
*
* 0 A.D. is free software: you can redistribute it and/or modify
@@ -41,6 +41,8 @@
# include "ps/XML/RelaxNG.h"
#endif
+#include
+
TIMER_ADD_CLIENT(tc_ShaderValidation);
CShaderManager::CShaderManager()
@@ -385,7 +387,6 @@ bool CShaderManager::NewEffect(const char* name, const CShaderDefines& baseDefin
// Define all the elements and attributes used in the XML file
#define EL(x) int el_##x = XeroFile.GetElementID(#x)
#define AT(x) int at_##x = XeroFile.GetAttributeID(#x)
- EL(alpha);
EL(blend);
EL(define);
EL(depth);
@@ -395,7 +396,6 @@ bool CShaderManager::NewEffect(const char* name, const CShaderDefines& baseDefin
AT(context);
AT(dst);
AT(func);
- AT(ref);
AT(shader);
AT(shaders);
AT(src);
@@ -429,6 +429,7 @@ bool CShaderManager::NewEffect(const char* name, const CShaderDefines& baseDefin
{
XMBAttributeList Attrs = Child.GetAttributes();
+ // TODO: require should be an attribute of the tech and not its child.
if (Child.GetNodeName() == el_require)
{
if (Attrs.GetNamedItem(at_shaders) == "arb")
@@ -472,7 +473,6 @@ bool CShaderManager::NewEffect(const char* name, const CShaderDefines& baseDefin
});
CShaderDefines techDefines = baseDefines;
-
XERO_ITER_EL(usableTechs[0].first, Child)
{
if (Child.GetNodeName() == el_define)
@@ -483,7 +483,15 @@ bool CShaderManager::NewEffect(const char* name, const CShaderDefines& baseDefin
{
tech->SetSortByDistance(true);
}
- else if (Child.GetNodeName() == el_pass)
+ }
+ // We don't want to have a shader context depending on the order of define and
+ // pass tags.
+ // TODO: we might want to implement that in a proper way via splitting passes
+ // and tags in different groups in XML.
+ std::vector techPasses;
+ XERO_ITER_EL(usableTechs[0].first, Child)
+ {
+ if (Child.GetNodeName() == el_pass)
{
CShaderDefines passDefines = techDefines;
@@ -495,12 +503,6 @@ bool CShaderManager::NewEffect(const char* name, const CShaderDefines& baseDefin
{
passDefines.Add(CStrIntern(Element.GetAttributes().GetNamedItem(at_name)), CStrIntern(Element.GetAttributes().GetNamedItem(at_value)));
}
- else if (Element.GetNodeName() == el_alpha)
- {
- GLenum func = ParseComparisonFunc(Element.GetAttributes().GetNamedItem(at_func));
- float ref = Element.GetAttributes().GetNamedItem(at_ref).ToFloat();
- pass.AlphaFunc(func, ref);
- }
else if (Element.GetNodeName() == el_blend)
{
GLenum src = ParseBlendFunc(Element.GetAttributes().GetNamedItem(at_src));
@@ -520,10 +522,12 @@ bool CShaderManager::NewEffect(const char* name, const CShaderDefines& baseDefin
// Load the shader program after we've read all the possibly-relevant s
pass.SetShader(LoadProgram(Child.GetAttributes().GetNamedItem(at_shader).c_str(), passDefines));
- tech->AddPass(pass);
+ techPasses.emplace_back(std::move(pass));
}
}
+ tech->SetPasses(std::move(techPasses));
+
return true;
}
diff --git a/source/graphics/ShaderTechnique.cpp b/source/graphics/ShaderTechnique.cpp
index c3876a2c1d..f6dbf4a1e5 100644
--- a/source/graphics/ShaderTechnique.cpp
+++ b/source/graphics/ShaderTechnique.cpp
@@ -21,22 +21,12 @@
#include "graphics/ShaderProgram.h"
-CShaderPass::CShaderPass() :
- m_HasAlpha(false), m_HasBlend(false), m_HasColorMask(false), m_HasDepthMask(false), m_HasDepthFunc(false)
-{
-}
+CShaderPass::CShaderPass() = default;
void CShaderPass::Bind()
{
m_Shader->Bind();
-#if !CONFIG2_GLES
- if (m_HasAlpha)
- {
- glEnable(GL_ALPHA_TEST);
- glAlphaFunc(m_AlphaFunc, m_AlphaRef);
- }
-#endif
// TODO: maybe emit some warning if GLSL shaders try to use alpha test;
// the test should be done inside the shader itself
@@ -60,11 +50,6 @@ void CShaderPass::Unbind()
{
m_Shader->Unbind();
-#if !CONFIG2_GLES
- if (m_HasAlpha)
- glDisable(GL_ALPHA_TEST);
-#endif
-
if (m_HasBlend)
glDisable(GL_BLEND);
@@ -78,13 +63,6 @@ void CShaderPass::Unbind()
glDepthFunc(GL_LEQUAL);
}
-void CShaderPass::AlphaFunc(GLenum func, GLclampf ref)
-{
- m_HasAlpha = true;
- m_AlphaFunc = func;
- m_AlphaRef = ref;
-}
-
void CShaderPass::BlendFunc(GLenum src, GLenum dst)
{
m_HasBlend = true;
@@ -114,14 +92,11 @@ void CShaderPass::DepthFunc(GLenum func)
}
-CShaderTechnique::CShaderTechnique()
- : m_SortByDistance(false)
-{
-}
+CShaderTechnique::CShaderTechnique() = default;
-void CShaderTechnique::AddPass(const CShaderPass& pass)
+void CShaderTechnique::SetPasses(std::vector&& passes)
{
- m_Passes.push_back(pass);
+ m_Passes = std::move(passes);
}
int CShaderTechnique::GetNumPasses() const
diff --git a/source/graphics/ShaderTechnique.h b/source/graphics/ShaderTechnique.h
index a7237ebea9..20100c7bed 100644
--- a/source/graphics/ShaderTechnique.h
+++ b/source/graphics/ShaderTechnique.h
@@ -39,7 +39,6 @@ public:
void SetShader(const CShaderProgramPtr& shader) { m_Shader = shader; }
// Add various bits of GL state to the pass:
- void AlphaFunc(GLenum func, GLclampf ref);
void BlendFunc(GLenum src, GLenum dst);
void ColorMask(GLboolean r, GLboolean g, GLboolean b, GLboolean a);
void DepthMask(GLboolean mask);
@@ -60,24 +59,20 @@ public:
private:
CShaderProgramPtr m_Shader;
- bool m_HasAlpha;
- GLenum m_AlphaFunc;
- GLclampf m_AlphaRef;
-
- bool m_HasBlend;
+ bool m_HasBlend = false;
GLenum m_BlendSrc;
GLenum m_BlendDst;
- bool m_HasColorMask;
+ bool m_HasColorMask = false;
GLboolean m_ColorMaskR;
GLboolean m_ColorMaskG;
GLboolean m_ColorMaskB;
GLboolean m_ColorMaskA;
- bool m_HasDepthMask;
+ bool m_HasDepthMask = false;
GLboolean m_DepthMask;
- bool m_HasDepthFunc;
+ bool m_HasDepthFunc = false;
GLenum m_DepthFunc;
};
@@ -89,7 +84,7 @@ class CShaderTechnique
{
public:
CShaderTechnique();
- void AddPass(const CShaderPass& pass);
+ void SetPasses(std::vector&& passes);
int GetNumPasses() const;
@@ -108,7 +103,7 @@ public:
private:
std::vector m_Passes;
- bool m_SortByDistance;
+ bool m_SortByDistance = false;
};
#endif // INCLUDED_SHADERTECHNIQUE
diff --git a/source/renderer/RenderingOptions.cpp b/source/renderer/RenderingOptions.cpp
index 680ac93cf7..715223baf6 100644
--- a/source/renderer/RenderingOptions.cpp
+++ b/source/renderer/RenderingOptions.cpp
@@ -123,7 +123,6 @@ CRenderingOptions::CRenderingOptions() : m_ConfigHooks(new ConfigHooks())
m_Particles = false;
m_Silhouettes = false;
m_Fog = false;
- m_ForceAlphaTest = false;
m_GPUSkinning = false;
m_SmoothLOS = false;
m_PostProc = false;
@@ -212,7 +211,6 @@ void CRenderingOptions::ReadConfigAndSetupHooks()
});
m_ConfigHooks->Setup("silhouettes", m_Silhouettes);
- m_ConfigHooks->Setup("forcealphatest", m_ForceAlphaTest);
m_ConfigHooks->Setup("gpuskinning", [this]() {
bool enabled;
CFG_GET_VAL("gpuskinning", enabled);
diff --git a/source/renderer/RenderingOptions.h b/source/renderer/RenderingOptions.h
index f5ee4d4149..c560fb27e4 100644
--- a/source/renderer/RenderingOptions.h
+++ b/source/renderer/RenderingOptions.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2021 Wildfire Games.
+/* Copyright (C) 2022 Wildfire Games.
* This file is part of 0 A.D.
*
* 0 A.D. is free software: you can redistribute it and/or modify
@@ -113,7 +113,6 @@ OPTION_CUSTOM_SETTER(NAME, TYPE); OPTION_GETTER(NAME, TYPE); OPTION_DEF(NAME, TY
OPTION(ShadowAlphaFix, bool);
OPTION(ARBProgramShadow, bool);
OPTION(Particles, bool);
- OPTION(ForceAlphaTest, bool);
OPTION(GPUSkinning, bool);
OPTION(Silhouettes, bool);
OPTION(SmoothLOS, bool);