Browse Source

Refactor how shader techniques are written

Panagiotis Christopoulos Charitos 1 year ago
parent
commit
95d96da6cd
70 changed files with 473 additions and 769 deletions
  1. 1 2
      AnKi/Gr/Common.h
  2. 5 4
      AnKi/Gr/D3D/D3DDescriptor.cpp
  3. 68 150
      AnKi/ShaderCompiler/ShaderParser.cpp
  4. 4 25
      AnKi/ShaderCompiler/ShaderParser.h
  5. 2 2
      AnKi/Shaders/ApplyIrradianceToReflection.ankiprog
  6. 2 9
      AnKi/Shaders/Blit.ankiprog
  7. 4 27
      AnKi/Shaders/Bloom.ankiprog
  8. 2 3
      AnKi/Shaders/ClearTextureCompute.ankiprog
  9. 1 3
      AnKi/Shaders/ClusterBinning.ankiprog
  10. 1 3
      AnKi/Shaders/ClusterBinningPackVisibles.ankiprog
  11. 1 3
      AnKi/Shaders/ClusterBinningSetup.ankiprog
  12. 19 18
      AnKi/Shaders/DbgBillboard.ankiprog
  13. 11 9
      AnKi/Shaders/DbgRenderables.ankiprog
  14. 2 9
      AnKi/Shaders/DepthAwareBlur.ankiprog
  15. 19 19
      AnKi/Shaders/DepthDownscale.ankiprog
  16. 14 16
      AnKi/Shaders/FinalComposite.ankiprog
  17. 6 7
      AnKi/Shaders/ForwardShadingFog.ankiprog
  18. 10 10
      AnKi/Shaders/ForwardShadingGenericTransparent.ankiprog
  19. 11 11
      AnKi/Shaders/ForwardShadingParticles.ankiprog
  20. 2 9
      AnKi/Shaders/Fsr.ankiprog
  21. 21 45
      AnKi/Shaders/GBufferGeneric.ankiprog
  22. 7 6
      AnKi/Shaders/GBufferGpuParticles.ankiprog
  23. 8 9
      AnKi/Shaders/GBufferPost.ankiprog
  24. 12 13
      AnKi/Shaders/GBufferVisualizeProbe.ankiprog
  25. 1 3
      AnKi/Shaders/GpuParticlesSimulation.ankiprog
  26. 1 3
      AnKi/Shaders/GpuSceneMicroPatching.ankiprog
  27. 1 3
      AnKi/Shaders/GpuVisibilityAccelerationStructures.ankiprog
  28. 1 3
      AnKi/Shaders/GpuVisibilityAccelerationStructuresZeroRemainingInstances.ankiprog
  29. 1 3
      AnKi/Shaders/GpuVisibilityNonRenderables.ankiprog
  30. 1 3
      AnKi/Shaders/GpuVisibilityStage1.ankiprog
  31. 42 40
      AnKi/Shaders/GpuVisibilityStage2And3.ankiprog
  32. 2 3
      AnKi/Shaders/HzbGenPyramid.ankiprog
  33. 1 3
      AnKi/Shaders/HzbMaxDepth.ankiprog
  34. 6 8
      AnKi/Shaders/HzbMaxDepthProject.ankiprog
  35. 1 3
      AnKi/Shaders/IrradianceDice.ankiprog
  36. 6 5
      AnKi/Shaders/LensFlareSprite.ankiprog
  37. 2 2
      AnKi/Shaders/LensFlareUpdateIndirectInfo.ankiprog
  38. 15 16
      AnKi/Shaders/LightShading.ankiprog
  39. 10 12
      AnKi/Shaders/LightShadingApplyFog.ankiprog
  40. 16 19
      AnKi/Shaders/LightShadingSkybox.ankiprog
  41. 4 5
      AnKi/Shaders/MipmapGenerator.ankiprog
  42. 2 9
      AnKi/Shaders/MotionVectors.ankiprog
  43. 6 8
      AnKi/Shaders/RtShadows.ankiprog
  44. 1 3
      AnKi/Shaders/RtShadowsDenoise.ankiprog
  45. 1 3
      AnKi/Shaders/RtShadowsSbtBuild.ankiprog
  46. 1 3
      AnKi/Shaders/RtShadowsSetupSbtBuild.ankiprog
  47. 1 2
      AnKi/Shaders/RtShadowsSvgfAtrous.ankiprog
  48. 1 2
      AnKi/Shaders/RtShadowsSvgfVariance.ankiprog
  49. 1 3
      AnKi/Shaders/RtShadowsUpscale.ankiprog
  50. 5 5
      AnKi/Shaders/ShadowMappingClearDepth.ankiprog
  51. 1 3
      AnKi/Shaders/ShadowMappingVetVisibility.ankiprog
  52. 2 9
      AnKi/Shaders/ShadowmapsResolve.ankiprog
  53. 17 13
      AnKi/Shaders/Sky.ankiprog
  54. 4 30
      AnKi/Shaders/Ssao.ankiprog
  55. 2 12
      AnKi/Shaders/Ssr.ankiprog
  56. 2 9
      AnKi/Shaders/TemporalAA.ankiprog
  57. 2 9
      AnKi/Shaders/Tonemap.ankiprog
  58. 1 2
      AnKi/Shaders/TonemappingAverageLuminance.ankiprog
  59. 14 18
      AnKi/Shaders/TraditionalDeferredShading.ankiprog
  60. 16 18
      AnKi/Shaders/TraditionalDeferredShadingSkybox.ankiprog
  61. 13 13
      AnKi/Shaders/Ui.ankiprog
  62. 12 13
      AnKi/Shaders/UiVisualizeImage.ankiprog
  63. 5 6
      AnKi/Shaders/VisualizeGBufferNormal.ankiprog
  64. 5 6
      AnKi/Shaders/VisualizeHdrRenderTarget.ankiprog
  65. 5 6
      AnKi/Shaders/VisualizeRenderTarget.ankiprog
  66. 1 3
      AnKi/Shaders/VolumetricFogAccumulation.ankiprog
  67. 1 3
      AnKi/Shaders/VolumetricLightingAccumulation.ankiprog
  68. 1 3
      AnKi/Shaders/VrsSriDownscale.ankiprog
  69. 1 3
      AnKi/Shaders/VrsSriGenerationCompute.ankiprog
  70. 5 6
      AnKi/Shaders/VrsSriVisualizeRenderTarget.ankiprog

+ 1 - 2
AnKi/Gr/Common.h

