Browse Source

New rewrite. Not working yet

Panagiotis Christopoulos Charitos 3 years ago
parent
commit
bd44fdea42
37 changed files with 598 additions and 1055 deletions
  1. 152 11
      AnKi/ShaderCompiler/ShaderProgramCompiler.cpp
  2. 16 1
      AnKi/ShaderCompiler/ShaderProgramParser.cpp
  3. 31 34
      AnKi/Shaders/ForwardShadingParticles.ankiprog
  4. 7 26
      AnKi/Shaders/GBufferGeneric.ankiprog
  5. 20 0
      AnKi/Util/Allocator.h
  6. 37 0
      AnKi/Util/Allocator.inl.h
  7. 2 2
      AnKi/Util/BitSet.h
  8. 13 6
      AnKi/Util/DynamicArray.h
  9. 11 0
      AnKi/Util/DynamicArray.inl.h
  10. 12 0
      AnKi/Util/Forward.h
  11. 5 0
      AnKi/Util/Memory.cpp
  12. 13 63
      AnKi/Util/WeakArray.h
  13. 87 0
      AnKi/Util/WeakArray.inl.h
  14. 8 38
      Samples/Sponza/Assets/arch.001_efebbb2a6f84fff0.ankimtl
  15. 8 38
      Samples/Sponza/Assets/arch_e0c8c7e29c806284.ankimtl
  16. 8 38
      Samples/Sponza/Assets/bricks_8bd6f24aa0ad3654.ankimtl
  17. 8 38
      Samples/Sponza/Assets/ceiling_3fd94cde277a48e1.ankimtl
  18. 8 38
      Samples/Sponza/Assets/chain_33ef478b87fe7c15.ankimtl
  19. 8 38
      Samples/Sponza/Assets/column_a_1e1bacae3460b88.ankimtl
  20. 8 38
      Samples/Sponza/Assets/column_b_c9391d56bff59fc3.ankimtl
  21. 8 38
      Samples/Sponza/Assets/column_c_43f866fc7b9f0169.ankimtl
  22. 8 38
      Samples/Sponza/Assets/details_4242afc5fc479920.ankimtl
  23. 8 38
      Samples/Sponza/Assets/fabric_a_945c29fc221550fb.ankimtl
  24. 8 38
      Samples/Sponza/Assets/fabric_c_c8bf70dee411d1bd.ankimtl
  25. 8 38
      Samples/Sponza/Assets/fabric_d_8ff4aebb25bf20b0.ankimtl
  26. 8 38
      Samples/Sponza/Assets/fabric_e_d1c5a44841c48230.ankimtl
  27. 8 38
      Samples/Sponza/Assets/fabric_f_d54bbaca38ed4391.ankimtl
  28. 8 38
      Samples/Sponza/Assets/flagpole_6c7e0eb8dd33b39e.ankimtl
  29. 8 38
      Samples/Sponza/Assets/floor_71cbd2644e53ab8c.ankimtl
  30. 8 38
      Samples/Sponza/Assets/leaf_3a245efd17475037.ankimtl
  31. 8 38
      Samples/Sponza/Assets/lion_c45d3035db3bc17b.ankimtl
  32. 8 38
      Samples/Sponza/Assets/lion_stand_ab5e3642131ad971.ankimtl
  33. 8 38
      Samples/Sponza/Assets/roof_4359bd4e3b26845.ankimtl
  34. 8 38
      Samples/Sponza/Assets/vase_45c3983f6cc9c489.ankimtl
  35. 8 38
      Samples/Sponza/Assets/vase_fl_580cea687de3d758.ankimtl
  36. 8 38
      Samples/Sponza/Assets/vase_hanging_c2d2b40b27cacd7d.ankimtl
  37. 8 38
      Samples/Sponza/Assets/vase_round_71af81a1ac0a7c3e.ankimtl

+ 152 - 11
AnKi/ShaderCompiler/ShaderProgramCompiler.cpp

@@ -725,7 +725,7 @@ public:
 		ShaderProgramBinaryBlockInstance& instance = m_blockInstances[blockType][blockInstanceIdx];
 		instance.m_index = blockIdx;
 		instance.m_size = size;
-		instance.m_variableInstances.setArray(m_alloc.newArray<ShaderProgramBinaryVariableInstance>(varSize), varSize);
+		m_alloc.newArray(varSize, instance.m_variableInstances);
 
 		return Error::NONE;
 	}
@@ -773,6 +773,150 @@ public:
 	}
 };
 
