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);