@@ -44,6 +44,7 @@ inline NumericCVar<U8> g_deviceCVar("Gr", "Device", 0, 0, 16, "Choose an availab
 inline BoolCVar g_rayTracingCVar("Gr", "RayTracing", false, "Try enabling ray tracing");
 inline BoolCVar g_rayTracingCVar("Gr", "RayTracing", false, "Try enabling ray tracing");
 inline BoolCVar g_vrsCVar("Gr", "Vrs", false, "Enable or not VRS");
 inline BoolCVar g_vrsCVar("Gr", "Vrs", false, "Enable or not VRS");
 inline BoolCVar g_workGraphcsCVar("Gr", "WorkGraphs", false, "Enable or not WorkGraphs");
 inline BoolCVar g_workGraphcsCVar("Gr", "WorkGraphs", false, "Enable or not WorkGraphs");
+inline NumericCVar<U32> g_maxBindlessSampledTextureCountCVar("Gr", "MaxBindlessSampledTextureCountCVar", 512, 16, kMaxU16);
 
 
 #if ANKI_GR_BACKEND_DIRECT3D
 #if ANKI_GR_BACKEND_DIRECT3D
 inline NumericCVar<U16> g_maxRtvDescriptorsCVar("Gr", "MaxRvtDescriptors", 128, 8, kMaxU16, "Max number of RTVs");
 inline NumericCVar<U16> g_maxRtvDescriptorsCVar("Gr", "MaxRvtDescriptors", 128, 8, kMaxU16, "Max number of RTVs");
@@ -57,7 +58,6 @@ inline NumericCVar<U16> g_maxGpuSamplerDescriptorsCVar("Gr", "MaxGpuSamplerDescr
 
 
 inline BoolCVar g_dredCVar("Gr", "Dred", false, "Enable DRED");
 inline BoolCVar g_dredCVar("Gr", "Dred", false, "Enable DRED");
 #else
 #else
-inline NumericCVar<U32> g_maxBindlessSampledTextureCountCVar("Gr", "MaxBindlessSampledTextureCountCVar", 512, 16, kMaxU16);
 inline NumericCVar<PtrSize> g_diskShaderCacheMaxSizeCVar("Gr", "DiskShaderCacheMaxSize", 128_MB, 1_MB, 1_GB, "Max size of the pipeline cache file");
 inline NumericCVar<PtrSize> g_diskShaderCacheMaxSizeCVar("Gr", "DiskShaderCacheMaxSize", 128_MB, 1_MB, 1_GB, "Max size of the pipeline cache file");
 inline BoolCVar g_debugPrintfCVar("Gr", "DebugPrintf", false, "Enable or not debug printf");
 inline BoolCVar g_debugPrintfCVar("Gr", "DebugPrintf", false, "Enable or not debug printf");
 inline BoolCVar g_samplerFilterMinMaxCVar("Gr", "SamplerFilterMinMax", true, "Enable or not min/max sample filtering");
 inline BoolCVar g_samplerFilterMinMaxCVar("Gr", "SamplerFilterMinMax", true, "Enable or not min/max sample filtering");
@@ -93,7 +93,6 @@ constexpr U32 kMaxRegisterSpaces = 3; ///< Groups that can be bound at the same
 constexpr U32 kMaxBindingsPerRegisterSpace = 32;
 constexpr U32 kMaxBindingsPerRegisterSpace = 32;
 constexpr U32 kMaxFramesInFlight = 3; ///< Triple buffering.
 constexpr U32 kMaxFramesInFlight = 3; ///< Triple buffering.
 constexpr U32 kMaxGrObjectNameLength = 61;
 constexpr U32 kMaxGrObjectNameLength = 61;
-constexpr U32 kMaxBindlessTextures = 512;
 constexpr U32 kMaxFastConstantsSize = 128; ///< Push/root constants size. Thanks AMD!!
 constexpr U32 kMaxFastConstantsSize = 128; ///< Push/root constants size. Thanks AMD!!
 
 
 /// The number of commands in a command buffer that make it a small batch command buffer.
 /// The number of commands in a command buffer that make it a small batch command buffer.

+ 5 - 4
AnKi/Gr/D3D/D3DDescriptor.cpp

@@ -197,13 +197,14 @@ Error DescriptorFactory::init()
 	D3D12_GPU_DESCRIPTOR_HANDLE gpuHeapStart;
 	D3D12_GPU_DESCRIPTOR_HANDLE gpuHeapStart;
 	U32 descriptorSize;
 	U32 descriptorSize;
 	ANKI_CHECK(createDescriptorHeap(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV, D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE,
 	ANKI_CHECK(createDescriptorHeap(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV, D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE,
-									g_maxGpuCbvSrvUavDescriptorsCVar + kMaxBindlessTextures, heap, cpuHeapStart, gpuHeapStart, descriptorSize));
+									g_maxGpuCbvSrvUavDescriptorsCVar + g_maxBindlessSampledTextureCountCVar, heap, cpuHeapStart, gpuHeapStart,
+									descriptorSize));
 	m_descriptorHeaps.emplaceBack(heap);
 	m_descriptorHeaps.emplaceBack(heap);
 
 
-	m_gpuPersistent.m_cbvSrvUav.init(cpuHeapStart, gpuHeapStart, descriptorSize, kMaxBindlessTextures);
+	m_gpuPersistent.m_cbvSrvUav.init(cpuHeapStart, gpuHeapStart, descriptorSize, U16(g_maxBindlessSampledTextureCountCVar));
 
 
-	cpuHeapStart.ptr += descriptorSize * kMaxBindlessTextures;
-	gpuHeapStart.ptr += descriptorSize * kMaxBindlessTextures;
+	cpuHeapStart.ptr += descriptorSize * g_maxBindlessSampledTextureCountCVar;
+	gpuHeapStart.ptr += descriptorSize * g_maxBindlessSampledTextureCountCVar;
 	m_gpuRing.m_cbvSrvUav.init(cpuHeapStart, gpuHeapStart, descriptorSize, g_maxGpuCbvSrvUavDescriptorsCVar);
 	m_gpuRing.m_cbvSrvUav.init(cpuHeapStart, gpuHeapStart, descriptorSize, g_maxGpuCbvSrvUavDescriptorsCVar);
 
 
 	ANKI_CHECK(createDescriptorHeap(D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER, D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE, g_maxGpuSamplerDescriptorsCVar,
 	ANKI_CHECK(createDescriptorHeap(D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER, D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE, g_maxGpuSamplerDescriptorsCVar,

+ 68 - 150
AnKi/ShaderCompiler/ShaderParser.cpp

@@ -126,7 +126,7 @@ void ShaderParser::tokenizeLine(CString line, ShaderCompilerDynamicArray<ShaderC
 	}
 	}
 }
 }
 
 
-Error ShaderParser::parsePragmaTechniqueStart(const ShaderCompilerString* begin, const ShaderCompilerString* end, CString line, CString fname)
+Error ShaderParser::parsePragmaTechnique(const ShaderCompilerString* begin, const ShaderCompilerString* end, CString line, CString fname)
 {
 {
 	ANKI_ASSERT(begin && end);
 	ANKI_ASSERT(begin && end);
 
 
@@ -136,40 +136,51 @@ Error ShaderParser::parsePragmaTechniqueStart(const ShaderCompilerString* begin,
 		ANKI_PP_ERROR_MALFORMED();
 		ANKI_PP_ERROR_MALFORMED();
 	}
 	}
 
 
-	const ShaderType shaderType = strToShaderType(*begin);
-	if(shaderType == ShaderType::kCount)
-	{
-		ANKI_PP_ERROR_MALFORMED();
-	}
-
+	// Technique name
 	ShaderCompilerString techniqueName;
 	ShaderCompilerString techniqueName;
-	++begin;
-	if(begin == end)
+	if(strToShaderType(*begin) == ShaderType::kCount)
 	{
 	{
-		techniqueName = "Unnamed";
+		techniqueName = *begin;
+		++begin;
 	}
 	}
-	else if(*begin == "uses_mutators")
+	else
 	{
 	{
 		techniqueName = "Unnamed";
 		techniqueName = "Unnamed";
 	}
 	}
-	else if(*begin != "uses_mutators")
+
+	// Stages
+	ShaderTypeBit stages = ShaderTypeBit::kNone;
+	while(begin != end)
 	{
 	{
-		techniqueName = *begin;
+		const ShaderType stage = strToShaderType(*begin);
+		if(stage == ShaderType::kCount)
+		{
+			break;
+		}
+
+		const ShaderTypeBit stageBit = ShaderTypeBit(1 << stage);
+		if(!!(stageBit & stages))
+		{
+			ANKI_PP_ERROR_MALFORMED_MSG("Stage appeared more than once");
+		}
+
+		stages |= stageBit;
 		++begin;
 		++begin;
 	}
 	}
 
 
+	if(!stages)
+	{
+		ANKI_PP_ERROR_MALFORMED_MSG("Missing stages");
+	}
+
 	// Mutators
 	// Mutators
 	U64 activeMutators = kMaxU64;
 	U64 activeMutators = kMaxU64;
-	if(begin != end)
+	if(begin != end && *begin == "mutators")
 	{
 	{
-		if(*begin != "uses_mutators")
-		{
-			ANKI_PP_ERROR_MALFORMED();
-		}
 		++begin;
 		++begin;
-
 		activeMutators = 0;
 		activeMutators = 0;
-		for(; begin != end; ++begin)
+
+		while(begin != end)
 		{
 		{
 			// Find mutator
 			// Find mutator
 			U32 count = 0;
 			U32 count = 0;
@@ -187,13 +198,14 @@ Error ShaderParser::parsePragmaTechniqueStart(const ShaderCompilerString* begin,
 			{
 			{
 				ANKI_PP_ERROR_MALFORMED_MSG("Mutator not found");
 				ANKI_PP_ERROR_MALFORMED_MSG("Mutator not found");
 			}
 			}
+
+			++begin;
 		}
 		}
 	}
 	}
 
 
-	// Checks
-	if(insideTechnique())
+	if(begin != end)
 	{
 	{
-		ANKI_PP_ERROR_MALFORMED_MSG("Need to close the previous technique_start before starting a new one");
+		ANKI_PP_ERROR_MALFORMED();
 	}
 	}
 
 
 	// Find the technique
 	// Find the technique
@@ -202,9 +214,9 @@ Error ShaderParser::parsePragmaTechniqueStart(const ShaderCompilerString* begin,
 	{
 	{
 		if(t.m_name == techniqueName)
 		if(t.m_name == techniqueName)
 		{
 		{
-			if(!!(t.m_shaderTypes & ShaderTypeBit(1 << shaderType)))
+			if(!!(t.m_shaderTypes & stages))
 			{
 			{
-				ANKI_PP_ERROR_MALFORMED_MSG("technique_start with the same name and type appeared more than once");
+				ANKI_PP_ERROR_MALFORMED_MSG("technique with the same name and type appeared more than once");
 			}
 			}
 
 
 			technique = &t;
 			technique = &t;
@@ -213,81 +225,18 @@ Error ShaderParser::parsePragmaTechniqueStart(const ShaderCompilerString* begin,
 	}
 	}
 
 
 	// Done
 	// Done
-	TechniqueExtra* extra = nullptr;
 	if(!technique)
 	if(!technique)
 	{
 	{
 		technique = m_techniques.emplaceBack();
 		technique = m_techniques.emplaceBack();
 		technique->m_name = techniqueName;
 		technique->m_name = techniqueName;
-
-		extra = m_techniqueExtras.emplaceBack();
-	}
-	else
-	{
-		const U32 idx = U32(technique - m_techniques.getBegin());
-		extra = &m_techniqueExtras[idx];
-	}
-
-	technique->m_shaderTypes |= ShaderTypeBit(1 << shaderType);
-	technique->m_activeMutators[shaderType] = activeMutators;
-
-	ANKI_ASSERT(extra->m_sourceLines[shaderType].getSize() == 0);
-	extra->m_sourceLines[shaderType] = m_commonSourceLines;
-
-	m_insideTechniqueIdx = U32(technique - m_techniques.getBegin());
-	m_insideTechniqueShaderType = shaderType;
-
-	return Error::kNone;
-}
-
-Error ShaderParser::parsePragmaTechniqueEnd(const ShaderCompilerString* begin, const ShaderCompilerString* end, CString line, CString fname)
-{
-	ANKI_ASSERT(begin && end);
-
-	// Check tokens
-	if(begin >= end)
-	{
-		ANKI_PP_ERROR_MALFORMED();
-	}
-
-	const ShaderType shaderType = strToShaderType(*begin);
-	if(shaderType == ShaderType::kCount)
-	{
-		ANKI_PP_ERROR_MALFORMED();
-	}
-
-	ShaderCompilerString techniqueName;
-	++begin;
-	if(begin == end)
-	{
-		// Last token
-		techniqueName = "Unnamed";
-	}
-	else
-	{
-		techniqueName = *begin;
-
-		++begin;
-		if(begin != end)
-		{
-			ANKI_PP_ERROR_MALFORMED();
-		}
 	}
 	}
 
 
-	// Checks
-	if(!insideTechnique())
+	technique->m_shaderTypes |= stages;
+	for(ShaderType s : EnumBitsIterable<ShaderType, ShaderTypeBit>(stages))
 	{
 	{
-		ANKI_PP_ERROR_MALFORMED_MSG("Forgot to insert a #pragma anki technique_start");
+		technique->m_activeMutators[s] = activeMutators;
 	}
 	}
 
 
-	if(m_techniques[m_insideTechniqueIdx].m_name != techniqueName || m_insideTechniqueShaderType != shaderType)
-	{
-		ANKI_PP_ERROR_MALFORMED_MSG("name or type doesn't match the one in technique_start");
-	}
-
-	// Done
-	m_insideTechniqueIdx = kMaxU32;
-	m_insideTechniqueShaderType = ShaderType::kCount;
-
 	return Error::kNone;
 	return Error::kNone;
 }
 }
 
 
@@ -487,7 +436,7 @@ Error ShaderParser::parseLine(CString line, CString fname, Bool& foundPragmaOnce
 		// We _must_ have an #include
 		// We _must_ have an #include
 		ANKI_CHECK(parseInclude(token + 1, end, line, fname, depth));
 		ANKI_CHECK(parseInclude(token + 1, end, line, fname, depth));
 
 
-		getAppendSourceList().pushBackSprintf("#line %u \"%s\"", lineNo + 1, sanitizeFilename(fname).cstr());
+		m_sourceLines.pushBackSprintf("#line %u \"%s\"", lineNo + 1, sanitizeFilename(fname).cstr());
 	}
 	}
 	else if((token < end) && ((foundAloneHash && *token == "pragma") || *token == "#pragma"))
 	else if((token < end) && ((foundAloneHash && *token == "pragma") || *token == "#pragma"))
 	{
 	{
@@ -511,11 +460,11 @@ Error ShaderParser::parseLine(CString line, CString fname, Bool& foundPragmaOnce
 			// Add the guard unique for this file
 			// Add the guard unique for this file
 			foundPragmaOnce = true;
 			foundPragmaOnce = true;
 			const U64 hash = fname.computeHash();
 			const U64 hash = fname.computeHash();
-			getAppendSourceList().pushBackSprintf("#ifndef _ANKI_INCL_GUARD_%" PRIu64 "\n"
-												  "#define _ANKI_INCL_GUARD_%" PRIu64,
-												  hash, hash);
+			m_sourceLines.pushBackSprintf("#ifndef _ANKI_INCL_GUARD_%" PRIu64 "\n"
+										  "#define _ANKI_INCL_GUARD_%" PRIu64,
+										  hash, hash);
 
 
-			getAppendSourceList().pushBackSprintf("#line %u \"%s\"", lineNo + 1, sanitizeFilename(fname).cstr());
+			m_sourceLines.pushBackSprintf("#line %u \"%s\"", lineNo + 1, sanitizeFilename(fname).cstr());
 		}
 		}
 		else if(*token == "anki")
 		else if(*token == "anki")
 		{
 		{
@@ -528,15 +477,10 @@ Error ShaderParser::parseLine(CString line, CString fname, Bool& foundPragmaOnce
 				ANKI_CHECK(checkNoActiveStruct());
 				ANKI_CHECK(checkNoActiveStruct());
 				ANKI_CHECK(parsePragmaMutator(token + 1, end, line, fname));
 				ANKI_CHECK(parsePragmaMutator(token + 1, end, line, fname));
 			}
 			}
-			else if(*token == "technique_start")
-			{
-				ANKI_CHECK(checkNoActiveStruct());
-				ANKI_CHECK(parsePragmaTechniqueStart(token + 1, end, line, fname));
-			}
-			else if(*token == "technique_end")
+			else if(*token == "technique")
 			{
 			{
 				ANKI_CHECK(checkNoActiveStruct());
 				ANKI_CHECK(checkNoActiveStruct());
-				ANKI_CHECK(parsePragmaTechniqueEnd(token + 1, end, line, fname));
+				ANKI_CHECK(parsePragmaTechnique(token + 1, end, line, fname));
 			}
 			}
 			else if(*token == "skip_mutation")
 			else if(*token == "skip_mutation")
 			{
 			{
@@ -572,18 +516,18 @@ Error ShaderParser::parseLine(CString line, CString fname, Bool& foundPragmaOnce
 			}
 			}
 
 
 			// For good measure
 			// For good measure
-			getAppendSourceList().pushBackSprintf("#line %u \"%s\"", lineNo + 1, sanitizeFilename(fname).cstr());
+			m_sourceLines.pushBackSprintf("#line %u \"%s\"", lineNo + 1, sanitizeFilename(fname).cstr());
 		}
 		}
 		else
 		else
 		{
 		{
 			// Some other pragma, ignore
 			// Some other pragma, ignore
-			getAppendSourceList().pushBack(line);
+			m_sourceLines.pushBack(line);
 		}
 		}
 	}
 	}
 	else
 	else
 	{
 	{
 		// Ignore
 		// Ignore
-		getAppendSourceList().pushBack(line);
+		m_sourceLines.pushBack(line);
 	}
 	}
 
 
 	return Error::kNone;
 	return Error::kNone;
@@ -600,7 +544,7 @@ Error ShaderParser::parsePragmaStructBegin(const ShaderCompilerString* begin, co
 	GhostStruct& gstruct = *m_ghostStructs.emplaceBack();
 	GhostStruct& gstruct = *m_ghostStructs.emplaceBack();
 	gstruct.m_name = *begin;
 	gstruct.m_name = *begin;
 
 
-	getAppendSourceList().pushBackSprintf("struct %s {", begin->cstr());
+	m_sourceLines.pushBackSprintf("struct %s {", begin->cstr());
 
 
 	ANKI_ASSERT(!m_insideStruct);
 	ANKI_ASSERT(!m_insideStruct);
 	m_insideStruct = true;
 	m_insideStruct = true;
@@ -658,8 +602,8 @@ Error ShaderParser::parsePragmaMember(const ShaderCompilerString* begin, const S
 						  ? structure.m_members.getBack().m_offset + getShaderVariableDataTypeInfo(structure.m_members.getBack().m_type).m_size
 						  ? structure.m_members.getBack().m_offset + getShaderVariableDataTypeInfo(structure.m_members.getBack().m_type).m_size
 						  : 0;
 						  : 0;
 
 
-	getAppendSourceList().pushBackSprintf("#define %s_%s_OFFSETOF %u", structure.m_name.cstr(), member.m_name.cstr(), member.m_offset);
-	getAppendSourceList().pushBackSprintf("\t%s %s;", typeStr.cstr(), member.m_name.cstr());
+	m_sourceLines.pushBackSprintf("#define %s_%s_OFFSETOF %u", structure.m_name.cstr(), member.m_name.cstr(), member.m_offset);
+	m_sourceLines.pushBackSprintf("\t%s %s;", typeStr.cstr(), member.m_name.cstr());
 
 
 	structure.m_members.emplaceBack(std::move(member));
 	structure.m_members.emplaceBack(std::move(member));
 
 
@@ -683,26 +627,26 @@ Error ShaderParser::parsePragmaStructEnd(const ShaderCompilerString* begin, cons
 		ANKI_PP_ERROR_MALFORMED_MSG("Struct doesn't have any members");
 		ANKI_PP_ERROR_MALFORMED_MSG("Struct doesn't have any members");
 	}
 	}
 
 
-	getAppendSourceList().pushBack("};");
+	m_sourceLines.pushBack("};");
 
 
 	for(U32 i = 0; i < gstruct.m_members.getSize(); ++i)
 	for(U32 i = 0; i < gstruct.m_members.getSize(); ++i)
 	{
 	{
 		const Member& m = gstruct.m_members[i];
 		const Member& m = gstruct.m_members[i];
 
 
 		// #	define XXX_LOAD()
 		// #	define XXX_LOAD()
-		getAppendSourceList().pushBackSprintf("#\tdefine %s_%s_LOAD(buff, offset) buff.Load<%s>(%s_%s_OFFSETOF + (offset))%s", structName.cstr(),
-											  m.m_name.cstr(), getShaderVariableDataTypeInfo(m.m_type).m_name, structName.cstr(), m.m_name.cstr(),
-											  (i != gstruct.m_members.getSize() - 1) ? "," : "");
+		m_sourceLines.pushBackSprintf("#\tdefine %s_%s_LOAD(buff, offset) buff.Load<%s>(%s_%s_OFFSETOF + (offset))%s", structName.cstr(),
+									  m.m_name.cstr(), getShaderVariableDataTypeInfo(m.m_type).m_name, structName.cstr(), m.m_name.cstr(),
+									  (i != gstruct.m_members.getSize() - 1) ? "," : "");
 	}
 	}
 
 
 	// Now define the structure LOAD in HLSL
 	// Now define the structure LOAD in HLSL
-	getAppendSourceList().pushBackSprintf("#define load%s(buff, offset) { \\", structName.cstr());
+	m_sourceLines.pushBackSprintf("#define load%s(buff, offset) { \\", structName.cstr());
 	for(U32 i = 0; i < gstruct.m_members.getSize(); ++i)
 	for(U32 i = 0; i < gstruct.m_members.getSize(); ++i)
 	{
 	{
 		const Member& m = gstruct.m_members[i];
 		const Member& m = gstruct.m_members[i];
-		getAppendSourceList().pushBackSprintf("\t%s_%s_LOAD(buff, offset) \\", structName.cstr(), m.m_name.cstr());
+		m_sourceLines.pushBackSprintf("\t%s_%s_LOAD(buff, offset) \\", structName.cstr(), m.m_name.cstr());
 	}
 	}
-	getAppendSourceList().pushBack("}");
+	m_sourceLines.pushBack("}");
 
 
 	// Done
 	// Done
 	m_insideStruct = false;
 	m_insideStruct = false;
@@ -769,7 +713,7 @@ Error ShaderParser::parseFile(CString fname, U32 depth)
 		ANKI_SHADER_COMPILER_LOGE("Source is empty");
 		ANKI_SHADER_COMPILER_LOGE("Source is empty");
 	}
 	}
 
 
-	getAppendSourceList().pushBackSprintf("#line 0 \"%s\"", sanitizeFilename(fname).cstr());
+	m_sourceLines.pushBackSprintf("#line 0 \"%s\"", sanitizeFilename(fname).cstr());
 
 
 	// Parse lines
 	// Parse lines
 	U32 lineNo = 1;
 	U32 lineNo = 1;
@@ -777,7 +721,7 @@ Error ShaderParser::parseFile(CString fname, U32 depth)
 	{
 	{
 		if(line.isEmpty())
 		if(line.isEmpty())
 		{
 		{
-			getAppendSourceList().pushBack(" ");
+			m_sourceLines.pushBack(" ");
 		}
 		}
 		else if(line.find("pragma") != ShaderCompilerString::kNpos || line.find("include") != ShaderCompilerString::kNpos)
 		else if(line.find("pragma") != ShaderCompilerString::kNpos || line.find("include") != ShaderCompilerString::kNpos)
 		{
 		{
@@ -787,7 +731,7 @@ Error ShaderParser::parseFile(CString fname, U32 depth)
 		else
 		else
 		{
 		{
 			// Just append the line
 			// Just append the line
-			getAppendSourceList().pushBack(line.toCString());
+			m_sourceLines.pushBack(line.toCString());
 		}
 		}
 
 
 		++lineNo;
 		++lineNo;
@@ -796,7 +740,7 @@ Error ShaderParser::parseFile(CString fname, U32 depth)
 	if(foundPragmaOnce)
 	if(foundPragmaOnce)
 	{
 	{
 		// Append the guard
 		// Append the guard
-		getAppendSourceList().pushBack("#endif // Include guard");
+		m_sourceLines.pushBack("#endif // Include guard");
 	}
 	}
 
 
 	return Error::kNone;
 	return Error::kNone;
@@ -805,7 +749,7 @@ Error ShaderParser::parseFile(CString fname, U32 depth)
 Error ShaderParser::parse()
 Error ShaderParser::parse()
 {
 {
 	ANKI_ASSERT(!m_fname.isEmpty());
 	ANKI_ASSERT(!m_fname.isEmpty());
-	ANKI_ASSERT(m_commonSourceLines.isEmpty());
+	ANKI_ASSERT(m_sourceLines.isEmpty());
 
 
 	const CString fname = m_fname;
 	const CString fname = m_fname;
 
 
@@ -820,12 +764,6 @@ Error ShaderParser::parse()
 			return Error::kUserData;
 			return Error::kUserData;
 		}
 		}
 
 
-		if(insideTechnique())
-		{
-			ANKI_SHADER_COMPILER_LOGE("Forgot to end a technique");
-			return Error::kUserData;
-		}
-
 		if(m_insideStruct)
 		if(m_insideStruct)
 		{
 		{
 			ANKI_SHADER_COMPILER_LOGE("Forgot to end a struct");
 			ANKI_SHADER_COMPILER_LOGE("Forgot to end a struct");
@@ -833,24 +771,6 @@ Error ShaderParser::parse()
 		}
 		}
 	}
 	}
 
 
-	// Create the code lines for each technique
-	for(U32 i = 0; i < m_techniques.getSize(); ++i)
-	{
-		for(ShaderType s : EnumIterable<ShaderType>())
-		{
-			if(m_techniqueExtras[i].m_sourceLines[s].getSize())
-			{
-				ANKI_ASSERT(!!(m_techniques[i].m_shaderTypes & ShaderTypeBit(1 << s)));
-				m_techniqueExtras[i].m_sourceLines[s].join("\n", m_techniqueExtras[i].m_sources[s]);
-				m_techniqueExtras[i].m_sourceLines[s].destroy(); // Free mem
-			}
-			else
-			{
-				ANKI_ASSERT(!(m_techniques[i].m_shaderTypes & ShaderTypeBit(1 << s)));
-			}
-		}
-	}
-
 	// Copy the extra compiler args to a better structure
 	// Copy the extra compiler args to a better structure
 	if(m_extraCompilerArgs.getSize() > 0)
 	if(m_extraCompilerArgs.getSize() > 0)
 	{
 	{
@@ -862,7 +782,8 @@ Error ShaderParser::parse()
 		}
 		}
 	}
 	}
 
 
-	m_commonSourceLines.destroy(); // Free mem
+	m_sourceLines.join("\n", m_source);
+	m_sourceLines.destroy(); // Free mem
 
 
 	return Error::kNone;
 	return Error::kNone;
 }
 }
@@ -871,8 +792,6 @@ void ShaderParser::generateAnkiShaderHeader(ShaderType shaderType, ShaderCompile
 {
 {
 	header.destroy();
 	header.destroy();
 
 
-	header += ShaderCompilerString().sprintf("#define kMaxBindlessTextures %uu\n", kMaxBindlessTextures);
-
 	for(ShaderType type : EnumIterable<ShaderType>())
 	for(ShaderType type : EnumIterable<ShaderType>())
 	{
 	{
 		header += ShaderCompilerString().sprintf("#define ANKI_%s_SHADER %u\n", kShaderStageNames[type].cstr(), (shaderType == type) ? 1 : 0);
 		header += ShaderCompilerString().sprintf("#define ANKI_%s_SHADER %u\n", kShaderStageNames[type].cstr(), (shaderType == type) ? 1 : 0);
@@ -926,8 +845,7 @@ void ShaderParser::generateVariant(ConstWeakArray<MutatorValue> mutation, const
 		source += "#define ANKI_SUPPORTS_16BIT_TYPES 0\n";
 		source += "#define ANKI_SUPPORTS_16BIT_TYPES 0\n";
 	}
 	}
 
 
-	ANKI_ASSERT(m_techniqueExtras[tIdx].m_sources[shaderType].getLength() > 0);
-	source += m_techniqueExtras[tIdx].m_sources[shaderType];
+	source += m_source;
 }
 }
 
 
 Bool ShaderParser::mutatorHasValue(const ShaderParserMutator& mutator, MutatorValue value)
 Bool ShaderParser::mutatorHasValue(const ShaderParserMutator& mutator, MutatorValue value)

+ 4 - 25
AnKi/ShaderCompiler/ShaderParser.h

@@ -61,8 +61,7 @@ public:
 /// #pragma anki mutator NAME VALUE0 [VALUE1 [VALUE2 ...]]
 /// #pragma anki mutator NAME VALUE0 [VALUE1 [VALUE2 ...]]
 /// #pragma anki skip_mutation MUTATOR0 VALUE0 [MUTATOR1 VALUE1 [MUTATOR2 VALUE2 ...]]
 /// #pragma anki skip_mutation MUTATOR0 VALUE0 [MUTATOR1 VALUE1 [MUTATOR2 VALUE2 ...]]
 /// #pragma anki 16bit // Works only in HLSL. Gain 16bit types but loose min16xxx types
 /// #pragma anki 16bit // Works only in HLSL. Gain 16bit types but loose min16xxx types
-/// #pragma anki technique_start STAGE [NAME] [uses_mutators [USES_MUTATOR1 [USES_MUTATOR2 ...]]]
-/// #pragma anki technique_end STAGE [NAME]
+/// #pragma anki technique [NAME] STAGE0 [STAGE1 ...] [mutators [MUTATOR0 [MUTATOR1 ...]]]
 /// #pragma anki extra_compiler_args ARG0 [ARG1 [ARG2...]]
 /// #pragma anki extra_compiler_args ARG0 [ARG1 [ARG2...]]
 ///
 ///
 /// #pragma anki struct NAME
 /// #pragma anki struct NAME
@@ -138,13 +137,6 @@ private:
 		ShaderCompilerDynamicArray<MutatorValue> m_partialMutation;
 		ShaderCompilerDynamicArray<MutatorValue> m_partialMutation;
 	};
 	};
 
 
-	class TechniqueExtra
-	{
-	public:
-		Array<ShaderCompilerStringList, U32(ShaderType::kCount)> m_sourceLines;
-		Array<ShaderCompilerString, U32(ShaderType::kCount)> m_sources;
-	};
-
 	static constexpr U32 kMaxIncludeDepth = 8;
 	static constexpr U32 kMaxIncludeDepth = 8;
 
 
 	ShaderCompilerString m_fname;
 	ShaderCompilerString m_fname;
@@ -155,12 +147,10 @@ private:
 
 
 	U64 m_hash = 0;
 	U64 m_hash = 0;
 
 
-	ShaderCompilerStringList m_commonSourceLines; ///< Common code until now.
+	ShaderCompilerStringList m_sourceLines;
+	ShaderCompilerString m_source;
 
 
 	ShaderCompilerDynamicArray<Technique> m_techniques;
 	ShaderCompilerDynamicArray<Technique> m_techniques;
-	ShaderCompilerDynamicArray<TechniqueExtra> m_techniqueExtras;
-	U32 m_insideTechniqueIdx = kMaxU32;
-	ShaderType m_insideTechniqueShaderType = ShaderType::kCount;
 
 
 	ShaderCompilerDynamicArray<Mutator> m_mutators;
 	ShaderCompilerDynamicArray<Mutator> m_mutators;
 	ShaderCompilerDynamicArray<PartialMutationSkip> m_skipMutations;
 	ShaderCompilerDynamicArray<PartialMutationSkip> m_skipMutations;
@@ -173,22 +163,11 @@ private:
 	ShaderCompilerDynamicArray<ShaderCompilerString> m_extraCompilerArgs;
 	ShaderCompilerDynamicArray<ShaderCompilerString> m_extraCompilerArgs;
 	ShaderCompilerDynamicArray<CString> m_extraCompilerArgsCString;
 	ShaderCompilerDynamicArray<CString> m_extraCompilerArgsCString;
 
 
-	ShaderCompilerStringList& getAppendSourceList()
-	{
-		return (insideTechnique()) ? m_techniqueExtras[m_insideTechniqueIdx].m_sourceLines[m_insideTechniqueShaderType] : m_commonSourceLines;
-	}
-
-	Bool insideTechnique() const
-	{
-		return m_insideTechniqueIdx < kMaxU32;
-	}
-
 	Error parseFile(CString fname, U32 depth);
 	Error parseFile(CString fname, U32 depth);
 	Error parseLine(CString line, CString fname, Bool& foundPragmaOnce, U32 depth, U32 lineNumber);
 	Error parseLine(CString line, CString fname, Bool& foundPragmaOnce, U32 depth, U32 lineNumber);
 	Error parseInclude(const ShaderCompilerString* begin, const ShaderCompilerString* end, CString line, CString fname, U32 depth);
 	Error parseInclude(const ShaderCompilerString* begin, const ShaderCompilerString* end, CString line, CString fname, U32 depth);
 	Error parsePragmaMutator(const ShaderCompilerString* begin, const ShaderCompilerString* end, CString line, CString fname);
 	Error parsePragmaMutator(const ShaderCompilerString* begin, const ShaderCompilerString* end, CString line, CString fname);
-	Error parsePragmaTechniqueStart(const ShaderCompilerString* begin, const ShaderCompilerString* end, CString line, CString fname);
-	Error parsePragmaTechniqueEnd(const ShaderCompilerString* begin, const ShaderCompilerString* end, CString line, CString fname);
+	Error parsePragmaTechnique(const ShaderCompilerString* begin, const ShaderCompilerString* end, CString line, CString fname);
 	Error parsePragmaSkipMutation(const ShaderCompilerString* begin, const ShaderCompilerString* end, CString line, CString fname);
 	Error parsePragmaSkipMutation(const ShaderCompilerString* begin, const ShaderCompilerString* end, CString line, CString fname);
 	Error parsePragmaStructBegin(const ShaderCompilerString* begin, const ShaderCompilerString* end, CString line, CString fname);
 	Error parsePragmaStructBegin(const ShaderCompilerString* begin, const ShaderCompilerString* end, CString line, CString fname);
 	Error parsePragmaStructEnd(const ShaderCompilerString* begin, const ShaderCompilerString* end, CString line, CString fname);
 	Error parsePragmaStructEnd(const ShaderCompilerString* begin, const ShaderCompilerString* end, CString line, CString fname);

+ 2 - 2
AnKi/Shaders/ApplyIrradianceToReflection.ankiprog

@@ -3,7 +3,8 @@
 // Code licensed under the BSD License.
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 // http://www.anki3d.org/LICENSE
 
 
-#pragma anki technique_start comp
+#pragma anki technique comp
+
 #include <AnKi/Shaders/PackFunctions.hlsl>
 #include <AnKi/Shaders/PackFunctions.hlsl>
 #include <AnKi/Shaders/LightFunctions.hlsl>
 #include <AnKi/Shaders/LightFunctions.hlsl>
 
 
@@ -48,4 +49,3 @@ RWTexture2D<RVec4> g_cubeTex[6u] : register(u0); // RWTexture2D because there is
 	// Write it back
 	// Write it back
 	g_cubeTex[faceIdx][dispatchThreadId] = RVec4(prevColorWithIndirectDiffuse, 0.0);
 	g_cubeTex[faceIdx][dispatchThreadId] = RVec4(prevColorWithIndirectDiffuse, 0.0);
 }
 }
-#pragma anki technique_end comp

+ 2 - 9
AnKi/Shaders/Blit.ankiprog

@@ -3,6 +3,8 @@
 // Code licensed under the BSD License.
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 // http://www.anki3d.org/LICENSE
 
 
+#pragma anki technique vert pixel comp
+
 #include <AnKi/Shaders/QuadVert.hlsl>
 #include <AnKi/Shaders/QuadVert.hlsl>
 
 
 #if ANKI_COMPUTE_SHADER || ANKI_PIXEL_SHADER
 #if ANKI_COMPUTE_SHADER || ANKI_PIXEL_SHADER
@@ -54,12 +56,3 @@ RVec3 main(VertOut input) : SV_TARGET0
 #	endif
 #	endif
 }
 }
 #endif // ANKI_COMPUTE_SHADER || ANKI_PIXEL_SHADER
 #endif // ANKI_COMPUTE_SHADER || ANKI_PIXEL_SHADER
-
-#pragma anki technique_start vert
-#pragma anki technique_end vert
-
-#pragma anki technique_start pixel
-#pragma anki technique_end pixel
-
-#pragma anki technique_start comp
-#pragma anki technique_end comp

+ 4 - 27
AnKi/Shaders/Bloom.ankiprog

@@ -3,6 +3,10 @@
 // Code licensed under the BSD License.
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 // http://www.anki3d.org/LICENSE
 
 
+#pragma anki technique Downscale vert pixel comp
+#pragma anki technique Exposure vert pixel comp
+#pragma anki technique Upscale vert pixel comp
+
 #include <AnKi/Shaders/QuadVert.hlsl>
 #include <AnKi/Shaders/QuadVert.hlsl>
 
 
 // ===========================================================================
 // ===========================================================================
@@ -221,30 +225,3 @@ RVec3 main(VertOut input) : SV_TARGET0
 #	endif
 #	endif
 }
 }
 #endif // (ANKI_PIXEL_SHADER || ANKI_COMPUTE_SHADER) && ANKI_TECHNIQUE_Upscale
 #endif // (ANKI_PIXEL_SHADER || ANKI_COMPUTE_SHADER) && ANKI_TECHNIQUE_Upscale
-
-#pragma anki technique_start vert Downscale
-#pragma anki technique_end vert Downscale
-
-#pragma anki technique_start pixel Downscale
-#pragma anki technique_end pixel Downscale
-
-#pragma anki technique_start comp Downscale
-#pragma anki technique_end comp Downscale
-
-#pragma anki technique_start vert Exposure
-#pragma anki technique_end vert Exposure
-
-#pragma anki technique_start pixel Exposure
-#pragma anki technique_end pixel Exposure
-
-#pragma anki technique_start comp Exposure
-#pragma anki technique_end comp Exposure
-
-#pragma anki technique_start vert Upscale
-#pragma anki technique_end vert Upscale
-
-#pragma anki technique_start pixel Upscale
-#pragma anki technique_end pixel Upscale
-
-#pragma anki technique_start comp Upscale
-#pragma anki technique_end comp Upscale

+ 2 - 3
AnKi/Shaders/ClearTextureCompute.ankiprog

@@ -8,7 +8,8 @@
 #pragma anki mutator TEXTURE_DIMENSIONS 2 3
 #pragma anki mutator TEXTURE_DIMENSIONS 2 3
 #pragma anki mutator COMPONENT_TYPE 0 1 // 0 is float, 1 is uint
 #pragma anki mutator COMPONENT_TYPE 0 1 // 0 is float, 1 is uint
 
 
-#pragma anki technique_start comp
+#pragma anki technique comp
+
 #include <AnKi/Shaders/Common.hlsl>
 #include <AnKi/Shaders/Common.hlsl>
 
 
 struct Consts
 struct Consts
@@ -60,5 +61,3 @@ RWTexture3D<UVec4> g_storageTex : register(u0);
 	g_storageTex[svDispatchThreadId] = g_consts.m_clearColor;
 	g_storageTex[svDispatchThreadId] = g_consts.m_clearColor;
 #endif
 #endif
 }
 }
-
-#pragma anki technique_end comp

+ 1 - 3
AnKi/Shaders/ClusterBinning.ankiprog

@@ -7,7 +7,7 @@
 
 
 #pragma anki mutator OBJECT_TYPE 0 1 2 3 4 // Same as GpuSceneNonRenderableObjectType
 #pragma anki mutator OBJECT_TYPE 0 1 2 3 4 // Same as GpuSceneNonRenderableObjectType
 
 
-#pragma anki technique_start comp
+#pragma anki technique comp
 
 
 #include <AnKi/Shaders/Include/ClusteredShadingTypes.h>
 #include <AnKi/Shaders/Include/ClusteredShadingTypes.h>
 #include <AnKi/Shaders/VisibilityAndCollisionFunctions.hlsl>
 #include <AnKi/Shaders/VisibilityAndCollisionFunctions.hlsl>