+static Bool ghostMemberActive(const ShaderProgramParserMember& member, const ShaderProgramBinaryMutation& mutation)
+{
+	Bool active = false;
+	if(member.m_dependentMutator == MAX_U32)
+	{
+		active = true;
+	}
+	else
+	{
+		ANKI_ASSERT(member.m_dependentMutator < mutation.m_values.getSize());
+		active = mutation.m_values[member.m_dependentMutator] == member.m_mutatorValue;
+	}
+
+	return active;
+}
+
+static Error doGhostStructReflection(const StringList& symbolsToReflect,
+									 ConstWeakArray<ShaderProgramParserGhostStruct> ghostStructs,
+									 ShaderProgramBinary& binary, GenericMemoryPoolAllocator<U8>& tmpAlloc,
+									 GenericMemoryPoolAllocator<U8>& binaryAlloc)
+{
+	// Count reflectable ghost structs
+	DynamicArrayAuto<U32> ghostStructIndices(tmpAlloc);
+	for(U32 i = 0; i < ghostStructs.getSize(); ++i)
+	{
+		for(const String& s : symbolsToReflect)
+		{
+			if(s == ghostStructs[i].m_name)
+			{
+				ghostStructIndices.emplaceBack(i);
+				break;
+			}
+		}
+	}
+
+	if(ghostStructIndices.getSize() == 0)
+	{
+		return Error::NONE;
+	}
+
+	// Add the ghost structs to binary structs
+	const U32 nonGhostStructCount = binary.m_structs.getSize();
+	DynamicArrayAuto<ShaderProgramBinaryStruct> structs(binaryAlloc,
+														nonGhostStructCount + ghostStructIndices.getSize());
+
+	for(U32 i = 0; i < binary.m_structs.getSize(); ++i)
+	{
+		structs[i] = binary.m_structs[i];
+	}
+
+	for(U32 i = 0; i < ghostStructIndices.getSize(); ++i)
+	{
+		const ShaderProgramParserGhostStruct& in = ghostStructs[ghostStructIndices[i]];
+		ShaderProgramBinaryStruct& out = structs[nonGhostStructCount + i];
+
+		ANKI_CHECK(Refl::setName(in.m_name, out.m_name));
+
+		DynamicArrayAuto<ShaderProgramBinaryStructMember> members(binaryAlloc, in.m_members.getSize());
+		for(U32 j = 0; j < in.m_members.getSize(); ++j)
+		{
+			const ShaderProgramParserMember& inMember = in.m_members[j];
+			ShaderProgramBinaryStructMember& outMember = members[j];
+
+			ANKI_CHECK(Refl::setName(inMember.m_name, outMember.m_name));
+			outMember.m_type = inMember.m_type;
+		}
+
+		members.moveAndReset(out.m_members);
+	}
+
+	binaryAlloc.deleteArray(binary.m_structs);
+	structs.moveAndReset(binary.m_structs);
+
+	// For all mutations update the instances
+	DynamicArrayAuto<Bool> variantVisited(tmpAlloc, binary.m_variants.getSize(), false);
+	for(U32 mutationIdx = 0; mutationIdx < binary.m_mutations.getSize(); ++mutationIdx)
+	{
+		const ShaderProgramBinaryMutation& mutation = binary.m_mutations[mutationIdx];
+		if(variantVisited[mutation.m_variantIndex])
+		{
+			continue;
+		}
+		variantVisited[mutation.m_variantIndex] = true;
+
+		ShaderProgramBinaryVariant& variant = binary.m_variants[mutation.m_variantIndex];
+
+		DynamicArrayAuto<ShaderProgramBinaryStructInstance> structInstances(binaryAlloc);
+
+		// Copy the existing struct instances
+		for(U32 i = 0; i < variant.m_structs.getSize(); ++i)
+		{
+			structInstances.emplaceBack(variant.m_structs[i]);
+		}
+
+		// For each ghost struct add member intances
+		for(U32 i = 0; i < ghostStructIndices.getSize(); ++i)
+		{
+			const ShaderProgramParserGhostStruct& inStruct = ghostStructs[ghostStructIndices[i]];
+
+			// Find which members are active in this mutation
+			BitSet<128, U64> activeMembers(false);
+			ANKI_ASSERT(inStruct.m_members.getSize() <= 128);
+			for(U32 j = 0; j < inStruct.m_members.getSize(); ++j)
+			{
+				activeMembers.set(j, ghostMemberActive(inStruct.m_members[j], mutation));
+			}
+
+			if(activeMembers.getEnabledBitCount() == 0)
+			{
+				continue;
+			}
+
+			// Add the active members
+			U32 offsetof = 0;
+			DynamicArrayAuto<ShaderProgramBinaryStructMemberInstance> memberInstances(binaryAlloc);
+			for(U32 j = 0; j < inStruct.m_members.getSize(); ++j)
+			{
+				if(!activeMembers.get(j))
+				{
+					continue;
+				}
+
+				ShaderProgramBinaryStructMemberInstance& outMember = *memberInstances.emplaceBack();
+				outMember.m_arraySize = 1;
+				outMember.m_index = j;
+				outMember.m_offset = offsetof;
+
+				offsetof += getShaderVariableDataTypeInfo(inStruct.m_members[j].m_type).m_size;
+			}
+
+			ShaderProgramBinaryStructInstance& outStructInstance = *structInstances.emplaceBack();
+			outStructInstance.m_index = nonGhostStructCount + i;
+			outStructInstance.m_size = offsetof;
+			memberInstances.moveAndReset(outStructInstance.m_memberInstances);
+		}
+
+		// Replace data
+		binaryAlloc.deleteArray(variant.m_structs);
+		structInstances.moveAndReset(variant.m_structs);
+	}
+
+	return Error::NONE;
+}
+
 static Error doReflection(const StringList& symbolsToReflect, ShaderProgramBinary& binary,
 						  GenericMemoryPoolAllocator<U8>& tmpAlloc, GenericMemoryPoolAllocator<U8>& binaryAlloc)
 {
@@ -965,18 +1109,16 @@ Error compileShaderProgramInternal(CString fname, ShaderProgramFilesystemInterfa
 	U32 mutationCount = 0;
 	if(parser.getMutators().getSize() > 0)
 	{
-		binary.m_mutators.setArray(binaryAllocator.newArray<ShaderProgramBinaryMutator>(parser.getMutators().getSize()),
-								   parser.getMutators().getSize());
+		binaryAllocator.newArray(parser.getMutators().getSize(), binary.m_mutators);
 
 		for(U32 i = 0; i < binary.m_mutators.getSize(); ++i)
 		{
 			ShaderProgramBinaryMutator& out = binary.m_mutators[i];
 			const ShaderProgramParserMutator& in = parser.getMutators()[i];
 
-			ANKI_ASSERT(in.getName().getLength() < out.m_name.getSize());
-			memcpy(&out.m_name[0], in.getName().cstr(), in.getName().getLength() + 1);
+			ANKI_CHECK(Refl::setName(in.getName(), out.m_name));
 
-			out.m_values.setArray(binaryAllocator.newArray<I32>(in.getValues().getSize()), in.getValues().getSize());
+			binaryAllocator.newArray(in.getValues().getSize(), out.m_values);
 			memcpy(out.m_values.getBegin(), in.getValues().getBegin(), in.getValues().getSizeInBytes());
 
 			// Update the count
@@ -1038,8 +1180,7 @@ Error compileShaderProgramInternal(CString fname, ShaderProgramFilesystemInterfa
 			}
 
 			ShaderProgramBinaryMutation& mutation = mutations[mutationCount++];
-			mutation.m_values.setArray(binaryAllocator.newArray<MutatorValue>(originalMutationValues.getSize()),
-									   originalMutationValues.getSize());
+			binaryAllocator.newArray(originalMutationValues.getSize(), mutation.m_values);
 			memcpy(mutation.m_values.getBegin(), originalMutationValues.getBegin(),
 				   originalMutationValues.getSizeInBytes());
 
@@ -1084,9 +1225,7 @@ Error compileShaderProgramInternal(CString fname, ShaderProgramFilesystemInterfa
 										tempAllocator, binaryAllocator, taskManager, mtx, errorAtomic);
 
 					ShaderProgramBinaryMutation& otherMutation = mutations[mutationCount++];
-					otherMutation.m_values.setArray(
-						binaryAllocator.newArray<MutatorValue>(rewrittenMutationValues.getSize()),
-						rewrittenMutationValues.getSize());
+					binaryAllocator.newArray(rewrittenMutationValues.getSize(), otherMutation.m_values);
 					memcpy(otherMutation.m_values.getBegin(), rewrittenMutationValues.getBegin(),
 						   rewrittenMutationValues.getSizeInBytes());
 
@@ -1175,6 +1314,8 @@ Error compileShaderProgramInternal(CString fname, ShaderProgramFilesystemInterfa
 
 	// Reflection
 	ANKI_CHECK(doReflection(parser.getSymbolsToReflect(), binary, tempAllocator, binaryAllocator));
+	ANKI_CHECK(doGhostStructReflection(parser.getSymbolsToReflect(), parser.getGhostStructs(), binary, tempAllocator,
+									   binaryAllocator));
 
 	return Error::NONE;
 }

+ 16 - 1
AnKi/ShaderCompiler/ShaderProgramParser.cpp

@@ -896,7 +896,19 @@ Error ShaderProgramParser::parsePragmaStructBegin(const StringAuto* begin, const
 
 	GhostStruct& gstruct = *m_ghostStructs.emplaceBack(m_alloc);
 	gstruct.m_name.create(*begin);
-	m_codeLines.pushBackSprintf("struct %s {", begin->cstr());
+
+	// Add a '_' to the struct name.
+	//
+	// Scenario:
+	// - The shader may have a "pragma reflect" of the struct
+	// - The SPIRV also contains the struct
+	//
+	// What happens:
+	// - The struct is in SPIRV and it will be reflected
+	// - The struct is also in ghost structs and it will be reflected
+	//
+	// This is undesirable because it will complicates reflection. So eliminate the struct from SPIRV by renaming it
+	m_codeLines.pushBackSprintf("struct %s_ {", begin->cstr());
 
 	ANKI_ASSERT(!m_insideStruct);
 	m_insideStruct = true;
@@ -1135,6 +1147,9 @@ Error ShaderProgramParser::parsePragmaStructEnd(const StringAuto* begin, const S
 	}
 	m_codeLines.pushBack(")");
 
+	// Define the actual struct
+	m_codeLines.pushBackSprintf("#define %s %s_", structName.cstr(), structName.cstr());
+
 	m_insideStruct = false;
 	return Error::NONE;
 }

+ 31 - 34
AnKi/Shaders/ForwardShadingParticles.ankiprog

@@ -9,14 +9,17 @@
 
 #include <AnKi/Shaders/ForwardShadingCommon.glsl>
 
-#pragma anki start vert
-
-layout(location = VERTEX_ATTRIBUTE_ID_SCALE) in F32 in_scale;
-layout(location = VERTEX_ATTRIBUTE_ID_ALPHA) in F32 in_alpha;
+#pragma anki reflect AnKiLocalUniforms
+#pragma anki struct AnKiLocalUniforms
+#pragma anki member F32 m_animationPeriod if ANIMATED_TEXTURE is 1
+#pragma anki member ANKI_RP Vec4 m_colorScale
+#pragma anki member ANKI_RP Vec4 m_colorBias
+#pragma anki struct end
 
-layout(location = 0) flat out ANKI_RP F32 out_alpha;
-layout(location = 1) out Vec2 out_uv;
-layout(location = 2) out Vec3 out_worldPos;
+layout(set = MATERIAL_SET_EXTERNAL, binding = MATERIAL_BINDING_LOCAL_UNIFORMS, row_major, scalar) buffer b_localUniforms
+{
+	U32 u_localUniforms[];
+};
 
 layout(set = MATERIAL_SET_EXTERNAL, binding = MATERIAL_BINDING_GLOBAL_UNIFORMS, row_major,
 	   scalar) uniform b_ankiGlobalUniforms
@@ -30,6 +33,27 @@ layout(set = MATERIAL_SET_EXTERNAL, binding = MATERIAL_BINDING_RENDERABLE_GPU_VI
 	RenderableGpuView u_renderableGpuViews[1];
 };
 
+layout(set = MATERIAL_SET_EXTERNAL, binding = MATERIAL_BINDING_GLOBAL_SAMPLER) uniform sampler u_globalSampler;
+#if ANIMATED_TEXTURE == 0
+#	pragma anki reflect u_diffuseMap
+layout(set = MATERIAL_SET_EXTERNAL,
+	   binding = MATERIAL_BINDING_FIRST_NON_STANDARD) uniform ANKI_RP texture2D u_diffuseMap;
+#endif
+#if ANIMATED_TEXTURE == 1
+#	pragma anki reflect u_diffuseMapArr
+layout(set = MATERIAL_SET_EXTERNAL,
+	   binding = MATERIAL_BINDING_FIRST_NON_STANDARD) uniform ANKI_RP texture2DArray u_diffuseMapArr;
+#endif
+
+#pragma anki start vert
+
+layout(location = VERTEX_ATTRIBUTE_ID_SCALE) in F32 in_scale;
+layout(location = VERTEX_ATTRIBUTE_ID_ALPHA) in F32 in_alpha;
+
+layout(location = 0) flat out ANKI_RP F32 out_alpha;
+layout(location = 1) out Vec2 out_uv;
+layout(location = 2) out Vec3 out_worldPos;
+
 void main()
 {
 	out_uv = Vec2(gl_VertexID & 1, gl_VertexID >> 1);
@@ -48,33 +72,6 @@ layout(location = 0) flat in ANKI_RP F32 in_alpha;
 layout(location = 1) in Vec2 in_uv;
 layout(location = 2) in Vec3 in_worldPos;
 
-#pragma anki reflect AnKiLocalUniforms
-#pragma anki struct AnKiLocalUniforms
-#if ANIMATED_TEXTURE == 1
-#	pragma anki member F32 m_animationPeriod
-#endif
-#pragma anki member ANKI_RP Vec4 m_colorScale
-#pragma anki member ANKI_RP Vec4 m_colorBias
-#pragma anki struct end
-
-layout(set = MATERIAL_SET_EXTERNAL, binding = MATERIAL_BINDING_LOCAL_UNIFORMS, row_major, scalar) buffer b_localUniforms
-{
-	U32 u_localUniforms[];
-};
-ANKI_FAKE_LOCAL_UNIFORMS_BUFFER()
-
-layout(set = MATERIAL_SET_EXTERNAL, binding = MATERIAL_BINDING_GLOBAL_SAMPLER) uniform sampler u_globalSampler;
-#if ANIMATED_TEXTURE == 0
-#	pragma anki reflect u_diffuseMap
-layout(set = MATERIAL_SET_EXTERNAL,
-	   binding = MATERIAL_BINDING_FIRST_NON_STANDARD) uniform ANKI_RP texture2D u_diffuseMap;
-#endif
-#if ANIMATED_TEXTURE == 1
-#	pragma anki reflect u_diffuseMapArr
-layout(set = MATERIAL_SET_EXTERNAL,
-	   binding = MATERIAL_BINDING_FIRST_NON_STANDARD) uniform ANKI_RP texture2DArray u_diffuseMapArr;
-#endif
-
 void main()
 {
 	const AnKiLocalUniforms localUniforms = loadAnKiLocalUniforms(u_localUniforms, 0u);

+ 7 - 26
AnKi/Shaders/GBufferGeneric.ankiprog

@@ -87,25 +87,13 @@ layout(set = MATERIAL_SET_EXTERNAL,
 
 #pragma anki reflect AnKiLocalUniforms
 #pragma anki struct AnKiLocalUniforms
-#if !DIFFUSE_TEX
-#	pragma anki member Vec3 m_diffColor
-#endif
-#if !ROUGHNESS_TEX
-#	pragma anki member F32 m_roughness
-#endif
-#if !SPECULAR_TEX
-#	pragma anki member Vec3 m_specColor
-#endif
-#if !METAL_TEX
-#	pragma anki member F32 m_metallic
-#endif
-#if !EMISSIVE_TEX
-#	pragma anki member Vec3 m_emission
-#endif
-#if PARALLAX
-#	pragma anki member F32 m_heightmapScale
-#endif
-#pragma anki member F32 m_subsurface
+#pragma anki member ANKI_RP Vec3 m_diffColor if DIFFUSE_TEX is 0
+#pragma anki member ANKI_RP F32 m_roughness if ROUGHNESS_TEX is 0
+#pragma anki member ANKI_RP Vec3 m_specColor if SPECULAR_TEX is 0
+#pragma anki member ANKI_RP F32 m_metallic if METAL_TEX is 0
+#pragma anki member ANKI_RP Vec3 m_emission if EMISSIVE_TEX is 0
+#pragma anki member ANKI_RP F32 m_heightmapScale if PARALLAX is 1
+#pragma anki member ANKI_RP F32 m_subsurface
 #pragma anki struct end
 
 layout(set = MATERIAL_SET_EXTERNAL, binding = MATERIAL_BINDING_LOCAL_UNIFORMS, row_major, scalar) buffer b_localUniforms
@@ -113,13 +101,6 @@ layout(set = MATERIAL_SET_EXTERNAL, binding = MATERIAL_BINDING_LOCAL_UNIFORMS, r
 	U32 u_localUniforms[];
 };
 
-// A trick to avoid spirv-opt optimizing away the AnKiLocalUniforms
-layout(set = MATERIAL_SET_EXTERNAL, binding = MATERIAL_BINDING_LOCAL_UNIFORMS, row_major,
-	   scalar) buffer b_localUniformsFake
-{
-	AnKiLocalUniforms u_localUniformsFake[];
-};
-
 layout(set = MATERIAL_SET_EXTERNAL, binding = MATERIAL_BINDING_RENDERABLE_GPU_VIEW, row_major,
 	   scalar) uniform b_renderableGpuView
 {

+ 20 - 0
AnKi/Util/Allocator.h

@@ -8,6 +8,7 @@
 #include <AnKi/Util/Assert.h>
 #include <AnKi/Util/Memory.h>
 #include <AnKi/Util/Logger.h>
+#include <AnKi/Util/Forward.h>
 #include <cstddef> // For ptrdiff_t
 #include <utility> // For forward
 #include <new> // For placement new
@@ -291,6 +292,18 @@ public:
 		return ptr;
 	}
 
+	/// Allocate a new array of objects and call their constructor.
+	/// @note This is AnKi specific.
+	/// @note The output is a parameter to work with template deduction.
+	template<typename TValue, typename TSize>
+	void newArray(size_type n, WeakArray<TValue, TSize>& out);
+
+	/// Allocate a new array of objects and call their constructor.
+	/// @note This is AnKi specific.
+	/// @note The output is a parameter to work with template deduction.
+	template<typename TValue, typename TSize>
+	void newArray(size_type n, const TValue& v, WeakArray<TValue, TSize>& out);
+
 	/// Call the destructor and deallocate an object
 	/// @note This is AnKi specific
 	template<typename Y>
@@ -327,6 +340,11 @@ public:
 		}
 	}
 
+	/// Call the destructor and deallocate an array of objects
+	/// @note This is AnKi specific
+	template<typename TValue, typename TSize>
+	void deleteArray(WeakArray<TValue, TSize>& arr);
+
 private:
 	TPool* m_pool = nullptr;
 
@@ -414,3 +432,5 @@ using ChainAllocator = GenericPoolAllocator<T, ChainMemoryPool>;
 /// @}
 
 } // end namespace anki
+
+#include <AnKi/Util/Allocator.inl.h>

+ 37 - 0
AnKi/Util/Allocator.inl.h

@@ -0,0 +1,37 @@
+// Copyright (C) 2009-2022, Panagiotis Christopoulos Charitos and contributors.
+// All rights reserved.
+// Code licensed under the BSD License.
+// http://www.anki3d.org/LICENSE
+
+#include <AnKi/Util/Allocator.h>
+#include <AnKi/Util/WeakArray.h>
+
+namespace anki {
+
+template<typename T, typename TPool>
+template<typename TValue, typename TSize>
+void GenericPoolAllocator<T, TPool>::deleteArray(WeakArray<TValue, TSize>& arr)
+{
+	deleteArray(arr.getBegin(), arr.getSize());
+	arr.setArray(nullptr, 0);
+}
+
+template<typename T, typename TPool>
+template<typename TValue, typename TSize>
+void GenericPoolAllocator<T, TPool>::newArray(size_type n, WeakArray<TValue, TSize>& out)
+{
+	TValue* arr = newArray<TValue>(n);
+	ANKI_ASSERT(n < std::numeric_limits<TSize>::max());
+	out.setArray(arr, TSize(n));
+}
+
+template<typename T, typename TPool>
+template<typename TValue, typename TSize>
+void GenericPoolAllocator<T, TPool>::newArray(size_type n, const TValue& v, WeakArray<TValue, TSize>& out)
+{
+	TValue* arr = newArray<TValue>(n, v);
+	ANKI_ASSERT(n < std::numeric_limits<TSize>::max());
+	out.setArray(arr, TSize(n));
+}
+
+} // end namespace anki

+ 2 - 2
AnKi/Util/BitSet.h

@@ -159,12 +159,12 @@ public:
 
 	/// Set or unset a bit at the given position.
 	template<typename TInt>
-	BitSet& set(TInt pos, Bool setBits = true)
+	BitSet& set(TInt pos, Bool setBit = true)
 	{
 		U32 high, low;
 		position(U32(pos), high, low);
 		const ChunkType mask = ChunkType(ChunkType(1) << ChunkType(low));
-		m_chunks[high] = (setBits) ? ChunkType(m_chunks[high] | mask) : ChunkType(m_chunks[high] & ~mask);
+		m_chunks[high] = (setBit) ? ChunkType(m_chunks[high] | mask) : ChunkType(m_chunks[high] & ~mask);
 		return *this;
 	}
 

+ 13 - 6
AnKi/Util/DynamicArray.h

@@ -7,13 +7,10 @@
 
 #include <AnKi/Util/Allocator.h>
 #include <AnKi/Util/Functions.h>
+#include <AnKi/Util/Forward.h>
 
 namespace anki {
 
-// Forward
-template<typename T, typename TSize>
-class DynamicArrayAuto;
-
 /// @addtogroup util_containers
 /// @{
 
@@ -21,7 +18,7 @@ class DynamicArrayAuto;
 /// that requires manual destruction. Used in permanent classes.
 /// @tparam T The type this array will hold.
 /// @tparam TSize The type that denotes the maximum number of elements of the array.
-template<typename T, typename TSize = U32>
+template<typename T, typename TSize>
 class DynamicArray
 {
 public:
@@ -296,6 +293,9 @@ public:
 		m_capacity = 0;
 	}
 
+	/// @copydoc moveAndReset
+	void moveAndReset(WeakArray<Value, Size>& array);
+
 	/// Resizes the storage but DOESN'T CONSTRUCT ANY ELEMENTS. It only moves or destroys.
 	template<typename TAllocator>
 	void resizeStorage(TAllocator alloc, Size newSize);
@@ -308,7 +308,7 @@ protected:
 
 /// Dynamic array with automatic destruction. It's the same as DynamicArray but it holds the allocator in order to
 /// perform automatic destruction. Use it for temp operations and on transient classes.
-template<typename T, typename TSize = U32>
+template<typename T, typename TSize>
 class DynamicArrayAuto : public DynamicArray<T, TSize>
 {
 public:
@@ -473,6 +473,13 @@ public:
 		// Don't touch the m_alloc
 	}
 
+	/// @copydoc DynamicArray::moveAndReset
+	void moveAndReset(WeakArray<Value, Size>& array)
+	{
+		Base::moveAndReset(array);
+		// Don't touch the m_alloc
+	}
+
 	/// @copydoc DynamicArray::resizeStorage
 	void resizeStorage(Size newSize)
 	{

+ 11 - 0
AnKi/Util/DynamicArray.inl.h

@@ -4,6 +4,7 @@
 // http://www.anki3d.org/LICENSE
 
 #include <AnKi/Util/DynamicArray.h>
+#include <AnKi/Util/WeakArray.h>
 
 namespace anki {
 
@@ -227,4 +228,14 @@ void DynamicArray<T, TSize>::erase(TAllocator alloc, ConstIterator first, ConstI
 	resizeStorage(alloc, newSize);
 }
 
+template<typename T, typename TSize>
+void DynamicArray<T, TSize>::moveAndReset(WeakArray<Value, Size>& array)
+{
+	Value* data;
+	Size size;
+	Size storageSize;
+	moveAndReset(data, size, storageSize);
+	array.setArray(data, size);
+}
+
 } // end namespace anki

+ 12 - 0
AnKi/Util/Forward.h

@@ -41,4 +41,16 @@ class ThreadHive;
 template<typename T, PtrSize T_PREALLOCATED_STORAGE = ANKI_SAFE_ALIGNMENT>
 class Function;
 
+template<typename T, typename TSize = U32>
+class WeakArray;
+
+template<typename T, typename TSize = U32>
+class ConstWeakArray;
+
+template<typename T, typename TSize = U32>
+class DynamicArray;
+
+template<typename T, typename TSize = U32>
+class DynamicArrayAuto;
+
 } // end namespace anki

+ 5 - 0
AnKi/Util/Memory.cpp

@@ -181,6 +181,7 @@ HeapMemoryPool::~HeapMemoryPool()
 
 void* HeapMemoryPool::allocate(PtrSize size, PtrSize alignment)
 {
+	ANKI_ASSERT(size > 0);
 #if ANKI_MEM_EXTRA_CHECKS
 	ANKI_ASSERT(alignment <= MAX_ALIGNMENT && "Wrong assumption");
 	size += ALLOCATION_HEADER_SIZE;
@@ -288,6 +289,8 @@ StackMemoryPool::~StackMemoryPool()
 
 void* StackMemoryPool::allocate(PtrSize size, PtrSize alignment)
 {
+	ANKI_ASSERT(size > 0);
+
 	Chunk* chunk;
 	PtrSize offset;
 	if(m_builder.allocate(size, alignment, chunk, offset))
@@ -362,6 +365,8 @@ ChainMemoryPool::~ChainMemoryPool()
 
 void* ChainMemoryPool::allocate(PtrSize size, PtrSize alignment)
 {
+	ANKI_ASSERT(size > 0);
+
 	Chunk* ch;
 	void* mem = nullptr;
 

+ 13 - 63
AnKi/Util/WeakArray.h

@@ -6,7 +6,7 @@
 #pragma once
 
 #include <AnKi/Util/Array.h>
-#include <AnKi/Util/DynamicArray.h>
+#include <AnKi/Util/Forward.h>
 
 namespace anki {
 
@@ -14,7 +14,7 @@ namespace anki {
 /// @{
 
 /// Array that doesn't own the memory.
-template<typename T, typename TSize = U32>
+template<typename T, typename TSize>
 class WeakArray
 {
 public:
@@ -46,25 +46,9 @@ public:
 	{
 	}
 
-	explicit WeakArray(DynamicArray<T, TSize>& arr)
-		: WeakArray()
-	{
-		if(arr.getSize())
-		{
-			m_data = &arr[0];
-			m_size = arr.getSize();
-		}
-	}
+	explicit WeakArray(DynamicArray<T, TSize>& arr);
 
-	explicit WeakArray(DynamicArrayAuto<T, TSize>& arr)
-		: WeakArray()
-	{
-		if(arr.getSize())
-		{
-			m_data = &arr[0];
-			m_size = arr.getSize();
-		}
-	}
+	explicit WeakArray(DynamicArrayAuto<T, TSize>& arr);
 
 	/// Copy.
 	WeakArray(const WeakArray& b)
@@ -105,19 +89,9 @@ public:
 		return *this;
 	}
 
-	WeakArray& operator=(DynamicArray<T, TSize>& arr)
-	{
-		m_data = (arr.getSize()) ? &arr[0] : nullptr;
-		m_size = arr.getSize();
-		return *this;
-	}
+	WeakArray& operator=(DynamicArray<T, TSize>& arr);
 
-	WeakArray& operator=(DynamicArrayAuto<T, TSize>& arr)
-	{
-		m_data = (arr.getSize()) ? &arr[0] : nullptr;
-		m_size = arr.getSize();
-		return *this;
-	}
+	WeakArray& operator=(DynamicArrayAuto<T, TSize>& arr);
 
 	Reference operator[](const Size n)
 	{
@@ -232,7 +206,7 @@ private:
 };
 
 /// Array that doesn't own the memory.
-template<typename T, typename TSize = U32>
+template<typename T, typename TSize>
 class ConstWeakArray
 {
 public:
@@ -270,26 +244,10 @@ public:
 	}
 
 	/// Construct from DynamicArray.
-	ConstWeakArray(const DynamicArray<T, TSize>& arr)
-		: ConstWeakArray()
-	{
-		if(arr.getSize())
-		{
-			m_data = &arr[0];
-			m_size = arr.getSize();
-		}
-	}
+	ConstWeakArray(const DynamicArray<T, TSize>& arr);
 
 	/// Construct from DynamicArrayAuto.
-	ConstWeakArray(const DynamicArrayAuto<T, TSize>& arr)
-		: ConstWeakArray()
-	{
-		if(arr.getSize())
-		{
-			m_data = &arr[0];
-			m_size = arr.getSize();
-		}
-	}
+	ConstWeakArray(const DynamicArrayAuto<T, TSize>& arr);
 
 	/// Copy.
 	ConstWeakArray(const ConstWeakArray& b)
@@ -339,19 +297,9 @@ public:
 		return *this;
 	}
 
-	ConstWeakArray& operator=(const DynamicArray<T, TSize>& arr)
-	{
-		m_data = (arr.getSize()) ? &arr[0] : nullptr;
-		m_size = arr.getSize();
-		return *this;
-	}
+	ConstWeakArray& operator=(const DynamicArray<T, TSize>& arr);
 
-	ConstWeakArray& operator=(const DynamicArrayAuto<T, TSize>& arr)
-	{
-		m_data = (arr.getSize()) ? &arr[0] : nullptr;
-		m_size = arr.getSize();
-		return *this;
-	}
+	ConstWeakArray& operator=(const DynamicArrayAuto<T, TSize>& arr);
 
 	ConstReference operator[](const Size n) const
 	{
@@ -425,3 +373,5 @@ private:
 /// @}
 
 } // end namespace anki
+
+#include <AnKi/Util/WeakArray.inl.h>

+ 87 - 0
AnKi/Util/WeakArray.inl.h

@@ -0,0 +1,87 @@
+// Copyright (C) 2009-2022, Panagiotis Christopoulos Charitos and contributors.
+// All rights reserved.
+// Code licensed under the BSD License.
+// http://www.anki3d.org/LICENSE
+
+#include <AnKi/Util/WeakArray.h>
+#include <AnKi/Util/DynamicArray.h>
+
+namespace anki {
+
+template<typename T, typename TSize>
+WeakArray<T, TSize>::WeakArray(DynamicArray<T, TSize>& arr)
+	: WeakArray()
+{
+	if(arr.getSize())
+	{
+		m_data = &arr[0];
+		m_size = arr.getSize();
+	}
+}
+
+template<typename T, typename TSize>
+WeakArray<T, TSize>::WeakArray(DynamicArrayAuto<T, TSize>& arr)
+	: WeakArray()
+{
+	if(arr.getSize())
+	{
+		m_data = &arr[0];
+		m_size = arr.getSize();
+	}
+}
+
+template<typename T, typename TSize>
+WeakArray<T, TSize>& WeakArray<T, TSize>::operator=(DynamicArray<T, TSize>& arr)
+{
+	m_data = (arr.getSize()) ? &arr[0] : nullptr;
+	m_size = arr.getSize();
+	return *this;
+}
+
+template<typename T, typename TSize>
+WeakArray<T, TSize>& WeakArray<T, TSize>::operator=(DynamicArrayAuto<T, TSize>& arr)
+{
+	m_data = (arr.getSize()) ? &arr[0] : nullptr;
+	m_size = arr.getSize();
+	return *this;
+}
+
+template<typename T, typename TSize>
+ConstWeakArray<T, TSize>::ConstWeakArray(const DynamicArray<T, TSize>& arr)
+	: ConstWeakArray()
+{
+	if(arr.getSize())
+	{
+		m_data = &arr[0];
+		m_size = arr.getSize();
+	}
+}
+
+template<typename T, typename TSize>
+ConstWeakArray<T, TSize>::ConstWeakArray(const DynamicArrayAuto<T, TSize>& arr)
+	: ConstWeakArray()
+{
+	if(arr.getSize())
+	{
+		m_data = &arr[0];
+		m_size = arr.getSize();
+	}
+}
+
+template<typename T, typename TSize>
+ConstWeakArray<T, TSize>& ConstWeakArray<T, TSize>::operator=(const DynamicArray<T, TSize>& arr)
+{
+	m_data = (arr.getSize()) ? &arr[0] : nullptr;
+	m_size = arr.getSize();
+	return *this;
+}
+
+template<typename T, typename TSize>
+ConstWeakArray<T, TSize>& ConstWeakArray<T, TSize>::operator=(const DynamicArrayAuto<T, TSize>& arr)
+{
+	m_data = (arr.getSize()) ? &arr[0] : nullptr;
+	m_size = arr.getSize();
+	return *this;
+}
+
+} // end namespace anki

+ 8 - 38
Samples/Sponza/Assets/arch.001_efebbb2a6f84fff0.ankimtl

@@ -1,10 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!-- This file is auto generated by ImporterMaterial.cpp -->
 <material shadows="1">
-	<techniques>
-		<technique name="GBuffer" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+	<shaderPrograms>
+		<shaderProgram filename="AnKi/Shaders/GBufferGeneric.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="0"/>
 				<mutator name="DIFFUSE_TEX" value="1"/>
 				<mutator name="SPECULAR_TEX" value="0"/>
 				<mutator name="ROUGHNESS_TEX" value="1"/>
@@ -14,44 +13,15 @@
 				<mutator name="EMISSIVE_TEX" value="0"/>
 				<mutator name="ALPHA_TEST" value="0"/>
 			</mutation>
-		</technique>
-
-		<technique name="GBufferEarlyZ" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
-			<mutation>
-				<mutator name="TECHNIQUE" value="1"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
-			</mutation>
-		</technique>
-
-		<technique name="Shadow" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+		</shaderProgram>
+		
+		<shaderProgram filename="AnKi/Shaders/RtShadowsHit.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="2"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
+				<mutator name="ALPHA_TEXTURE" value="0"/>
 			</mutation>
-		</technique>
-
-		
-	<technique name="RtShadow" shaderProgram="AnKi/Shaders/RtShadowsHit.ankiprog">
-		<mutation>
-			<mutator name="ALPHA_TEXTURE" value="0"/>
-		</mutation>
-	</technique>
+		</shaderProgram>
 
-	</techniques>
+	</shaderPrograms>
 
 	<inputs>
 		

+ 8 - 38
Samples/Sponza/Assets/arch_e0c8c7e29c806284.ankimtl

@@ -1,10 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!-- This file is auto generated by ImporterMaterial.cpp -->
 <material shadows="1">
-	<techniques>
-		<technique name="GBuffer" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+	<shaderPrograms>
+		<shaderProgram filename="AnKi/Shaders/GBufferGeneric.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="0"/>
 				<mutator name="DIFFUSE_TEX" value="1"/>
 				<mutator name="SPECULAR_TEX" value="0"/>
 				<mutator name="ROUGHNESS_TEX" value="1"/>
@@ -14,44 +13,15 @@
 				<mutator name="EMISSIVE_TEX" value="0"/>
 				<mutator name="ALPHA_TEST" value="0"/>
 			</mutation>
-		</technique>
-
-		<technique name="GBufferEarlyZ" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
-			<mutation>
-				<mutator name="TECHNIQUE" value="1"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
-			</mutation>
-		</technique>
-
-		<technique name="Shadow" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+		</shaderProgram>
+		
+		<shaderProgram filename="AnKi/Shaders/RtShadowsHit.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="2"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
+				<mutator name="ALPHA_TEXTURE" value="0"/>
 			</mutation>
-		</technique>
-
-		
-	<technique name="RtShadow" shaderProgram="AnKi/Shaders/RtShadowsHit.ankiprog">
-		<mutation>
-			<mutator name="ALPHA_TEXTURE" value="0"/>
-		</mutation>
-	</technique>
+		</shaderProgram>
 
-	</techniques>
+	</shaderPrograms>
 
 	<inputs>
 		

+ 8 - 38
Samples/Sponza/Assets/bricks_8bd6f24aa0ad3654.ankimtl

@@ -1,10 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!-- This file is auto generated by ImporterMaterial.cpp -->
 <material shadows="1">
-	<techniques>
-		<technique name="GBuffer" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+	<shaderPrograms>
+		<shaderProgram filename="AnKi/Shaders/GBufferGeneric.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="0"/>
 				<mutator name="DIFFUSE_TEX" value="1"/>
 				<mutator name="SPECULAR_TEX" value="0"/>
 				<mutator name="ROUGHNESS_TEX" value="1"/>
@@ -14,44 +13,15 @@
 				<mutator name="EMISSIVE_TEX" value="0"/>
 				<mutator name="ALPHA_TEST" value="0"/>
 			</mutation>
-		</technique>
-
-		<technique name="GBufferEarlyZ" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
-			<mutation>
-				<mutator name="TECHNIQUE" value="1"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
-			</mutation>
-		</technique>
-
-		<technique name="Shadow" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+		</shaderProgram>
+		
+		<shaderProgram filename="AnKi/Shaders/RtShadowsHit.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="2"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
+				<mutator name="ALPHA_TEXTURE" value="0"/>
 			</mutation>
-		</technique>
-
-		
-	<technique name="RtShadow" shaderProgram="AnKi/Shaders/RtShadowsHit.ankiprog">
-		<mutation>
-			<mutator name="ALPHA_TEXTURE" value="0"/>
-		</mutation>
-	</technique>
+		</shaderProgram>
 
-	</techniques>
+	</shaderPrograms>
 
 	<inputs>
 		

+ 8 - 38
Samples/Sponza/Assets/ceiling_3fd94cde277a48e1.ankimtl

@@ -1,10 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!-- This file is auto generated by ImporterMaterial.cpp -->
 <material shadows="1">
-	<techniques>
-		<technique name="GBuffer" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+	<shaderPrograms>
+		<shaderProgram filename="AnKi/Shaders/GBufferGeneric.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="0"/>
 				<mutator name="DIFFUSE_TEX" value="1"/>
 				<mutator name="SPECULAR_TEX" value="0"/>
 				<mutator name="ROUGHNESS_TEX" value="1"/>
@@ -14,44 +13,15 @@
 				<mutator name="EMISSIVE_TEX" value="0"/>
 				<mutator name="ALPHA_TEST" value="0"/>
 			</mutation>
-		</technique>
-
-		<technique name="GBufferEarlyZ" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
-			<mutation>
-				<mutator name="TECHNIQUE" value="1"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="0"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
-			</mutation>
-		</technique>
-
-		<technique name="Shadow" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+		</shaderProgram>
+		
+		<shaderProgram filename="AnKi/Shaders/RtShadowsHit.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="2"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="0"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
+				<mutator name="ALPHA_TEXTURE" value="0"/>
 			</mutation>
-		</technique>
-
-		
-	<technique name="RtShadow" shaderProgram="AnKi/Shaders/RtShadowsHit.ankiprog">
-		<mutation>
-			<mutator name="ALPHA_TEXTURE" value="0"/>
-		</mutation>
-	</technique>
+		</shaderProgram>
 
-	</techniques>
+	</shaderPrograms>
 
 	<inputs>
 		

+ 8 - 38
Samples/Sponza/Assets/chain_33ef478b87fe7c15.ankimtl

@@ -1,10 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!-- This file is auto generated by ImporterMaterial.cpp -->
 <material shadows="1">
-	<techniques>
-		<technique name="GBuffer" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+	<shaderPrograms>
+		<shaderProgram filename="AnKi/Shaders/GBufferGeneric.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="0"/>
 				<mutator name="DIFFUSE_TEX" value="1"/>
 				<mutator name="SPECULAR_TEX" value="0"/>
 				<mutator name="ROUGHNESS_TEX" value="0"/>
@@ -14,44 +13,15 @@
 				<mutator name="EMISSIVE_TEX" value="0"/>
 				<mutator name="ALPHA_TEST" value="0"/>
 			</mutation>
-		</technique>
-
-		<technique name="GBufferEarlyZ" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
-			<mutation>
-				<mutator name="TECHNIQUE" value="1"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="0"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="0"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
-			</mutation>
-		</technique>
-
-		<technique name="Shadow" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+		</shaderProgram>
+		
+		<shaderProgram filename="AnKi/Shaders/RtShadowsHit.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="2"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="0"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="0"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
+				<mutator name="ALPHA_TEXTURE" value="0"/>
 			</mutation>
-		</technique>
-
-		
-	<technique name="RtShadow" shaderProgram="AnKi/Shaders/RtShadowsHit.ankiprog">
-		<mutation>
-			<mutator name="ALPHA_TEXTURE" value="0"/>
-		</mutation>
-	</technique>
+		</shaderProgram>
 
-	</techniques>
+	</shaderPrograms>
 
 	<inputs>
 		

+ 8 - 38
Samples/Sponza/Assets/column_a_1e1bacae3460b88.ankimtl

@@ -1,10 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!-- This file is auto generated by ImporterMaterial.cpp -->
 <material shadows="1">
-	<techniques>
-		<technique name="GBuffer" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+	<shaderPrograms>
+		<shaderProgram filename="AnKi/Shaders/GBufferGeneric.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="0"/>
 				<mutator name="DIFFUSE_TEX" value="1"/>
 				<mutator name="SPECULAR_TEX" value="0"/>
 				<mutator name="ROUGHNESS_TEX" value="1"/>
@@ -14,44 +13,15 @@
 				<mutator name="EMISSIVE_TEX" value="0"/>
 				<mutator name="ALPHA_TEST" value="0"/>
 			</mutation>
-		</technique>
-
-		<technique name="GBufferEarlyZ" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
-			<mutation>
-				<mutator name="TECHNIQUE" value="1"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
-			</mutation>
-		</technique>
-
-		<technique name="Shadow" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+		</shaderProgram>
+		
+		<shaderProgram filename="AnKi/Shaders/RtShadowsHit.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="2"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
+				<mutator name="ALPHA_TEXTURE" value="0"/>
 			</mutation>
-		</technique>
-
-		
-	<technique name="RtShadow" shaderProgram="AnKi/Shaders/RtShadowsHit.ankiprog">
-		<mutation>
-			<mutator name="ALPHA_TEXTURE" value="0"/>
-		</mutation>
-	</technique>
+		</shaderProgram>
 
-	</techniques>
+	</shaderPrograms>
 
 	<inputs>
 		

+ 8 - 38
Samples/Sponza/Assets/column_b_c9391d56bff59fc3.ankimtl

@@ -1,10 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!-- This file is auto generated by ImporterMaterial.cpp -->
 <material shadows="1">
-	<techniques>
-		<technique name="GBuffer" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+	<shaderPrograms>
+		<shaderProgram filename="AnKi/Shaders/GBufferGeneric.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="0"/>
 				<mutator name="DIFFUSE_TEX" value="1"/>
 				<mutator name="SPECULAR_TEX" value="0"/>
 				<mutator name="ROUGHNESS_TEX" value="1"/>
@@ -14,44 +13,15 @@
 				<mutator name="EMISSIVE_TEX" value="0"/>
 				<mutator name="ALPHA_TEST" value="0"/>
 			</mutation>
-		</technique>
-
-		<technique name="GBufferEarlyZ" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
-			<mutation>
-				<mutator name="TECHNIQUE" value="1"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
-			</mutation>
-		</technique>
-
-		<technique name="Shadow" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+		</shaderProgram>
+		
+		<shaderProgram filename="AnKi/Shaders/RtShadowsHit.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="2"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
+				<mutator name="ALPHA_TEXTURE" value="0"/>
 			</mutation>
-		</technique>
-
-		
-	<technique name="RtShadow" shaderProgram="AnKi/Shaders/RtShadowsHit.ankiprog">
-		<mutation>
-			<mutator name="ALPHA_TEXTURE" value="0"/>
-		</mutation>
-	</technique>
+		</shaderProgram>
 
-	</techniques>
+	</shaderPrograms>
 
 	<inputs>
 		

+ 8 - 38
Samples/Sponza/Assets/column_c_43f866fc7b9f0169.ankimtl

@@ -1,10 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!-- This file is auto generated by ImporterMaterial.cpp -->
 <material shadows="1">
-	<techniques>
-		<technique name="GBuffer" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+	<shaderPrograms>
+		<shaderProgram filename="AnKi/Shaders/GBufferGeneric.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="0"/>
 				<mutator name="DIFFUSE_TEX" value="1"/>
 				<mutator name="SPECULAR_TEX" value="0"/>
 				<mutator name="ROUGHNESS_TEX" value="1"/>
@@ -14,44 +13,15 @@
 				<mutator name="EMISSIVE_TEX" value="0"/>
 				<mutator name="ALPHA_TEST" value="0"/>
 			</mutation>
-		</technique>
-
-		<technique name="GBufferEarlyZ" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
-			<mutation>
-				<mutator name="TECHNIQUE" value="1"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
-			</mutation>
-		</technique>
-
-		<technique name="Shadow" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+		</shaderProgram>
+		
+		<shaderProgram filename="AnKi/Shaders/RtShadowsHit.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="2"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
+				<mutator name="ALPHA_TEXTURE" value="0"/>
 			</mutation>
-		</technique>
-
-		
-	<technique name="RtShadow" shaderProgram="AnKi/Shaders/RtShadowsHit.ankiprog">
-		<mutation>
-			<mutator name="ALPHA_TEXTURE" value="0"/>
-		</mutation>
-	</technique>
+		</shaderProgram>
 
-	</techniques>
+	</shaderPrograms>
 
 	<inputs>
 		

+ 8 - 38
Samples/Sponza/Assets/details_4242afc5fc479920.ankimtl

@@ -1,10 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!-- This file is auto generated by ImporterMaterial.cpp -->
 <material shadows="1">
-	<techniques>
-		<technique name="GBuffer" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+	<shaderPrograms>
+		<shaderProgram filename="AnKi/Shaders/GBufferGeneric.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="0"/>
 				<mutator name="DIFFUSE_TEX" value="1"/>
 				<mutator name="SPECULAR_TEX" value="0"/>
 				<mutator name="ROUGHNESS_TEX" value="1"/>
@@ -14,44 +13,15 @@
 				<mutator name="EMISSIVE_TEX" value="0"/>
 				<mutator name="ALPHA_TEST" value="0"/>
 			</mutation>
-		</technique>
-
-		<technique name="GBufferEarlyZ" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
-			<mutation>
-				<mutator name="TECHNIQUE" value="1"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="1"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
-			</mutation>
-		</technique>
-
-		<technique name="Shadow" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+		</shaderProgram>
+		
+		<shaderProgram filename="AnKi/Shaders/RtShadowsHit.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="2"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="1"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
+				<mutator name="ALPHA_TEXTURE" value="0"/>
 			</mutation>
-		</technique>
-
-		
-	<technique name="RtShadow" shaderProgram="AnKi/Shaders/RtShadowsHit.ankiprog">
-		<mutation>
-			<mutator name="ALPHA_TEXTURE" value="0"/>
-		</mutation>
-	</technique>
+		</shaderProgram>
 
-	</techniques>
+	</shaderPrograms>
 
 	<inputs>
 		

+ 8 - 38
Samples/Sponza/Assets/fabric_a_945c29fc221550fb.ankimtl

@@ -1,10 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!-- This file is auto generated by ImporterMaterial.cpp -->
 <material shadows="1">
-	<techniques>
-		<technique name="GBuffer" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+	<shaderPrograms>
+		<shaderProgram filename="AnKi/Shaders/GBufferGeneric.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="0"/>
 				<mutator name="DIFFUSE_TEX" value="1"/>
 				<mutator name="SPECULAR_TEX" value="0"/>
 				<mutator name="ROUGHNESS_TEX" value="1"/>
@@ -14,44 +13,15 @@
 				<mutator name="EMISSIVE_TEX" value="0"/>
 				<mutator name="ALPHA_TEST" value="0"/>
 			</mutation>
-		</technique>
-
-		<technique name="GBufferEarlyZ" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
-			<mutation>
-				<mutator name="TECHNIQUE" value="1"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="1"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
-			</mutation>
-		</technique>
-
-		<technique name="Shadow" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+		</shaderProgram>
+		
+		<shaderProgram filename="AnKi/Shaders/RtShadowsHit.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="2"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="1"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
+				<mutator name="ALPHA_TEXTURE" value="0"/>
 			</mutation>
-		</technique>
-
-		
-	<technique name="RtShadow" shaderProgram="AnKi/Shaders/RtShadowsHit.ankiprog">
-		<mutation>
-			<mutator name="ALPHA_TEXTURE" value="0"/>
-		</mutation>
-	</technique>
+		</shaderProgram>
 
-	</techniques>
+	</shaderPrograms>
 
 	<inputs>
 		

+ 8 - 38
Samples/Sponza/Assets/fabric_c_c8bf70dee411d1bd.ankimtl

@@ -1,10 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!-- This file is auto generated by ImporterMaterial.cpp -->
 <material shadows="1">
-	<techniques>
-		<technique name="GBuffer" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+	<shaderPrograms>
+		<shaderProgram filename="AnKi/Shaders/GBufferGeneric.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="0"/>
 				<mutator name="DIFFUSE_TEX" value="1"/>
 				<mutator name="SPECULAR_TEX" value="0"/>
 				<mutator name="ROUGHNESS_TEX" value="1"/>
@@ -14,44 +13,15 @@
 				<mutator name="EMISSIVE_TEX" value="0"/>
 				<mutator name="ALPHA_TEST" value="0"/>
 			</mutation>
-		</technique>
-
-		<technique name="GBufferEarlyZ" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
-			<mutation>
-				<mutator name="TECHNIQUE" value="1"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="1"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
-			</mutation>
-		</technique>
-
-		<technique name="Shadow" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+		</shaderProgram>
+		
+		<shaderProgram filename="AnKi/Shaders/RtShadowsHit.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="2"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="1"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
+				<mutator name="ALPHA_TEXTURE" value="0"/>
 			</mutation>
-		</technique>
-
-		
-	<technique name="RtShadow" shaderProgram="AnKi/Shaders/RtShadowsHit.ankiprog">
-		<mutation>
-			<mutator name="ALPHA_TEXTURE" value="0"/>
-		</mutation>
-	</technique>
+		</shaderProgram>
 
-	</techniques>
+	</shaderPrograms>
 
 	<inputs>
 		

+ 8 - 38
Samples/Sponza/Assets/fabric_d_8ff4aebb25bf20b0.ankimtl

@@ -1,10 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!-- This file is auto generated by ImporterMaterial.cpp -->
 <material shadows="1">
-	<techniques>
-		<technique name="GBuffer" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+	<shaderPrograms>
+		<shaderProgram filename="AnKi/Shaders/GBufferGeneric.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="0"/>
 				<mutator name="DIFFUSE_TEX" value="1"/>
 				<mutator name="SPECULAR_TEX" value="0"/>
 				<mutator name="ROUGHNESS_TEX" value="1"/>
@@ -14,44 +13,15 @@
 				<mutator name="EMISSIVE_TEX" value="0"/>
 				<mutator name="ALPHA_TEST" value="0"/>
 			</mutation>
-		</technique>
-
-		<technique name="GBufferEarlyZ" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
-			<mutation>
-				<mutator name="TECHNIQUE" value="1"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="1"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
-			</mutation>
-		</technique>
-
-		<technique name="Shadow" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+		</shaderProgram>
+		
+		<shaderProgram filename="AnKi/Shaders/RtShadowsHit.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="2"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="1"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
+				<mutator name="ALPHA_TEXTURE" value="0"/>
 			</mutation>
-		</technique>
-
-		
-	<technique name="RtShadow" shaderProgram="AnKi/Shaders/RtShadowsHit.ankiprog">
-		<mutation>
-			<mutator name="ALPHA_TEXTURE" value="0"/>
-		</mutation>
-	</technique>
+		</shaderProgram>
 
-	</techniques>
+	</shaderPrograms>
 
 	<inputs>
 		

+ 8 - 38
Samples/Sponza/Assets/fabric_e_d1c5a44841c48230.ankimtl

@@ -1,10 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!-- This file is auto generated by ImporterMaterial.cpp -->
 <material shadows="1">
-	<techniques>
-		<technique name="GBuffer" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+	<shaderPrograms>
+		<shaderProgram filename="AnKi/Shaders/GBufferGeneric.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="0"/>
 				<mutator name="DIFFUSE_TEX" value="1"/>
 				<mutator name="SPECULAR_TEX" value="0"/>
 				<mutator name="ROUGHNESS_TEX" value="1"/>
@@ -14,44 +13,15 @@
 				<mutator name="EMISSIVE_TEX" value="0"/>
 				<mutator name="ALPHA_TEST" value="0"/>
 			</mutation>
-		</technique>
-
-		<technique name="GBufferEarlyZ" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
-			<mutation>
-				<mutator name="TECHNIQUE" value="1"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="1"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
-			</mutation>
-		</technique>
-
-		<technique name="Shadow" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+		</shaderProgram>
+		
+		<shaderProgram filename="AnKi/Shaders/RtShadowsHit.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="2"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="1"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
+				<mutator name="ALPHA_TEXTURE" value="0"/>
 			</mutation>
-		</technique>
-
-		
-	<technique name="RtShadow" shaderProgram="AnKi/Shaders/RtShadowsHit.ankiprog">
-		<mutation>
-			<mutator name="ALPHA_TEXTURE" value="0"/>
-		</mutation>
-	</technique>
+		</shaderProgram>
 
-	</techniques>
+	</shaderPrograms>
 
 	<inputs>
 		

+ 8 - 38
Samples/Sponza/Assets/fabric_f_d54bbaca38ed4391.ankimtl

@@ -1,10 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!-- This file is auto generated by ImporterMaterial.cpp -->
 <material shadows="1">
-	<techniques>
-		<technique name="GBuffer" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+	<shaderPrograms>
+		<shaderProgram filename="AnKi/Shaders/GBufferGeneric.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="0"/>
 				<mutator name="DIFFUSE_TEX" value="1"/>
 				<mutator name="SPECULAR_TEX" value="0"/>
 				<mutator name="ROUGHNESS_TEX" value="1"/>
@@ -14,44 +13,15 @@
 				<mutator name="EMISSIVE_TEX" value="0"/>
 				<mutator name="ALPHA_TEST" value="0"/>
 			</mutation>
-		</technique>
-
-		<technique name="GBufferEarlyZ" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
-			<mutation>
-				<mutator name="TECHNIQUE" value="1"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
-			</mutation>
-		</technique>
-
-		<technique name="Shadow" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+		</shaderProgram>
+		
+		<shaderProgram filename="AnKi/Shaders/RtShadowsHit.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="2"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
+				<mutator name="ALPHA_TEXTURE" value="0"/>
 			</mutation>
-		</technique>
-
-		
-	<technique name="RtShadow" shaderProgram="AnKi/Shaders/RtShadowsHit.ankiprog">
-		<mutation>
-			<mutator name="ALPHA_TEXTURE" value="0"/>
-		</mutation>
-	</technique>
+		</shaderProgram>
 
-	</techniques>
+	</shaderPrograms>
 
 	<inputs>
 		

+ 8 - 38
Samples/Sponza/Assets/flagpole_6c7e0eb8dd33b39e.ankimtl

@@ -1,10 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!-- This file is auto generated by ImporterMaterial.cpp -->
 <material shadows="1">
-	<techniques>
-		<technique name="GBuffer" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+	<shaderPrograms>
+		<shaderProgram filename="AnKi/Shaders/GBufferGeneric.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="0"/>
 				<mutator name="DIFFUSE_TEX" value="1"/>
 				<mutator name="SPECULAR_TEX" value="0"/>
 				<mutator name="ROUGHNESS_TEX" value="1"/>
@@ -14,44 +13,15 @@
 				<mutator name="EMISSIVE_TEX" value="0"/>
 				<mutator name="ALPHA_TEST" value="0"/>
 			</mutation>
-		</technique>
-
-		<technique name="GBufferEarlyZ" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
-			<mutation>
-				<mutator name="TECHNIQUE" value="1"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
-			</mutation>
-		</technique>
-
-		<technique name="Shadow" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+		</shaderProgram>
+		
+		<shaderProgram filename="AnKi/Shaders/RtShadowsHit.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="2"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
+				<mutator name="ALPHA_TEXTURE" value="0"/>
 			</mutation>
-		</technique>
-
-		
-	<technique name="RtShadow" shaderProgram="AnKi/Shaders/RtShadowsHit.ankiprog">
-		<mutation>
-			<mutator name="ALPHA_TEXTURE" value="0"/>
-		</mutation>
-	</technique>
+		</shaderProgram>
 
-	</techniques>
+	</shaderPrograms>
 
 	<inputs>
 		

+ 8 - 38
Samples/Sponza/Assets/floor_71cbd2644e53ab8c.ankimtl

@@ -1,10 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!-- This file is auto generated by ImporterMaterial.cpp -->
 <material shadows="1">
-	<techniques>
-		<technique name="GBuffer" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+	<shaderPrograms>
+		<shaderProgram filename="AnKi/Shaders/GBufferGeneric.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="0"/>
 				<mutator name="DIFFUSE_TEX" value="1"/>
 				<mutator name="SPECULAR_TEX" value="0"/>
 				<mutator name="ROUGHNESS_TEX" value="1"/>
@@ -14,44 +13,15 @@
 				<mutator name="EMISSIVE_TEX" value="0"/>
 				<mutator name="ALPHA_TEST" value="0"/>
 			</mutation>
-		</technique>
-
-		<technique name="GBufferEarlyZ" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
-			<mutation>
-				<mutator name="TECHNIQUE" value="1"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
-			</mutation>
-		</technique>
-
-		<technique name="Shadow" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+		</shaderProgram>
+		
+		<shaderProgram filename="AnKi/Shaders/RtShadowsHit.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="2"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
+				<mutator name="ALPHA_TEXTURE" value="0"/>
 			</mutation>
-		</technique>
-
-		
-	<technique name="RtShadow" shaderProgram="AnKi/Shaders/RtShadowsHit.ankiprog">
-		<mutation>
-			<mutator name="ALPHA_TEXTURE" value="0"/>
-		</mutation>
-	</technique>
+		</shaderProgram>
 
-	</techniques>
+	</shaderPrograms>
 
 	<inputs>
 		

+ 8 - 38
Samples/Sponza/Assets/leaf_3a245efd17475037.ankimtl

@@ -1,10 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!-- This file is auto generated by ImporterMaterial.cpp -->
 <material shadows="1">
-	<techniques>
-		<technique name="GBuffer" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+	<shaderPrograms>
+		<shaderProgram filename="AnKi/Shaders/GBufferGeneric.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="0"/>
 				<mutator name="DIFFUSE_TEX" value="1"/>
 				<mutator name="SPECULAR_TEX" value="0"/>
 				<mutator name="ROUGHNESS_TEX" value="1"/>
@@ -14,44 +13,15 @@
 				<mutator name="EMISSIVE_TEX" value="0"/>
 				<mutator name="ALPHA_TEST" value="1"/>
 			</mutation>
-		</technique>
-
-		<technique name="GBufferEarlyZ" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
-			<mutation>
-				<mutator name="TECHNIQUE" value="1"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="1"/>
-			</mutation>
-		</technique>
-
-		<technique name="Shadow" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+		</shaderProgram>
+		
+		<shaderProgram filename="AnKi/Shaders/RtShadowsHit.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="2"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="1"/>
+				<mutator name="ALPHA_TEXTURE" value="0"/>
 			</mutation>
-		</technique>
-
-		
-	<technique name="RtShadow" shaderProgram="AnKi/Shaders/RtShadowsHit.ankiprog">
-		<mutation>
-			<mutator name="ALPHA_TEXTURE" value="0"/>
-		</mutation>
-	</technique>
+		</shaderProgram>
 
-	</techniques>
+	</shaderPrograms>
 
 	<inputs>
 		

+ 8 - 38
Samples/Sponza/Assets/lion_c45d3035db3bc17b.ankimtl

@@ -1,10 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!-- This file is auto generated by ImporterMaterial.cpp -->
 <material shadows="1">
-	<techniques>
-		<technique name="GBuffer" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+	<shaderPrograms>
+		<shaderProgram filename="AnKi/Shaders/GBufferGeneric.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="0"/>
 				<mutator name="DIFFUSE_TEX" value="1"/>
 				<mutator name="SPECULAR_TEX" value="0"/>
 				<mutator name="ROUGHNESS_TEX" value="1"/>
@@ -14,44 +13,15 @@
 				<mutator name="EMISSIVE_TEX" value="0"/>
 				<mutator name="ALPHA_TEST" value="0"/>
 			</mutation>
-		</technique>
-
-		<technique name="GBufferEarlyZ" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
-			<mutation>
-				<mutator name="TECHNIQUE" value="1"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
-			</mutation>
-		</technique>
-
-		<technique name="Shadow" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+		</shaderProgram>
+		
+		<shaderProgram filename="AnKi/Shaders/RtShadowsHit.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="2"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
+				<mutator name="ALPHA_TEXTURE" value="0"/>
 			</mutation>
-		</technique>
-
-		
-	<technique name="RtShadow" shaderProgram="AnKi/Shaders/RtShadowsHit.ankiprog">
-		<mutation>
-			<mutator name="ALPHA_TEXTURE" value="0"/>
-		</mutation>
-	</technique>
+		</shaderProgram>
 
-	</techniques>
+	</shaderPrograms>
 
 	<inputs>
 		

+ 8 - 38
Samples/Sponza/Assets/lion_stand_ab5e3642131ad971.ankimtl

@@ -1,10 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!-- This file is auto generated by ImporterMaterial.cpp -->
 <material shadows="1">
-	<techniques>
-		<technique name="GBuffer" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+	<shaderPrograms>
+		<shaderProgram filename="AnKi/Shaders/GBufferGeneric.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="0"/>
 				<mutator name="DIFFUSE_TEX" value="1"/>
 				<mutator name="SPECULAR_TEX" value="0"/>
 				<mutator name="ROUGHNESS_TEX" value="1"/>
@@ -14,44 +13,15 @@
 				<mutator name="EMISSIVE_TEX" value="0"/>
 				<mutator name="ALPHA_TEST" value="0"/>
 			</mutation>
-		</technique>
-
-		<technique name="GBufferEarlyZ" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
-			<mutation>
-				<mutator name="TECHNIQUE" value="1"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
-			</mutation>
-		</technique>
-
-		<technique name="Shadow" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+		</shaderProgram>
+		
+		<shaderProgram filename="AnKi/Shaders/RtShadowsHit.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="2"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
+				<mutator name="ALPHA_TEXTURE" value="0"/>
 			</mutation>
-		</technique>
-
-		
-	<technique name="RtShadow" shaderProgram="AnKi/Shaders/RtShadowsHit.ankiprog">
-		<mutation>
-			<mutator name="ALPHA_TEXTURE" value="0"/>
-		</mutation>
-	</technique>
+		</shaderProgram>
 
-	</techniques>
+	</shaderPrograms>
 
 	<inputs>
 		

+ 8 - 38
Samples/Sponza/Assets/roof_4359bd4e3b26845.ankimtl

@@ -1,10 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!-- This file is auto generated by ImporterMaterial.cpp -->
 <material shadows="1">
-	<techniques>
-		<technique name="GBuffer" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+	<shaderPrograms>
+		<shaderProgram filename="AnKi/Shaders/GBufferGeneric.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="0"/>
 				<mutator name="DIFFUSE_TEX" value="1"/>
 				<mutator name="SPECULAR_TEX" value="0"/>
 				<mutator name="ROUGHNESS_TEX" value="1"/>
@@ -14,44 +13,15 @@
 				<mutator name="EMISSIVE_TEX" value="0"/>
 				<mutator name="ALPHA_TEST" value="0"/>
 			</mutation>
-		</technique>
-
-		<technique name="GBufferEarlyZ" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
-			<mutation>
-				<mutator name="TECHNIQUE" value="1"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
-			</mutation>
-		</technique>
-
-		<technique name="Shadow" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+		</shaderProgram>
+		
+		<shaderProgram filename="AnKi/Shaders/RtShadowsHit.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="2"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
+				<mutator name="ALPHA_TEXTURE" value="0"/>
 			</mutation>
-		</technique>
-
-		
-	<technique name="RtShadow" shaderProgram="AnKi/Shaders/RtShadowsHit.ankiprog">
-		<mutation>
-			<mutator name="ALPHA_TEXTURE" value="0"/>
-		</mutation>
-	</technique>
+		</shaderProgram>
 
-	</techniques>
+	</shaderPrograms>
 
 	<inputs>
 		

+ 8 - 38
Samples/Sponza/Assets/vase_45c3983f6cc9c489.ankimtl

@@ -1,10 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!-- This file is auto generated by ImporterMaterial.cpp -->
 <material shadows="1">
-	<techniques>
-		<technique name="GBuffer" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+	<shaderPrograms>
+		<shaderProgram filename="AnKi/Shaders/GBufferGeneric.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="0"/>
 				<mutator name="DIFFUSE_TEX" value="1"/>
 				<mutator name="SPECULAR_TEX" value="0"/>
 				<mutator name="ROUGHNESS_TEX" value="1"/>
@@ -14,44 +13,15 @@
 				<mutator name="EMISSIVE_TEX" value="0"/>
 				<mutator name="ALPHA_TEST" value="0"/>
 			</mutation>
-		</technique>
-
-		<technique name="GBufferEarlyZ" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
-			<mutation>
-				<mutator name="TECHNIQUE" value="1"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
-			</mutation>
-		</technique>
-
-		<technique name="Shadow" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+		</shaderProgram>
+		
+		<shaderProgram filename="AnKi/Shaders/RtShadowsHit.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="2"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
+				<mutator name="ALPHA_TEXTURE" value="0"/>
 			</mutation>
-		</technique>
-
-		
-	<technique name="RtShadow" shaderProgram="AnKi/Shaders/RtShadowsHit.ankiprog">
-		<mutation>
-			<mutator name="ALPHA_TEXTURE" value="0"/>
-		</mutation>
-	</technique>
+		</shaderProgram>
 
-	</techniques>
+	</shaderPrograms>
 
 	<inputs>
 		

+ 8 - 38
Samples/Sponza/Assets/vase_fl_580cea687de3d758.ankimtl

@@ -1,10 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!-- This file is auto generated by ImporterMaterial.cpp -->
 <material shadows="1">
-	<techniques>
-		<technique name="GBuffer" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+	<shaderPrograms>
+		<shaderProgram filename="AnKi/Shaders/GBufferGeneric.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="0"/>
 				<mutator name="DIFFUSE_TEX" value="1"/>
 				<mutator name="SPECULAR_TEX" value="0"/>
 				<mutator name="ROUGHNESS_TEX" value="1"/>
@@ -14,44 +13,15 @@
 				<mutator name="EMISSIVE_TEX" value="0"/>
 				<mutator name="ALPHA_TEST" value="1"/>
 			</mutation>
-		</technique>
-
-		<technique name="GBufferEarlyZ" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
-			<mutation>
-				<mutator name="TECHNIQUE" value="1"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="1"/>
-			</mutation>
-		</technique>
-
-		<technique name="Shadow" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+		</shaderProgram>
+		
+		<shaderProgram filename="AnKi/Shaders/RtShadowsHit.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="2"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="1"/>
+				<mutator name="ALPHA_TEXTURE" value="0"/>
 			</mutation>
-		</technique>
-
-		
-	<technique name="RtShadow" shaderProgram="AnKi/Shaders/RtShadowsHit.ankiprog">
-		<mutation>
-			<mutator name="ALPHA_TEXTURE" value="0"/>
-		</mutation>
-	</technique>
+		</shaderProgram>
 
-	</techniques>
+	</shaderPrograms>
 
 	<inputs>
 		

+ 8 - 38
Samples/Sponza/Assets/vase_hanging_c2d2b40b27cacd7d.ankimtl

@@ -1,10 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!-- This file is auto generated by ImporterMaterial.cpp -->
 <material shadows="1">
-	<techniques>
-		<technique name="GBuffer" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+	<shaderPrograms>
+		<shaderProgram filename="AnKi/Shaders/GBufferGeneric.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="0"/>
 				<mutator name="DIFFUSE_TEX" value="1"/>
 				<mutator name="SPECULAR_TEX" value="0"/>
 				<mutator name="ROUGHNESS_TEX" value="1"/>
@@ -14,44 +13,15 @@
 				<mutator name="EMISSIVE_TEX" value="0"/>
 				<mutator name="ALPHA_TEST" value="0"/>
 			</mutation>
-		</technique>
-
-		<technique name="GBufferEarlyZ" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
-			<mutation>
-				<mutator name="TECHNIQUE" value="1"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
-			</mutation>
-		</technique>
-
-		<technique name="Shadow" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+		</shaderProgram>
+		
+		<shaderProgram filename="AnKi/Shaders/RtShadowsHit.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="2"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
+				<mutator name="ALPHA_TEXTURE" value="0"/>
 			</mutation>
-		</technique>
-
-		
-	<technique name="RtShadow" shaderProgram="AnKi/Shaders/RtShadowsHit.ankiprog">
-		<mutation>
-			<mutator name="ALPHA_TEXTURE" value="0"/>
-		</mutation>
-	</technique>
+		</shaderProgram>
 
-	</techniques>
+	</shaderPrograms>
 
 	<inputs>
 		

+ 8 - 38
Samples/Sponza/Assets/vase_round_71af81a1ac0a7c3e.ankimtl

@@ -1,10 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!-- This file is auto generated by ImporterMaterial.cpp -->
 <material shadows="1">
-	<techniques>
-		<technique name="GBuffer" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+	<shaderPrograms>
+		<shaderProgram filename="AnKi/Shaders/GBufferGeneric.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="0"/>
 				<mutator name="DIFFUSE_TEX" value="1"/>
 				<mutator name="SPECULAR_TEX" value="0"/>
 				<mutator name="ROUGHNESS_TEX" value="1"/>
@@ -14,44 +13,15 @@
 				<mutator name="EMISSIVE_TEX" value="0"/>
 				<mutator name="ALPHA_TEST" value="0"/>
 			</mutation>
-		</technique>
-
-		<technique name="GBufferEarlyZ" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
-			<mutation>
-				<mutator name="TECHNIQUE" value="1"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
-			</mutation>
-		</technique>
-
-		<technique name="Shadow" shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
+		</shaderProgram>
+		
+		<shaderProgram filename="AnKi/Shaders/RtShadowsHit.ankiprog">
 			<mutation>
-				<mutator name="TECHNIQUE" value="2"/>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
+				<mutator name="ALPHA_TEXTURE" value="0"/>
 			</mutation>
-		</technique>
-
-		
-	<technique name="RtShadow" shaderProgram="AnKi/Shaders/RtShadowsHit.ankiprog">
-		<mutation>
-			<mutator name="ALPHA_TEXTURE" value="0"/>
-		</mutation>
-	</technique>
+		</shaderProgram>
 
-	</techniques>
+	</shaderPrograms>
 
 	<inputs>