@@ -224,5 +224,3 @@ constexpr UVec2 kSampleLocations[kSampleCount] = {LOCATION(1, -3), LOCATION(-1,
 		}
 		}
 	}
 	}
 }
 }
-
-#pragma anki technique_end comp

+ 1 - 3
AnKi/Shaders/ClusterBinningPackVisibles.ankiprog

@@ -5,7 +5,7 @@
 
 
 #pragma anki mutator OBJECT_TYPE 0 1 2 3 4 // Same as GpuSceneNonRenderableObjectType
 #pragma anki mutator OBJECT_TYPE 0 1 2 3 4 // Same as GpuSceneNonRenderableObjectType
 
 
-#pragma anki technique_start comp
+#pragma anki technique comp
 
 
 #include <AnKi/Shaders/Include/ClusteredShadingTypes.h>
 #include <AnKi/Shaders/Include/ClusteredShadingTypes.h>
 #include <AnKi/Shaders/Include/GpuSceneTypes.h>
 #include <AnKi/Shaders/Include/GpuSceneTypes.h>
@@ -73,5 +73,3 @@ StructuredBuffer<U32> g_visibles : register(t1);
 	g_outBuffer[idxOut] = g_inBuffer[g_visibles[idxOut + 1]];
 	g_outBuffer[idxOut] = g_inBuffer[g_visibles[idxOut + 1]];
 #endif
 #endif
 }
 }
-
-#pragma anki technique_end comp

+ 1 - 3
AnKi/Shaders/ClusterBinningSetup.ankiprog

@@ -5,7 +5,7 @@
 
 
 // This shader prepares the indirect args of future dispatches
 // This shader prepares the indirect args of future dispatches
 
 
-#pragma anki technique_start comp
+#pragma anki technique comp
 
 
 #include <AnKi/Shaders/Common.hlsl>
 #include <AnKi/Shaders/Common.hlsl>
 #include <AnKi/Shaders/Include/ClusteredShadingTypes.h>
 #include <AnKi/Shaders/Include/ClusteredShadingTypes.h>
@@ -67,5 +67,3 @@ constexpr U32 kPackVisiblesThreadgroupSize = 64;
 		// Skip remaining threads
 		// Skip remaining threads
 	}
 	}
 }
 }
-
-#pragma anki technique_end comp

+ 19 - 18
AnKi/Shaders/DbgBillboard.ankiprog

@@ -6,6 +6,8 @@
 #pragma anki mutator DEPTH_FAIL_VISUALIZATION 0 1
 #pragma anki mutator DEPTH_FAIL_VISUALIZATION 0 1
 #pragma anki mutator OBJECT_TYPE 0 1 2 3 4 // Same as GpuSceneNonRenderableObjectType
 #pragma anki mutator OBJECT_TYPE 0 1 2 3 4 // Same as GpuSceneNonRenderableObjectType
 
 
+#pragma anki technique vert pixel
+
 #include <AnKi/Shaders/Common.hlsl>
 #include <AnKi/Shaders/Common.hlsl>
 #include <AnKi/Shaders/ClusteredShadingFunctions.hlsl>
 #include <AnKi/Shaders/ClusteredShadingFunctions.hlsl>
 #include <AnKi/Shaders/TonemappingFunctions.hlsl>
 #include <AnKi/Shaders/TonemappingFunctions.hlsl>
@@ -46,14 +48,13 @@ struct VertOut
 	nointerpolation U32 m_textureIndex : TEX_INDEX;
 	nointerpolation U32 m_textureIndex : TEX_INDEX;
 };
 };
 
 
-#pragma anki technique_start vert
-
 struct VertIn
 struct VertIn
 {
 {
 	U32 m_svInstanceId : SV_INSTANCEID;
 	U32 m_svInstanceId : SV_INSTANCEID;
 	U32 m_svVertexId : SV_VERTEXID;
 	U32 m_svVertexId : SV_VERTEXID;
 };
 };
 
 
+#if ANKI_VERTEX_SHADER
 VertOut main(VertIn input)
 VertOut main(VertIn input)
 {
 {
 	VertOut output;
 	VertOut output;
@@ -67,22 +68,22 @@ VertOut main(VertIn input)
 
 
 	if(input.m_svInstanceId < objCount)
 	if(input.m_svInstanceId < objCount)
 	{
 	{
-#if OBJECT_TYPE == ANKI_GPU_SCENE_NON_RENDERABLE_OBJECT_TYPE_LIGHT
+#	if OBJECT_TYPE == ANKI_GPU_SCENE_NON_RENDERABLE_OBJECT_TYPE_LIGHT
 		const Vec3 localPos = g_visibleObjects[input.m_svInstanceId].m_position;
 		const Vec3 localPos = g_visibleObjects[input.m_svInstanceId].m_position;
 		output.m_colorScale.xyz = reinhardTonemap(g_visibleObjects[input.m_svInstanceId].m_diffuseColor);
 		output.m_colorScale.xyz = reinhardTonemap(g_visibleObjects[input.m_svInstanceId].m_diffuseColor);
 		output.m_textureIndex = g_visibleObjects[input.m_svInstanceId].m_lightType;
 		output.m_textureIndex = g_visibleObjects[input.m_svInstanceId].m_lightType;
-#elif OBJECT_TYPE == ANKI_GPU_SCENE_NON_RENDERABLE_OBJECT_TYPE_DECAL
+#	elif OBJECT_TYPE == ANKI_GPU_SCENE_NON_RENDERABLE_OBJECT_TYPE_DECAL
 		const Vec3 localPos = g_visibleObjects[input.m_svInstanceId].m_sphereCenter;
 		const Vec3 localPos = g_visibleObjects[input.m_svInstanceId].m_sphereCenter;
-#elif OBJECT_TYPE == ANKI_GPU_SCENE_NON_RENDERABLE_OBJECT_TYPE_FOG_DENSITY_VOLUME
+#	elif OBJECT_TYPE == ANKI_GPU_SCENE_NON_RENDERABLE_OBJECT_TYPE_FOG_DENSITY_VOLUME
 		const ClusteredType obj = g_visibleObjects[input.m_svInstanceId];
 		const ClusteredType obj = g_visibleObjects[input.m_svInstanceId];
 		const Vec3 localPos = (obj.m_isBox) ? (obj.m_aabbMinOrSphereCenter + obj.m_aabbMaxOrSphereRadius) / 2.0f : obj.m_aabbMinOrSphereCenter;
 		const Vec3 localPos = (obj.m_isBox) ? (obj.m_aabbMinOrSphereCenter + obj.m_aabbMaxOrSphereRadius) / 2.0f : obj.m_aabbMinOrSphereCenter;
-#elif OBJECT_TYPE == ANKI_GPU_SCENE_NON_RENDERABLE_OBJECT_TYPE_REFLECTION_PROBE
+#	elif OBJECT_TYPE == ANKI_GPU_SCENE_NON_RENDERABLE_OBJECT_TYPE_REFLECTION_PROBE
 		const Vec3 localPos = g_visibleObjects[input.m_svInstanceId].m_position;
 		const Vec3 localPos = g_visibleObjects[input.m_svInstanceId].m_position;
-#elif OBJECT_TYPE == ANKI_GPU_SCENE_NON_RENDERABLE_OBJECT_TYPE_GLOBAL_ILLUMINATION_PROBE
+#	elif OBJECT_TYPE == ANKI_GPU_SCENE_NON_RENDERABLE_OBJECT_TYPE_GLOBAL_ILLUMINATION_PROBE
 		const Vec3 localPos = (g_visibleObjects[input.m_svInstanceId].m_aabbMin + g_visibleObjects[input.m_svInstanceId].m_aabbMax) / 2.0f;
 		const Vec3 localPos = (g_visibleObjects[input.m_svInstanceId].m_aabbMin + g_visibleObjects[input.m_svInstanceId].m_aabbMax) / 2.0f;
-#else
-#	error See file
-#endif
+#	else
+#		error See file
+#	endif
 
 
 		// Rotate towards the camera and apply translation
 		// Rotate towards the camera and apply translation
 		const Vec3 worldPos = mul(g_consts.m_camTrf, Vec4((output.m_uv * 2.0 - 1.0) * kBillboardScale, 0.0, 0.0)) + localPos;
 		const Vec3 worldPos = mul(g_consts.m_camTrf, Vec4((output.m_uv * 2.0 - 1.0) * kBillboardScale, 0.0, 0.0)) + localPos;
@@ -97,20 +98,20 @@ VertOut main(VertIn input)
 
 
 	return output;
 	return output;
 }
 }
-#pragma anki technique_end vert
+#endif // ANKI_VERTEX_SHADER
 
 
-#pragma anki technique_start pixel
-#include <AnKi/Shaders/ImportanceSampling.hlsl>
+#if ANKI_PIXEL_SHADER
+#	include <AnKi/Shaders/ImportanceSampling.hlsl>
 
 
 SamplerState g_trilinearRepeatSampler : register(s1);
 SamplerState g_trilinearRepeatSampler : register(s1);
 Texture2D<Vec4> g_tex : register(t3);
 Texture2D<Vec4> g_tex : register(t3);
 Texture2D<Vec4> g_tex2 : register(t4);
 Texture2D<Vec4> g_tex2 : register(t4);
 
 
 // NOTE: Don't eliminate the binding because it confuses the descriptor set creation
 // NOTE: Don't eliminate the binding because it confuses the descriptor set creation
-#if DEPTH_FAIL_VISUALIZATION == 1
+#	if DEPTH_FAIL_VISUALIZATION == 1
 SamplerState g_nearestAnyClampSampler : register(s0);
 SamplerState g_nearestAnyClampSampler : register(s0);
 Texture2D g_depthRt : register(t0);
 Texture2D g_depthRt : register(t0);
-#endif
+#	endif
 
 
 Vec4 main(VertOut input) : SV_TARGET0
 Vec4 main(VertOut input) : SV_TARGET0
 {
 {
@@ -118,7 +119,7 @@ Vec4 main(VertOut input) : SV_TARGET0
 
 
 	// Check if we should skip the frag
 	// Check if we should skip the frag
 	F32 colorFactor = 1.0f;
 	F32 colorFactor = 1.0f;
-#if DEPTH_FAIL_VISUALIZATION == 1
+#	if DEPTH_FAIL_VISUALIZATION == 1
 	Vec2 texSize;
 	Vec2 texSize;
 	g_depthRt.GetDimensions(texSize.x, texSize.y);
 	g_depthRt.GetDimensions(texSize.x, texSize.y);
 	const Vec2 uv = input.m_svPosition.xy / texSize;
 	const Vec2 uv = input.m_svPosition.xy / texSize;
@@ -128,7 +129,7 @@ Vec4 main(VertOut input) : SV_TARGET0
 	{
 	{
 		colorFactor = 0.6;
 		colorFactor = 0.6;
 	}
 	}
-#endif
+#	endif
 
 
 	// Write the color
 	// Write the color
 	if(input.m_textureIndex == 0)
 	if(input.m_textureIndex == 0)
@@ -140,4 +141,4 @@ Vec4 main(VertOut input) : SV_TARGET0
 		return g_tex2.Sample(g_trilinearRepeatSampler, input.m_uv) * input.m_colorScale * colorFactor;
 		return g_tex2.Sample(g_trilinearRepeatSampler, input.m_uv) * input.m_colorScale * colorFactor;
 	}
 	}
 }
 }
-#pragma anki technique_end pixel
+#endif // ANKI_PIXEL_SHADER

+ 11 - 9
AnKi/Shaders/DbgRenderables.ankiprog

@@ -5,6 +5,8 @@
 
 
 #pragma anki mutator DEPTH_FAIL_VISUALIZATION 0 1
 #pragma anki mutator DEPTH_FAIL_VISUALIZATION 0 1
 
 
+#pragma anki technique vert pixel
+
 #include <AnKi/Shaders/Common.hlsl>
 #include <AnKi/Shaders/Common.hlsl>
 #include <AnKi/Shaders/Include/GpuSceneTypes.h>
 #include <AnKi/Shaders/Include/GpuSceneTypes.h>
 
 
@@ -24,13 +26,13 @@ struct VertOut
 	Vec4 m_svPosition : SV_POSITION;
 	Vec4 m_svPosition : SV_POSITION;
 };
 };
 
 
-#pragma anki technique_start vert
 struct VertIn
 struct VertIn
 {
 {
 	Vec3 m_position : POSITION;
 	Vec3 m_position : POSITION;
 	U32 m_svInstanceId : SV_INSTANCEID;
 	U32 m_svInstanceId : SV_INSTANCEID;
 };
 };
 
 
+#if ANKI_VERTEX_SHADER
 VertOut main(VertIn input)
 VertOut main(VertIn input)
 {
 {
 	VertOut output;
 	VertOut output;
@@ -52,23 +54,23 @@ VertOut main(VertIn input)
 
 
 	return output;
 	return output;
 }
 }
-#pragma anki technique_end vert
+#endif // ANKI_VERTEX_SHADER
 
 
-#pragma anki technique_start pixel
-#include <AnKi/Shaders/ImportanceSampling.hlsl>
+#if ANKI_PIXEL_SHADER
+#	include <AnKi/Shaders/ImportanceSampling.hlsl>
 
 
 // NOTE: Don't eliminate the binding because it confuses the descriptor set creation
 // NOTE: Don't eliminate the binding because it confuses the descriptor set creation
-#if DEPTH_FAIL_VISUALIZATION == 1
+#	if DEPTH_FAIL_VISUALIZATION == 1
 SamplerState g_nearestAnyClampSampler : register(s0);
 SamplerState g_nearestAnyClampSampler : register(s0);
 Texture2D g_depthRt : register(t0);
 Texture2D g_depthRt : register(t0);
-#endif
+#	endif
 
 
 Vec4 main(VertOut input) : SV_TARGET0
 Vec4 main(VertOut input) : SV_TARGET0
 {
 {
 	ANKI_MAYBE_UNUSED(input);
 	ANKI_MAYBE_UNUSED(input);
 
 
 	// Check if we should skip the frag
 	// Check if we should skip the frag
-#if DEPTH_FAIL_VISUALIZATION == 1
+#	if DEPTH_FAIL_VISUALIZATION == 1
 	Vec2 texSize;
 	Vec2 texSize;
 	g_depthRt.GetDimensions(texSize.x, texSize.y);
 	g_depthRt.GetDimensions(texSize.x, texSize.y);
 	const Vec2 uv = input.m_svPosition.xy / texSize;
 	const Vec2 uv = input.m_svPosition.xy / texSize;
@@ -78,9 +80,9 @@ Vec4 main(VertOut input) : SV_TARGET0
 	{
 	{
 		return g_consts.m_color * 0.5;
 		return g_consts.m_color * 0.5;
 	}
 	}
-#endif
+#	endif
 
 
 	// Write the color
 	// Write the color
 	return g_consts.m_color;
 	return g_consts.m_color;
 }
 }
-#pragma anki technique_end pixel
+#endif // ANKI_PIXEL_SHADER

+ 2 - 9
AnKi/Shaders/DepthAwareBlur.ankiprog

@@ -7,6 +7,8 @@
 #pragma anki mutator SAMPLE_COUNT 3 5 7 9 11 13 15
 #pragma anki mutator SAMPLE_COUNT 3 5 7 9 11 13 15
 #pragma anki mutator COLOR_COMPONENTS 4 3 1
 #pragma anki mutator COLOR_COMPONENTS 4 3 1
 
 
+#pragma anki technique vert pixel comp
+
 #include <AnKi/Shaders/QuadVert.hlsl>
 #include <AnKi/Shaders/QuadVert.hlsl>
 #include <AnKi/Shaders/Common.hlsl>
 #include <AnKi/Shaders/Common.hlsl>
 #include <AnKi/Shaders/BilateralFilter.hlsl>
 #include <AnKi/Shaders/BilateralFilter.hlsl>
@@ -129,12 +131,3 @@ ColorType main(VertOut input) : SV_TARGET0
 #	endif
 #	endif
 }
 }
 #endif // ANKI_COMPUTE_SHADER || ANKI_PIXEL_SHADER
 #endif // ANKI_COMPUTE_SHADER || ANKI_PIXEL_SHADER
-
-#pragma anki technique_start vert
-#pragma anki technique_end vert
-
-#pragma anki technique_start pixel
-#pragma anki technique_end pixel
-
-#pragma anki technique_start comp
-#pragma anki technique_end comp

+ 19 - 19
AnKi/Shaders/DepthDownscale.ankiprog

@@ -5,9 +5,11 @@
 
 
 #pragma anki mutator WAVE_OPERATIONS 0 1
 #pragma anki mutator WAVE_OPERATIONS 0 1
 
 
-#pragma anki technique_start comp
-#include <AnKi/Shaders/Common.hlsl>
-#include <AnKi/Shaders/Include/MiscRendererTypes.h>
+#pragma anki technique vert pixel comp
+
+#if ANKI_COMPUTE_SHADER
+#	include <AnKi/Shaders/Common.hlsl>
+#	include <AnKi/Shaders/Include/MiscRendererTypes.h>
 
 
 ANKI_FAST_CONSTANTS(DepthDownscaleConstants, g_consts)
 ANKI_FAST_CONSTANTS(DepthDownscaleConstants, g_consts)
 
 
@@ -18,9 +20,9 @@ SamplerState u_linearAnyClampSampler : register(s0);
 Texture2D g_srcTex : register(t0);
 Texture2D g_srcTex : register(t0);
 
 
 // Include SPD
 // Include SPD
-#define A_GPU 1
-#define A_HLSL 1
-#include <ThirdParty/FidelityFX/ffx_a.h>
+#	define A_GPU 1
+#	define A_HLSL 1
+#	include <ThirdParty/FidelityFX/ffx_a.h>
 
 
 groupshared AU1 s_spdCounter;
 groupshared AU1 s_spdCounter;
 groupshared AF1 s_spdIntermediateR[16][16];
 groupshared AF1 s_spdIntermediateR[16][16];
@@ -77,13 +79,13 @@ AF4 SpdReduce4(AF4 v0, AF4 v1, AF4 v2, AF4 v3)
 	return AF4(avg, 0.0, 0.0, 0.0);
 	return AF4(avg, 0.0, 0.0, 0.0);
 }
 }
 
 
-#define SPD_LINEAR_SAMPLER 1
+#	define SPD_LINEAR_SAMPLER 1
 
 
-#if WAVE_OPERATIONS == 0
-#	define SPD_NO_WAVE_OPERATIONS 1
-#endif
+#	if WAVE_OPERATIONS == 0
+#		define SPD_NO_WAVE_OPERATIONS 1
+#	endif
 
 
-#include <ThirdParty/FidelityFX/ffx_spd.h>
+#	include <ThirdParty/FidelityFX/ffx_spd.h>
 
 
 [numthreads(256, 1, 1)] void main(UVec3 svGroupId : SV_GROUPID, U32 svGroupIndex : SV_GROUPINDEX)
 [numthreads(256, 1, 1)] void main(UVec3 svGroupId : SV_GROUPID, U32 svGroupIndex : SV_GROUPINDEX)
 {
 {
@@ -92,20 +94,18 @@ AF4 SpdReduce4(AF4 v0, AF4 v1, AF4 v2, AF4 v3)
 	SpdDownsample(AU2(svGroupId.xy), AU1(svGroupIndex), AU1(g_consts.m_mipmapCount), AU1(g_consts.m_threadgroupCount), slice, offset);
 	SpdDownsample(AU2(svGroupId.xy), AU1(svGroupIndex), AU1(g_consts.m_mipmapCount), AU1(g_consts.m_threadgroupCount), slice, offset);
 }
 }
 
 
-#pragma anki technique_end comp
-
-#pragma anki technique_start vert
-#include <AnKi/Shaders/QuadVert.hlsl>
-#pragma anki technique_end vert
+#endif // ANKI_COMPUTE_SHADER
 
 
-#pragma anki technique_start pixel
-#include <AnKi/Shaders/QuadVert.hlsl>
+#if ANKI_PIXEL_SHADER || ANKI_VERTEX_SHADER
+#	include <AnKi/Shaders/QuadVert.hlsl>
 
 
 Texture2D<Vec4> g_inputTex : register(t0);
 Texture2D<Vec4> g_inputTex : register(t0);
 SamplerState g_linearAnyClampSampler : register(s0);
 SamplerState g_linearAnyClampSampler : register(s0);
 
 
+#	if ANKI_PIXEL_SHADER
 F32 main(VertOut input) : SV_TARGET0
 F32 main(VertOut input) : SV_TARGET0
 {
 {
 	return g_inputTex.SampleLevel(g_linearAnyClampSampler, input.m_uv, 0.0).x;
 	return g_inputTex.SampleLevel(g_linearAnyClampSampler, input.m_uv, 0.0).x;
 }
 }
-#pragma anki technique_end pixel
+#	endif // ANKI_PIXEL_SHADER
+#endif // ANKI_PIXEL_SHADER || ANKI_VERTEX_SHADER

+ 14 - 16
AnKi/Shaders/FinalComposite.ankiprog

@@ -7,14 +7,13 @@
 #pragma anki mutator BLOOM_ENABLED 0 1
 #pragma anki mutator BLOOM_ENABLED 0 1
 #pragma anki mutator DBG_ENABLED 0 1
 #pragma anki mutator DBG_ENABLED 0 1
 
 
-#include <AnKi/Shaders/QuadVert.hlsl>
+#pragma anki technique vert pixel
 
 
-#pragma anki technique_start vert
-#pragma anki technique_end vert
+#include <AnKi/Shaders/QuadVert.hlsl>
 
 
-#pragma anki technique_start pixel
-#include <AnKi/Shaders/Functions.hlsl>
-#include <AnKi/Shaders/MotionBlur.hlsl>
+#if ANKI_PIXEL_SHADER
+#	include <AnKi/Shaders/Functions.hlsl>
+#	include <AnKi/Shaders/MotionBlur.hlsl>
 
 
 SamplerState g_nearestAnyClampSampler : register(s0);
 SamplerState g_nearestAnyClampSampler : register(s0);
 SamplerState g_linearAnyClampSampler : register(s1);
 SamplerState g_linearAnyClampSampler : register(s1);
@@ -24,9 +23,9 @@ Texture2D<RVec4> g_ppsBloomLfRt : register(t1);
 Texture3D<RVec4> g_lut : register(t2);
 Texture3D<RVec4> g_lut : register(t2);
 Texture2D g_motionVectorsRt : register(t3);
 Texture2D g_motionVectorsRt : register(t3);
 Texture2D g_depthRt : register(t4);
 Texture2D g_depthRt : register(t4);
-#if DBG_ENABLED
+#	if DBG_ENABLED
 Texture2D<RVec4> g_dbgOutlineRt : register(t5);
 Texture2D<RVec4> g_dbgOutlineRt : register(t5);
-#endif
+#	endif
 
 
 struct Constants
 struct Constants
 {
 {
@@ -65,24 +64,23 @@ RVec4 main(VertOut input) : SV_TARGET0
 		outColor = g_lightShadingRt.SampleLevel(g_linearAnyClampSampler, uv, 0.0).rgb;
 		outColor = g_lightShadingRt.SampleLevel(g_linearAnyClampSampler, uv, 0.0).rgb;
 	}
 	}
 
 
-#if BLOOM_ENABLED
+#	if BLOOM_ENABLED
 	const RVec3 bloom = g_ppsBloomLfRt.SampleLevel(g_linearAnyClampSampler, uv, 0.0).rgb;
 	const RVec3 bloom = g_ppsBloomLfRt.SampleLevel(g_linearAnyClampSampler, uv, 0.0).rgb;
 	outColor += bloom;
 	outColor += bloom;
-#endif
+#	endif
 
 
 	outColor = colorGrading(outColor);
 	outColor = colorGrading(outColor);
 
 
-#if FILM_GRAIN
+#	if FILM_GRAIN
 	const F32 dt = 1.0;
 	const F32 dt = 1.0;
 	outColor = filmGrain<F32>(outColor, uv, g_consts.m_filmGrainStrength, F32(g_consts.m_frameCount % 0xFFFFu) * dt);
 	outColor = filmGrain<F32>(outColor, uv, g_consts.m_filmGrainStrength, F32(g_consts.m_frameCount % 0xFFFFu) * dt);
-#endif
+#	endif
 
 
-#if DBG_ENABLED
+#	if DBG_ENABLED
 	const RVec4 dbg = g_dbgOutlineRt.SampleLevel(g_linearAnyClampSampler, uv, 0.0);
 	const RVec4 dbg = g_dbgOutlineRt.SampleLevel(g_linearAnyClampSampler, uv, 0.0);
 	outColor = lerp(outColor, dbg.rgb, dbg.a);
 	outColor = lerp(outColor, dbg.rgb, dbg.a);
-#endif
+#	endif
 
 
 	return RVec4(outColor, 0.0);
 	return RVec4(outColor, 0.0);
 }
 }
-
-#pragma anki technique_end pixel
+#endif // ANKI_PIXEL_SHADER

+ 6 - 7
AnKi/Shaders/ForwardShadingFog.ankiprog

@@ -3,6 +3,8 @@
 // Code licensed under the BSD License.
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 // http://www.anki3d.org/LICENSE
 
 
+#pragma anki technique Forward vert pixel
+
 #include <AnKi/Shaders/ForwardShadingCommon.hlsl>
 #include <AnKi/Shaders/ForwardShadingCommon.hlsl>
 #include <AnKi/Shaders/Functions.hlsl>
 #include <AnKi/Shaders/Functions.hlsl>
 
 
@@ -25,8 +27,7 @@ struct VertOut
 	nointerpolation U32 m_constantsOffset : CONSTANTS_OFFSET;
 	nointerpolation U32 m_constantsOffset : CONSTANTS_OFFSET;
 };
 };
 
 
-#pragma anki technique_start vert Forward
-
+#if ANKI_VERTEX_SHADER
 VertOut main(VertIn input)
 VertOut main(VertIn input)
 {
 {
 	VertOut output;
 	VertOut output;
@@ -46,11 +47,9 @@ VertOut main(VertIn input)
 
 
 	return output;
 	return output;
 }
 }
+#endif // ANKI_VERTEX_SHADER
 
 
-#pragma anki technique_end vert Forward
-
-#pragma anki technique_start pixel Forward
-
+#if ANKI_PIXEL_SHADER
 PixelOut main(VertOut input)
 PixelOut main(VertOut input)
 {
 {
 	PixelOut output = (PixelOut)0;
 	PixelOut output = (PixelOut)0;
@@ -61,4 +60,4 @@ PixelOut main(VertOut input)
 
 
 	return output;
 	return output;
 }
 }
-#pragma anki technique_end pixel Forward
+#endif // ANKI_PIXEL_SHADER

+ 10 - 10
AnKi/Shaders/ForwardShadingGenericTransparent.ankiprog

@@ -6,6 +6,8 @@
 #pragma anki mutator TEXTURE 0 1
 #pragma anki mutator TEXTURE 0 1
 #pragma anki mutator LIGHT 0 1
 #pragma anki mutator LIGHT 0 1
 
 
+#pragma anki technique Forward vert pixel
+
 #include <AnKi/Shaders/ForwardShadingCommon.hlsl>
 #include <AnKi/Shaders/ForwardShadingCommon.hlsl>
 
 
 #pragma anki struct AnKiLocalConstants
 #pragma anki struct AnKiLocalConstants
@@ -28,8 +30,7 @@ struct VertOut
 	nointerpolation U32 m_constantsOffset : CONSTANTS_OFFSET;
 	nointerpolation U32 m_constantsOffset : CONSTANTS_OFFSET;
 };
 };
 
 
-#pragma anki technique_start vert Forward
-
+#if ANKI_VERTEX_SHADER
 VertOut main(VertIn input)
 VertOut main(VertIn input)
 {
 {
 	VertOut output;
 	VertOut output;
@@ -48,10 +49,9 @@ VertOut main(VertIn input)
 
 
 	return output;
 	return output;
 }
 }
-#pragma anki technique_end vert Forward
-
-#pragma anki technique_start pixel Forward
+#endif // ANKI_VERTEX_SHADER
 
 
+#if ANKI_PIXEL_SHADER
 PixelOut main(VertOut input)
 PixelOut main(VertOut input)
 {
 {
 	ANKI_MAYBE_UNUSED(input);
 	ANKI_MAYBE_UNUSED(input);
@@ -61,16 +61,16 @@ PixelOut main(VertOut input)
 
 
 	output.m_color = RVec4(1.0, 1.0, 1.0, 1.0);
 	output.m_color = RVec4(1.0, 1.0, 1.0, 1.0);
 
 
-#if TEXTURE == 1
+#	if TEXTURE == 1
 	output.m_color = getBindlessTexture2DRVec4(localConstants.m_texture).Sample(g_globalSampler, input.m_uv);
 	output.m_color = getBindlessTexture2DRVec4(localConstants.m_texture).Sample(g_globalSampler, input.m_uv);
-#endif
+#	endif
 
 
-#if LIGHT == 1
+#	if LIGHT == 1
 	output.m_color.rgb = computeLightColorLow(output.m_color.rgb, input.m_worldPosition, input.m_svPosition);
 	output.m_color.rgb = computeLightColorLow(output.m_color.rgb, input.m_worldPosition, input.m_svPosition);
-#endif
+#	endif
 
 
 	output.m_color = output.m_color * localConstants.m_colorScale + localConstants.m_colorBias;
 	output.m_color = output.m_color * localConstants.m_colorScale + localConstants.m_colorBias;
 
 
 	return output;
 	return output;
 }
 }
-#pragma anki technique_end pixel Forward
+#endif // ANKI_PIXEL_SHADER

+ 11 - 11
AnKi/Shaders/ForwardShadingParticles.ankiprog

@@ -6,6 +6,8 @@
 #pragma anki mutator ANIMATED_TEXTURE 0 1
 #pragma anki mutator ANIMATED_TEXTURE 0 1
 #pragma anki mutator LIGHT 0 1
 #pragma anki mutator LIGHT 0 1
 
 
+#pragma anki technique Forward vert pixel
+
 #include <AnKi/Shaders/ForwardShadingCommon.hlsl>
 #include <AnKi/Shaders/ForwardShadingCommon.hlsl>
 
 
 struct VertIn
 struct VertIn
@@ -30,8 +32,7 @@ struct VertOut
 #pragma anki member U32 m_diffuseMap
 #pragma anki member U32 m_diffuseMap
 #pragma anki struct_end
 #pragma anki struct_end
 
 
-#pragma anki technique_start vert Forward
-
+#if ANKI_VERTEX_SHADER
 VertOut main(VertIn input)
 VertOut main(VertIn input)
 {
 {
 	const GpuSceneRenderableInstance instance = unpackGpuSceneRenderableVertex(input.m_gpuSceneRenderable);
 	const GpuSceneRenderableInstance instance = unpackGpuSceneRenderableVertex(input.m_gpuSceneRenderable);
@@ -66,25 +67,24 @@ VertOut main(VertIn input)
 
 
 	return output;
 	return output;
 }
 }
-#pragma anki technique_end vert Forward
-
-#pragma anki technique_start pixel Forward
+#endif // ANKI_VERTEX_SHADER
 
 
+#if ANKI_PIXEL_SHADER
 PixelOut main(VertOut input)
 PixelOut main(VertOut input)
 {
 {
 	PixelOut output = (PixelOut)0;
 	PixelOut output = (PixelOut)0;
 	const AnKiLocalConstants localConstants = loadAnKiLocalConstants(g_gpuScene, WaveReadLaneFirst(input.m_constantsOffset));
 	const AnKiLocalConstants localConstants = loadAnKiLocalConstants(g_gpuScene, WaveReadLaneFirst(input.m_constantsOffset));
 
 
-#if ANIMATED_TEXTURE == 1
+#	if ANIMATED_TEXTURE == 1
 	RVec4 texCol = readAnimatedTextureRgba(getBindlessTexture2DArrayRVec4(localConstants.m_diffuseMap), g_globalSampler,
 	RVec4 texCol = readAnimatedTextureRgba(getBindlessTexture2DArrayRVec4(localConstants.m_diffuseMap), g_globalSampler,
 										   localConstants.m_animationPeriod, input.m_uv, g_globalRendererConstants.m_time);
 										   localConstants.m_animationPeriod, input.m_uv, g_globalRendererConstants.m_time);
-#else
+#	else
 	RVec4 texCol = getBindlessTexture2DRVec4(localConstants.m_diffuseMap).Sample(g_globalSampler, input.m_uv);
 	RVec4 texCol = getBindlessTexture2DRVec4(localConstants.m_diffuseMap).Sample(g_globalSampler, input.m_uv);
-#endif
+#	endif
 
 
-#if LIGHT
+#	if LIGHT
 	texCol.rgb = computeLightColorLow(texCol.rgb, input.m_worldPos, input.m_svPosition);
 	texCol.rgb = computeLightColorLow(texCol.rgb, input.m_worldPos, input.m_svPosition);
-#endif
+#	endif
 
 
 	RVec4 colScale = localConstants.m_colorScale;
 	RVec4 colScale = localConstants.m_colorScale;
 	colScale.a *= input.m_alpha;
 	colScale.a *= input.m_alpha;
@@ -92,4 +92,4 @@ PixelOut main(VertOut input)
 
 
 	return output;
 	return output;
 }
 }
-#pragma anki technique_end pixel Forward
+#endif // ANKI_PIXEL_SHADER

+ 2 - 9
AnKi/Shaders/Fsr.ankiprog

@@ -7,6 +7,8 @@
 #pragma anki mutator SHARPEN 0 1
 #pragma anki mutator SHARPEN 0 1
 #pragma anki mutator FSR_QUALITY 0 1
 #pragma anki mutator FSR_QUALITY 0 1
 
 
+#pragma anki technique vert pixel comp
+
 #include <AnKi/Shaders/QuadVert.hlsl>
 #include <AnKi/Shaders/QuadVert.hlsl>
 
 
 #if ANKI_COMPUTE_SHADER || ANKI_PIXEL_SHADER
 #if ANKI_COMPUTE_SHADER || ANKI_PIXEL_SHADER
@@ -111,12 +113,3 @@ Vec3 main(VertOut input) : SV_TARGET0
 #	endif
 #	endif
 }
 }
 #endif // ANKI_COMPUTE_SHADER || ANKI_PIXEL_SHADER
 #endif // ANKI_COMPUTE_SHADER || ANKI_PIXEL_SHADER
-
-#pragma anki technique_start vert
-#pragma anki technique_end vert
-
-#pragma anki technique_start pixel
-#pragma anki technique_end pixel
-
-#pragma anki technique_start comp
-#pragma anki technique_end comp

+ 21 - 45
AnKi/Shaders/GBufferGeneric.ankiprog

@@ -15,6 +15,27 @@
 
 
 #pragma anki skip_mutation ALPHA_TEST 1 DIFFUSE_TEX 0
 #pragma anki skip_mutation ALPHA_TEST 1 DIFFUSE_TEX 0
 
 
+#pragma anki technique GBufferLegacy vert mutators ANKI_VELOCITY ANKI_BONES DIFFUSE_TEX NORMAL_TEX PARALLAX ALPHA_TEST
+#pragma anki technique GBufferLegacy pixel
+
+#pragma anki technique ShadowsLegacy vert mutators ANKI_VELOCITY ANKI_BONES DIFFUSE_TEX PARALLAX ALPHA_TEST
+#pragma anki technique ShadowsLegacy pixel
+
+#pragma anki technique GBufferSwMeshletRendering vert mutators ANKI_VELOCITY ANKI_BONES DIFFUSE_TEX NORMAL_TEX PARALLAX ALPHA_TEST
+#pragma anki technique GBufferSwMeshletRendering pixel
+
+#pragma anki technique ShadowsSwMeshletRendering vert mutators ANKI_VELOCITY ANKI_BONES DIFFUSE_TEX PARALLAX ALPHA_TEST
+#pragma anki technique ShadowsSwMeshletRendering pixel
+
+#pragma anki technique GBufferMeshShaders mesh mutators ANKI_VELOCITY ANKI_BONES DIFFUSE_TEX NORMAL_TEX PARALLAX ALPHA_TEST
+#pragma anki technique GBufferMeshShaders pixel
+
+#pragma anki technique ShadowsMeshShaders mesh mutators ANKI_VELOCITY ANKI_BONES DIFFUSE_TEX PARALLAX ALPHA_TEST
+#pragma anki technique ShadowsMeshShaders pixel
+
+#pragma anki technique RtShadows ahit mutators ALPHA_TEST DIFFUSE_TEX
+#pragma anki technique RtShadows chit mutators
+
 #include <AnKi/Shaders/Include/MaterialTypes.h>
 #include <AnKi/Shaders/Include/MaterialTypes.h>
 #include <AnKi/Shaders/Include/GpuSceneFunctions.h>
 #include <AnKi/Shaders/Include/GpuSceneFunctions.h>
 #include <AnKi/Shaders/PackFunctions.hlsl>
 #include <AnKi/Shaders/PackFunctions.hlsl>
@@ -659,48 +680,3 @@ PixelOut main(
 	ANKI_MAYBE_UNUSED(barycentrics);
 	ANKI_MAYBE_UNUSED(barycentrics);
 }
 }
 #endif // ANKI_CLOSEST_HIT_SHADER
 #endif // ANKI_CLOSEST_HIT_SHADER
-
-// ===========================================================================
-// Define the techniques                                                     =
-// ===========================================================================
-#pragma anki technique_start vert GBufferLegacy uses_mutators ANKI_VELOCITY ANKI_BONES DIFFUSE_TEX NORMAL_TEX PARALLAX ALPHA_TEST
-#pragma anki technique_end vert GBufferLegacy
-
-#pragma anki technique_start vert ShadowsLegacy uses_mutators ANKI_VELOCITY ANKI_BONES DIFFUSE_TEX PARALLAX ALPHA_TEST
-#pragma anki technique_end vert ShadowsLegacy
-
-#pragma anki technique_start vert GBufferSwMeshletRendering uses_mutators ANKI_VELOCITY ANKI_BONES DIFFUSE_TEX NORMAL_TEX PARALLAX ALPHA_TEST
-#pragma anki technique_end vert GBufferSwMeshletRendering
-
-#pragma anki technique_start vert ShadowsSwMeshletRendering uses_mutators ANKI_VELOCITY ANKI_BONES DIFFUSE_TEX PARALLAX ALPHA_TEST
-#pragma anki technique_end vert ShadowsSwMeshletRendering
-
-#pragma anki technique_start mesh GBufferMeshShaders uses_mutators ANKI_VELOCITY ANKI_BONES DIFFUSE_TEX NORMAL_TEX PARALLAX ALPHA_TEST
-#pragma anki technique_end mesh GBufferMeshShaders
-
-#pragma anki technique_start mesh ShadowsMeshShaders uses_mutators ANKI_VELOCITY ANKI_BONES DIFFUSE_TEX PARALLAX ALPHA_TEST
-#pragma anki technique_end mesh ShadowsMeshShaders
-
-#pragma anki technique_start pixel GBufferLegacy
-#pragma anki technique_end pixel GBufferLegacy
-
-#pragma anki technique_start pixel ShadowsLegacy
-#pragma anki technique_end pixel ShadowsLegacy
-
-#pragma anki technique_start pixel GBufferMeshShaders
-#pragma anki technique_end pixel GBufferMeshShaders
-
-#pragma anki technique_start pixel ShadowsMeshShaders
-#pragma anki technique_end pixel ShadowsMeshShaders
-
-#pragma anki technique_start pixel GBufferSwMeshletRendering
-#pragma anki technique_end pixel GBufferSwMeshletRendering
-
-#pragma anki technique_start pixel ShadowsSwMeshletRendering
-#pragma anki technique_end pixel ShadowsSwMeshletRendering
-
-#pragma anki technique_start ahit RtShadows uses_mutators ALPHA_TEST DIFFUSE_TEX
-#pragma anki technique_end ahit RtShadows
-
-#pragma anki technique_start chit RtShadows uses_mutators
-#pragma anki technique_end chit RtShadows

+ 7 - 6
AnKi/Shaders/GBufferGpuParticles.ankiprog

@@ -3,6 +3,8 @@
 // Code licensed under the BSD License.
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 // http://www.anki3d.org/LICENSE
 
 
+#pragma anki technique GBuffer vert pixel
+
 #include <AnKi/Shaders/MaterialShadersCommon.hlsl>
 #include <AnKi/Shaders/MaterialShadersCommon.hlsl>
 
 
 #pragma anki struct AnKiLocalConstants
 #pragma anki struct AnKiLocalConstants
@@ -36,8 +38,7 @@ struct PixelOut
 	Vec2 m_color3 : SV_TARGET3;
 	Vec2 m_color3 : SV_TARGET3;
 };
 };
 
 
-#pragma anki technique_start vert GBuffer
-
+#if ANKI_VERTEX_SHADER
 VertOut main(VertIn input)
 VertOut main(VertIn input)
 {
 {
 	VertOut output;
 	VertOut output;
@@ -76,10 +77,10 @@ VertOut main(VertIn input)
 
 
 	return output;
 	return output;
 }
 }
-#pragma anki technique_end vert GBuffer
+#endif // ANKI_VERTEX_SHADER
 
 
-#pragma anki technique_start pixel GBuffer
-#include <AnKi/Shaders/PackFunctions.hlsl>
+#if ANKI_PIXEL_SHADER
+#	include <AnKi/Shaders/PackFunctions.hlsl>
 
 
 PixelOut main(VertOut input)
 PixelOut main(VertOut input)
 {
 {
@@ -101,4 +102,4 @@ PixelOut main(VertOut input)
 	packGBuffer(g, output.m_color0, output.m_color1, output.m_color2, output.m_color3);
 	packGBuffer(g, output.m_color0, output.m_color1, output.m_color2, output.m_color3);
 	return output;
 	return output;
 }
 }
-#pragma anki technique_end pixel GBuffer
+#endif // ANKI_PIXEL_SHADER

+ 8 - 9
AnKi/Shaders/GBufferPost.ankiprog

@@ -3,16 +3,15 @@
 // Code licensed under the BSD License.
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 // http://www.anki3d.org/LICENSE
 
 
-#include <AnKi/Shaders/QuadVert.hlsl>
+#pragma anki technique vert pixel
 
 
-#pragma anki technique_start vert
-#pragma anki technique_end vert
+#include <AnKi/Shaders/QuadVert.hlsl>
 
 
-#pragma anki technique_start pixel
-#include <AnKi/Shaders/PackFunctions.hlsl>
-#include <AnKi/Shaders/Functions.hlsl>
-#include <AnKi/Shaders/ClusteredShadingFunctions.hlsl>
-#include <AnKi/Shaders/Include/MiscRendererTypes.h>
+#if ANKI_PIXEL_SHADER
+#	include <AnKi/Shaders/PackFunctions.hlsl>
+#	include <AnKi/Shaders/Functions.hlsl>
+#	include <AnKi/Shaders/ClusteredShadingFunctions.hlsl>
+#	include <AnKi/Shaders/Include/MiscRendererTypes.h>
 
 
 SamplerState g_nearestAnyClampSampler : register(s0);
 SamplerState g_nearestAnyClampSampler : register(s0);
 Texture2D g_depthTex : register(t0);
 Texture2D g_depthTex : register(t0);
@@ -118,4 +117,4 @@ PixelOut main(VertOut input)
 	output.m_roughnessAndOther = roughnessAndOther;
 	output.m_roughnessAndOther = roughnessAndOther;
 	return output;
 	return output;
 }
 }
-#pragma anki technique_end pixel
+#endif // ANKI_PIXEL_SHADER

+ 12 - 13
AnKi/Shaders/GBufferVisualizeProbe.ankiprog

@@ -5,6 +5,8 @@
 
 
 #pragma anki mutator PROBE_TYPE 0 1
 #pragma anki mutator PROBE_TYPE 0 1
 
 
+#pragma anki technique vert pixel
+
 #include <AnKi/Shaders/Functions.hlsl>
 #include <AnKi/Shaders/Functions.hlsl>
 #include <AnKi/Shaders/PackFunctions.hlsl>
 #include <AnKi/Shaders/PackFunctions.hlsl>
 #include <AnKi/Shaders/VisibilityAndCollisionFunctions.hlsl>
 #include <AnKi/Shaders/VisibilityAndCollisionFunctions.hlsl>
@@ -53,7 +55,7 @@ struct PixelOut
 	F32 m_svDepth : SV_Depth;
 	F32 m_svDepth : SV_Depth;
 };
 };
 
 
-#pragma anki technique_start vert
+#if ANKI_VERTEX_SHADER
 
 
 UVec3 getCellCount(GpuSceneGlobalIlluminationProbe probe)
 UVec3 getCellCount(GpuSceneGlobalIlluminationProbe probe)
 {
 {
@@ -65,13 +67,13 @@ UVec3 getCellCount(GpuSceneGlobalIlluminationProbe probe)
 
 
 VertOut main(VertIn input)
 VertOut main(VertIn input)
 {
 {
-#if PROBE_TYPE == 0
+#	if PROBE_TYPE == 0
 	const GpuSceneGlobalIlluminationProbe probe = SBUFF(g_probes, g_consts.m_probeIdx);
 	const GpuSceneGlobalIlluminationProbe probe = SBUFF(g_probes, g_consts.m_probeIdx);
-#else
+#	else
 	const GpuSceneReflectionProbe probe = SBUFF(g_probes, g_consts.m_probeIdx);
 	const GpuSceneReflectionProbe probe = SBUFF(g_probes, g_consts.m_probeIdx);
-#endif
+#	endif
 
 
-#if PROBE_TYPE == 0
+#	if PROBE_TYPE == 0
 	// Compute the cell ID
 	// Compute the cell ID
 	const U32 cellIdx = input.m_svInstanceId;
 	const U32 cellIdx = input.m_svInstanceId;
 	const UVec3 cellCount = getCellCount(probe);
 	const UVec3 cellCount = getCellCount(probe);
@@ -84,9 +86,9 @@ VertOut main(VertIn input)
 
 
 	const Vec3 cellCenter = cellSize * Vec3(cellId) + probe.m_aabbMin + cellSize / 2.0;
 	const Vec3 cellCenter = cellSize * Vec3(cellId) + probe.m_aabbMin + cellSize / 2.0;
 	const Vec3 sphereCenter = cellCenter;
 	const Vec3 sphereCenter = cellCenter;
-#else
+#	else
 	const Vec3 sphereCenter = probe.m_position;
 	const Vec3 sphereCenter = probe.m_position;
-#endif
+#	endif
 
 
 	const Vec3 sphereMin = sphereCenter - g_consts.m_sphereRadius;
 	const Vec3 sphereMin = sphereCenter - g_consts.m_sphereRadius;
 	const Vec3 sphereMax = sphereCenter + g_consts.m_sphereRadius;
 	const Vec3 sphereMax = sphereCenter + g_consts.m_sphereRadius;
@@ -123,11 +125,9 @@ VertOut main(VertIn input)
 
 
 	return output;
 	return output;
 }
 }
+#endif // ANKI_VERTEX_SHADER
 
 
-#pragma anki technique_end vert
-
-#pragma anki technique_start pixel
-
+#if ANKI_PIXEL_SHADER
 PixelOut main(VertOut input)
 PixelOut main(VertOut input)
 {
 {
 	PixelOut output = (PixelOut)0;
 	PixelOut output = (PixelOut)0;
@@ -182,5 +182,4 @@ PixelOut main(VertOut input)
 
 
 	return output;
 	return output;
 }
 }
-
-#pragma anki technique_end pixel
+#endif // ANKI_PIXEL_SHADER

+ 1 - 3
AnKi/Shaders/GpuParticlesSimulation.ankiprog

@@ -5,7 +5,7 @@
 
 
 // This shader does a particle simulation
 // This shader does a particle simulation
 
 
-#pragma anki technique_start comp
+#pragma anki technique comp
 
 
 #include <AnKi/Shaders/Include/ParticleTypes.h>
 #include <AnKi/Shaders/Include/ParticleTypes.h>
 #include <AnKi/Shaders/Common.hlsl>
 #include <AnKi/Shaders/Common.hlsl>
@@ -138,5 +138,3 @@ void initParticle(UVec3 svDispatchThreadId, out GpuParticle p)
 	// Write back the particle
 	// Write back the particle
 	g_particles[particleIdx] = particle;
 	g_particles[particleIdx] = particle;
 }
 }
-
-#pragma anki technique_end comp

+ 1 - 3
AnKi/Shaders/GpuSceneMicroPatching.ankiprog

@@ -3,7 +3,7 @@
 // Code licensed under the BSD License.
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 // http://www.anki3d.org/LICENSE
 
 
-#pragma anki technique_start comp
+#pragma anki technique comp
 
 
 #include <AnKi/Shaders/Common.hlsl>
 #include <AnKi/Shaders/Common.hlsl>
 
 
@@ -26,5 +26,3 @@ RWStructuredBuffer<U32> g_dstBuffer : register(u0);
 
 
 	g_dstBuffer[dstDwordOffset + svGroupIndex] = g_srcBuffer[srcDwordOffset + svGroupIndex];
 	g_dstBuffer[dstDwordOffset + svGroupIndex] = g_srcBuffer[srcDwordOffset + svGroupIndex];
 }
 }
-
-#pragma anki technique_end comp

+ 1 - 3
AnKi/Shaders/GpuVisibilityAccelerationStructures.ankiprog

@@ -3,7 +3,7 @@
 // Code licensed under the BSD License.
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 // http://www.anki3d.org/LICENSE
 
 
-#pragma anki technique_start comp
+#pragma anki technique comp
 
 
 #include <AnKi/Shaders/Common.hlsl>
 #include <AnKi/Shaders/Common.hlsl>
 #include <AnKi/Shaders/Include/GpuSceneTypes.h>
 #include <AnKi/Shaders/Include/GpuSceneTypes.h>
@@ -144,5 +144,3 @@ ANKI_FAST_CONSTANTS(GpuVisibilityAccelerationStructuresConstants, g_consts)
 		}
 		}
 	}
 	}
 }
 }
-
-#pragma anki technique_end comp

+ 1 - 3
AnKi/Shaders/GpuVisibilityAccelerationStructuresZeroRemainingInstances.ankiprog

@@ -3,7 +3,7 @@
 // Code licensed under the BSD License.
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 // http://www.anki3d.org/LICENSE
 
 
-#pragma anki technique_start comp
+#pragma anki technique comp
 
 
 #include <AnKi/Shaders/Common.hlsl>
 #include <AnKi/Shaders/Common.hlsl>
 #include <AnKi/Shaders/Include/GpuSceneTypes.h>
 #include <AnKi/Shaders/Include/GpuSceneTypes.h>
@@ -28,5 +28,3 @@ RWStructuredBuffer<AccelerationStructureInstance> g_instances : register(u0);
 		g_instances[visibleInstances + svDispatchThreadId] = (AccelerationStructureInstance)0;
 		g_instances[visibleInstances + svDispatchThreadId] = (AccelerationStructureInstance)0;
 	}
 	}
 }
 }
-
-#pragma anki technique_end comp

+ 1 - 3
AnKi/Shaders/GpuVisibilityNonRenderables.ankiprog

@@ -10,7 +10,7 @@
 #pragma anki skip_mutation CPU_FEEDBACK 1 OBJECT_TYPE 1
 #pragma anki skip_mutation CPU_FEEDBACK 1 OBJECT_TYPE 1
 #pragma anki skip_mutation CPU_FEEDBACK 1 OBJECT_TYPE 2
 #pragma anki skip_mutation CPU_FEEDBACK 1 OBJECT_TYPE 2
 
 
-#pragma anki technique_start comp
+#pragma anki technique comp
 
 
 #include <AnKi/Shaders/Common.hlsl>
 #include <AnKi/Shaders/Common.hlsl>
 #include <AnKi/Shaders/Include/GpuSceneTypes.h>
 #include <AnKi/Shaders/Include/GpuSceneTypes.h>
@@ -143,5 +143,3 @@ Vec4 getSphere(GpuSceneGlobalIlluminationProbe l)
 		}
 		}
 	}
 	}
 }
 }
-
-#pragma anki technique_end comp

+ 1 - 3
AnKi/Shaders/GpuVisibilityStage1.ankiprog

@@ -13,7 +13,7 @@
 #pragma anki skip_mutation DISTANCE_TEST 1 HZB_TEST 1
 #pragma anki skip_mutation DISTANCE_TEST 1 HZB_TEST 1
 #pragma anki skip_mutation GATHER_MESHLETS 0 GATHER_LEGACY 0
 #pragma anki skip_mutation GATHER_MESHLETS 0 GATHER_LEGACY 0
 
 
-#pragma anki technique_start comp
+#pragma anki technique comp
 
 
 #include <AnKi/Shaders/Common.hlsl>
 #include <AnKi/Shaders/Common.hlsl>
 #include <AnKi/Shaders/Include/GpuSceneTypes.h>
 #include <AnKi/Shaders/Include/GpuSceneTypes.h>
@@ -359,5 +359,3 @@ Bool isVisible(GpuSceneRenderableBoundingVolume bvolume)
 		}
 		}
 	}
 	}
 }
 }
-
-#pragma anki technique_end comp

+ 42 - 40
AnKi/Shaders/GpuVisibilityStage2And3.ankiprog

@@ -8,6 +8,11 @@
 #pragma anki mutator MESH_SHADERS 0 1
 #pragma anki mutator MESH_SHADERS 0 1
 #pragma anki mutator STORE_MESHLETS_FAILED_HZB 0 1 // Two-phase occlusion culling
 #pragma anki mutator STORE_MESHLETS_FAILED_HZB 0 1 // Two-phase occlusion culling
 
 
+// This technique is used for legacy rendering. It gathers the visible renderables and places them into the correct buckets.
+#pragma anki technique Legacy comp mutators
+
+#pragma anki technique Meshlets comp mutators HZB_TEST PASSTHROUGH MESH_SHADERS STORE_MESHLETS_FAILED_HZB
+
 #include <AnKi/Shaders/Include/GpuSceneTypes.h>
 #include <AnKi/Shaders/Include/GpuSceneTypes.h>
 #include <AnKi/Shaders/Include/GpuVisibilityTypes.h>
 #include <AnKi/Shaders/Include/GpuVisibilityTypes.h>
 #include <AnKi/Shaders/VisibilityAndCollisionFunctions.hlsl>
 #include <AnKi/Shaders/VisibilityAndCollisionFunctions.hlsl>
@@ -15,9 +20,7 @@
 
 
 #define NUMTHREADS 64u
 #define NUMTHREADS 64u
 
 
-// This technique is used for legacy rendering. It gathers the visible renderables and places them into the correct buckets.
-#pragma anki technique_start comp Legacy uses_mutators
-
+#if ANKI_TECHNIQUE_Legacy
 struct DrawIndirectArgsWithPadding
 struct DrawIndirectArgsWithPadding
 {
 {
 	U32 m_vertexCount;
 	U32 m_vertexCount;
@@ -121,14 +124,14 @@ RWStructuredBuffer<U32> g_outOfMemoryBuffer : register(u4);
 	}
 	}
 }
 }
 
 
-#pragma anki technique_end comp Legacy
+#endif // ANKI_TECHNIQUE_Legacy
 
 
-#pragma anki technique_start comp Meshlets uses_mutators HZB_TEST PASSTHROUGH MESH_SHADERS STORE_MESHLETS_FAILED_HZB
+#if ANKI_TECHNIQUE_Meshlets
 
 
-#define MESHLET_BACKFACE_CULLING 0 // Doesn't work correctly for some reason
-#define MESHLET_OUTSIDE_OF_SCREEN_CULLING 1
-#define MESHLET_NO_SAMPLING_POINT_CULLING 1
-#define MESHLET_HZB_CULLING HZB_TEST
+#	define MESHLET_BACKFACE_CULLING 0 // Doesn't work correctly for some reason
+#	define MESHLET_OUTSIDE_OF_SCREEN_CULLING 1
+#	define MESHLET_NO_SAMPLING_POINT_CULLING 1
+#	define MESHLET_HZB_CULLING HZB_TEST
 
 
 // GPU scene
 // GPU scene
 StructuredBuffer<GpuSceneRenderable> g_renderables : register(t0);
 StructuredBuffer<GpuSceneRenderable> g_renderables : register(t0);
@@ -138,10 +141,10 @@ StructuredBuffer<Mat3x4> g_transforms : register(t2);
 // UGB
 // UGB
 StructuredBuffer<MeshletBoundingVolume> g_meshletBoundingVolumes : register(t3);
 StructuredBuffer<MeshletBoundingVolume> g_meshletBoundingVolumes : register(t3);
 
 
-#if MESHLET_HZB_CULLING
+#	if MESHLET_HZB_CULLING
 Texture2D<Vec4> g_hzbTexture : register(t4);
 Texture2D<Vec4> g_hzbTexture : register(t4);
 SamplerState g_nearestClampSampler : register(s0);
 SamplerState g_nearestClampSampler : register(s0);
-#endif
+#	endif
 
 
 // Prev stage results
 // Prev stage results
 RWStructuredBuffer<U32> g_counters : register(u0); // 2nd element is the visible meshlet count
 RWStructuredBuffer<U32> g_counters : register(u0); // 2nd element is the visible meshlet count
@@ -149,20 +152,20 @@ StructuredBuffer<U32> g_meshletPrefixSums : register(t5);
 StructuredBuffer<GpuVisibilityVisibleMeshletDesc> g_visibleMeshlets : register(t6);
 StructuredBuffer<GpuVisibilityVisibleMeshletDesc> g_visibleMeshlets : register(t6);
 
 
 // New results
 // New results
-#if MESH_SHADERS
+#	if MESH_SHADERS
 RWStructuredBuffer<DispatchIndirectArgs> g_dispatchMeshIndirectArgs : register(u1);
 RWStructuredBuffer<DispatchIndirectArgs> g_dispatchMeshIndirectArgs : register(u1);
-#else
+#	else
 RWStructuredBuffer<DrawIndirectArgs> g_indirectDrawArgs : register(u1);
 RWStructuredBuffer<DrawIndirectArgs> g_indirectDrawArgs : register(u1);
-#endif
+#	endif
 RWStructuredBuffer<GpuSceneMeshletInstance> g_meshletInstances : register(u2);
 RWStructuredBuffer<GpuSceneMeshletInstance> g_meshletInstances : register(u2);
 
 
 RWStructuredBuffer<U32> g_outOfMemoryBuffer : register(u3);
 RWStructuredBuffer<U32> g_outOfMemoryBuffer : register(u3);
 
 
-#if STORE_MESHLETS_FAILED_HZB
+#	if STORE_MESHLETS_FAILED_HZB
 RWStructuredBuffer<GpuVisibilityVisibleMeshletDesc> g_meshletsFailedHzb : register(u4);
 RWStructuredBuffer<GpuVisibilityVisibleMeshletDesc> g_meshletsFailedHzb : register(u4);
 
 
 RWStructuredBuffer<DispatchIndirectArgs> g_gpuVisIndirectDispatchArgs : register(u5);
 RWStructuredBuffer<DispatchIndirectArgs> g_gpuVisIndirectDispatchArgs : register(u5);
-#endif
+#	endif
 
 
 ANKI_FAST_CONSTANTS(GpuVisibilityMeshletConstants, g_consts)
 ANKI_FAST_CONSTANTS(GpuVisibilityMeshletConstants, g_consts)
 
 
@@ -170,16 +173,16 @@ Bool cullMeshlet(GpuSceneRenderable renderable, const MeshletBoundingVolume mesh
 {
 {
 	meshletCulledByHzb = false;
 	meshletCulledByHzb = false;
 
 
-#if !PASSTHROUGH
+#	if !PASSTHROUGH
 	const Mat3x4 worldTransform = SBUFF(g_transforms, renderable.m_worldTransformsIndex);
 	const Mat3x4 worldTransform = SBUFF(g_transforms, renderable.m_worldTransformsIndex);
 
 
-#	if MESHLET_BACKFACE_CULLING
+#		if MESHLET_BACKFACE_CULLING
 	const Vec4 coneDirAndAng = unpackSnorm4x8(meshletBoundingVol.m_coneDirection_R8G8B8_Snorm_cosHalfAngle_R8_Snorm);
 	const Vec4 coneDirAndAng = unpackSnorm4x8(meshletBoundingVol.m_coneDirection_R8G8B8_Snorm_cosHalfAngle_R8_Snorm);
 	if(cullBackfaceMeshlet(coneDirAndAng.xyz, coneDirAndAng.w, meshletBoundingVol.m_coneApex, worldTransform, g_consts.m_cameraPos))
 	if(cullBackfaceMeshlet(coneDirAndAng.xyz, coneDirAndAng.w, meshletBoundingVol.m_coneApex, worldTransform, g_consts.m_cameraPos))
 	{
 	{
 		return true;
 		return true;
 	}
 	}
-#	endif
+#		endif
 
 
 	const Mat4 wordTransform4 = {worldTransform.m_row0, worldTransform.m_row1, worldTransform.m_row2, Vec4(0.0f, 0.0f, 0.0f, 1.0f)};
 	const Mat4 wordTransform4 = {worldTransform.m_row0, worldTransform.m_row1, worldTransform.m_row2, Vec4(0.0f, 0.0f, 0.0f, 1.0f)};
 	const Mat4 mvp = mul(g_consts.m_viewProjectionMatrix, wordTransform4);
 	const Mat4 mvp = mul(g_consts.m_viewProjectionMatrix, wordTransform4);
@@ -188,15 +191,15 @@ Bool cullMeshlet(GpuSceneRenderable renderable, const MeshletBoundingVolume mesh
 	F32 aabbMinDepth;
 	F32 aabbMinDepth;
 	projectAabb(meshletBoundingVol.m_aabbMin, meshletBoundingVol.m_aabbMax, mvp, minNdc, maxNdc, aabbMinDepth);
 	projectAabb(meshletBoundingVol.m_aabbMin, meshletBoundingVol.m_aabbMax, mvp, minNdc, maxNdc, aabbMinDepth);
 
 
-#	if MESHLET_OUTSIDE_OF_SCREEN_CULLING
+#		if MESHLET_OUTSIDE_OF_SCREEN_CULLING
 	// Outside of the screen
 	// Outside of the screen
 	if(any(minNdc > 1.0f) || any(maxNdc < -1.0f))
 	if(any(minNdc > 1.0f) || any(maxNdc < -1.0f))
 	{
 	{
 		return true;
 		return true;
 	}
 	}
-#	endif
+#		endif
 
 
-#	if MESHLET_NO_SAMPLING_POINT_CULLING
+#		if MESHLET_NO_SAMPLING_POINT_CULLING
 	// Sampling points test
 	// Sampling points test
 	const Vec2 windowCoordsMin = ndcToUv(minNdc) * g_consts.m_viewportSizef;
 	const Vec2 windowCoordsMin = ndcToUv(minNdc) * g_consts.m_viewportSizef;
 	const Vec2 windowCoordsMax = ndcToUv(maxNdc) * g_consts.m_viewportSizef;
 	const Vec2 windowCoordsMax = ndcToUv(maxNdc) * g_consts.m_viewportSizef;
@@ -204,14 +207,14 @@ Bool cullMeshlet(GpuSceneRenderable renderable, const MeshletBoundingVolume mesh
 	{
 	{
 		return true;
 		return true;
 	}
 	}
-#	endif
+#		endif
 
 
-#	if MESHLET_HZB_CULLING
+#		if MESHLET_HZB_CULLING
 	meshletCulledByHzb = (renderable.m_boneTransformsOffset == 0u && cullHzb(minNdc, maxNdc, aabbMinDepth, g_hzbTexture, g_nearestClampSampler));
 	meshletCulledByHzb = (renderable.m_boneTransformsOffset == 0u && cullHzb(minNdc, maxNdc, aabbMinDepth, g_hzbTexture, g_nearestClampSampler));
 	return meshletCulledByHzb;
 	return meshletCulledByHzb;
-#	endif
+#		endif
 
 
-#endif // !PASSTHROUGH
+#	endif // !PASSTHROUGH
 
 
 	return false;
 	return false;
 }
 }
@@ -239,27 +242,27 @@ Bool cullMeshlet(GpuSceneRenderable renderable, const MeshletBoundingVolume mesh
 		if(!cull)
 		if(!cull)
 		{
 		{
 			U32 instanceIdx;
 			U32 instanceIdx;
-#if MESH_SHADERS
+#	if MESH_SHADERS
 			InterlockedAdd(SBUFF(g_dispatchMeshIndirectArgs, renderStateBucket).m_threadGroupCountX, 1u, instanceIdx);
 			InterlockedAdd(SBUFF(g_dispatchMeshIndirectArgs, renderStateBucket).m_threadGroupCountX, 1u, instanceIdx);
-#else
+#	else
 			InterlockedAdd(SBUFF(g_indirectDrawArgs, renderStateBucket).m_instanceCount, 1u, instanceIdx);
 			InterlockedAdd(SBUFF(g_indirectDrawArgs, renderStateBucket).m_instanceCount, 1u, instanceIdx);
-#endif
+#	endif
 
 
 			if(instanceIdx == 0)
 			if(instanceIdx == 0)
 			{
 			{
 				// First instance, init the drawcall
 				// First instance, init the drawcall
-#if MESH_SHADERS
+#	if MESH_SHADERS
 				SBUFF(g_dispatchMeshIndirectArgs, renderStateBucket).m_threadGroupCountY = 1u;
 				SBUFF(g_dispatchMeshIndirectArgs, renderStateBucket).m_threadGroupCountY = 1u;
 				SBUFF(g_dispatchMeshIndirectArgs, renderStateBucket).m_threadGroupCountZ = 1u;
 				SBUFF(g_dispatchMeshIndirectArgs, renderStateBucket).m_threadGroupCountZ = 1u;
-#else
+#	else
 				SBUFF(g_indirectDrawArgs, renderStateBucket).m_firstInstance = SBUFF(g_meshletPrefixSums, renderStateBucket);
 				SBUFF(g_indirectDrawArgs, renderStateBucket).m_firstInstance = SBUFF(g_meshletPrefixSums, renderStateBucket);
-#endif
+#	endif
 			}
 			}
 
 
-#if !MESH_SHADERS
+#	if !MESH_SHADERS
 			// Try to limit the vertex size
 			// Try to limit the vertex size
 			InterlockedMax(SBUFF(g_indirectDrawArgs, renderStateBucket).m_vertexCount, meshletBoundingVol.m_primitiveCount * 3u);
 			InterlockedMax(SBUFF(g_indirectDrawArgs, renderStateBucket).m_vertexCount, meshletBoundingVol.m_primitiveCount * 3u);
-#endif
+#	endif
 
 
 			GpuSceneMeshletInstance instance;
 			GpuSceneMeshletInstance instance;
 			instance.m_worldTransformsIndex_25bit_meshletPrimitiveCount_7bit = renderable.m_worldTransformsIndex << 7u;
 			instance.m_worldTransformsIndex_25bit_meshletPrimitiveCount_7bit = renderable.m_worldTransformsIndex << 7u;
@@ -271,17 +274,17 @@ Bool cullMeshlet(GpuSceneRenderable renderable, const MeshletBoundingVolume mesh
 			SBUFF(g_meshletInstances, SBUFF(g_meshletPrefixSums, renderStateBucket) + instanceIdx) = instance;
 			SBUFF(g_meshletInstances, SBUFF(g_meshletPrefixSums, renderStateBucket) + instanceIdx) = instance;
 		}
 		}
 
 
-#if STORE_MESHLETS_FAILED_HZB
+#	if STORE_MESHLETS_FAILED_HZB
 		if(cull && meshletCulledByHzb)
 		if(cull && meshletCulledByHzb)
 		{
 		{
 			U32 idx;
 			U32 idx;
 			InterlockedAdd(SBUFF(g_counters, (U32)GpuVisibilityCounter::kMeshletsCulledByHzbCount), 1u, idx);
 			InterlockedAdd(SBUFF(g_counters, (U32)GpuVisibilityCounter::kMeshletsCulledByHzbCount), 1u, idx);
 			SBUFF(g_meshletsFailedHzb, idx) = desc;
 			SBUFF(g_meshletsFailedHzb, idx) = desc;
 		}
 		}
-#endif
+#	endif
 	}
 	}
 
 
-#if STORE_MESHLETS_FAILED_HZB
+#	if STORE_MESHLETS_FAILED_HZB
 	// Sync to make sure all the atomic ops have finished before the following code reads them
 	// Sync to make sure all the atomic ops have finished before the following code reads them
 	AllMemoryBarrierWithGroupSync();
 	AllMemoryBarrierWithGroupSync();
 
 
@@ -308,7 +311,6 @@ Bool cullMeshlet(GpuSceneRenderable renderable, const MeshletBoundingVolume mesh
 			SBUFF(g_counters, (U32)GpuVisibilityCounter::kMeshletsSurvivingStage1Count) = meshletsNeedReTestingCount;
 			SBUFF(g_counters, (U32)GpuVisibilityCounter::kMeshletsSurvivingStage1Count) = meshletsNeedReTestingCount;
 		}
 		}
 	}
 	}
-#endif
+#	endif
 }
 }
-
-#pragma anki technique_end comp Meshlets
+#endif // ANKI_TECHNIQUE_Meshlets

+ 2 - 3
AnKi/Shaders/HzbGenPyramid.ankiprog

@@ -6,7 +6,8 @@
 #pragma anki mutator REDUCTION_TYPE 0 1 // 0: min 1: max
 #pragma anki mutator REDUCTION_TYPE 0 1 // 0: min 1: max
 #pragma anki mutator MIN_MAX_SAMPLER 0 1
 #pragma anki mutator MIN_MAX_SAMPLER 0 1
 
 
-#pragma anki technique_start comp
+#pragma anki technique comp
+
 #include <AnKi/Shaders/Common.hlsl>
 #include <AnKi/Shaders/Common.hlsl>
 
 
 struct Constants
 struct Constants
@@ -113,5 +114,3 @@ AF4 SpdReduce4(AF4 v0, AF4 v1, AF4 v2, AF4 v3)
 	const UVec2 offset = UVec2(0, 0);
 	const UVec2 offset = UVec2(0, 0);
 	SpdDownsample(AU2(svGroupId.xy), AU1(svGroupIndex), AU1(g_consts.m_mipmapCount), AU1(g_consts.m_threadGroupCount), slice, offset);
 	SpdDownsample(AU2(svGroupId.xy), AU1(svGroupIndex), AU1(g_consts.m_mipmapCount), AU1(g_consts.m_threadGroupCount), slice, offset);
 }
 }
-
-#pragma anki technique_end comp

+ 1 - 3
AnKi/Shaders/HzbMaxDepth.ankiprog

@@ -5,7 +5,7 @@
 
 
 #include <AnKi/Shaders/Functions.hlsl>
 #include <AnKi/Shaders/Functions.hlsl>
 
 
-#pragma anki technique_start comp
+#pragma anki technique comp
 
 
 Texture2D<Vec4> g_depthRt : register(t0);
 Texture2D<Vec4> g_depthRt : register(t0);
 SamplerState g_linearAnyClampSampler : register(s0);
 SamplerState g_linearAnyClampSampler : register(s0);
@@ -46,5 +46,3 @@ groupshared U32 s_maxDepth;
 		g_maxDepthStorageTex[svGroupId] = asfloat(s_maxDepth);
 		g_maxDepthStorageTex[svGroupId] = asfloat(s_maxDepth);
 	}
 	}
 }
 }
-
-#pragma anki technique_end comp

+ 6 - 8
AnKi/Shaders/HzbMaxDepthProject.ankiprog

@@ -5,9 +5,9 @@
 
 
 // This shader draws tile aligned boxes in order to fill the HZB buffer for cascaded shadows
 // This shader draws tile aligned boxes in order to fill the HZB buffer for cascaded shadows
 
 
-#include <AnKi/Shaders/Functions.hlsl>
+#pragma anki technique vert pixel
 
 
-#pragma anki technique_start vert
+#include <AnKi/Shaders/Functions.hlsl>
 
 
 Texture2D<Vec4> g_maxDepthRt : register(t0);
 Texture2D<Vec4> g_maxDepthRt : register(t0);
 
 
@@ -22,6 +22,7 @@ struct Constants
 };
 };
 ANKI_FAST_CONSTANTS(Constants, g_consts)
 ANKI_FAST_CONSTANTS(Constants, g_consts)
 
 
+#if ANKI_VERTEX_SHADER
 Vec4 main(U32 svVertexId : SV_VERTEXID, U32 svInstanceId : SV_INSTANCEID) : SV_POSITION
 Vec4 main(U32 svVertexId : SV_VERTEXID, U32 svInstanceId : SV_INSTANCEID) : SV_POSITION
 {
 {
 	UVec2 maxDepthRtSize;
 	UVec2 maxDepthRtSize;
@@ -65,13 +66,10 @@ Vec4 main(U32 svVertexId : SV_VERTEXID, U32 svInstanceId : SV_INSTANCEID) : SV_P
 	// Unproject and project
 	// Unproject and project
 	return mul(g_consts.m_reprojectionMat, Vec4(ndc, 1.0));
 	return mul(g_consts.m_reprojectionMat, Vec4(ndc, 1.0));
 }
 }
+#endif // ANKI_VERTEX_SHADER
 
 
-#pragma anki technique_end vert
-
-#pragma anki technique_start pixel
-
+#if ANKI_PIXEL_SHADER
 void main()
 void main()
 {
 {
 }
 }
-
-#pragma anki technique_end pixel
+#endif // ANKI_PIXEL_SHADER

+ 1 - 3
AnKi/Shaders/IrradianceDice.ankiprog

@@ -9,7 +9,7 @@
 #pragma anki mutator STORE_LOCATION 0 1 // 0: in a 3D texture, 1: In an SSBO
 #pragma anki mutator STORE_LOCATION 0 1 // 0: in a 3D texture, 1: In an SSBO
 #pragma anki mutator SECOND_BOUNCE 0 1
 #pragma anki mutator SECOND_BOUNCE 0 1
 
 
-#pragma anki technique_start comp
+#pragma anki technique comp
 
 
 #include <AnKi/Shaders/Functions.hlsl>
 #include <AnKi/Shaders/Functions.hlsl>
 #include <AnKi/Shaders/PackFunctions.hlsl>
 #include <AnKi/Shaders/PackFunctions.hlsl>
@@ -209,5 +209,3 @@ RVec3 sampleLightShadingTexture(const U32 face, UVec3 svGroupThreadId)
 #endif
 #endif
 	}
 	}
 }
 }
-
-#pragma anki technique_end comp

+ 6 - 5
AnKi/Shaders/LensFlareSprite.ankiprog

@@ -3,6 +3,8 @@
 // Code licensed under the BSD License.
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 // http://www.anki3d.org/LICENSE
 
 
+#pragma anki technique vert pixel
+
 #include <AnKi/Shaders/Common.hlsl>
 #include <AnKi/Shaders/Common.hlsl>
 #include <AnKi/Shaders/Include/MiscRendererTypes.h>
 #include <AnKi/Shaders/Include/MiscRendererTypes.h>
 
 
@@ -13,7 +15,7 @@ struct VertOut
 	Vec4 m_svPosition : SV_POSITION;
 	Vec4 m_svPosition : SV_POSITION;
 };
 };
 
 
-#pragma anki technique_start vert
+#if ANKI_VERTEX_SHADER
 
 
 // The block contains data for all flares
 // The block contains data for all flares
 StructuredBuffer<LensFlareSprite> g_sprites : register(t0);
 StructuredBuffer<LensFlareSprite> g_sprites : register(t0);
@@ -35,10 +37,9 @@ VertOut main(U32 svVertexId : SV_VERTEXID, U32 svInstanceId : SV_INSTANCEID)
 
 
 	return output;
 	return output;
 }
 }
-#pragma anki technique_end vert
-
-#pragma anki technique_start pixel
+#endif // ANKI_VERTEX_SHADER
 
 
+#if ANKI_PIXEL_SHADER
 SamplerState g_trilinearRepeatSampler : register(s0);
 SamplerState g_trilinearRepeatSampler : register(s0);
 Texture2DArray<RVec4> g_tex : register(t1);
 Texture2DArray<RVec4> g_tex : register(t1);
 
 
@@ -47,4 +48,4 @@ RVec4 main(VertOut input) : SV_TARGET0
 	const RVec4 col = g_tex.Sample(g_trilinearRepeatSampler, input.m_uv);
 	const RVec4 col = g_tex.Sample(g_trilinearRepeatSampler, input.m_uv);
 	return col * input.m_color;
 	return col * input.m_color;
 }
 }
-#pragma anki technique_end pixel
+#endif

+ 2 - 2
AnKi/Shaders/LensFlareUpdateIndirectInfo.ankiprog

@@ -3,7 +3,8 @@
 // Code licensed under the BSD License.
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 // http://www.anki3d.org/LICENSE
 
 
-#pragma anki technique_start comp
+#pragma anki technique comp
+
 #include <AnKi/Shaders/Common.hlsl>
 #include <AnKi/Shaders/Common.hlsl>
 
 
 #define THREAD_COUNT_SQRT 8
 #define THREAD_COUNT_SQRT 8
@@ -58,4 +59,3 @@ groupshared U32 s_maxDepth;
 		g_indirectInfo[flareIdx].m_firstInstance = 0u;
 		g_indirectInfo[flareIdx].m_firstInstance = 0u;
 	}
 	}
 }
 }
-#pragma anki technique_end comp

+ 15 - 16
AnKi/Shaders/LightShading.ankiprog

@@ -3,16 +3,15 @@
 // Code licensed under the BSD License.
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 // http://www.anki3d.org/LICENSE
 
 
-#include <AnKi/Shaders/QuadVert.hlsl>
+#pragma anki technique vert pixel
 
 
-#pragma anki technique_start vert
-#pragma anki technique_end vert
+#include <AnKi/Shaders/QuadVert.hlsl>
 
 
-#pragma anki technique_start pixel
-#include <AnKi/Shaders/PackFunctions.hlsl>
-#include <AnKi/Shaders/Functions.hlsl>
-#include <AnKi/Shaders/RtShadows.hlsl>
-#include <AnKi/Shaders/ClusteredShadingFunctions.hlsl>
+#if ANKI_PIXEL_SHADER
+#	include <AnKi/Shaders/PackFunctions.hlsl>
+#	include <AnKi/Shaders/Functions.hlsl>
+#	include <AnKi/Shaders/RtShadows.hlsl>
+#	include <AnKi/Shaders/ClusteredShadingFunctions.hlsl>
 
 
 ConstantBuffer<GlobalRendererConstants> g_globalConstants : register(b0);
 ConstantBuffer<GlobalRendererConstants> g_globalConstants : register(b0);
 StructuredBuffer<PointLight> g_pointLights : register(t0);
 StructuredBuffer<PointLight> g_pointLights : register(t0);
@@ -34,13 +33,13 @@ Texture2D<RVec4> g_ssrTex : register(t11);
 Texture2D<RVec4> g_integrationLut : register(t12);
 Texture2D<RVec4> g_integrationLut : register(t12);
 
 
 // Common code for lighting
 // Common code for lighting
-#define LIGHTING_COMMON_BRDF() \
-	const RVec3 frag2Light = light.m_position - worldPos; \
-	const RVec3 l = normalize(frag2Light); \
-	const RVec3 specC = specularIsotropicLobe(gbuffer, viewDir, l); \
-	const RVec3 diffC = diffuseLobe(gbuffer.m_diffuse); \
-	const RF32 att = computeAttenuationFactor(light.m_radius, frag2Light); \
-	RF32 lambert = max(0.0, dot(gbuffer.m_normal, l));
+#	define LIGHTING_COMMON_BRDF() \
+		const RVec3 frag2Light = light.m_position - worldPos; \
+		const RVec3 l = normalize(frag2Light); \
+		const RVec3 specC = specularIsotropicLobe(gbuffer, viewDir, l); \
+		const RVec3 diffC = diffuseLobe(gbuffer.m_diffuse); \
+		const RF32 att = computeAttenuationFactor(light.m_radius, frag2Light); \
+		RF32 lambert = max(0.0, dot(gbuffer.m_normal, l));
 
 
 RVec4 main(VertOut input) : SV_TARGET0
 RVec4 main(VertOut input) : SV_TARGET0
 {
 {
@@ -255,4 +254,4 @@ RVec4 main(VertOut input) : SV_TARGET0
 	outColor = min(outColor, RVec3(kMaxRF32, kMaxRF32, kMaxRF32));
 	outColor = min(outColor, RVec3(kMaxRF32, kMaxRF32, kMaxRF32));
 	return RVec4(outColor, 0.0);
 	return RVec4(outColor, 0.0);
 }
 }
-#pragma anki technique_end pixel
+#endif // ANKI_PIXEL_SHADER

+ 10 - 12
AnKi/Shaders/LightShadingApplyFog.ankiprog

@@ -3,13 +3,12 @@
 // Code licensed under the BSD License.
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 // http://www.anki3d.org/LICENSE
 
 
-#include <AnKi/Shaders/QuadVert.hlsl>
+#pragma anki technique vert pixel
 
 
-#pragma anki technique_start vert
-#pragma anki technique_end vert
+#include <AnKi/Shaders/QuadVert.hlsl>
 
 
-#pragma anki technique_start pixel
-#include <AnKi/Shaders/Functions.hlsl>
+#if ANKI_PIXEL_SHADER
+#	include <AnKi/Shaders/Functions.hlsl>
 
 
 SamplerState g_nearestAnyClampSampler : register(s0);
 SamplerState g_nearestAnyClampSampler : register(s0);
 SamplerState g_linearAnyClampSampler : register(s1);
 SamplerState g_linearAnyClampSampler : register(s1);
@@ -26,11 +25,11 @@ struct Constants
 ANKI_FAST_CONSTANTS(Constants, g_consts)
 ANKI_FAST_CONSTANTS(Constants, g_consts)
 
 
 // Workaround validation errors
 // Workaround validation errors
-#if ANKI_GR_BACKEND_DIRECT3D
-#	define OUT_TYPE Vec4
-#else
-#	define OUT_TYPE RVec4
-#endif
+#	if ANKI_GR_BACKEND_DIRECT3D
+#		define OUT_TYPE Vec4
+#	else
+#		define OUT_TYPE RVec4
+#	endif
 
 
 OUT_TYPE main(VertOut input) : SV_TARGET0
 OUT_TYPE main(VertOut input) : SV_TARGET0
 {
 {
@@ -53,5 +52,4 @@ OUT_TYPE main(VertOut input) : SV_TARGET0
 	// Apply the fog
 	// Apply the fog
 	return OUT_TYPE(inScattering, transmittance);
 	return OUT_TYPE(inScattering, transmittance);
 }
 }
-
-#pragma anki technique_end pixel
+#endif // ANKI_PIXEL_SHADER

+ 16 - 19
AnKi/Shaders/LightShadingSkybox.ankiprog

@@ -5,20 +5,18 @@
 
 
 #pragma anki mutator METHOD 0 1 2 // 0: solid colod, 1: 2D image, 2: generated
 #pragma anki mutator METHOD 0 1 2 // 0: solid colod, 1: 2D image, 2: generated
 
 
+#pragma anki technique vert pixel
+
 #define CUSTOM_DEPTH 1.0
 #define CUSTOM_DEPTH 1.0
 #include <AnKi/Shaders/QuadVert.hlsl>
 #include <AnKi/Shaders/QuadVert.hlsl>
 
 
-#pragma anki technique_start vert
-#pragma anki technique_end vert
-
-#pragma anki technique_start pixel
+#if ANKI_PIXEL_SHADER
+#	include <AnKi/Shaders/Include/MiscRendererTypes.h>
+#	include <AnKi/Shaders/Functions.hlsl>
+#	include <AnKi/Shaders/TonemappingFunctions.hlsl>
+#	include <AnKi/Shaders/Sky.hlsl>
 
 
-#include <AnKi/Shaders/Include/MiscRendererTypes.h>
-#include <AnKi/Shaders/Functions.hlsl>
-#include <AnKi/Shaders/TonemappingFunctions.hlsl>
-#include <AnKi/Shaders/Sky.hlsl>
-
-#if METHOD == 0
+#	if METHOD == 0
 struct Constants
 struct Constants
 {
 {
 	RVec3 m_solidColor;
 	RVec3 m_solidColor;
@@ -26,7 +24,7 @@ struct Constants
 };
 };
 
 
 ANKI_FAST_CONSTANTS(Constants, g_consts)
 ANKI_FAST_CONSTANTS(Constants, g_consts)
-#elif METHOD == 1
+#	elif METHOD == 1
 SamplerState g_trilinearAnySampler : register(s0);
 SamplerState g_trilinearAnySampler : register(s0);
 Texture2D<RVec4> g_envMapTex : register(t0);
 Texture2D<RVec4> g_envMapTex : register(t0);
 
 
@@ -45,19 +43,19 @@ struct Constants
 };
 };
 
 
 ANKI_FAST_CONSTANTS(Constants, g_consts)
 ANKI_FAST_CONSTANTS(Constants, g_consts)
-#else
+#	else
 SamplerState g_linearAnyClampSampler : register(s0);
 SamplerState g_linearAnyClampSampler : register(s0);
 Texture2D<Vec4> g_skyLut : register(t0);
 Texture2D<Vec4> g_skyLut : register(t0);
 ConstantBuffer<GlobalRendererConstants> g_consts : register(b0);
 ConstantBuffer<GlobalRendererConstants> g_consts : register(b0);
-#endif
+#	endif
 
 
 RVec4 main(VertOut input) : SV_TARGET0
 RVec4 main(VertOut input) : SV_TARGET0
 {
 {
 	const Vec2 uv = input.m_uv;
 	const Vec2 uv = input.m_uv;
-#if METHOD == 0
+#	if METHOD == 0
 	ANKI_MAYBE_UNUSED(uv);
 	ANKI_MAYBE_UNUSED(uv);
 	const RVec3 output = g_consts.m_solidColor;
 	const RVec3 output = g_consts.m_solidColor;
-#elif METHOD == 1
+#	elif METHOD == 1
 	const F32 depth = 1.0;
 	const F32 depth = 1.0;
 	const Vec2 ndc = uvToNdc(uv);
 	const Vec2 ndc = uvToNdc(uv);
 	const Vec4 worldPos4 = mul(g_consts.m_invertedViewProjectionJitterMat, Vec4(ndc, depth, 1.0));
 	const Vec4 worldPos4 = mul(g_consts.m_invertedViewProjectionJitterMat, Vec4(ndc, depth, 1.0));
@@ -76,7 +74,7 @@ RVec4 main(VertOut input) : SV_TARGET0
 	const F32 bias = (maxD > 0.9) ? -100.0f : 0.0f;
 	const F32 bias = (maxD > 0.9) ? -100.0f : 0.0f;
 
 
 	const RVec3 output = g_envMapTex.SampleBias(g_trilinearAnySampler, uv3, bias).rgb * g_consts.m_scale + g_consts.m_bias;
 	const RVec3 output = g_envMapTex.SampleBias(g_trilinearAnySampler, uv3, bias).rgb * g_consts.m_scale + g_consts.m_bias;
-#else
+#	else
 	const F32 depth = 1.0;
 	const F32 depth = 1.0;
 	const Vec2 ndc = uvToNdc(uv);
 	const Vec2 ndc = uvToNdc(uv);
 	const Vec4 worldPos4 = mul(g_consts.m_matrices.m_invertedViewProjectionJitter, Vec4(ndc, depth, 1.0));
 	const Vec4 worldPos4 = mul(g_consts.m_matrices.m_invertedViewProjectionJitter, Vec4(ndc, depth, 1.0));
@@ -86,9 +84,8 @@ RVec4 main(VertOut input) : SV_TARGET0
 
 
 	const RVec3 output = computeSkyColor(g_skyLut, g_linearAnyClampSampler, eyeToFrag, -g_consts.m_directionalLight.m_direction,
 	const RVec3 output = computeSkyColor(g_skyLut, g_linearAnyClampSampler, eyeToFrag, -g_consts.m_directionalLight.m_direction,
 										 g_consts.m_directionalLight.m_power, true);
 										 g_consts.m_directionalLight.m_power, true);
-#endif
+#	endif
 
 
 	return RVec4(output, 0.0);
 	return RVec4(output, 0.0);
 }
 }
-
-#pragma anki technique_end pixel
+#endif // ANKI_PIXEL_SHADER

+ 4 - 5
AnKi/Shaders/MipmapGenerator.ankiprog

@@ -3,12 +3,11 @@
 // Code licensed under the BSD License.
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 // http://www.anki3d.org/LICENSE
 
 
-#include <AnKi/Shaders/QuadVert.hlsl>
+#pragma anki technique vert pixel
 
 
-#pragma anki technique_start vert
-#pragma anki technique_end vert
+#include <AnKi/Shaders/QuadVert.hlsl>
 
 
-#pragma anki technique_start pixel
+#if ANKI_PIXEL_SHADER
 Texture2D<Vec4> g_inputTex : register(t0);
 Texture2D<Vec4> g_inputTex : register(t0);
 SamplerState g_linearAnyClampSampler : register(s0);
 SamplerState g_linearAnyClampSampler : register(s0);
 
 
@@ -16,4 +15,4 @@ Vec4 main(VertOut input) : SV_TARGET0
 {
 {
 	return g_inputTex.SampleLevel(g_linearAnyClampSampler, input.m_uv, 0.0f);
 	return g_inputTex.SampleLevel(g_linearAnyClampSampler, input.m_uv, 0.0f);
 }
 }
-#pragma anki technique_end pixel
+#endif // ANKI_PIXEL_SHADER

+ 2 - 9
AnKi/Shaders/MotionVectors.ankiprog

@@ -5,6 +5,8 @@
 
 
 // Calculates the motion vectors that will be used to sample from the previous frame
 // Calculates the motion vectors that will be used to sample from the previous frame
 
 
+#pragma anki technique vert pixel comp
+
 #include <AnKi/Shaders/QuadVert.hlsl>
 #include <AnKi/Shaders/QuadVert.hlsl>
 
 
 #if ANKI_COMPUTE_SHADER || ANKI_PIXEL_SHADER
 #if ANKI_COMPUTE_SHADER || ANKI_PIXEL_SHADER
@@ -81,12 +83,3 @@ PixelOut main(VertOut input)
 #	endif
 #	endif
 }
 }
 #endif // ANKI_COMPUTE_SHADER || ANKI_PIXEL_SHADER
 #endif // ANKI_COMPUTE_SHADER || ANKI_PIXEL_SHADER
-
-#pragma anki technique_start vert
-#pragma anki technique_end vert
-
-#pragma anki technique_start pixel
-#pragma anki technique_end pixel
-
-#pragma anki technique_start comp
-#pragma anki technique_end comp

+ 6 - 8
AnKi/Shaders/RtShadows.ankiprog

@@ -5,7 +5,7 @@
 
 
 #pragma anki mutator RAYS_PER_PIXEL 1 2 4 8
 #pragma anki mutator RAYS_PER_PIXEL 1 2 4 8
 
 
-#pragma anki technique_start rgen RtShadows
+#pragma anki technique RtShadows rgen miss
 
 
 #include <AnKi/Shaders/ImportanceSampling.hlsl>
 #include <AnKi/Shaders/ImportanceSampling.hlsl>
 #include <AnKi/Shaders/PackFunctions.hlsl>
 #include <AnKi/Shaders/PackFunctions.hlsl>
@@ -13,7 +13,8 @@
 #include <AnKi/Shaders/MaterialShadersCommon.hlsl>
 #include <AnKi/Shaders/MaterialShadersCommon.hlsl>
 #include <AnKi/Shaders/ClusteredShadingFunctions.hlsl>
 #include <AnKi/Shaders/ClusteredShadingFunctions.hlsl>
 
 
-#define SPACE space2
+#if ANKI_RAY_GEN_SHADER
+#	define SPACE space2
 
 
 ConstantBuffer<GlobalRendererConstants> g_globalRendererConstants : register(b0, SPACE);
 ConstantBuffer<GlobalRendererConstants> g_globalRendererConstants : register(b0, SPACE);
 
 
@@ -130,14 +131,11 @@ Vec3 genRandomDirection(U32 rayIdx, Vec2 uv)
 	// Store the moments
 	// Store the moments
 	g_momentsImage[DispatchRaysIndex().xy] = Vec4(moments, 0.0, 0.0);
 	g_momentsImage[DispatchRaysIndex().xy] = Vec4(moments, 0.0, 0.0);
 }
 }
-#pragma anki technique_end rgen RtShadows
-
-#pragma anki technique_start miss RtShadows
-
-#include <AnKi/Shaders/RtShadows.hlsl>
+#endif // ANKI_RAY_GEN_SHADER
 
 
+#if ANKI_MISS_SHADER
 [shader("miss")] void main(inout RayPayload payload)
 [shader("miss")] void main(inout RayPayload payload)
 {
 {
 	payload.m_shadowFactor = 1.0;
 	payload.m_shadowFactor = 1.0;
 }
 }
-#pragma anki technique_end miss RtShadows
+#endif // ANKI_MISS_SHADER

+ 1 - 3
AnKi/Shaders/RtShadowsDenoise.ankiprog

@@ -5,7 +5,7 @@
 
 
 #pragma anki mutator BLUR_ORIENTATION 0 1
 #pragma anki mutator BLUR_ORIENTATION 0 1
 
 
-#pragma anki technique_start comp
+#pragma anki technique comp
 
 
 #include <AnKi/Shaders/BilateralFilter.hlsl>
 #include <AnKi/Shaders/BilateralFilter.hlsl>
 #include <AnKi/Shaders/PackFunctions.hlsl>
 #include <AnKi/Shaders/PackFunctions.hlsl>
@@ -135,5 +135,3 @@ F32 computeVarianceCenter(Vec2 uv)
 	shadowFactor /= weight;
 	shadowFactor /= weight;
 	g_storageTex[svDispatchThreadId.xy] = shadowFactor;
 	g_storageTex[svDispatchThreadId.xy] = shadowFactor;
 }
 }
-
-#pragma anki technique_end comp

+ 1 - 3
AnKi/Shaders/RtShadowsSbtBuild.ankiprog

@@ -6,7 +6,7 @@
 #include <AnKi/Shaders/RtShadows.hlsl>
 #include <AnKi/Shaders/RtShadows.hlsl>
 #include <AnKi/Shaders/Include/GpuSceneTypes.h>
 #include <AnKi/Shaders/Include/GpuSceneTypes.h>
 
 
-#pragma anki technique_start comp
+#pragma anki technique comp
 
 
 StructuredBuffer<GpuSceneRenderable> g_renderables : register(t0);
 StructuredBuffer<GpuSceneRenderable> g_renderables : register(t0);
 ByteAddressBuffer g_gpuScene : register(t1);
 ByteAddressBuffer g_gpuScene : register(t1);
@@ -47,5 +47,3 @@ ANKI_FAST_CONSTANTS(RtShadowsSbtBuildConstants, g_consts)
 	g_sbtBuffer[sbtDwordOffset++] = renderable.m_meshLodsIndex;
 	g_sbtBuffer[sbtDwordOffset++] = renderable.m_meshLodsIndex;
 	g_sbtBuffer[sbtDwordOffset] = 0;
 	g_sbtBuffer[sbtDwordOffset] = 0;
 }
 }
-
-#pragma anki technique_end comp

+ 1 - 3
AnKi/Shaders/RtShadowsSetupSbtBuild.ankiprog

@@ -5,7 +5,7 @@
 
 
 #include <AnKi/Shaders/RtShadows.hlsl>
 #include <AnKi/Shaders/RtShadows.hlsl>
 
 
-#pragma anki technique_start comp
+#pragma anki technique comp
 
 
 StructuredBuffer<U32> g_visibleRenderableIndices : register(t0); // 1st element is the count
 StructuredBuffer<U32> g_visibleRenderableIndices : register(t0); // 1st element is the count
 RWStructuredBuffer<DispatchIndirectArgs> g_args : register(u0);
 RWStructuredBuffer<DispatchIndirectArgs> g_args : register(u0);
@@ -23,5 +23,3 @@ RWStructuredBuffer<DispatchIndirectArgs> g_args : register(u0);
 
 
 	g_args[0] = args;
 	g_args[0] = args;
 }
 }
-
-#pragma anki technique_end comp

+ 1 - 2
AnKi/Shaders/RtShadowsSvgfAtrous.ankiprog

@@ -5,7 +5,7 @@
 
 
 #pragma anki mutator LAST_PASS 0 1
 #pragma anki mutator LAST_PASS 0 1
 
 
-#pragma anki technique_start comp
+#pragma anki technique comp
 
 
 #include <AnKi/Shaders/RtShadows.hlsl>
 #include <AnKi/Shaders/RtShadows.hlsl>
 #include <AnKi/Shaders/BilateralFilter.hlsl>
 #include <AnKi/Shaders/BilateralFilter.hlsl>
@@ -148,4 +148,3 @@ F32 computeVarianceCenter(Vec2 uv)
 	g_varianceStorageTex[svDispatchThreadId.xy] = Vec4(sumVariance, 0.0, 0.0, 0.0);
 	g_varianceStorageTex[svDispatchThreadId.xy] = Vec4(sumVariance, 0.0, 0.0, 0.0);
 #endif
 #endif
 }
 }
-#pragma anki technique_end comp

+ 1 - 2
AnKi/Shaders/RtShadowsSvgfVariance.ankiprog

@@ -3,7 +3,7 @@
 // Code licensed under the BSD License.
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 // http://www.anki3d.org/LICENSE
 
 
-#pragma anki technique_start comp
+#pragma anki technique comp
 
 
 #include <AnKi/Shaders/RtShadows.hlsl>
 #include <AnKi/Shaders/RtShadows.hlsl>
 #include <AnKi/Shaders/BilateralFilter.hlsl>
 #include <AnKi/Shaders/BilateralFilter.hlsl>
@@ -118,4 +118,3 @@ Vec3 toViewspace(Vec2 uv, F32 depth)
 	g_shadowUav[svDispatchThreadId] = outShadowFactor;
 	g_shadowUav[svDispatchThreadId] = outShadowFactor;
 	g_varianceUav[svDispatchThreadId] = Vec4(outVariance, 0.0, 0.0, 0.0);
 	g_varianceUav[svDispatchThreadId] = Vec4(outVariance, 0.0, 0.0, 0.0);
 }
 }
-#pragma anki technique_end comp

+ 1 - 3
AnKi/Shaders/RtShadowsUpscale.ankiprog

@@ -3,7 +3,7 @@
 // Code licensed under the BSD License.
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 // http://www.anki3d.org/LICENSE
 
 
-#pragma anki technique_start comp
+#pragma anki technique comp
 
 
 #include <AnKi/Shaders/RtShadows.hlsl>
 #include <AnKi/Shaders/RtShadows.hlsl>
 #include <AnKi/Shaders/Functions.hlsl>
 #include <AnKi/Shaders/Functions.hlsl>
@@ -56,5 +56,3 @@ Texture2D<Vec4> g_fullDepthTex : register(t2);
 
 
 	g_fullShadowStorageTex[svDispatchThreadId.xy] = sumShadowFactor;
 	g_fullShadowStorageTex[svDispatchThreadId.xy] = sumShadowFactor;
 }
 }
-
-#pragma anki technique_end comp

+ 5 - 5
AnKi/Shaders/ShadowMappingClearDepth.ankiprog

@@ -5,8 +5,9 @@
 
 
 #include <AnKi/Shaders/Common.hlsl>
 #include <AnKi/Shaders/Common.hlsl>
 
 
-#pragma anki technique_start vert
+#pragma anki technique vert pixel
 
 
+#if ANKI_VERTEX_SHADER
 Vec4 main(U32 svVertexId : SV_VERTEXID) : SV_POSITION
 Vec4 main(U32 svVertexId : SV_VERTEXID) : SV_POSITION
 {
 {
 	const Vec2 uv = Vec2(svVertexId & 1, svVertexId >> 1) * 2.0;
 	const Vec2 uv = Vec2(svVertexId & 1, svVertexId >> 1) * 2.0;
@@ -14,11 +15,10 @@ Vec4 main(U32 svVertexId : SV_VERTEXID) : SV_POSITION
 
 
 	return Vec4(pos, 1.0, 1.0);
 	return Vec4(pos, 1.0, 1.0);
 }
 }
+#endif // ANKI_VERTEX_SHADER
 
 
-#pragma anki technique_end vert
-
-#pragma anki technique_start pixel
+#if ANKI_PIXEL_SHADER
 void main()
 void main()
 {
 {
 }
 }
-#pragma anki technique_end pixel
+#endif // ANKI_PIXEL_SHADER

+ 1 - 3
AnKi/Shaders/ShadowMappingVetVisibility.ankiprog

@@ -5,7 +5,7 @@
 
 
 // A very simle compute shader that checks if the light shadows needs rendering or not.
 // A very simle compute shader that checks if the light shadows needs rendering or not.
 
 
-#pragma anki technique_start comp
+#pragma anki technique comp
 
 
 #include <AnKi/Shaders/Common.hlsl>
 #include <AnKi/Shaders/Common.hlsl>
 #include <AnKi/Shaders/Include/GpuVisibilityTypes.h>
 #include <AnKi/Shaders/Include/GpuVisibilityTypes.h>
@@ -81,5 +81,3 @@ groupshared U32 s_renderLight;
 		}
 		}
 	}
 	}
 }
 }
-
-#pragma anki technique_end comp

+ 2 - 9
AnKi/Shaders/ShadowmapsResolve.ankiprog

@@ -6,6 +6,8 @@
 #pragma anki mutator QUALITY 0 1 2 // No filtering, PCF, PCSS
 #pragma anki mutator QUALITY 0 1 2 // No filtering, PCF, PCSS
 #pragma anki mutator DIRECTIONAL_LIGHT_SHADOW_RESOLVED 0 1
 #pragma anki mutator DIRECTIONAL_LIGHT_SHADOW_RESOLVED 0 1
 
 
+#pragma anki technique vert pixel comp
+
 #include <AnKi/Shaders/QuadVert.hlsl>
 #include <AnKi/Shaders/QuadVert.hlsl>
 #if ANKI_COMPUTE_SHADER || ANKI_PIXEL_SHADER
 #if ANKI_COMPUTE_SHADER || ANKI_PIXEL_SHADER
 #	include <AnKi/Shaders/ClusteredShadingFunctions.hlsl>
 #	include <AnKi/Shaders/ClusteredShadingFunctions.hlsl>
@@ -236,12 +238,3 @@ RVec4 main(VertOut input) : SV_TARGET0
 #	endif
 #	endif
 }
 }
 #endif // ANKI_COMPUTE_SHADER || ANKI_PIXEL_SHADER
 #endif // ANKI_COMPUTE_SHADER || ANKI_PIXEL_SHADER
-
-#pragma anki technique_start vert
-#pragma anki technique_end vert
-
-#pragma anki technique_start pixel
-#pragma anki technique_end pixel
-
-#pragma anki technique_start comp
-#pragma anki technique_end comp

+ 17 - 13
AnKi/Shaders/Sky.ankiprog

@@ -5,6 +5,11 @@
 
 
 // Shamelessly copied from https://www.shadertoy.com/view/slSXRW
 // Shamelessly copied from https://www.shadertoy.com/view/slSXRW
 
 
+#pragma anki technique SkyTransmittanceLut comp
+#pragma anki technique SkyMultipleScatteringLut comp
+#pragma anki technique SkyLut comp
+#pragma anki technique ComputeSunColor comp
+
 #include <AnKi/Shaders/Sky.hlsl>
 #include <AnKi/Shaders/Sky.hlsl>
 
 
 constexpr Vec3 kRayleighScatteringBase = Vec3(5.802f, 13.558f, 33.1f);
 constexpr Vec3 kRayleighScatteringBase = Vec3(5.802f, 13.558f, 33.1f);
@@ -142,7 +147,7 @@ F32 getRayleighPhase(F32 cosTheta)
 // ===========================================================================
 // ===========================================================================
 // Transmitance LUT                                                          =
 // Transmitance LUT                                                          =
 // ===========================================================================
 // ===========================================================================
-#pragma anki technique_start comp SkyTransmittanceLut
+#if ANKI_TECHNIQUE_SkyTransmittanceLut
 
 
 RWTexture2D<Vec4> g_tLutStorageTex : register(u0);
 RWTexture2D<Vec4> g_tLutStorageTex : register(u0);
 
 
@@ -190,13 +195,12 @@ Vec3 getSunTransmittance(Vec3 pos, Vec3 dirToSun)
 
 
 	g_tLutStorageTex[svDispatchThreadId] = Vec4(getSunTransmittance(pos, dirToSun), 1.0f);
 	g_tLutStorageTex[svDispatchThreadId] = Vec4(getSunTransmittance(pos, dirToSun), 1.0f);
 }
 }
-
-#pragma anki technique_end comp SkyTransmittanceLut
+#endif // ANKI_TECHNIQUE_SkyTransmittanceLut
 
 
 // ===========================================================================
 // ===========================================================================
 // Multiple scattering LUT                                                   =
 // Multiple scattering LUT                                                   =
 // ===========================================================================
 // ===========================================================================
-#pragma anki technique_start comp SkyMultipleScatteringLut
+#if ANKI_TECHNIQUE_SkyMultipleScatteringLut
 
 
 Texture2D<Vec4> g_tLutTex : register(t0);
 Texture2D<Vec4> g_tLutTex : register(t0);
 SamplerState g_linearAnyClampSampler : register(s0);
 SamplerState g_linearAnyClampSampler : register(s0);
@@ -317,15 +321,15 @@ void getMulScattValues(Vec3 pos, Vec3 dirToSun, out Vec3 lumTotal, out Vec3 fms)
 	g_mLutStorageTex[svDispatchThreadId] = Vec4(psi, 0.0f);
 	g_mLutStorageTex[svDispatchThreadId] = Vec4(psi, 0.0f);
 }
 }
 
 
-#pragma anki technique_end comp SkyMultipleScatteringLut
+#endif // ANKI_TECHNIQUE_SkyMultipleScatteringLut
 
 
 // ===========================================================================
 // ===========================================================================
 // Sky LUT                                                                   =
 // Sky LUT                                                                   =
 // ===========================================================================
 // ===========================================================================
-#pragma anki technique_start comp SkyLut
+#if ANKI_TECHNIQUE_SkyLut
 
 
-#include <AnKi/Shaders/Include/MiscRendererTypes.h>
-#include <AnKi/Shaders/TonemappingFunctions.hlsl>
+#	include <AnKi/Shaders/Include/MiscRendererTypes.h>
+#	include <AnKi/Shaders/TonemappingFunctions.hlsl>
 
 
 Texture2D<Vec4> g_tLutTex : register(t0);
 Texture2D<Vec4> g_tLutTex : register(t0);
 Texture2D<Vec4> g_mLutTex : register(t1);
 Texture2D<Vec4> g_mLutTex : register(t1);
@@ -416,15 +420,15 @@ Vec3 raymarchScattering(Vec3 pos, Vec3 rayDir, Vec3 dirToSun, F32 tMax, F32 numS
 	g_skyLutStorageTex[svDispatchThreadId] = Vec4(lum, 0.0);
 	g_skyLutStorageTex[svDispatchThreadId] = Vec4(lum, 0.0);
 }
 }
 
 
-#pragma anki technique_end comp SkyLut
+#endif // ANKI_TECHNIQUE_SkyLut
 
 
 // ===========================================================================
 // ===========================================================================
 // Compute sun color                                                         =
 // Compute sun color                                                         =
 // ===========================================================================
 // ===========================================================================
-#pragma anki technique_start comp ComputeSunColor
+#if ANKI_TECHNIQUE_ComputeSunColor
 
 
-#include <AnKi/Shaders/Include/MiscRendererTypes.h>
-#include <AnKi/Shaders/TonemappingFunctions.hlsl>
+#	include <AnKi/Shaders/Include/MiscRendererTypes.h>
+#	include <AnKi/Shaders/TonemappingFunctions.hlsl>
 
 
 Texture2D<Vec4> g_tLutTex : register(t0);
 Texture2D<Vec4> g_tLutTex : register(t0);
 globallycoherent RWStructuredBuffer<GlobalRendererConstants> g_globalConstants : register(u0);
 globallycoherent RWStructuredBuffer<GlobalRendererConstants> g_globalConstants : register(u0);
@@ -437,4 +441,4 @@ globallycoherent RWStructuredBuffer<GlobalRendererConstants> g_globalConstants :
 	g_globalConstants[0].m_directionalLight.m_diffuseColor = Vec4(sunPower * sunTransmittance, 0.0f);
 	g_globalConstants[0].m_directionalLight.m_diffuseColor = Vec4(sunPower * sunTransmittance, 0.0f);
 }
 }
 
 
-#pragma anki technique_end comp ComputeSunColor
+#endif // ANKI_TECHNIQUE_ComputeSunColor

+ 4 - 30
AnKi/Shaders/Ssao.ankiprog

@@ -7,6 +7,10 @@
 
 
 #pragma anki mutator SPATIAL_DENOISE_QUALITY 0 1
 #pragma anki mutator SPATIAL_DENOISE_QUALITY 0 1
 
 
+#pragma anki technique Ssao vert pixel comp mutators
+#pragma anki technique SsaoSpatialDenoise vert pixel comp
+#pragma anki technique SsaoTemporalDenoise vert pixel comp
+
 #include <AnKi/Shaders/QuadVert.hlsl>
 #include <AnKi/Shaders/QuadVert.hlsl>
 
 
 // ===========================================================================
 // ===========================================================================
@@ -344,33 +348,3 @@ RVec4 main(VertOut input) : SV_TARGET0
 #	endif
 #	endif
 }
 }
 #endif
 #endif
-
-// ===========================================================================
-// Techniques                                                                =
-// ===========================================================================
-#pragma anki technique_start vert Ssao uses_mutators
-#pragma anki technique_end vert Ssao
-
-#pragma anki technique_start pixel Ssao uses_mutators
-#pragma anki technique_end pixel Ssao
-
-#pragma anki technique_start comp Ssao
-#pragma anki technique_end comp Ssao
-
-#pragma anki technique_start vert SsaoSpatialDenoise
-#pragma anki technique_end vert SsaoSpatialDenoise
-
-#pragma anki technique_start pixel SsaoSpatialDenoise
-#pragma anki technique_end pixel SsaoSpatialDenoise
-
-#pragma anki technique_start comp SsaoSpatialDenoise
-#pragma anki technique_end comp SsaoSpatialDenoise
-
-#pragma anki technique_start vert SsaoTemporalDenoise
-#pragma anki technique_end vert SsaoTemporalDenoise
-
-#pragma anki technique_start pixel SsaoTemporalDenoise
-#pragma anki technique_end pixel SsaoTemporalDenoise
-
-#pragma anki technique_start comp SsaoTemporalDenoise
-#pragma anki technique_end comp SsaoTemporalDenoise

+ 2 - 12
AnKi/Shaders/Ssr.ankiprog

@@ -5,6 +5,8 @@
 
 
 // Screen space reflections
 // Screen space reflections
 
 
+#pragma anki technique Ssr vert pixel comp
+
 #include <AnKi/Shaders/QuadVert.hlsl>
 #include <AnKi/Shaders/QuadVert.hlsl>
 
 
 // ===========================================================================
 // ===========================================================================
@@ -152,15 +154,3 @@ RVec4 main(VertOut input) : SV_TARGET0
 }
 }
 
 
 #endif // ANKI_TECHNIQUE_Ssr && (ANKI_COMPUTE_SHADER || ANKI_PIXEL_SHADER)
 #endif // ANKI_TECHNIQUE_Ssr && (ANKI_COMPUTE_SHADER || ANKI_PIXEL_SHADER)
-
-// ===========================================================================
-// Techniques                                                                =
-// ===========================================================================
-#pragma anki technique_start vert Ssr
-#pragma anki technique_end vert Ssr
-
-#pragma anki technique_start pixel Ssr
-#pragma anki technique_end pixel Ssr
-
-#pragma anki technique_start comp Ssr
-#pragma anki technique_end comp Ssr

+ 2 - 9
AnKi/Shaders/TemporalAA.ankiprog

@@ -6,6 +6,8 @@
 #pragma anki mutator VARIANCE_CLIPPING 0 1
 #pragma anki mutator VARIANCE_CLIPPING 0 1
 #pragma anki mutator YCBCR 0 1
 #pragma anki mutator YCBCR 0 1
 
 
+#pragma anki technique vert pixel comp
+
 #include <AnKi/Shaders/QuadVert.hlsl>
 #include <AnKi/Shaders/QuadVert.hlsl>
 #if ANKI_COMPUTE_SHADER || ANKI_PIXEL_SHADER
 #if ANKI_COMPUTE_SHADER || ANKI_PIXEL_SHADER
 #	include <AnKi/Shaders/Functions.hlsl>
 #	include <AnKi/Shaders/Functions.hlsl>
@@ -119,12 +121,3 @@ PixelOut main(VertOut input)
 #	endif
 #	endif
 }
 }
 #endif // ANKI_COMPUTE_SHADER || ANKI_PIXEL_SHADER
 #endif // ANKI_COMPUTE_SHADER || ANKI_PIXEL_SHADER
-
-#pragma anki technique_start vert
-#pragma anki technique_end vert
-
-#pragma anki technique_start pixel
-#pragma anki technique_end pixel
-
-#pragma anki technique_start comp
-#pragma anki technique_end comp

+ 2 - 9
AnKi/Shaders/Tonemap.ankiprog

@@ -5,6 +5,8 @@
 
 
 // Does tonemapping
 // Does tonemapping
 
 
+#pragma anki technique vert pixel comp
+
 #include <AnKi/Shaders/QuadVert.hlsl>
 #include <AnKi/Shaders/QuadVert.hlsl>
 #if ANKI_COMPUTE_SHADER || ANKI_PIXEL_SHADER
 #if ANKI_COMPUTE_SHADER || ANKI_PIXEL_SHADER
 #	include <AnKi/Shaders/Functions.hlsl>
 #	include <AnKi/Shaders/Functions.hlsl>
@@ -56,12 +58,3 @@ RVec3 main(VertOut input) : SV_TARGET0
 #	endif
 #	endif
 }
 }
 #endif // ANKI_COMPUTE_SHADER || ANKI_PIXEL_SHADER
 #endif // ANKI_COMPUTE_SHADER || ANKI_PIXEL_SHADER
-
-#pragma anki technique_start vert
-#pragma anki technique_end vert
-
-#pragma anki technique_start pixel
-#pragma anki technique_end pixel
-
-#pragma anki technique_start comp
-#pragma anki technique_end comp

+ 1 - 2
AnKi/Shaders/TonemappingAverageLuminance.ankiprog

@@ -3,7 +3,7 @@
 // Code licensed under the BSD License.
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 // http://www.anki3d.org/LICENSE
 
 
-#pragma anki technique_start comp
+#pragma anki technique comp
 
 
 #include <AnKi/Shaders/TonemappingFunctions.hlsl>
 #include <AnKi/Shaders/TonemappingFunctions.hlsl>
 
 
@@ -92,4 +92,3 @@ groupshared F32 s_avgLum[THREAD_COUNT_X * THREAD_COUNT_Y];
 		writeExposureAndAverageLuminance(computeExposure(finalAvgLum, 0.0f), finalAvgLum);
 		writeExposureAndAverageLuminance(computeExposure(finalAvgLum, 0.0f), finalAvgLum);
 	}
 	}
 }
 }
-#pragma anki technique_end comp

+ 14 - 18
AnKi/Shaders/TraditionalDeferredShading.ankiprog

@@ -7,18 +7,15 @@
 
 
 #pragma anki mutator SPECULAR 0 1
 #pragma anki mutator SPECULAR 0 1
 
 
-#include <AnKi/Shaders/QuadVert.hlsl>
+#pragma anki technique vert pixel
 
 
-// VERT
-#pragma anki technique_start vert
-#pragma anki technique_end vert
+#include <AnKi/Shaders/QuadVert.hlsl>
 
 
-// FRAG
-#pragma anki technique_start pixel
-#include <AnKi/Shaders/PackFunctions.hlsl>
-#include <AnKi/Shaders/LightFunctions.hlsl>
-#include <AnKi/Shaders/Include/TraditionalDeferredShadingTypes.h>
-#include <AnKi/Shaders/Include/GpuSceneTypes.h>
+#if ANKI_PIXEL_SHADER
+#	include <AnKi/Shaders/PackFunctions.hlsl>
+#	include <AnKi/Shaders/LightFunctions.hlsl>
+#	include <AnKi/Shaders/Include/TraditionalDeferredShadingTypes.h>
+#	include <AnKi/Shaders/Include/GpuSceneTypes.h>
 
 
 ConstantBuffer<TraditionalDeferredShadingConstants> g_consts : register(b0);
 ConstantBuffer<TraditionalDeferredShadingConstants> g_consts : register(b0);
 
 
@@ -82,11 +79,11 @@ Vec4 main(VertOut input) : SV_TARGET0
 		const RF32 lambert = dot(l, gbuffer.m_normal);
 		const RF32 lambert = dot(l, gbuffer.m_normal);
 		const RF32 factor = shadowFactor * max(gbuffer.m_subsurface, lambert);
 		const RF32 factor = shadowFactor * max(gbuffer.m_subsurface, lambert);
 
 
-#if SPECULAR == 1
+#	if SPECULAR == 1
 		const Vec3 specC = specularIsotropicLobe(gbuffer, viewDir, l);
 		const Vec3 specC = specularIsotropicLobe(gbuffer, viewDir, l);
-#else
+#	else
 		const Vec3 specC = Vec3(0.0, 0.0, 0.0);
 		const Vec3 specC = Vec3(0.0, 0.0, 0.0);
-#endif
+#	endif
 		outColor += (specC + diffC) * g_globalRendererConsts.m_directionalLight.m_diffuseColor * factor;
 		outColor += (specC + diffC) * g_globalRendererConsts.m_directionalLight.m_diffuseColor * factor;
 	}
 	}
 
 
@@ -107,16 +104,15 @@ Vec4 main(VertOut input) : SV_TARGET0
 							 : 1.0f;
 							 : 1.0f;
 		const F32 factor = att * spot * max(lambert, gbuffer.m_subsurface);
 		const F32 factor = att * spot * max(lambert, gbuffer.m_subsurface);
 
 
-#if SPECULAR == 1
+#	if SPECULAR == 1
 		const Vec3 specC = specularIsotropicLobe(gbuffer, viewDir, l);
 		const Vec3 specC = specularIsotropicLobe(gbuffer, viewDir, l);
-#else
+#	else
 		const Vec3 specC = Vec3(0.0, 0.0, 0.0);
 		const Vec3 specC = Vec3(0.0, 0.0, 0.0);
-#endif
+#	endif
 
 
 		outColor += (specC + diffC) * light.m_diffuseColor * factor;
 		outColor += (specC + diffC) * light.m_diffuseColor * factor;
 	}
 	}
 
 
 	return Vec4(outColor, 0.0);
 	return Vec4(outColor, 0.0);
 }
 }
-
-#pragma anki technique_end pixel
+#endif // ANKI_PIXEL_SHADER

+ 16 - 18
AnKi/Shaders/TraditionalDeferredShadingSkybox.ankiprog

@@ -5,31 +5,29 @@
 
 
 #pragma anki mutator METHOD 0 1 2 // 0: solid colod, 1: 2D image, 2: Generated
 #pragma anki mutator METHOD 0 1 2 // 0: solid colod, 1: 2D image, 2: Generated
 
 
-#include <AnKi/Shaders/QuadVert.hlsl>
-
-#pragma anki technique_start vert
-#pragma anki technique_end vert
+#pragma anki technique vert pixel
 
 
-#pragma anki technique_start pixel
+#include <AnKi/Shaders/QuadVert.hlsl>
 
 
-#include <AnKi/Shaders/Functions.hlsl>
-#include <AnKi/Shaders/Sky.hlsl>
-#include <AnKi/Shaders/TonemappingFunctions.hlsl>
-#include <AnKi/Shaders/Include/TraditionalDeferredShadingTypes.h>
-#include <AnKi/Shaders/Include/MiscRendererTypes.h>
+#if ANKI_PIXEL_SHADER
+#	include <AnKi/Shaders/Functions.hlsl>
+#	include <AnKi/Shaders/Sky.hlsl>
+#	include <AnKi/Shaders/TonemappingFunctions.hlsl>
+#	include <AnKi/Shaders/Include/TraditionalDeferredShadingTypes.h>
+#	include <AnKi/Shaders/Include/MiscRendererTypes.h>
 
 
 ANKI_FAST_CONSTANTS(TraditionalDeferredSkyboxConstants, g_consts)
 ANKI_FAST_CONSTANTS(TraditionalDeferredSkyboxConstants, g_consts)
 
 
 SamplerState g_nearestAnyClampSampler : register(s0);
 SamplerState g_nearestAnyClampSampler : register(s0);
 Texture2D g_depthTex : register(t0);
 Texture2D g_depthTex : register(t0);
 
 
-#if METHOD == 1
+#	if METHOD == 1
 SamplerState g_trilinearAnySampler : register(s1);
 SamplerState g_trilinearAnySampler : register(s1);
 Texture2D<RVec4> g_envMapTex : register(t1);
 Texture2D<RVec4> g_envMapTex : register(t1);
-#elif METHOD == 2
+#	elif METHOD == 2
 SamplerState g_linearAnyClampSampler : register(s1);
 SamplerState g_linearAnyClampSampler : register(s1);
 Texture2D<Vec4> g_skyLut : register(t1);
 Texture2D<Vec4> g_skyLut : register(t1);
-#endif
+#	endif
 
 
 ConstantBuffer<GlobalRendererConstants> g_globalRendererConsts : register(b0);
 ConstantBuffer<GlobalRendererConstants> g_globalRendererConsts : register(b0);
 
 
@@ -42,10 +40,10 @@ Vec4 main(VertOut input) : SV_TARGET0
 		discard;
 		discard;
 	}
 	}
 
 
-#if METHOD == 0
+#	if METHOD == 0
 	ANKI_MAYBE_UNUSED(uv);
 	ANKI_MAYBE_UNUSED(uv);
 	const Vec3 outColor = g_consts.m_solidColor;
 	const Vec3 outColor = g_consts.m_solidColor;
-#elif METHOD == 1
+#	elif METHOD == 1
 	const F32 depthFar = 1.0;
 	const F32 depthFar = 1.0;
 	const Vec2 ndc = uvToNdc(uv);
 	const Vec2 ndc = uvToNdc(uv);
 	const Vec4 worldPos4 = mul(g_consts.m_invertedViewProjectionMat, Vec4(ndc, depthFar, 1.0));
 	const Vec4 worldPos4 = mul(g_consts.m_invertedViewProjectionMat, Vec4(ndc, depthFar, 1.0));
@@ -55,7 +53,7 @@ Vec4 main(VertOut input) : SV_TARGET0
 
 
 	const Vec2 uv2 = equirectangularMapping(eyeToFrag);
 	const Vec2 uv2 = equirectangularMapping(eyeToFrag);
 	const Vec3 outColor = g_envMapTex.Sample(g_trilinearAnySampler, uv2).rgb * g_consts.m_scale + g_consts.m_bias;
 	const Vec3 outColor = g_envMapTex.Sample(g_trilinearAnySampler, uv2).rgb * g_consts.m_scale + g_consts.m_bias;
-#else
+#	else
 	const Vec2 ndc = uvToNdc(uv);
 	const Vec2 ndc = uvToNdc(uv);
 	const Vec4 worldPos4 = mul(g_consts.m_invertedViewProjectionMat, Vec4(ndc, depth, 1.0));
 	const Vec4 worldPos4 = mul(g_consts.m_invertedViewProjectionMat, Vec4(ndc, depth, 1.0));
 	const Vec3 worldPos = worldPos4.xyz / worldPos4.w;
 	const Vec3 worldPos = worldPos4.xyz / worldPos4.w;
@@ -66,9 +64,9 @@ Vec4 main(VertOut input) : SV_TARGET0
 
 
 	const Vec3 outColor =
 	const Vec3 outColor =
 		computeSkyColor(g_skyLut, g_linearAnyClampSampler, eyeToFrag, -g_globalRendererConsts.m_directionalLight.m_direction, sunPower, false);
 		computeSkyColor(g_skyLut, g_linearAnyClampSampler, eyeToFrag, -g_globalRendererConsts.m_directionalLight.m_direction, sunPower, false);
-#endif
+#	endif
 
 
 	return Vec4(outColor, 0.0);
 	return Vec4(outColor, 0.0);
 }
 }
 
 
-#pragma anki technique_end pixel
+#endif // ANKI_PIXEL_SHADER

+ 13 - 13
AnKi/Shaders/Ui.ankiprog

@@ -5,6 +5,8 @@
 
 
 #pragma anki mutator TEXTURE_TYPE 0 1 // 0: no tex, 1: rgba tex
 #pragma anki mutator TEXTURE_TYPE 0 1 // 0: no tex, 1: rgba tex
 
 
+#pragma anki technique vert pixel
+
 #include <AnKi/Shaders/Common.hlsl>
 #include <AnKi/Shaders/Common.hlsl>
 
 
 // Workaround validation errors
 // Workaround validation errors
@@ -32,7 +34,7 @@ struct VertOut
 	Vec4 m_svPosition : SV_POSITION;
 	Vec4 m_svPosition : SV_POSITION;
 };
 };
 
 
-#pragma anki technique_start vert
+#if ANKI_VERTEX_SHADER
 
 
 struct Constants
 struct Constants
 {
 {
@@ -44,9 +46,9 @@ VertOut main(VertIn input)
 {
 {
 	VertOut output;
 	VertOut output;
 
 
-#if TEXTURE_TYPE > 0
+#	if TEXTURE_TYPE > 0
 	output.m_uv = input.m_uv;
 	output.m_uv = input.m_uv;
-#endif
+#	endif
 	output.m_color = input.m_color;
 	output.m_color = input.m_color;
 
 
 	const Vec2 pos = g_consts.m_transform.xy * input.m_position + g_consts.m_transform.zw;
 	const Vec2 pos = g_consts.m_transform.xy * input.m_position + g_consts.m_transform.zw;
@@ -54,22 +56,20 @@ VertOut main(VertIn input)
 
 
 	return output;
 	return output;
 }
 }
-#pragma anki technique_end vert
-
-#pragma anki technique_start pixel
+#endif // ANKI_VERTEX_SHADER
 
 
-#if TEXTURE_TYPE > 0
+#if ANKI_PIXEL_SHADER
+#	if TEXTURE_TYPE > 0
 SamplerState g_trilinearRepeatSampler : register(s0);
 SamplerState g_trilinearRepeatSampler : register(s0);
 Texture2D g_tex : register(t0);
 Texture2D g_tex : register(t0);
-#endif
+#	endif
 
 
 OUT_TYPE main(VertOut input) : SV_TARGET0
 OUT_TYPE main(VertOut input) : SV_TARGET0
 {
 {
-#if TEXTURE_TYPE == 0
+#	if TEXTURE_TYPE == 0
 	return input.m_color;
 	return input.m_color;
-#elif TEXTURE_TYPE == 1
+#	elif TEXTURE_TYPE == 1
 	return input.m_color * g_tex.Sample(g_trilinearRepeatSampler, input.m_uv);
 	return input.m_color * g_tex.Sample(g_trilinearRepeatSampler, input.m_uv);
-#endif
+#	endif
 }
 }
-
-#pragma anki technique_end pixel
+#endif // ANKI_PIXEL_SHADER

+ 12 - 13
AnKi/Shaders/UiVisualizeImage.ankiprog

@@ -5,6 +5,8 @@
 
 
 #pragma anki mutator TEXTURE_TYPE 0 1
 #pragma anki mutator TEXTURE_TYPE 0 1
 
 
+#pragma anki technique vert pixel
+
 #include <AnKi/Shaders/Common.hlsl>
 #include <AnKi/Shaders/Common.hlsl>
 
 
 struct Constants
 struct Constants
@@ -30,8 +32,7 @@ struct VertOut
 	Vec4 m_svPosition : SV_POSITION;
 	Vec4 m_svPosition : SV_POSITION;
 };
 };
 
 
-#pragma anki technique_start vert
-
+#if ANKI_VERTEX_SHADER
 VertOut main(VertIn input)
 VertOut main(VertIn input)
 {
 {
 	VertOut output;
 	VertOut output;
@@ -44,24 +45,23 @@ VertOut main(VertIn input)
 
 
 	return output;
 	return output;
 }
 }
-#pragma anki technique_end vert
-
-#pragma anki technique_start pixel
+#endif // ANKI_VERTEX_SHADER
 
 
+#if ANKI_PIXEL_SHADER
 SamplerState g_trilinearRepeatSampler : register(s0);
 SamplerState g_trilinearRepeatSampler : register(s0);
-#if TEXTURE_TYPE == 0
+#	if TEXTURE_TYPE == 0
 Texture2D<RVec4> g_tex2d : register(t0);
 Texture2D<RVec4> g_tex2d : register(t0);
-#else
+#	else
 Texture3D<RVec4> g_tex3d : register(t0);
 Texture3D<RVec4> g_tex3d : register(t0);
-#endif
+#	endif
 
 
 RVec4 main(VertOut input) : SV_TARGET0
 RVec4 main(VertOut input) : SV_TARGET0
 {
 {
-#if TEXTURE_TYPE == 0
+#	if TEXTURE_TYPE == 0
 	const RVec4 rgba = g_tex2d.Sample(g_trilinearRepeatSampler, input.m_uv);
 	const RVec4 rgba = g_tex2d.Sample(g_trilinearRepeatSampler, input.m_uv);
-#else
+#	else
 	const RVec4 rgba = g_tex3d.Sample(g_trilinearRepeatSampler, Vec3(input.m_uv, g_consts.m_depth.x));
 	const RVec4 rgba = g_tex3d.Sample(g_trilinearRepeatSampler, Vec3(input.m_uv, g_consts.m_depth.x));
-#endif
+#	endif
 	RVec3 outColor = input.m_color.rgb * rgba.rgb * g_consts.m_colorScale.rgb;
 	RVec3 outColor = input.m_color.rgb * rgba.rgb * g_consts.m_colorScale.rgb;
 
 
 	if(g_consts.m_colorScale.a == 1.0)
 	if(g_consts.m_colorScale.a == 1.0)
@@ -75,5 +75,4 @@ RVec4 main(VertOut input) : SV_TARGET0
 
 
 	return RVec4(outColor, 1.0);
 	return RVec4(outColor, 1.0);
 }
 }
-
-#pragma anki technique_end pixel
+#endif // ANKI_PIXEL_SHADER

+ 5 - 6
AnKi/Shaders/VisualizeGBufferNormal.ankiprog

@@ -3,13 +3,12 @@
 // Code licensed under the BSD License.
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 // http://www.anki3d.org/LICENSE
 
 
-#include <AnKi/Shaders/QuadVert.hlsl>
+#pragma anki technique vert pixel
 
 
-#pragma anki technique_start vert
-#pragma anki technique_end vert
+#include <AnKi/Shaders/QuadVert.hlsl>
 
 
-#pragma anki technique_start pixel
-#include <AnKi/Shaders/PackFunctions.hlsl>
+#if ANKI_PIXEL_SHADER
+#	include <AnKi/Shaders/PackFunctions.hlsl>
 
 
 SamplerState g_nearestAnyClampSampler : register(s0);
 SamplerState g_nearestAnyClampSampler : register(s0);
 Texture2D g_inTex : register(t0);
 Texture2D g_inTex : register(t0);
@@ -18,4 +17,4 @@ Vec3 main(VertOut input) : SV_TARGET0
 {
 {
 	return unpackNormalFromGBuffer(g_inTex.SampleLevel(g_nearestAnyClampSampler, input.m_uv, 0.0)) / 2.0f + 0.5f;
 	return unpackNormalFromGBuffer(g_inTex.SampleLevel(g_nearestAnyClampSampler, input.m_uv, 0.0)) / 2.0f + 0.5f;
 }
 }
-#pragma anki technique_end pixel
+#endif // ANKI_PIXEL_SHADER

+ 5 - 6
AnKi/Shaders/VisualizeHdrRenderTarget.ankiprog

@@ -3,13 +3,12 @@
 // Code licensed under the BSD License.
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 // http://www.anki3d.org/LICENSE
 
 
-#include <AnKi/Shaders/QuadVert.hlsl>
+#pragma anki technique vert pixel
 
 
-#pragma anki technique_start vert
-#pragma anki technique_end vert
+#include <AnKi/Shaders/QuadVert.hlsl>
 
 
-#pragma anki technique_start pixel
-#include <AnKi/Shaders/TonemappingFunctions.hlsl>
+#if ANKI_PIXEL_SHADER
+#	include <AnKi/Shaders/TonemappingFunctions.hlsl>
 
 
 SamplerState g_nearestAnyClampSampler : register(s0);
 SamplerState g_nearestAnyClampSampler : register(s0);
 Texture2D g_inTex : register(t0);
 Texture2D g_inTex : register(t0);
@@ -18,4 +17,4 @@ Vec3 main(VertOut input) : SV_TARGET0
 {
 {
 	return reinhardTonemap(g_inTex.SampleLevel(g_nearestAnyClampSampler, input.m_uv, 0.0).rgb);
 	return reinhardTonemap(g_inTex.SampleLevel(g_nearestAnyClampSampler, input.m_uv, 0.0).rgb);
 }
 }
-#pragma anki technique_end pixel
+#endif // ANKI_PIXEL_SHADER

+ 5 - 6
AnKi/Shaders/VisualizeRenderTarget.ankiprog

@@ -3,13 +3,12 @@
 // Code licensed under the BSD License.
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 // http://www.anki3d.org/LICENSE
 
 
-#include <AnKi/Shaders/QuadVert.hlsl>
+#pragma anki technique vert pixel
 
 
-#pragma anki technique_start vert
-#pragma anki technique_end vert
+#include <AnKi/Shaders/QuadVert.hlsl>
 
 
-#pragma anki technique_start pixel
-#include <AnKi/Shaders/Common.hlsl>
+#if ANKI_PIXEL_SHADER
+#	include <AnKi/Shaders/Common.hlsl>
 
 
 SamplerState g_nearestAnyClampSampler : register(s0);
 SamplerState g_nearestAnyClampSampler : register(s0);
 Texture2D g_inTex : register(t0);
 Texture2D g_inTex : register(t0);
@@ -19,4 +18,4 @@ Vec3 main(VertOut input) : SV_TARGET0
 	const Vec4 rgba = g_inTex.SampleLevel(g_nearestAnyClampSampler, input.m_uv, 0.0);
 	const Vec4 rgba = g_inTex.SampleLevel(g_nearestAnyClampSampler, input.m_uv, 0.0);
 	return rgba.xyz;
 	return rgba.xyz;
 }
 }
-#pragma anki technique_end pixel
+#endif // ANKI_PIXEL_SHADER

+ 1 - 3
AnKi/Shaders/VolumetricFogAccumulation.ankiprog

@@ -3,7 +3,7 @@
 // Code licensed under the BSD License.
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 // http://www.anki3d.org/LICENSE
 
 
-#pragma anki technique_start comp
+#pragma anki technique comp
 
 
 #include <AnKi/Shaders/Include/MiscRendererTypes.h>
 #include <AnKi/Shaders/Include/MiscRendererTypes.h>
 #include <AnKi/Shaders/Common.hlsl>
 #include <AnKi/Shaders/Common.hlsl>
@@ -61,5 +61,3 @@ ANKI_FAST_CONSTANTS(VolumetricFogConstants, g_consts)
 		g_fogVolume[UVec3(svDispatchThreadId.xy, i)] = valToWrite;
 		g_fogVolume[UVec3(svDispatchThreadId.xy, i)] = valToWrite;
 	}
 	}
 }
 }
-
-#pragma anki technique_end comp

+ 1 - 3
AnKi/Shaders/VolumetricLightingAccumulation.ankiprog

@@ -7,7 +7,7 @@
 
 
 #pragma anki mutator ENABLE_SHADOWS 0 1
 #pragma anki mutator ENABLE_SHADOWS 0 1
 
 
-#pragma anki technique_start comp
+#pragma anki technique comp
 
 
 #include <AnKi/Shaders/Include/MiscRendererTypes.h>
 #include <AnKi/Shaders/Include/MiscRendererTypes.h>
 #include <AnKi/Shaders/ClusteredShadingFunctions.hlsl>
 #include <AnKi/Shaders/ClusteredShadingFunctions.hlsl>
@@ -289,5 +289,3 @@ Vec4 accumulateLightsAndFog(Cluster cluster, Vec3 worldPos, F32 negativeZViewSpa
 	// Write result
 	// Write result
 	g_volume[svDispatchThreadId] = lightAndFog;
 	g_volume[svDispatchThreadId] = lightAndFog;
 }
 }
-
-#pragma anki technique_end comp

+ 1 - 3
AnKi/Shaders/VrsSriDownscale.ankiprog

@@ -3,7 +3,7 @@
 // Code licensed under the BSD License.
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 // http://www.anki3d.org/LICENSE
 
 
-#pragma anki technique_start comp
+#pragma anki technique comp
 
 
 #include <AnKi/Shaders/Functions.hlsl>
 #include <AnKi/Shaders/Functions.hlsl>
 
 
@@ -32,5 +32,3 @@ ANKI_FAST_CONSTANTS(Constants, g_consts)
 
 
 	g_storageTex[svDispatchThreadId.xy] = UVec4(encodeVrsRate(rate), 0, 0, 0);
 	g_storageTex[svDispatchThreadId.xy] = UVec4(encodeVrsRate(rate), 0, 0, 0);
 }
 }
-
-#pragma anki technique_end comp

+ 1 - 3
AnKi/Shaders/VrsSriGenerationCompute.ankiprog

@@ -7,7 +7,7 @@
 #pragma anki mutator SHARED_MEMORY 0 1
 #pragma anki mutator SHARED_MEMORY 0 1
 #pragma anki mutator LIMIT_RATE_TO_2X2 0 1
 #pragma anki mutator LIMIT_RATE_TO_2X2 0 1
 
 
-#pragma anki technique_start comp
+#pragma anki technique comp
 
 
 #include <AnKi/Shaders/Functions.hlsl>
 #include <AnKi/Shaders/Functions.hlsl>
 #include <AnKi/Shaders/TonemappingFunctions.hlsl>
 #include <AnKi/Shaders/TonemappingFunctions.hlsl>
@@ -190,5 +190,3 @@ RF32 computeLuma(RVec3 color)
 		g_sriStorageTex[outTexelCoord] = encodeVrsRate(rate);
 		g_sriStorageTex[outTexelCoord] = encodeVrsRate(rate);
 	}
 	}
 }
 }
-
-#pragma anki technique_end comp

+ 5 - 6
AnKi/Shaders/VrsSriVisualizeRenderTarget.ankiprog

@@ -3,13 +3,12 @@
 // Code licensed under the BSD License.
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 // http://www.anki3d.org/LICENSE
 
 
-#include <AnKi/Shaders/QuadVert.hlsl>
+#pragma anki technique vert pixel
 
 
-#pragma anki technique_start vert
-#pragma anki technique_end vert
+#include <AnKi/Shaders/QuadVert.hlsl>
 
 
-#pragma anki technique_start pixel
-#include <AnKi/Shaders/Functions.hlsl>
+#if ANKI_PIXEL_SHADER
+#	include <AnKi/Shaders/Functions.hlsl>
 
 
 SamplerState g_nearestAnyClampSampler : register(s0);
 SamplerState g_nearestAnyClampSampler : register(s0);
 Texture2D<U32> g_inTex : register(t0);
 Texture2D<U32> g_inTex : register(t0);
@@ -20,4 +19,4 @@ Vec3 main(VertOut input) : SV_TARGET0
 	const UVec2 rate = decodeVrsRate(texel);
 	const UVec2 rate = decodeVrsRate(texel);
 	return visualizeVrsRate(rate);
 	return visualizeVrsRate(rate);
 }
 }
-#pragma anki technique_end pixel
+#endif // ANKI_PIXEL_SAHDER