瀏覽代碼

Merge compute and raster versions of shaders into the same ankiprog file

Panagiotis Christopoulos Charitos 2 年之前
父節點
當前提交
9546d08023
共有 53 個文件被更改,包括 507 次插入684 次删除
  1. 2 5
      AnKi/Renderer/Bloom.cpp
  2. 1 9
      AnKi/Renderer/DepthDownscale.cpp
  3. 1 5
      AnKi/Renderer/DownscaleBlur.cpp
  4. 6 25
      AnKi/Renderer/IndirectDiffuse.cpp
  5. 2 11
      AnKi/Renderer/IndirectSpecular.cpp
  6. 4 2
      AnKi/Renderer/MainRenderer.cpp
  7. 1 3
      AnKi/Renderer/MotionVectors.cpp
  8. 14 13
      AnKi/Renderer/RendererObject.cpp
  9. 5 1
      AnKi/Renderer/RendererObject.h
  10. 4 18
      AnKi/Renderer/Scale.cpp
  11. 4 9
      AnKi/Renderer/ShadowmapsResolve.cpp
  12. 2 10
      AnKi/Renderer/TemporalAA.cpp
  13. 28 16
      AnKi/Shaders/Blit.ankiprog
  14. 0 8
      AnKi/Shaders/BlitCompute.ankiprog
  15. 0 12
      AnKi/Shaders/BlitRaster.ankiprog
  16. 27 15
      AnKi/Shaders/Bloom.ankiprog
  17. 0 8
      AnKi/Shaders/BloomCompute.ankiprog
  18. 0 12
      AnKi/Shaders/BloomRaster.ankiprog
  19. 31 19
      AnKi/Shaders/BloomUpscale.ankiprog
  20. 0 8
      AnKi/Shaders/BloomUpscaleCompute.ankiprog
  21. 0 12
      AnKi/Shaders/BloomUpscaleRaster.ankiprog
  22. 43 31
      AnKi/Shaders/DepthAwareBlur.ankiprog
  23. 0 8
      AnKi/Shaders/DepthAwareBlurCompute.ankiprog
  24. 0 12
      AnKi/Shaders/DepthAwareBlurRaster.ankiprog
  25. 16 2
      AnKi/Shaders/DepthDownscale.ankiprog
  26. 0 20
      AnKi/Shaders/DepthDownscaleRaster.ankiprog
  27. 25 15
      AnKi/Shaders/DownscaleBlur.ankiprog
  28. 0 8
      AnKi/Shaders/DownscaleBlurCompute.ankiprog
  29. 0 12
      AnKi/Shaders/DownscaleBlurRaster.ankiprog
  30. 38 26
      AnKi/Shaders/Fsr.ankiprog
  31. 0 8
      AnKi/Shaders/FsrCompute.ankiprog
  32. 0 12
      AnKi/Shaders/FsrRaster.ankiprog
  33. 38 26
      AnKi/Shaders/IndirectDiffuse.ankiprog
  34. 0 8
      AnKi/Shaders/IndirectDiffuseCompute.ankiprog
  35. 29 17
      AnKi/Shaders/IndirectDiffuseDenoise.ankiprog
  36. 0 8
      AnKi/Shaders/IndirectDiffuseDenoiseCompute.ankiprog
  37. 0 12
      AnKi/Shaders/IndirectDiffuseDenoiseRaster.ankiprog
  38. 0 12
      AnKi/Shaders/IndirectDiffuseRaster.ankiprog
  39. 45 33
      AnKi/Shaders/IndirectSpecular.ankiprog
  40. 0 8
      AnKi/Shaders/IndirectSpecularCompute.ankiprog
  41. 0 12
      AnKi/Shaders/IndirectSpecularRaster.ankiprog
  42. 26 14
      AnKi/Shaders/MotionVectors.ankiprog
  43. 0 8
      AnKi/Shaders/MotionVectorsCompute.ankiprog
  44. 0 12
      AnKi/Shaders/MotionVectorsRaster.ankiprog
  45. 47 35
      AnKi/Shaders/ShadowmapsResolve.ankiprog
  46. 0 8
      AnKi/Shaders/ShadowmapsResolveCompute.ankiprog
  47. 0 12
      AnKi/Shaders/ShadowmapsResolveRaster.ankiprog
  48. 42 30
      AnKi/Shaders/TemporalAA.ankiprog
  49. 0 8
      AnKi/Shaders/TemporalAACompute.ankiprog
  50. 0 12
      AnKi/Shaders/TemporalAARaster.ankiprog
  51. 26 14
      AnKi/Shaders/Tonemap.ankiprog
  52. 0 8
      AnKi/Shaders/TonemapCompute.ankiprog
  53. 0 12
      AnKi/Shaders/TonemapRaster.ankiprog

+ 2 - 5
AnKi/Renderer/Bloom.cpp

@@ -46,8 +46,7 @@ Error Bloom::initExposure()
 	m_exposure.m_rtDescr.bake();
 
 	// init shaders
-	const CString progFname = (g_preferComputeCVar.get()) ? "ShaderBinaries/BloomCompute.ankiprogbin" : "ShaderBinaries/BloomRaster.ankiprogbin";
-	ANKI_CHECK(loadShaderProgram(progFname, m_exposure.m_prog, m_exposure.m_grProg));
+	ANKI_CHECK(loadShaderProgram("ShaderBinaries/Bloom.ankiprogbin", m_exposure.m_prog, m_exposure.m_grProg));
 
 	return Error::kNone;
 }
@@ -62,9 +61,7 @@ Error Bloom::initUpscale()
 	m_upscale.m_rtDescr.bake();
 
 	// init shaders
-	const CString progFname =
-		(g_preferComputeCVar.get()) ? "ShaderBinaries/BloomUpscaleCompute.ankiprogbin" : "ShaderBinaries/BloomUpscaleRaster.ankiprogbin";
-	ANKI_CHECK(loadShaderProgram(progFname, m_upscale.m_prog, m_upscale.m_grProg));
+	ANKI_CHECK(loadShaderProgram("ShaderBinaries/BloomUpscale.ankiprogbin", m_upscale.m_prog, m_upscale.m_grProg));
 
 	// Textures
 	ANKI_CHECK(ResourceManager::getSingleton().loadResource("EngineAssets/LensDirt.ankitex", m_upscale.m_lensDirtImage));

+ 1 - 9
AnKi/Renderer/DepthDownscale.cpp

@@ -53,15 +53,7 @@ Error DepthDownscale::initInternal()
 	}
 
 	// Progs
-	if(preferCompute)
-	{
-		ANKI_CHECK(
-			loadShaderProgram("ShaderBinaries/DepthDownscaleCompute.ankiprogbin", Array<SubMutation, 1>{{{"WAVE_OPERATIONS", 0}}}, m_prog, m_grProg));
-	}
-	else
-	{
-		ANKI_CHECK(loadShaderProgram("ShaderBinaries/DepthDownscaleRaster.ankiprogbin", m_prog, m_grProg));
-	}
+	ANKI_CHECK(loadShaderProgram("ShaderBinaries/DepthDownscale.ankiprogbin", Array<SubMutation, 1>{{{"WAVE_OPERATIONS", 1}}}, m_prog, m_grProg));
 
 	// Counter buffer
 	if(preferCompute)

+ 1 - 5
AnKi/Renderer/DownscaleBlur.cpp

@@ -60,11 +60,7 @@ Error DownscaleBlur::initInternal()
 	}
 
 	// Shader programs
-	ANKI_CHECK(ResourceManager::getSingleton().loadResource(
-		(preferCompute) ? "ShaderBinaries/DownscaleBlurCompute.ankiprogbin" : "ShaderBinaries/DownscaleBlurRaster.ankiprogbin", m_prog));
-	const ShaderProgramResourceVariant* variant = nullptr;
-	m_prog->getOrCreateVariant(variant);
-	m_grProg.reset(&variant->getProgram());
+	ANKI_CHECK(loadShaderProgram("ShaderBinaries/DownscaleBlur.ankiprogbin", m_prog, m_grProg));
 
 	return Error::kNone;
 }

+ 6 - 25
AnKi/Renderer/IndirectDiffuse.cpp

@@ -102,40 +102,21 @@ Error IndirectDiffuse::initInternal()
 		m_vrs.m_prog->getOrCreateVariant(variantInit, variant);
 		m_vrs.m_grProg.reset(&variant->getProgram());
 
-		ANKI_CHECK(ResourceManager::getSingleton().loadResource("ShaderBinaries/VrsSriVisualizeRenderTarget.ankiprogbin", m_vrs.m_visualizeProg));
-		m_vrs.m_visualizeProg->getOrCreateVariant(variant);
-		m_vrs.m_visualizeGrProg.reset(&variant->getProgram());
+		ANKI_CHECK(loadShaderProgram("ShaderBinaries/VrsSriVisualizeRenderTarget.ankiprogbin", m_vrs.m_visualizeProg, m_vrs.m_visualizeGrProg));
 	}
 
 	// Init SSGI+probes pass
-	{
-		CString progFname =
-			(preferCompute) ? "ShaderBinaries/IndirectDiffuseCompute.ankiprogbin" : "ShaderBinaries/IndirectDiffuseRaster.ankiprogbin";
-		ANKI_CHECK(ResourceManager::getSingleton().loadResource(progFname, m_main.m_prog));
-
-		const ShaderProgramResourceVariant* variant;
-		m_main.m_prog->getOrCreateVariant(variant);
-		m_main.m_grProg.reset(&variant->getProgram());
-	}
+	ANKI_CHECK(loadShaderProgram("ShaderBinaries/IndirectDiffuse.ankiprogbin", m_main.m_prog, m_main.m_grProg));
 
 	// Init denoise
 	{
 		m_denoise.m_fbDescr.m_colorAttachmentCount = 1;
 		m_denoise.m_fbDescr.bake();
 
-		CString progFname =
-			(preferCompute) ? "ShaderBinaries/IndirectDiffuseDenoiseCompute.ankiprogbin" : "ShaderBinaries/IndirectDiffuseDenoiseRaster.ankiprogbin";
-		ANKI_CHECK(ResourceManager::getSingleton().loadResource(progFname, m_denoise.m_prog));
-
-		ShaderProgramResourceVariantInitInfo variantInit(m_denoise.m_prog);
-		variantInit.addMutation("BLUR_ORIENTATION", 0);
-		const ShaderProgramResourceVariant* variant;
-		m_denoise.m_prog->getOrCreateVariant(variantInit, variant);
-		m_denoise.m_grProgs[0].reset(&variant->getProgram());
-
-		variantInit.addMutation("BLUR_ORIENTATION", 1);
-		m_denoise.m_prog->getOrCreateVariant(variantInit, variant);
-		m_denoise.m_grProgs[1].reset(&variant->getProgram());
+		ANKI_CHECK(loadShaderProgram("ShaderBinaries/IndirectDiffuseDenoise.ankiprogbin", Array<SubMutation, 1>{{"BLUR_ORIENTATION", 0}},
+									 m_denoise.m_prog, m_denoise.m_grProgs[0]));
+		ANKI_CHECK(loadShaderProgram("ShaderBinaries/IndirectDiffuseDenoise.ankiprogbin", Array<SubMutation, 1>{{"BLUR_ORIENTATION", 1}},
+									 m_denoise.m_prog, m_denoise.m_grProgs[1]));
 	}
 
 	return Error::kNone;

+ 2 - 11
AnKi/Renderer/IndirectSpecular.cpp

@@ -57,17 +57,8 @@ Error IndirectSpecular::initInternal()
 	m_fbDescr.m_colorAttachmentCount = 1;
 	m_fbDescr.bake();
 
-	// Create shader
-	ANKI_CHECK(ResourceManager::getSingleton().loadResource((g_preferComputeCVar.get()) ? "ShaderBinaries/IndirectSpecularCompute.ankiprogbin"
-																						: "ShaderBinaries/IndirectSpecularRaster.ankiprogbin",
-															m_prog));
-
-	ShaderProgramResourceVariantInitInfo variantInit(m_prog);
-	variantInit.addMutation("EXTRA_REJECTION", false);
-	variantInit.addMutation("STOCHASTIC", g_ssrStochasticCVar.get());
-	const ShaderProgramResourceVariant* variant;
-	m_prog->getOrCreateVariant(variantInit, variant);
-	m_grProg.reset(&variant->getProgram());
+	ANKI_CHECK(loadShaderProgram("ShaderBinaries/IndirectSpecular.ankiprogbin",
+								 Array<SubMutation, 2>{{{"EXTRA_REJECTION", false}, {"STOCHASTIC", g_ssrStochasticCVar.get()}}}, m_prog, m_grProg));
 
 	return Error::kNone;
 }

+ 4 - 2
AnKi/Renderer/MainRenderer.cpp

@@ -53,9 +53,11 @@ Error MainRenderer::init(const MainRendererInitInfo& inf)
 	// Init other
 	if(!m_rDrawToDefaultFb)
 	{
-		ANKI_CHECK(ResourceManager::getSingleton().loadResource("ShaderBinaries/BlitRaster.ankiprogbin", m_blitProg));
+		ANKI_CHECK(ResourceManager::getSingleton().loadResource("ShaderBinaries/Blit.ankiprogbin", m_blitProg));
+		ShaderProgramResourceVariantInitInfo varInit(m_blitProg);
+		varInit.requestShaderTypes(ShaderTypeBit::kFragment | ShaderTypeBit::kVertex);
 		const ShaderProgramResourceVariant* variant;
-		m_blitProg->getOrCreateVariant(variant);
+		m_blitProg->getOrCreateVariant(varInit, variant);
 		m_blitGrProg.reset(&variant->getProgram());
 
 		// The RT desc

+ 1 - 3
AnKi/Renderer/MotionVectors.cpp

@@ -26,9 +26,7 @@ Error MotionVectors::initInternal()
 	ANKI_R_LOGV("Initializing motion vectors");
 
 	// Prog
-	const CString progFname =
-		(g_preferComputeCVar.get()) ? "ShaderBinaries/MotionVectorsCompute.ankiprogbin" : "ShaderBinaries/MotionVectorsRaster.ankiprogbin";
-	ANKI_CHECK(loadShaderProgram(progFname, m_prog, m_grProg));
+	ANKI_CHECK(loadShaderProgram("ShaderBinaries/MotionVectors.ankiprogbin", m_prog, m_grProg));
 
 	// RTs
 	m_motionVectorsRtDescr = getRenderer().create2DRenderTargetDescription(

+ 14 - 13
AnKi/Renderer/RendererObject.cpp

@@ -20,16 +20,6 @@ void RendererObject::registerDebugRenderTarget(CString rtName)
 	getRenderer().registerDebugRenderTarget(this, rtName);
 }
 
-Error RendererObject::loadShaderProgram(CString filename, ShaderProgramResourcePtr& rsrc, ShaderProgramPtr& grProg)
-{
-	ANKI_CHECK(ResourceManager::getSingleton().loadResource(filename, rsrc));
-	const ShaderProgramResourceVariant* variant;
-	rsrc->getOrCreateVariant(variant);
-	grProg.reset(&variant->getProgram());
-
-	return Error::kNone;
-}
-
 Error RendererObject::loadShaderProgram(CString filename, ConstWeakArray<SubMutation> mutators, ShaderProgramResourcePtr& rsrc,
 										ShaderProgramPtr& grProg, ShaderTypeBit shaderTypes, CString technique)
 {
@@ -44,14 +34,25 @@ Error RendererObject::loadShaderProgram(CString filename, ConstWeakArray<SubMuta
 		initInf.addMutation(pair.m_mutatorName, pair.m_value);
 	}
 
+	if(technique)
+	{
+		initInf.requestTechnique(technique);
+	}
+
 	if(!!shaderTypes)
 	{
 		initInf.requestShaderTypes(shaderTypes);
 	}
-
-	if(technique)
+	else if(rsrc->getBinary().m_shaderTypes == (ShaderTypeBit::kCompute | ShaderTypeBit::kFragment | ShaderTypeBit::kVertex))
 	{
-		initInf.requestTechnique(technique);
+		if(g_preferComputeCVar.get())
+		{
+			initInf.requestShaderTypes(ShaderTypeBit::kCompute);
+		}
+		else
+		{
+			initInf.requestShaderTypes(ShaderTypeBit::kFragment | ShaderTypeBit::kVertex);
+		}
 	}
 
 	const ShaderProgramResourceVariant* variant;

+ 5 - 1
AnKi/Renderer/RendererObject.h

@@ -83,7 +83,11 @@ protected:
 
 	void registerDebugRenderTarget(CString rtName);
 
-	static Error loadShaderProgram(CString filename, ShaderProgramResourcePtr& rsrc, ShaderProgramPtr& grProg);
+	static Error loadShaderProgram(CString filename, ShaderProgramResourcePtr& rsrc, ShaderProgramPtr& grProg)
+	{
+		ANKI_CHECK(loadShaderProgram(filename, {}, rsrc, grProg));
+		return Error::kNone;
+	}
 
 	class SubMutation
 	{

+ 4 - 18
AnKi/Renderer/Scale.cpp

@@ -93,16 +93,8 @@ Error Scale::init()
 	}
 	else if(m_upscalingMethod == UpscalingMethod::kFsr)
 	{
-		const CString shaderFname = (preferCompute) ? "ShaderBinaries/FsrCompute.ankiprogbin" : "ShaderBinaries/FsrRaster.ankiprogbin";
-
-		ANKI_CHECK(ResourceManager::getSingleton().loadResource(shaderFname, m_scaleProg));
-
-		ShaderProgramResourceVariantInitInfo variantInitInfo(m_scaleProg);
-		variantInitInfo.addMutation("SHARPEN", 0);
-		variantInitInfo.addMutation("FSR_QUALITY", fsrQuality - 1);
-		const ShaderProgramResourceVariant* variant;
-		m_scaleProg->getOrCreateVariant(variantInitInfo, variant);
-		m_scaleGrProg.reset(&variant->getProgram());
+		const Array<SubMutation, 2> mutation = {{{"SHARPEN", 0}, {"FSR_QUALITY", MutatorValue(fsrQuality - 1)}}};
+		ANKI_CHECK(loadShaderProgram("ShaderBinaries/Fsr.ankiprogbin", mutation, m_scaleProg, m_scaleGrProg));
 	}
 	else if(m_upscalingMethod == UpscalingMethod::kGr)
 	{
@@ -118,14 +110,8 @@ Error Scale::init()
 	// Sharpen programs
 	if(m_sharpenMethod == SharpenMethod::kRcas)
 	{
-		ANKI_CHECK(ResourceManager::getSingleton().loadResource(
-			(preferCompute) ? "ShaderBinaries/FsrCompute.ankiprogbin" : "ShaderBinaries/FsrRaster.ankiprogbin", m_sharpenProg));
-		ShaderProgramResourceVariantInitInfo variantInitInfo(m_sharpenProg);
-		variantInitInfo.addMutation("SHARPEN", 1);
-		variantInitInfo.addMutation("FSR_QUALITY", 0);
-		const ShaderProgramResourceVariant* variant;
-		m_sharpenProg->getOrCreateVariant(variantInitInfo, variant);
-		m_sharpenGrProg.reset(&variant->getProgram());
+		const Array<SubMutation, 2> mutation = {{{"SHARPEN", 1}, {"FSR_QUALITY", 0}}};
+		ANKI_CHECK(loadShaderProgram("ShaderBinaries/Fsr.ankiprogbin", mutation, m_sharpenProg, m_sharpenGrProg));
 	}
 
 	// Tonemapping programs

+ 4 - 9
AnKi/Renderer/ShadowmapsResolve.cpp

@@ -44,15 +44,10 @@ Error ShadowmapsResolve::initInternal()
 	m_fbDescr.bake();
 
 	// Prog
-	ANKI_CHECK(ResourceManager::getSingleton().loadResource((g_preferComputeCVar.get()) ? "ShaderBinaries/ShadowmapsResolveCompute.ankiprogbin"
-																						: "ShaderBinaries/ShadowmapsResolveRaster.ankiprogbin",
-															m_prog));
-	ShaderProgramResourceVariantInitInfo variantInitInfo(m_prog);
-	variantInitInfo.addMutation("PCF", g_shadowMappingPcfCVar.get() != 0);
-	variantInitInfo.addMutation("DIRECTIONAL_LIGHT_SHADOW_RESOLVED", getRenderer().getRtShadowsEnabled());
-	const ShaderProgramResourceVariant* variant;
-	m_prog->getOrCreateVariant(variantInitInfo, variant);
-	m_grProg.reset(&variant->getProgram());
+	ANKI_CHECK(loadShaderProgram("ShaderBinaries/ShadowmapsResolve.ankiprogbin",
+								 Array<SubMutation, 2>{{{"PCF", g_shadowMappingPcfCVar.get() != 0},
+														{"DIRECTIONAL_LIGHT_SHADOW_RESOLVED", getRenderer().getRtShadowsEnabled()}}},
+								 m_prog, m_grProg));
 
 	ANKI_CHECK(ResourceManager::getSingleton().loadResource("EngineAssets/BlueNoise_Rgba8_64x64.png", m_noiseImage));
 

+ 2 - 10
AnKi/Renderer/TemporalAA.cpp

@@ -29,17 +29,9 @@ Error TemporalAA::initInternal()
 {
 	ANKI_R_LOGV("Initializing TAA");
 
-	ANKI_CHECK(ResourceManager::getSingleton().loadResource(
-		(g_preferComputeCVar.get()) ? "ShaderBinaries/TemporalAACompute.ankiprogbin" : "ShaderBinaries/TemporalAARaster.ankiprogbin", m_prog));
-
 	{
-		ShaderProgramResourceVariantInitInfo variantInitInfo(m_prog);
-		variantInitInfo.addMutation("VARIANCE_CLIPPING", 1);
-		variantInitInfo.addMutation("YCBCR", 0);
-
-		const ShaderProgramResourceVariant* variant;
-		m_prog->getOrCreateVariant(variantInitInfo, variant);
-		m_grProg.reset(&variant->getProgram());
+		const Array<SubMutation, 2> mutation = {{{"VARIANCE_CLIPPING", 1}, {"YCBCR", 0}}};
+		ANKI_CHECK(loadShaderProgram("ShaderBinaries/TemporalAA.ankiprogbin", mutation, m_prog, m_grProg));
 	}
 
 	for(U i = 0; i < 2; ++i)

+ 28 - 16
AnKi/Shaders/Blit.hlsl → AnKi/Shaders/Blit.ankiprog

@@ -3,18 +3,19 @@
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 
-#include <AnKi/Shaders/Functions.hlsl>
+#if defined(ANKI_COMPUTE_SHADER) || defined(ANKI_FRAGMENT_SHADER)
+#	include <AnKi/Shaders/Functions.hlsl>
 
 [[vk::binding(0)]] SamplerState g_linearAnyClampSampler;
 [[vk::binding(1)]] Texture2D<RVec4> g_inputTex;
 
-#if defined(ANKI_COMPUTE_SHADER)
-#	define USE_COMPUTE 1
-#else
-#	define USE_COMPUTE 0
-#endif
+#	if defined(ANKI_COMPUTE_SHADER)
+#		define USE_COMPUTE 1
+#	else
+#		define USE_COMPUTE 0
+#	endif
 
-#if USE_COMPUTE
+#	if USE_COMPUTE
 [[vk::binding(2)]] RWTexture2D<RVec4> g_outUav;
 
 struct Constants
@@ -24,28 +25,39 @@ struct Constants
 };
 
 [[vk::push_constant]] ConstantBuffer<Constants> g_pc;
-#endif
+#	endif
 
-#if USE_COMPUTE
+#	if USE_COMPUTE
 [numthreads(8, 8, 1)] void main(UVec3 svDispatchThreadId : SV_DISPATCHTHREADID)
-#else
+#	else
 RVec3 main([[vk::location(0)]] Vec2 uv : TEXCOORD) : SV_TARGET0
-#endif
+#	endif
 {
-#if USE_COMPUTE
+#	if USE_COMPUTE
 	if(skipOutOfBoundsInvocations(UVec2(8, 8), g_pc.m_viewportSizeU, svDispatchThreadId.xy))
 	{
 		return;
 	}
 
 	const Vec2 uv = (Vec2(svDispatchThreadId.xy) + 0.5) / g_pc.m_viewportSize;
-#endif
+#	endif
 
 	const RVec3 color = g_inputTex.SampleLevel(g_linearAnyClampSampler, uv, 0.0).rgb;
 
-#if USE_COMPUTE
+#	if USE_COMPUTE
 	g_outUav[svDispatchThreadId.xy] = RVec4(color, 0.0);
-#else
+#	else
 	return color;
-#endif
+#	endif
 }
+#endif // defined(ANKI_COMPUTE_SHADER) || defined(ANKI_FRAGMENT_SHADER)
+
+#pragma anki technique_start vert
+#include <AnKi/Shaders/QuadVert.hlsl>
+#pragma anki technique_end vert
+
+#pragma anki technique_start frag
+#pragma anki technique_end frag
+
+#pragma anki technique_start comp
+#pragma anki technique_end comp

+ 0 - 8
AnKi/Shaders/BlitCompute.ankiprog

@@ -1,8 +0,0 @@
-// Copyright (C) 2009-2023, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#pragma anki technique_start comp
-#include <AnKi/Shaders/Blit.hlsl>
-#pragma anki technique_end comp

+ 0 - 12
AnKi/Shaders/BlitRaster.ankiprog

@@ -1,12 +0,0 @@
-// Copyright (C) 2009-2023, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#pragma anki technique_start vert
-#include <AnKi/Shaders/QuadVert.hlsl>
-#pragma anki technique_end vert
-
-#pragma anki technique_start frag
-#include <AnKi/Shaders/Blit.hlsl>
-#pragma anki technique_end frag

+ 27 - 15
AnKi/Shaders/Bloom.hlsl → AnKi/Shaders/Bloom.ankiprog

@@ -3,10 +3,11 @@
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 
-#include <AnKi/Shaders/TonemappingFunctions.hlsl>
-#include <AnKi/Shaders/Functions.hlsl>
+#if defined(ANKI_COMPUTE_SHADER) || defined(ANKI_FRAGMENT_SHADER)
+#	include <AnKi/Shaders/TonemappingFunctions.hlsl>
+#	include <AnKi/Shaders/Functions.hlsl>
 constexpr U32 kTonemappingBinding = 2u;
-#include <AnKi/Shaders/TonemappingResources.hlsl>
+#	include <AnKi/Shaders/TonemappingResources.hlsl>
 
 [[vk::binding(0)]] SamplerState g_linearAnyClampSampler;
 [[vk::binding(1)]] Texture2D<RVec4> g_inTex;
@@ -21,24 +22,24 @@ struct Constants
 
 [[vk::push_constant]] ConstantBuffer<Constants> g_consts;
 
-#if defined(ANKI_COMPUTE_SHADER)
-#	define THREADGROUP_SIZE_X 8
-#	define THREADGROUP_SIZE_Y 8
+#	if defined(ANKI_COMPUTE_SHADER)
+#		define THREADGROUP_SIZE_X 8
+#		define THREADGROUP_SIZE_Y 8
 [[vk::binding(3)]] RWTexture2D<RVec4> g_outUav;
-#endif
+#	endif
 
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 [numthreads(THREADGROUP_SIZE_X, THREADGROUP_SIZE_Y, 1)] void main(UVec2 svDispatchThreadId : SV_DISPATCHTHREADID)
-#else
+#	else
 RVec3 main([[vk::location(0)]] Vec2 uv : TEXCOORD) : SV_TARGET0
-#endif
+#	endif
 {
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 	Vec2 outUavSize;
 	g_outUav.GetDimensions(outUavSize.x, outUavSize.y);
 
 	const Vec2 uv = (Vec2(svDispatchThreadId) + 0.5) / outUavSize;
-#endif
+#	endif
 
 	const RF32 weight = 1.0 / 5.0;
 	RVec3 color = g_inTex.SampleLevel(g_linearAnyClampSampler, uv, 0.0).rgb * weight;
@@ -49,9 +50,20 @@ RVec3 main([[vk::location(0)]] Vec2 uv : TEXCOORD) : SV_TARGET0
 
 	color = tonemap(color, readExposureAndAverageLuminance().y, g_consts.m_threshold) * g_consts.m_scale;
 
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 	g_outUav[svDispatchThreadId] = RVec4(color, 0.0);
-#else
+#	else
 	return color;
-#endif
+#	endif
 }
+#endif // defined(ANKI_COMPUTE_SHADER) || defined(ANKI_FRAGMENT_SHADER)
+
+#pragma anki technique_start vert
+#include <AnKi/Shaders/QuadVert.hlsl>
+#pragma anki technique_end vert
+
+#pragma anki technique_start frag
+#pragma anki technique_end frag
+
+#pragma anki technique_start comp
+#pragma anki technique_end comp

+ 0 - 8
AnKi/Shaders/BloomCompute.ankiprog

@@ -1,8 +0,0 @@
-// Copyright (C) 2009-2023, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#pragma anki technique_start comp
-#include <AnKi/Shaders/Bloom.hlsl>
-#pragma anki technique_end comp

+ 0 - 12
AnKi/Shaders/BloomRaster.ankiprog

@@ -1,12 +0,0 @@
-// Copyright (C) 2009-2023, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#pragma anki technique_start vert
-#include <AnKi/Shaders/QuadVert.hlsl>
-#pragma anki technique_end vert
-
-#pragma anki technique_start frag
-#include <AnKi/Shaders/Bloom.hlsl>
-#pragma anki technique_end frag

+ 31 - 19
AnKi/Shaders/BloomUpscale.hlsl → AnKi/Shaders/BloomUpscale.ankiprog

@@ -3,11 +3,12 @@
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 
-#include <AnKi/Shaders/Functions.hlsl>
+#if defined(ANKI_FRAGMENT_SHADER) || defined(ANKI_COMPUTE_SHADER)
+#	include <AnKi/Shaders/Functions.hlsl>
 
 // Constants
-#define ENABLE_CHROMATIC_DISTORTION 1
-#define ENABLE_HALO 1
+#	define ENABLE_CHROMATIC_DISTORTION 1
+#	define ENABLE_HALO 1
 constexpr U32 kMaxGhosts = 4u;
 constexpr F32 kGhostDispersal = 0.7;
 constexpr F32 kHaloWidth = 0.4;
@@ -18,21 +19,21 @@ constexpr F32 kHaloOpacity = 0.5;
 [[vk::binding(1)]] Texture2D<RVec4> g_inputTex;
 [[vk::binding(2)]] Texture2D<RVec3> g_lensDirtTex;
 
-#if defined(ANKI_COMPUTE_SHADER)
-#	define THREADGROUP_SIZE_XY 8
+#	if defined(ANKI_COMPUTE_SHADER)
+#		define THREADGROUP_SIZE_XY 8
 [[vk::binding(3)]] RWTexture2D<RVec4> g_outUav;
-#endif
+#	endif
 
 RVec3 textureDistorted(Texture2D<RVec4> tex, SamplerState sampl, Vec2 uv,
 					   Vec2 direction, // direction of distortion
 					   Vec3 distortion) // per-channel distortion factor
 {
-#if ENABLE_CHROMATIC_DISTORTION
+#	if ENABLE_CHROMATIC_DISTORTION
 	return RVec3(tex.SampleLevel(sampl, uv + direction * distortion.r, 0.0).r, tex.SampleLevel(sampl, uv + direction * distortion.g, 0.0).g,
 				 tex.SampleLevel(sampl, uv + direction * distortion.b, 0.0).b);
-#else
+#	else
 	return tex.SampleLevel(uv, 0.0).rgb;
-#endif
+#	endif
 }
 
 RVec3 ssLensFlare(Vec2 uv)
@@ -63,12 +64,12 @@ RVec3 ssLensFlare(Vec2 uv)
 	}
 
 	// Sample halo
-#if ENABLE_HALO
+#	if ENABLE_HALO
 	const Vec2 haloVec = normalize(ghostVec) * kHaloWidth;
 	RF32 weight = length(Vec2(0.5, 0.5) - frac(flipUv + haloVec)) / lensOfHalf;
 	weight = pow(1.0 - weight, 20.0);
 	result += textureDistorted(g_inputTex, g_linearAnyClampSampler, flipUv + haloVec, direction, distortion) * (weight * kHaloOpacity);
-#endif
+#	endif
 
 	// Lens dirt
 	result *= g_lensDirtTex.SampleLevel(g_linearAnyClampSampler, uv, 0.0).rgb;
@@ -88,24 +89,35 @@ RVec3 upscale(Vec2 uv)
 	return result;
 }
 
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 [numthreads(THREADGROUP_SIZE_XY, THREADGROUP_SIZE_XY, 1)] void main(UVec2 svDispatchThreadId : SV_DISPATCHTHREADID)
-#else
+#	else
 RVec3 main([[vk::location(0)]] Vec2 uv : TEXCOORD) : SV_TARGET0
-#endif
+#	endif
 {
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 	Vec2 outUavTexSize;
 	g_outUav.GetDimensions(outUavTexSize.x, outUavTexSize.y);
 
 	const Vec2 uv = (Vec2(svDispatchThreadId) + 0.5) / outUavTexSize;
-#endif
+#	endif
 
 	const RVec3 outColor = ssLensFlare(uv) + upscale(uv);
 
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 	g_outUav[svDispatchThreadId] = RVec4(outColor, 0.0);
-#else
+#	else
 	return outColor;
-#endif
+#	endif
 }
+#endif // defined(ANKI_FRAGMENT_SHADER) || defined(ANKI_COMPUTE_SHADER)
+
+#pragma anki technique_start vert
+#include <AnKi/Shaders/QuadVert.hlsl>
+#pragma anki technique_end vert
+
+#pragma anki technique_start frag
+#pragma anki technique_end frag
+
+#pragma anki technique_start comp
+#pragma anki technique_end comp

+ 0 - 8
AnKi/Shaders/BloomUpscaleCompute.ankiprog

@@ -1,8 +0,0 @@
-// Copyright (C) 2009-2023, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#pragma anki technique_start comp
-#include <AnKi/Shaders/BloomUpscale.hlsl>
-#pragma anki technique_end comp

+ 0 - 12
AnKi/Shaders/BloomUpscaleRaster.ankiprog

@@ -1,12 +0,0 @@
-// Copyright (C) 2009-2023, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#pragma anki technique_start vert
-#include <AnKi/Shaders/QuadVert.hlsl>
-#pragma anki technique_end vert
-
-#pragma anki technique_start frag
-#include <AnKi/Shaders/BloomUpscale.hlsl>
-#pragma anki technique_end frag

+ 43 - 31
AnKi/Shaders/DepthAwareBlur.hlsl → AnKi/Shaders/DepthAwareBlur.ankiprog

@@ -9,33 +9,34 @@
 #pragma anki mutator SAMPLE_COUNT 3 5 7 9 11 13 15
 #pragma anki mutator COLOR_COMPONENTS 4 3 1
 
-#define ORIENTATION_VERTICAL 0
-#define ORIENTATION_HORIZONTAL 1
-#define ORIENTATION_BOX 2
+#if defined(ANKI_COMPUTE_SHADER) || defined(ANKI_FRAGMENT_SHADER)
+#	define ORIENTATION_VERTICAL 0
+#	define ORIENTATION_HORIZONTAL 1
+#	define ORIENTATION_BOX 2
 
-#if SAMPLE_COUNT < 3
-#	error See file
-#endif
+#	if SAMPLE_COUNT < 3
+#		error See file
+#	endif
 
 // Define some macros depending on the number of components
-#if COLOR_COMPONENTS == 4
+#	if COLOR_COMPONENTS == 4
 typedef Vec4 ColorType;
-#elif COLOR_COMPONENTS == 3
+#	elif COLOR_COMPONENTS == 3
 typedef Vec3 ColorType;
-#elif COLOR_COMPONENTS == 1
+#	elif COLOR_COMPONENTS == 1
 typedef F32 ColorType;
-#else
-#	error See file
-#endif
+#	else
+#		error See file
+#	endif
 
 [[vk::binding(0)]] SamplerState g_linearAnyClampSampler;
 [[vk::binding(1)]] Texture2D<ColorType> g_inTex;
 [[vk::binding(2)]] Texture2D g_depthTex;
 
-#if defined(ANKI_COMPUTE_SHADER)
-#	define THREADGROUP_SQRT_SIZE 8
+#	if defined(ANKI_COMPUTE_SHADER)
+#		define THREADGROUP_SQRT_SIZE 8
 [[vk::binding(2)]] RWTexture2D<ColorType> g_outImg;
-#endif
+#	endif
 
 F32 computeDepthWeight(F32 refDepth, F32 depth)
 {
@@ -57,18 +58,18 @@ void sampleTex(Vec2 uv, F32 refDepth, inout ColorType col, inout F32 weight)
 	weight += w;
 }
 
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 [numthreads(THREADGROUP_SQRT_SIZE, THREADGROUP_SQRT_SIZE, 1)] void main(UVec3 svDispatchThreadId : SV_DISPATCHTHREADID)
-#else
+#	else
 ColorType main([[vk::location(0)]] Vec2 uv : TEXCOORD) : SV_TARGET0
-#endif
+#	endif
 {
 	UVec2 textureSize;
 	U32 mipCount;
 	g_inTex.GetDimensions(0, textureSize.x, textureSize.y, mipCount);
 
 	// Set UVs
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 	[branch] if(svDispatchThreadId.x >= textureSize.x || svDispatchThreadId.y >= textureSize.y)
 	{
 		// Out of bounds
@@ -76,7 +77,7 @@ ColorType main([[vk::location(0)]] Vec2 uv : TEXCOORD) : SV_TARGET0
 	}
 
 	const Vec2 uv = (Vec2(svDispatchThreadId.xy) + 0.5) / Vec2(textureSize);
-#endif
+#	endif
 
 	const Vec2 texelSize = 1.0 / Vec2(textureSize);
 
@@ -85,14 +86,14 @@ ColorType main([[vk::location(0)]] Vec2 uv : TEXCOORD) : SV_TARGET0
 	const F32 refDepth = readDepth(uv);
 	F32 weight = 1.0;
 
-#if ORIENTATION != ORIENTATION_BOX
+#	if ORIENTATION != ORIENTATION_BOX
 	// Do seperable
 
-#	if ORIENTATION == ORIENTATION_HORIZONTAL
-#		define X_OR_Y x
-#	else
-#		define X_OR_Y y
-#	endif
+#		if ORIENTATION == ORIENTATION_HORIZONTAL
+#			define X_OR_Y x
+#		else
+#			define X_OR_Y y
+#		endif
 
 	Vec2 uvOffset = Vec2(0.0, 0.0);
 	uvOffset.X_OR_Y = 1.5 * texelSize.X_OR_Y;
@@ -104,7 +105,7 @@ ColorType main([[vk::location(0)]] Vec2 uv : TEXCOORD) : SV_TARGET0
 
 		uvOffset.X_OR_Y += 2.0 * texelSize.X_OR_Y;
 	}
-#else
+#	else
 	// Do box
 
 	const Vec2 offset = 1.5 * texelSize;
@@ -118,14 +119,25 @@ ColorType main([[vk::location(0)]] Vec2 uv : TEXCOORD) : SV_TARGET0
 	sampleTex(uv + Vec2(0.0, offset.y), refDepth, color, weight);
 	sampleTex(uv + Vec2(-offset.x, 0.0), refDepth, color, weight);
 	sampleTex(uv + Vec2(0.0, -offset.y), refDepth, color, weight);
-#endif
+#	endif
 
 	color /= weight;
 
 	// Write value
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 	g_outImg[svDispatchThreadId.xy] = color;
-#else
+#	else
 	return color;
-#endif
+#	endif
 }
+#endif // defined(ANKI_COMPUTE_SHADER) || defined(ANKI_FRAGMENT_SHADER)
+
+#pragma anki technique_start vert
+#include <AnKi/Shaders/QuadVert.hlsl>
+#pragma anki technique_end vert
+
+#pragma anki technique_start frag
+#pragma anki technique_end frag
+
+#pragma anki technique_start comp
+#pragma anki technique_end comp

+ 0 - 8
AnKi/Shaders/DepthAwareBlurCompute.ankiprog

@@ -1,8 +0,0 @@
-// Copyright (C) 2009-2023, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#pragma anki technique_start comp
-#include <AnKi/Shaders/DepthAwareBlur.hlsl>
-#pragma anki technique_end comp

+ 0 - 12
AnKi/Shaders/DepthAwareBlurRaster.ankiprog

@@ -1,12 +0,0 @@
-// Copyright (C) 2009-2023, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#pragma anki technique_start vert
-#include <AnKi/Shaders/QuadVert.hlsl>
-#pragma anki technique_end vert
-
-#pragma anki technique_start frag
-#include <AnKi/Shaders/DepthAwareBlur.hlsl>
-#pragma anki technique_end frag

+ 16 - 2
AnKi/Shaders/DepthDownscaleCompute.ankiprog → AnKi/Shaders/DepthDownscale.ankiprog

@@ -3,8 +3,6 @@
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 
-// The 1st reduction is average depth. The next reductions are max depth
-
 #pragma anki mutator WAVE_OPERATIONS 0 1
 
 #pragma anki technique_start comp
@@ -95,3 +93,19 @@ AF4 SpdReduce4(AF4 v0, AF4 v1, AF4 v2, AF4 v3)
 }
 
 #pragma anki technique_end comp
+
+#pragma anki technique_start vert
+#include <AnKi/Shaders/QuadVert.hlsl>
+#pragma anki technique_end vert
+
+#pragma anki technique_start frag
+#include <AnKi/Shaders/Common.hlsl>
+
+[[vk::binding(0)]] Texture2D<Vec4> g_inputTex;
+[[vk::binding(1)]] SamplerState g_linearAnyClampSampler;
+
+F32 main([[vk::location(0)]] Vec2 uv : TEXCOORD) : SV_TARGET0
+{
+	return g_inputTex.SampleLevel(g_linearAnyClampSampler, uv, 0.0).x;
+}
+#pragma anki technique_end frag

+ 0 - 20
AnKi/Shaders/DepthDownscaleRaster.ankiprog

@@ -1,20 +0,0 @@
-// Copyright (C) 2009-2023, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#pragma anki technique_start vert
-#include <AnKi/Shaders/QuadVert.hlsl>
-#pragma anki technique_end vert
-
-#pragma anki technique_start frag
-#include <AnKi/Shaders/Common.hlsl>
-
-[[vk::binding(0)]] Texture2D<Vec4> g_inputTex;
-[[vk::binding(1)]] SamplerState g_linearAnyClampSampler;
-
-F32 main([[vk::location(0)]] Vec2 uv : TEXCOORD) : SV_TARGET0
-{
-	return g_inputTex.SampleLevel(g_linearAnyClampSampler, uv, 0.0).x;
-}
-#pragma anki technique_end frag

+ 25 - 15
AnKi/Shaders/DownscaleBlur.hlsl → AnKi/Shaders/DownscaleBlur.ankiprog

@@ -3,16 +3,15 @@
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 
-#pragma once
-
-#include <AnKi/Shaders/TonemappingFunctions.hlsl>
-#include <AnKi/Shaders/Functions.hlsl>
+#if defined(ANKI_COMPUTE_SHADER) || defined(ANKI_FRAGMENT_SHADER)
+#	include <AnKi/Shaders/TonemappingFunctions.hlsl>
+#	include <AnKi/Shaders/Functions.hlsl>
 
 [[vk::binding(0)]] SamplerState g_linearAnyClampSampler;
 [[vk::binding(1)]] Texture2D<RVec3> g_tex;
 
 constexpr U32 kTonemappingBinding = 2u;
-#include <AnKi/Shaders/TonemappingResources.hlsl>
+#	include <AnKi/Shaders/TonemappingResources.hlsl>
 
 struct Constants
 {
@@ -22,17 +21,17 @@ struct Constants
 };
 [[vk::push_constant]] ConstantBuffer<Constants> g_consts;
 
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 [[vk::binding(3)]] RWTexture2D<RVec4> g_outUav;
-#endif
+#	endif
 
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 [numthreads(8, 8, 1)] void main(UVec4 svDispatchThreadId : SV_DISPATCHTHREADID)
-#else
+#	else
 RVec3 main([[vk::location(0)]] Vec2 uv : TEXCOORD) : SV_TARGET0
-#endif
+#	endif
 {
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 	if(svDispatchThreadId.x >= g_consts.m_fbSize.x || svDispatchThreadId.y >= g_consts.m_fbSize.y)
 	{
 		// Skip pixels outside the viewport
@@ -40,7 +39,7 @@ RVec3 main([[vk::location(0)]] Vec2 uv : TEXCOORD) : SV_TARGET0
 	}
 
 	const Vec2 uv = (Vec2(svDispatchThreadId.xy) + 0.5) / Vec2(g_consts.m_fbSize);
-#endif
+#	endif
 
 	RVec3 output;
 	const RF32 weight = 1.0 / 5.0;
@@ -57,9 +56,20 @@ RVec3 main([[vk::location(0)]] Vec2 uv : TEXCOORD) : SV_TARGET0
 		output = invertTonemap(output, readExposureAndAverageLuminance().x);
 	}
 
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 	g_outUav[svDispatchThreadId.xy] = RVec4(output, 1.0);
-#else
+#	else
 	return output;
-#endif
+#	endif
 }
+#endif // defined(ANKI_COMPUTE_SHADER) || defined(ANKI_FRAGMENT_SHADER)
+
+#pragma anki technique_start vert
+#include <AnKi/Shaders/QuadVert.hlsl>
+#pragma anki technique_end vert
+
+#pragma anki technique_start frag
+#pragma anki technique_end frag
+
+#pragma anki technique_start comp
+#pragma anki technique_end comp

+ 0 - 8
AnKi/Shaders/DownscaleBlurCompute.ankiprog

@@ -1,8 +0,0 @@
-// Copyright (C) 2009-2023, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#pragma anki technique_start comp
-#include <AnKi/Shaders/DownscaleBlur.hlsl>
-#pragma anki technique_end comp

+ 0 - 12
AnKi/Shaders/DownscaleBlurRaster.ankiprog

@@ -1,12 +0,0 @@
-// Copyright (C) 2009-2023, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#pragma anki technique_start vert
-#include <AnKi/Shaders/QuadVert.hlsl>
-#pragma anki technique_end vert
-
-#pragma anki technique_start frag
-#include <AnKi/Shaders/DownscaleBlur.hlsl>
-#pragma anki technique_end frag

+ 38 - 26
AnKi/Shaders/Fsr.hlsl → AnKi/Shaders/Fsr.ankiprog

@@ -7,13 +7,14 @@
 #pragma anki mutator SHARPEN 0 1
 #pragma anki mutator FSR_QUALITY 0 1
 
-#include <AnKi/Shaders/Functions.hlsl>
+#if defined(ANKI_COMPUTE_SHADER) || defined(ANKI_FRAGMENT_SHADER)
+#	include <AnKi/Shaders/Functions.hlsl>
 
 [[vk::binding(0)]] SamplerState g_linearAnyClampSampler;
 [[vk::binding(1)]] Texture2D<Vec4> g_tex;
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 [[vk::binding(2)]] RWTexture2D<Vec4> g_outUav;
-#endif
+#	endif
 
 struct Constants
 {
@@ -28,13 +29,13 @@ struct Constants
 [[vk::push_constant]] ConstantBuffer<Constants> g_consts;
 
 // FSR begin
-#define A_GPU 1
-#define A_HLSL 1
-#define A_HALF 1
-#include <ThirdParty/FidelityFX/ffx_a.h>
+#	define A_GPU 1
+#	define A_HLSL 1
+#	define A_HALF 1
+#	include <ThirdParty/FidelityFX/ffx_a.h>
 
-#if SHARPEN
-#	define FSR_RCAS_H 1
+#	if SHARPEN
+#		define FSR_RCAS_H 1
 
 AH4 FsrRcasLoadH(ASW2 p)
 {
@@ -48,8 +49,8 @@ void FsrRcasInputH(inout AH1 r, inout AH1 g, inout AH1 b)
 	ANKI_MAYBE_UNUSED(b);
 }
 
-#else // !SHARPEN
-#	define FSR_EASU_H 1
+#	else // !SHARPEN
+#		define FSR_EASU_H 1
 
 AH4 FsrEasuRH(AF2 p)
 {
@@ -70,40 +71,51 @@ AH3 FsrEasuSampleH(AF2 p)
 {
 	return AH3(g_tex.SampleLevel(g_linearAnyClampSampler, p, 0.0).xyz);
 }
-#endif
+#	endif
 
-#include <ThirdParty/FidelityFX/ffx_fsr1.h>
+#	include <ThirdParty/FidelityFX/ffx_fsr1.h>
 // FSR end
 
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 [numthreads(8, 8, 1)] void main(UVec3 svDispatchThreadId : SV_DISPATCHTHREADID)
-#else
+#	else
 Vec3 main(Vec4 svPosition : SV_POSITION) : SV_TARGET0
-#endif
+#	endif
 {
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 	if(any(svDispatchThreadId >= g_consts.m_viewportSize))
 	{
 		return;
 	}
 
 	const UVec2 uv = svDispatchThreadId.xy;
-#else
+#	else
 	const UVec2 uv = UVec2(svPosition.xy);
-#endif
+#	endif
 
 	HVec3 color;
-#if SHARPEN
+#	if SHARPEN
 	FsrRcasH(color.r, color.g, color.b, uv, g_consts.m_fsrConsts0);
-#elif FSR_QUALITY == 0
+#	elif FSR_QUALITY == 0
 	FsrEasuL(color, uv, g_consts.m_fsrConsts0, g_consts.m_fsrConsts1, g_consts.m_fsrConsts2, g_consts.m_fsrConsts3);
-#else
+#	else
 	FsrEasuH(color, uv, g_consts.m_fsrConsts0, g_consts.m_fsrConsts1, g_consts.m_fsrConsts2, g_consts.m_fsrConsts3);
-#endif
+#	endif
 
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 	g_outUav[svDispatchThreadId.xy] = Vec4(color, 0.0);
-#else
+#	else
 	return HVec3(color);
-#endif
+#	endif
 }
+#endif // defined(ANKI_COMPUTE_SHADER) || defined(ANKI_FRAGMENT_SHADER)
+
+#pragma anki technique_start vert
+#include <AnKi/Shaders/QuadVert.hlsl>
+#pragma anki technique_end vert
+
+#pragma anki technique_start frag
+#pragma anki technique_end frag
+
+#pragma anki technique_start comp
+#pragma anki technique_end comp

+ 0 - 8
AnKi/Shaders/FsrCompute.ankiprog

@@ -1,8 +0,0 @@
-// Copyright (C) 2009-2023, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#pragma anki technique_start comp
-#include <AnKi/Shaders/Fsr.hlsl>
-#pragma anki technique_end comp

+ 0 - 12
AnKi/Shaders/FsrRaster.ankiprog

@@ -1,12 +0,0 @@
-// Copyright (C) 2009-2023, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#pragma anki technique_start vert
-#include <AnKi/Shaders/QuadVert.hlsl>
-#pragma anki technique_end vert
-
-#pragma anki technique_start frag
-#include <AnKi/Shaders/Fsr.hlsl>
-#pragma anki technique_end frag

+ 38 - 26
AnKi/Shaders/IndirectDiffuse.hlsl → AnKi/Shaders/IndirectDiffuse.ankiprog

@@ -5,18 +5,19 @@
 
 // Does SSGI and GI probe sampling
 
-#include <AnKi/Shaders/Functions.hlsl>
-#include <AnKi/Shaders/PackFunctions.hlsl>
-#include <AnKi/Shaders/ImportanceSampling.hlsl>
-#include <AnKi/Shaders/TonemappingFunctions.hlsl>
-#include <AnKi/Shaders/Include/MiscRendererTypes.h>
-#include <AnKi/Shaders/ClusteredShadingFunctions.hlsl>
-
-#define ENABLE_SSGI true
-#define ENABLE_PROBES true
-#define REMOVE_FIREFLIES false
-#define REPROJECT_LIGHTBUFFER false
-#define SSGI_PROBE_COMBINE(ssgiColor, probeColor) ((ssgiColor) + (probeColor))
+#if defined(ANKI_COMPUTE_SHADER) || defined(ANKI_FRAGMENT_SHADER)
+#	include <AnKi/Shaders/Functions.hlsl>
+#	include <AnKi/Shaders/PackFunctions.hlsl>
+#	include <AnKi/Shaders/ImportanceSampling.hlsl>
+#	include <AnKi/Shaders/TonemappingFunctions.hlsl>
+#	include <AnKi/Shaders/Include/MiscRendererTypes.h>
+#	include <AnKi/Shaders/ClusteredShadingFunctions.hlsl>
+
+#	define ENABLE_SSGI true
+#	define ENABLE_PROBES true
+#	define REMOVE_FIREFLIES false
+#	define REPROJECT_LIGHTBUFFER false
+#	define SSGI_PROBE_COMBINE(ssgiColor, probeColor) ((ssgiColor) + (probeColor))
 
 [[vk::binding(0)]] ConstantBuffer<ClusteredShadingConstants> g_clusteredShading;
 [[vk::binding(1)]] StructuredBuffer<GlobalIlluminationProbe> g_giProbes;
@@ -29,9 +30,9 @@
 [[vk::binding(8)]] Texture2D<Vec4> g_motionVectorsTex;
 [[vk::binding(9)]] Texture2D<Vec4> g_historyLengthTex;
 
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 [[vk::binding(10)]] RWTexture2D<RVec4> g_outUav;
-#endif
+#	endif
 
 ANKI_BINDLESS_SET(1)
 
@@ -42,13 +43,13 @@ Vec4 cheapProject(Vec4 point_)
 	return projectPerspective(point_, g_consts.m_projectionMat.x, g_consts.m_projectionMat.y, g_consts.m_projectionMat.z, g_consts.m_projectionMat.w);
 }
 
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 [numthreads(8, 8, 1)] void main(UVec3 svDispatchThreadId : SV_DISPATCHTHREADID)
-#else
+#	else
 RVec3 main([[vk::location(0)]] Vec2 uv : TEXCOORD, Vec4 svPosition : SV_POSITION) : SV_TARGET0
-#endif
+#	endif
 {
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 	if(svDispatchThreadId.x >= g_consts.m_viewportSize.x || svDispatchThreadId.y >= g_consts.m_viewportSize.y)
 	{
 		return;
@@ -56,9 +57,9 @@ RVec3 main([[vk::location(0)]] Vec2 uv : TEXCOORD, Vec4 svPosition : SV_POSITION
 
 	const Vec2 fragCoord = Vec2(svDispatchThreadId.xy) + 0.5;
 	const Vec2 uv = fragCoord / g_consts.m_viewportSizef;
-#else
+#	else
 	const Vec2 fragCoord = svPosition.xy;
-#endif
+#	endif
 
 	const Vec2 ndc = uvToNdc(uv);
 
@@ -85,11 +86,11 @@ RVec3 main([[vk::location(0)]] Vec2 uv : TEXCOORD, Vec4 svPosition : SV_POSITION
 		const RF32 projRadius = length(projSphereLimit2 - ndc);
 
 		// Loop to compute
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 		const UVec2 globalInvocation = svDispatchThreadId.xy;
-#else
+#	else
 		const UVec2 globalInvocation = UVec2(svPosition.xy);
-#endif
+#	endif
 		const UVec2 random = rand3DPCG16(UVec3(globalInvocation, g_clusteredShading.m_frame)).xy;
 		const F32 aspectRatio = g_consts.m_viewportSizef.x / g_consts.m_viewportSizef.y;
 		for(U32 i = 0u; i < g_consts.m_sampleCount; ++i)
@@ -221,9 +222,20 @@ RVec3 main([[vk::location(0)]] Vec2 uv : TEXCOORD, Vec4 svPosition : SV_POSITION
 	}
 
 	// Store color
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 	g_outUav[svDispatchThreadId.xy] = RVec4(outColor, 0.0f);
-#else
+#	else
 	return outColor;
-#endif
+#	endif
 }
+#endif // defined(ANKI_COMPUTE_SHADER) || defined(ANKI_FRAGMENT_SHADER)
+
+#pragma anki technique_start vert
+#include <AnKi/Shaders/QuadVert.hlsl>
+#pragma anki technique_end vert
+
+#pragma anki technique_start frag
+#pragma anki technique_end frag
+
+#pragma anki technique_start comp
+#pragma anki technique_end comp

+ 0 - 8
AnKi/Shaders/IndirectDiffuseCompute.ankiprog

@@ -1,8 +0,0 @@
-// Copyright (C) 2009-2023, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#pragma anki technique_start comp
-#include <AnKi/Shaders/IndirectDiffuse.hlsl>
-#pragma anki technique_end comp

+ 29 - 17
AnKi/Shaders/IndirectDiffuseDenoise.hlsl → AnKi/Shaders/IndirectDiffuseDenoise.ankiprog

@@ -10,14 +10,15 @@
 #include <AnKi/Shaders/Functions.hlsl>
 #include <AnKi/Shaders/BilateralFilter.hlsl>
 
+#if defined(ANKI_COMPUTE_SHADER) || defined(ANKI_FRAGMENT_SHADER)
 [[vk::binding(0)]] SamplerState g_linearAnyClampSampler;
 [[vk::binding(1)]] Texture2D<RVec4> g_toDenoiseTex;
 [[vk::binding(2)]] Texture2D g_depthTex;
 
-#if defined(ANKI_COMPUTE_SHADER)
-#	define THREAD_GROUP_SIZE_SQRT 8
+#	if defined(ANKI_COMPUTE_SHADER)
+#		define THREAD_GROUP_SIZE_SQRT 8
 [[vk::binding(3)]] RWTexture2D<RVec4> g_outUav;
-#endif
+#	endif
 
 [[vk::push_constant]] ConstantBuffer<IndirectDiffuseDenoiseConstants> g_consts;
 
@@ -28,31 +29,31 @@ Vec3 unproject(Vec2 ndc, F32 depth)
 	return worldPos;
 }
 
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 [numthreads(THREAD_GROUP_SIZE_SQRT, THREAD_GROUP_SIZE_SQRT, 1)] void main(UVec3 svDispatchThreadId : SV_DISPATCHTHREADID)
-#else
+#	else
 RVec3 main([[vk::location(0)]] Vec2 uv : TEXCOORD) : SV_TARGET0
-#endif
+#	endif
 {
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 	if(skipOutOfBoundsInvocations(UVec2(THREAD_GROUP_SIZE_SQRT, THREAD_GROUP_SIZE_SQRT), g_consts.m_viewportSize, svDispatchThreadId))
 	{
 		return;
 	}
 
 	const Vec2 uv = (Vec2(svDispatchThreadId.xy) + 0.5) / g_consts.m_viewportSizef;
-#endif
+#	endif
 
 	// Reference
 	const F32 depthCenter = g_depthTex.SampleLevel(g_linearAnyClampSampler, uv, 0.0).r;
 	if(depthCenter == 1.0)
 	{
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 		g_outUav[svDispatchThreadId.xy] = 0.0f;
 		return;
-#else
+#	else
 		return 0.0f;
-#endif
+#	endif
 	}
 
 	// Sample
@@ -62,11 +63,11 @@ RVec3 main([[vk::location(0)]] Vec2 uv : TEXCOORD) : SV_TARGET0
 	for(F32 i = -g_consts.m_sampleCountDiv2; i <= g_consts.m_sampleCountDiv2; i += 1.0)
 	{
 		const Vec2 texelSize = 1.0 / g_consts.m_viewportSizef;
-#if BLUR_ORIENTATION == 0
+#	if BLUR_ORIENTATION == 0
 		const Vec2 sampleUv = Vec2(uv.x + i * texelSize.x, uv.y);
-#else
+#	else
 		const Vec2 sampleUv = Vec2(uv.x, uv.y + i * texelSize.y);
-#endif
+#	endif
 
 		const F32 depthTap = g_depthTex.SampleLevel(g_linearAnyClampSampler, sampleUv, 0.0).r;
 
@@ -80,9 +81,20 @@ RVec3 main([[vk::location(0)]] Vec2 uv : TEXCOORD) : SV_TARGET0
 	// Normalize and store
 	color /= weight;
 
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 	g_outUav[svDispatchThreadId.xy] = RVec4(color, 0.0f);
-#else
+#	else
 	return color;
-#endif
+#	endif
 }
+#endif // defined(ANKI_COMPUTE_SHADER) || defined(ANKI_FRAGMENT_SHADER)
+
+#pragma anki technique_start vert
+#include <AnKi/Shaders/QuadVert.hlsl>
+#pragma anki technique_end vert
+
+#pragma anki technique_start frag
+#pragma anki technique_end frag
+
+#pragma anki technique_start comp
+#pragma anki technique_end comp

+ 0 - 8
AnKi/Shaders/IndirectDiffuseDenoiseCompute.ankiprog

@@ -1,8 +0,0 @@
-// Copyright (C) 2009-2023, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#pragma anki technique_start comp
-#include <AnKi/Shaders/IndirectDiffuseDenoise.hlsl>
-#pragma anki technique_end comp

+ 0 - 12
AnKi/Shaders/IndirectDiffuseDenoiseRaster.ankiprog

@@ -1,12 +0,0 @@
-// Copyright (C) 2009-2023, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#pragma anki technique_start vert
-#include <AnKi/Shaders/QuadVert.hlsl>
-#pragma anki technique_end vert
-
-#pragma anki technique_start frag
-#include <AnKi/Shaders/IndirectDiffuseDenoise.hlsl>
-#pragma anki technique_end frag

+ 0 - 12
AnKi/Shaders/IndirectDiffuseRaster.ankiprog

@@ -1,12 +0,0 @@
-// Copyright (C) 2009-2023, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#pragma anki technique_start vert
-#include <AnKi/Shaders/QuadVert.hlsl>
-#pragma anki technique_end vert
-
-#pragma anki technique_start frag
-#include <AnKi/Shaders/IndirectDiffuse.hlsl>
-#pragma anki technique_end frag

+ 45 - 33
AnKi/Shaders/IndirectSpecular.hlsl → AnKi/Shaders/IndirectSpecular.ankiprog

@@ -6,12 +6,13 @@
 #pragma anki mutator STOCHASTIC 0 1
 #pragma anki mutator EXTRA_REJECTION 0 1
 
-#include <AnKi/Shaders/LightFunctions.hlsl>
-#include <AnKi/Shaders/PackFunctions.hlsl>
-#include <AnKi/Shaders/Include/MiscRendererTypes.h>
-#include <AnKi/Shaders/TonemappingFunctions.hlsl>
-#include <AnKi/Shaders/SsRaymarching.hlsl>
-#include <AnKi/Shaders/ClusteredShadingFunctions.hlsl>
+#if defined(ANKI_COMPUTE_SHADER) || defined(ANKI_FRAGMENT_SHADER)
+#	include <AnKi/Shaders/LightFunctions.hlsl>
+#	include <AnKi/Shaders/PackFunctions.hlsl>
+#	include <AnKi/Shaders/Include/MiscRendererTypes.h>
+#	include <AnKi/Shaders/TonemappingFunctions.hlsl>
+#	include <AnKi/Shaders/SsRaymarching.hlsl>
+#	include <AnKi/Shaders/ClusteredShadingFunctions.hlsl>
 
 [[vk::binding(0)]] ConstantBuffer<SsrConstants> g_consts;
 
@@ -34,25 +35,25 @@
 
 constexpr Vec2 kNoiseTexSize = 64.0;
 
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 [[vk::binding(14)]] RWTexture2D<RVec4> g_outUav;
-#endif
+#	endif
 
 ANKI_BINDLESS_SET(1)
 
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 [numthreads(8, 8, 1)] void main(UVec3 svDispatchThreadId : SV_DISPATCHTHREADID)
-#else
+#	else
 RVec3 main(Vec2 uv : TEXCOORD, Vec4 svPosition : SV_POSITION) : SV_TARGET0
-#endif
+#	endif
 {
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 	if(any(svDispatchThreadId.xy >= g_consts.m_framebufferSize))
 	{
 		return;
 	}
 	const Vec2 uv = (Vec2(svDispatchThreadId.xy) + 0.5) / Vec2(g_consts.m_framebufferSize);
-#endif
+#	endif
 
 	// Read part of the G-buffer
 	const F32 roughness = unpackRoughnessFromGBuffer(g_gbufferRt1.SampleLevel(g_trilinearClampSampler, uv, 0.0));
@@ -72,11 +73,11 @@ RVec3 main(Vec2 uv : TEXCOORD, Vec4 svPosition : SV_POSITION) : SV_TARGET0
 	// Compute refl vector
 	const Vec3 viewDir = -normalize(viewPos);
 	const Vec3 viewNormal = mul(g_consts.m_normalMat, Vec4(worldNormal, 0.0));
-#if STOCHASTIC
+#	if STOCHASTIC
 	const Vec3 reflDir = sampleReflectionVector(viewDir, viewNormal, roughness, noise.xy);
-#else
+#	else
 	const Vec3 reflDir = reflect(-viewDir, viewNormal);
-#endif
+#	endif
 
 	// Is rough enough to deserve SSR?
 	F32 ssrAttenuation = saturate(1.0f - pow(roughness / g_consts.m_roughnessCutoff, 16.0f));
@@ -100,7 +101,7 @@ RVec3 main(Vec2 uv : TEXCOORD, Vec4 svPosition : SV_POSITION) : SV_TARGET0
 		ssrAttenuation = 0.0f;
 	}
 
-#if EXTRA_REJECTION
+#	if EXTRA_REJECTION
 	// Reject backfacing
 	[branch] if(ssrAttenuation > 0.0)
 	{
@@ -127,7 +128,7 @@ RVec3 main(Vec2 uv : TEXCOORD, Vec4 svPosition : SV_POSITION) : SV_TARGET0
 		const F32 distAttenuation = (diff < rejectionMeters) ? 1.0 : 0.0;
 		ssrAttenuation *= distAttenuation;
 	}
-#endif
+#	endif
 
 	// Read the reflection
 	Vec3 outColor = 0.0;
@@ -137,13 +138,13 @@ RVec3 main(Vec2 uv : TEXCOORD, Vec4 svPosition : SV_POSITION) : SV_TARGET0
 		const Vec4 v4 = mul(g_consts.m_prevViewProjMatMulInvViewProjMat, Vec4(uvToNdc(hitPoint.xy), hitPoint.z, 1.0));
 		hitPoint.xy = ndcToUv(v4.xy / v4.w);
 
-#if STOCHASTIC
+#	if STOCHASTIC
 		// LOD stays 0
 		const F32 lod = 0.0;
-#else
+#	else
 		// Compute the LOD based on the roughness
 		const F32 lod = F32(g_consts.m_lightBufferMipCount - 1u) * roughness;
-#endif
+#	endif
 
 		// Read the light buffer
 		Vec3 ssrColor = g_lightBufferRt.SampleLevel(g_trilinearClampSampler, hitPoint.xy, lod).rgb;
@@ -174,17 +175,17 @@ RVec3 main(Vec2 uv : TEXCOORD, Vec4 svPosition : SV_POSITION) : SV_TARGET0
 	// Read probes
 	[branch] if(ssrAttenuation < 1.0)
 	{
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 		const Vec2 fragCoord = Vec2(svDispatchThreadId.xy) + 0.5;
-#else
+#	else
 		const Vec2 fragCoord = svPosition.xy;
-#endif
+#	endif
 
-#if STOCHASTIC
+#	if STOCHASTIC
 		const F32 reflLod = 0.0;
-#else
+#	else
 		const F32 reflLod = (g_clusteredShading.m_reflectionProbesMipCount - 1.0) * roughness;
-#endif
+#	endif
 
 		// Get cluster
 		const Vec2 ndc = uvToNdc(uv);
@@ -194,11 +195,11 @@ RVec3 main(Vec2 uv : TEXCOORD, Vec4 svPosition : SV_POSITION) : SV_TARGET0
 
 		// Compute the refl dir in word space this time
 		const RVec3 viewDir = normalize(g_clusteredShading.m_cameraPosition - worldPos);
-#if STOCHASTIC
+#	if STOCHASTIC
 		const Vec3 reflDir = sampleReflectionVector(viewDir, worldNormal, roughness, noise.xy);
-#else
+#	else
 		const Vec3 reflDir = reflect(-viewDir, worldNormal);
-#endif
+#	endif
 
 		Vec3 probeColor = 0.0;
 
@@ -246,9 +247,20 @@ RVec3 main(Vec2 uv : TEXCOORD, Vec4 svPosition : SV_POSITION) : SV_TARGET0
 
 	// Store
 	ssrAttenuation = saturate(ssrAttenuation);
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 	g_outUav[svDispatchThreadId.xy] = RVec4(outColor, 0.0);
-#else
+#	else
 	return outColor;
-#endif
+#	endif
 }
+#endif // defined(ANKI_COMPUTE_SHADER) || defined(ANKI_FRAGMENT_SHADER)
+
+#pragma anki technique_start vert
+#include <AnKi/Shaders/QuadVert.hlsl>
+#pragma anki technique_end vert
+
+#pragma anki technique_start frag
+#pragma anki technique_end frag
+
+#pragma anki technique_start comp
+#pragma anki technique_end comp

+ 0 - 8
AnKi/Shaders/IndirectSpecularCompute.ankiprog

@@ -1,8 +0,0 @@
-// Copyright (C) 2009-2023, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#pragma anki technique_start comp
-#include <AnKi/Shaders/IndirectSpecular.hlsl>
-#pragma anki technique_end comp

+ 0 - 12
AnKi/Shaders/IndirectSpecularRaster.ankiprog

@@ -1,12 +0,0 @@
-// Copyright (C) 2009-2023, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#pragma anki technique_start vert
-#include <AnKi/Shaders/QuadVert.hlsl>
-#pragma anki technique_end vert
-
-#pragma anki technique_start frag
-#include <AnKi/Shaders/IndirectSpecular.hlsl>
-#pragma anki technique_end frag

+ 26 - 14
AnKi/Shaders/MotionVectors.hlsl → AnKi/Shaders/MotionVectors.ankiprog

@@ -5,7 +5,8 @@
 
 // Calculates the motion vectors that will be used to sample from the previous frame
 
-#include <AnKi/Shaders/Functions.hlsl>
+#if defined(ANKI_COMPUTE_SHADER) || defined(ANKI_FRAGMENT_SHADER)
+#	include <AnKi/Shaders/Functions.hlsl>
 
 constexpr F32 kMaxRejectionDistance = 0.1; // In meters
 constexpr F32 kMaxHistoryLength = 16.0;
@@ -29,10 +30,10 @@ struct Constants
 
 [[vk::binding(5)]] ConstantBuffer<Constants> g_consts;
 
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 [[vk::binding(6)]] RWTexture2D<Vec2> g_motionVectorsUav;
 [[vk::binding(7)]] RWTexture2D<F32> g_historyLengthUav;
-#endif
+#	endif
 
 Vec3 clipToWorld(Vec4 clip, Mat4 clipToWorldMat)
 {
@@ -83,13 +84,13 @@ F32 computeRejectionFactor(Vec2 uv, Vec2 historyUv)
 	Vec3 boxMax;
 	getMinMaxWorldPositions(g_currentDepthTex, uv, g_consts.m_viewProjectionInvMat, boxMin, boxMax);
 
-#if 0
+#	if 0
 	const F32 historyDepth = g_historyDepthTex.SampleLevel(g_linearAnyClampSampler, historyUv, 0.0).r;
 	const Vec3 historyWorldPos = clipToWorld(Vec4(uvToNdc(historyUv), historyDepth, 1.0), g_consts.m_prevViewProjectionInvMat);
-#else
+#	else
 	// Average gives more rejection so less ghosting
 	const Vec3 historyWorldPos = getAverageWorldPosition(g_historyDepthTex, historyUv, g_consts.m_prevViewProjectionInvMat);
-#endif
+#	endif
 	const Vec3 clampedHistoryWorldPos = clamp(historyWorldPos, boxMin, boxMax);
 
 	// This factor shows when new pixels appeared by checking depth differences
@@ -109,9 +110,9 @@ F32 computeRejectionFactor(Vec2 uv, Vec2 historyUv)
 	return rejection;
 }
 
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 [numthreads(8, 8, 1)] void main(UVec2 svDispatchThreadId : SV_DISPATCHTHREADID)
-#else
+#	else
 struct FragOut
 {
 	Vec2 m_motionVectors : SV_TARGET0;
@@ -119,11 +120,11 @@ struct FragOut
 };
 
 FragOut main(Vec2 uv : TEXCOORD)
-#endif
+#	endif
 {
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 	const Vec2 uv = (Vec2(svDispatchThreadId) + 0.5f) / g_consts.m_viewportSize;
-#endif
+#	endif
 	const F32 depth = g_currentDepthTex.SampleLevel(g_linearAnyClampSampler, uv, 0.0).r;
 
 	const Vec2 velocity = g_velocityTex.SampleLevel(g_linearAnyClampSampler, uv, 0.0).rg;
@@ -155,13 +156,24 @@ FragOut main(Vec2 uv : TEXCOORD)
 	}
 
 	// Write out
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 	g_motionVectorsUav[svDispatchThreadId] = historyUv - uv;
 	g_historyLengthUav[svDispatchThreadId] = historyLength;
-#else
+#	else
 	FragOut output;
 	output.m_motionVectors = historyUv - uv;
 	output.m_historyLength = historyLength;
 	return output;
-#endif
+#	endif
 }
+#endif // defined(ANKI_COMPUTE_SHADER) || defined(ANKI_FRAGMENT_SHADER)
+
+#pragma anki technique_start vert
+#include <AnKi/Shaders/QuadVert.hlsl>
+#pragma anki technique_end vert
+
+#pragma anki technique_start frag
+#pragma anki technique_end frag
+
+#pragma anki technique_start comp
+#pragma anki technique_end comp

+ 0 - 8
AnKi/Shaders/MotionVectorsCompute.ankiprog

@@ -1,8 +0,0 @@
-// Copyright (C) 2009-2023, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#pragma anki technique_start comp
-#include <AnKi/Shaders/MotionVectors.hlsl>
-#pragma anki technique_end comp

+ 0 - 12
AnKi/Shaders/MotionVectorsRaster.ankiprog

@@ -1,12 +0,0 @@
-// Copyright (C) 2009-2023, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#pragma anki technique_start vert
-#include <AnKi/Shaders/QuadVert.hlsl>
-#pragma anki technique_end vert
-
-#pragma anki technique_start frag
-#include <AnKi/Shaders/MotionVectors.hlsl>
-#pragma anki technique_end frag

+ 47 - 35
AnKi/Shaders/ShadowmapsResolve.hlsl → AnKi/Shaders/ShadowmapsResolve.ankiprog

@@ -6,9 +6,10 @@
 #pragma anki mutator PCF 0 1
 #pragma anki mutator DIRECTIONAL_LIGHT_SHADOW_RESOLVED 0 1
 
-#include <AnKi/Shaders/ClusteredShadingFunctions.hlsl>
+#if defined(ANKI_COMPUTE_SHADER) || defined(ANKI_FRAGMENT_SHADER)
+#	include <AnKi/Shaders/ClusteredShadingFunctions.hlsl>
 
-#define DEBUG_CASCADES 0
+#	define DEBUG_CASCADES 0
 
 [[vk::binding(0)]] ConstantBuffer<ClusteredShadingConstants> g_clusteredShading;
 [[vk::binding(1)]] StructuredBuffer<PointLight> g_pointLights;
@@ -22,13 +23,13 @@
 [[vk::binding(7)]] Texture2D<Vec4> g_depthRt;
 [[vk::binding(8)]] Texture2D<Vec4> g_noiseTex;
 
-#if DIRECTIONAL_LIGHT_SHADOW_RESOLVED
+#	if DIRECTIONAL_LIGHT_SHADOW_RESOLVED
 [[vk::binding(9)]] Texture2D<Vec4> g_dirLightResolvedShadowsTex;
-#endif
+#	endif
 
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 [[vk::binding(10)]] RWTexture2D<RVec4> g_outUav;
-#endif
+#	endif
 
 struct Constants
 {
@@ -59,18 +60,18 @@ Vec3 computeDebugShadowCascadeColor(U32 cascade)
 	}
 }
 
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 [numthreads(8, 8, 1)] void main(UVec2 svDispatchThreadId : SV_DISPATCHTHREADID)
-#else
+#	else
 RVec4 main(Vec2 uv : TEXCOORD) : SV_TARGET0
-#endif
+#	endif
 {
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 	svDispatchThreadId = min(svDispatchThreadId, UVec2(g_consts.m_framebufferSize - 1.0f)); // Just to be sure
 	const Vec2 uv = (Vec2(svDispatchThreadId) + 0.5) / g_consts.m_framebufferSize;
-#endif
+#	endif
 
-#if PCF
+#	if PCF
 	// Noise
 	Vec2 noiseTexSize;
 	g_noiseTex.GetDimensions(noiseTexSize.x, noiseTexSize.y);
@@ -79,7 +80,7 @@ RVec4 main(Vec2 uv : TEXCOORD) : SV_TARGET0
 	RVec3 noise = g_noiseTex.SampleLevel(g_trilinearRepeatSampler, noiseUv, 0.0).rgb;
 	noise = animateBlueNoise(noise, g_clusteredShading.m_frame % 16u);
 	const RF32 randFactor = noise.x;
-#endif
+#	endif
 
 	// World position
 	const Vec2 ndc = uvToNdc(uv);
@@ -97,10 +98,10 @@ RVec4 main(Vec2 uv : TEXCOORD) : SV_TARGET0
 	RVec4 shadowFactors = 0.0f;
 
 	// Dir light
-#if DIRECTIONAL_LIGHT_SHADOW_RESOLVED
+#	if DIRECTIONAL_LIGHT_SHADOW_RESOLVED
 	shadowFactors[0] = g_dirLightResolvedShadowsTex.SampleLevel(g_linearAnyClampSampler, uv, 0.0f).x;
 	++shadowCasterCountPerFragment;
-#else
+#	else
 	const DirectionalLight dirLight = g_clusteredShading.m_directionalLight;
 	if(dirLight.m_active != 0u && dirLight.m_shadowCascadeCount > 0u)
 	{
@@ -115,25 +116,25 @@ RVec4 main(Vec2 uv : TEXCOORD) : SV_TARGET0
 			const UVec2 cascadeIndices =
 				computeShadowCascadeIndex2(positiveZViewSpace, dirLight.m_shadowCascadeDistances, dirLight.m_shadowCascadeCount, cascadeBlendFactor);
 
-#	if DEBUG_CASCADES
+#		if DEBUG_CASCADES
 			const Vec3 debugColorA = computeDebugShadowCascadeColor(cascadeIndices[0]);
 			const Vec3 debugColorB = computeDebugShadowCascadeColor(cascadeIndices[1]);
 			const Vec3 debugColor = lerp(debugColorA, debugColorB, cascadeBlendFactor);
-#		if defined(ANKI_COMPUTE_SHADER)
+#			if defined(ANKI_COMPUTE_SHADER)
 			g_outUav[svDispatchThreadId.xy] = shadowFactors;
 			return;
-#		else
+#			else
 			return shadowFactors;
+#			endif
 #		endif
-#	endif
 
-#	if PCF
+#		if PCF
 			const F32 shadowFactorCascadeA =
 				computeShadowFactorDirLightPcf(dirLight, cascadeIndices.x, worldPos, g_shadowAtlasTex, g_linearAnyClampShadowSampler, randFactor);
-#	else
+#		else
 			const F32 shadowFactorCascadeA =
 				computeShadowFactorDirLight(dirLight, cascadeIndices.x, worldPos, g_shadowAtlasTex, g_linearAnyClampShadowSampler);
-#	endif
+#		endif
 
 			if(cascadeBlendFactor < 0.01 || cascadeIndices.x == cascadeIndices.y)
 			{
@@ -142,15 +143,15 @@ RVec4 main(Vec2 uv : TEXCOORD) : SV_TARGET0
 			}
 			else
 			{
-#	if PCF
+#		if PCF
 				// Blend cascades
 				const F32 shadowFactorCascadeB =
 					computeShadowFactorDirLightPcf(dirLight, cascadeIndices.y, worldPos, g_shadowAtlasTex, g_linearAnyClampShadowSampler, randFactor);
-#	else
+#		else
 				// Blend cascades
 				const F32 shadowFactorCascadeB =
 					computeShadowFactorDirLight(dirLight, cascadeIndices.y, worldPos, g_shadowAtlasTex, g_linearAnyClampShadowSampler);
-#	endif
+#		endif
 				shadowFactor = lerp(shadowFactorCascadeA, shadowFactorCascadeB, cascadeBlendFactor);
 			}
 
@@ -166,7 +167,7 @@ RVec4 main(Vec2 uv : TEXCOORD) : SV_TARGET0
 		shadowFactors[0] = shadowFactor;
 		++shadowCasterCountPerFragment;
 	}
-#endif // DIRECTIONAL_LIGHT_SHADOW_RESOLVED
+#	endif // DIRECTIONAL_LIGHT_SHADOW_RESOLVED
 
 	// Point lights
 	U32 idx = 0;
@@ -178,12 +179,12 @@ RVec4 main(Vec2 uv : TEXCOORD) : SV_TARGET0
 		{
 			const Vec3 frag2Light = light.m_position - worldPos;
 
-#if PCF
+#	if PCF
 			const RF32 shadowFactor =
 				computeShadowFactorPointLightPcf(light, frag2Light, g_shadowAtlasTex, g_linearAnyClampShadowSampler, randFactor);
-#else
+#	else
 			const RF32 shadowFactor = computeShadowFactorPointLight(light, frag2Light, g_shadowAtlasTex, g_linearAnyClampShadowSampler);
-#endif
+#	endif
 			shadowFactors[min(kMaxShadowCastersPerFragment - 1u, shadowCasterCountPerFragment++)] = shadowFactor;
 		}
 	}
@@ -195,19 +196,30 @@ RVec4 main(Vec2 uv : TEXCOORD) : SV_TARGET0
 
 		[branch] if(light.m_shadow)
 		{
-#if PCF
+#	if PCF
 			const RF32 shadowFactor = computeShadowFactorSpotLightPcf(light, worldPos, g_shadowAtlasTex, g_linearAnyClampShadowSampler, randFactor);
-#else
+#	else
 			const RF32 shadowFactor = computeShadowFactorSpotLight(light, worldPos, g_shadowAtlasTex, g_linearAnyClampShadowSampler);
-#endif
+#	endif
 			shadowFactors[min(kMaxShadowCastersPerFragment - 1u, shadowCasterCountPerFragment++)] = shadowFactor;
 		}
 	}
 
 	// Store
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 	g_outUav[svDispatchThreadId] = shadowFactors;
-#else
+#	else
 	return shadowFactors;
-#endif
+#	endif
 }
+#endif // defined(ANKI_COMPUTE_SHADER) || defined(ANKI_FRAGMENT_SHADER)
+
+#pragma anki technique_start vert
+#include <AnKi/Shaders/QuadVert.hlsl>
+#pragma anki technique_end vert
+
+#pragma anki technique_start frag
+#pragma anki technique_end frag
+
+#pragma anki technique_start comp
+#pragma anki technique_end comp

+ 0 - 8
AnKi/Shaders/ShadowmapsResolveCompute.ankiprog

@@ -1,8 +0,0 @@
-// Copyright (C) 2009-2023, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#pragma anki technique_start comp
-#include <AnKi/Shaders/ShadowmapsResolve.hlsl>
-#pragma anki technique_end comp

+ 0 - 12
AnKi/Shaders/ShadowmapsResolveRaster.ankiprog

@@ -1,12 +0,0 @@
-// Copyright (C) 2009-2023, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#pragma anki technique_start vert
-#include <AnKi/Shaders/QuadVert.hlsl>
-#pragma anki technique_end vert
-
-#pragma anki technique_start frag
-#include <AnKi/Shaders/ShadowmapsResolve.hlsl>
-#pragma anki technique_end frag

+ 42 - 30
AnKi/Shaders/TemporalAA.hlsl → AnKi/Shaders/TemporalAA.ankiprog

@@ -6,9 +6,10 @@
 #pragma anki mutator VARIANCE_CLIPPING 0 1
 #pragma anki mutator YCBCR 0 1
 
-#include <AnKi/Shaders/Functions.hlsl>
-#include <AnKi/Shaders/PackFunctions.hlsl>
-#include <AnKi/Shaders/TonemappingFunctions.hlsl>
+#if defined(ANKI_COMPUTE_SHADER) || defined(ANKI_FRAGMENT_SHADER)
+#	include <AnKi/Shaders/Functions.hlsl>
+#	include <AnKi/Shaders/PackFunctions.hlsl>
+#	include <AnKi/Shaders/TonemappingFunctions.hlsl>
 
 constexpr F32 kVarianceClippingGamma = 2.7f; // Variance clipping paper proposes 1.0
 constexpr F32 kBlendFactor = 1.0f / 16.0f;
@@ -19,39 +20,39 @@ constexpr F32 kBlendFactor = 1.0f / 16.0f;
 [[vk::binding(3)]] Texture2D g_motionVectorsTex;
 
 constexpr U32 kTonemappingBinding = 4u;
-#include <AnKi/Shaders/TonemappingResources.hlsl>
+#	include <AnKi/Shaders/TonemappingResources.hlsl>
 
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 [[vk::binding(5)]] RWTexture2D<RVec4> g_uavTex;
 [[vk::binding(6)]] RWTexture2D<RVec4> g_tonemappedUavTex;
-#else
+#	else
 struct FragOut
 {
 	RVec3 m_color : SV_TARGET0;
 	RVec3 m_tonemappedColor : SV_TARGET1;
 };
-#endif
+#	endif
 
-#if YCBCR
-#	define sample(s, uv) rgbToYCbCr(s.SampleLevel(g_linearAnyClampSampler, uv, 0.0).rgb)
-#	define sampleOffset(s, uv, x, y) rgbToYCbCr(s.SampleLevel(g_linearAnyClampSampler, uv, 0.0, IVec2(x, y)).rgb)
-#else
-#	define sample(s, uv) s.SampleLevel(g_linearAnyClampSampler, uv, 0.0).rgb
-#	define sampleOffset(s, uv, x, y) s.SampleLevel(g_linearAnyClampSampler, uv, 0.0, IVec2(x, y)).rgb
-#endif
+#	if YCBCR
+#		define sample(s, uv) rgbToYCbCr(s.SampleLevel(g_linearAnyClampSampler, uv, 0.0).rgb)
+#		define sampleOffset(s, uv, x, y) rgbToYCbCr(s.SampleLevel(g_linearAnyClampSampler, uv, 0.0, IVec2(x, y)).rgb)
+#	else
+#		define sample(s, uv) s.SampleLevel(g_linearAnyClampSampler, uv, 0.0).rgb
+#		define sampleOffset(s, uv, x, y) s.SampleLevel(g_linearAnyClampSampler, uv, 0.0, IVec2(x, y)).rgb
+#	endif
 
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 [numthreads(8, 8, 1)] void main(UVec3 svDispatchThreadId : SV_DISPATCHTHREADID)
-#else
+#	else
 FragOut main(Vec2 uv : TEXCOORD)
-#endif
+#	endif
 {
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 	Vec2 outUavSize;
 	g_uavTex.GetDimensions(outUavSize.x, outUavSize.y);
 
 	const Vec2 uv = (Vec2(svDispatchThreadId.xy) + 0.5) / outUavSize;
-#endif
+#	endif
 
 	// Get prev uv coords
 	const Vec2 oldUv = uv + g_motionVectorsTex.SampleLevel(g_linearAnyClampSampler, uv, 0.0).rg;
@@ -66,7 +67,7 @@ FragOut main(Vec2 uv : TEXCOORD)
 	const Vec3 near2 = sampleOffset(g_inputRt, uv, -1, 0);
 	const Vec3 near3 = sampleOffset(g_inputRt, uv, 0, -1);
 
-#if VARIANCE_CLIPPING
+#	if VARIANCE_CLIPPING
 	const Vec3 m1 = crntCol + near0 + near1 + near2 + near3;
 	const Vec3 m2 = crntCol * crntCol + near0 * near0 + near1 * near1 + near2 * near2 + near3 * near3;
 
@@ -75,23 +76,23 @@ FragOut main(Vec2 uv : TEXCOORD)
 
 	const Vec3 boxMin = mu - kVarianceClippingGamma * sigma;
 	const Vec3 boxMax = mu + kVarianceClippingGamma * sigma;
-#else
+#	else
 	const Vec3 boxMin = min(crntCol, min(near0, min(near1, min(near2, near3))));
 	const Vec3 boxMax = max(crntCol, max(near0, max(near1, max(near2, near3))));
-#endif
+#	endif
 
 	historyCol = clamp(historyCol, boxMin, boxMax);
 
 	// Remove jitter (T. Lottes)
-#if YCBCR
+#	if YCBCR
 	const F32 lum0 = crntCol.r;
 	const F32 lum1 = historyCol.r;
 	const F32 maxLum = boxMax.r;
-#else
+#	else
 	const F32 lum0 = computeLuminance(reinhardTonemap(crntCol));
 	const F32 lum1 = computeLuminance(reinhardTonemap(historyCol));
 	const F32 maxLum = 1.0;
-#endif
+#	endif
 
 	F32 diff = abs(lum0 - lum1) / max(lum0, max(lum1, maxLum + kEpsilonF32));
 	diff = 1.0 - diff;
@@ -100,17 +101,28 @@ FragOut main(Vec2 uv : TEXCOORD)
 
 	// Write result
 	Vec3 outColor = lerp(historyCol, crntCol, feedback);
-#if YCBCR
+#	if YCBCR
 	outColor = yCbCrToRgb(outColor);
-#endif
+#	endif
 	const Vec3 tonemapped = linearToSRgb(tonemap(outColor, readExposureAndAverageLuminance().x));
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 	g_uavTex[svDispatchThreadId.xy] = RVec4(outColor, 0.0);
 	g_tonemappedUavTex[svDispatchThreadId.xy] = RVec4(tonemapped, 0.0);
-#else
+#	else
 	FragOut output;
 	output.m_color = outColor;
 	output.m_tonemappedColor = tonemapped;
 	return output;
-#endif
+#	endif
 }
+#endif // defined(ANKI_COMPUTE_SHADER) || defined(ANKI_FRAGMENT_SHADER)
+
+#pragma anki technique_start vert
+#include <AnKi/Shaders/QuadVert.hlsl>
+#pragma anki technique_end vert
+
+#pragma anki technique_start frag
+#pragma anki technique_end frag
+
+#pragma anki technique_start comp
+#pragma anki technique_end comp

+ 0 - 8
AnKi/Shaders/TemporalAACompute.ankiprog

@@ -1,8 +0,0 @@
-// Copyright (C) 2009-2023, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#pragma anki technique_start comp
-#include <AnKi/Shaders/TemporalAA.hlsl>
-#pragma anki technique_end comp

+ 0 - 12
AnKi/Shaders/TemporalAARaster.ankiprog

@@ -1,12 +0,0 @@
-// Copyright (C) 2009-2023, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#pragma anki technique_start vert
-#include <AnKi/Shaders/QuadVert.hlsl>
-#pragma anki technique_end vert
-
-#pragma anki technique_start frag
-#include <AnKi/Shaders/TemporalAA.hlsl>
-#pragma anki technique_end frag

+ 26 - 14
AnKi/Shaders/Tonemap.hlsl → AnKi/Shaders/Tonemap.ankiprog

@@ -5,19 +5,20 @@
 
 // Does tonemapping
 
-#include <AnKi/Shaders/Functions.hlsl>
-#include <AnKi/Shaders/TonemappingFunctions.hlsl>
+#if defined(ANKI_COMPUTE_SHADER) || defined(ANKI_FRAGMENT_SHADER)
+#	include <AnKi/Shaders/Functions.hlsl>
+#	include <AnKi/Shaders/TonemappingFunctions.hlsl>
 
 [[vk::binding(0)]] SamplerState g_nearestAnyClampSampler;
 [[vk::binding(1)]] Texture2D<RVec4> g_inputRt;
 
 constexpr U32 kTonemappingBinding = 2u;
-#include <AnKi/Shaders/TonemappingResources.hlsl>
+#	include <AnKi/Shaders/TonemappingResources.hlsl>
 
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 [[vk::binding(3)]] RWTexture2D<RVec4> g_outUav;
-#	define THREADGROUP_SIZE_SQRT 8
-#endif
+#		define THREADGROUP_SIZE_SQRT 8
+#	endif
 
 struct Constants
 {
@@ -27,27 +28,38 @@ struct Constants
 
 [[vk::push_constant]] ConstantBuffer<Constants> g_consts;
 
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 [numthreads(THREADGROUP_SIZE_SQRT, THREADGROUP_SIZE_SQRT, 1)] void main(UVec3 svDispatchThreadId : SV_DISPATCHTHREADID)
-#else
+#	else
 RVec3 main(Vec2 uv : TEXCOORD) : SV_TARGET0
-#endif
+#	endif
 {
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 	if(skipOutOfBoundsInvocations(UVec2(THREADGROUP_SIZE_SQRT, THREADGROUP_SIZE_SQRT), g_consts.m_viewportSize, svDispatchThreadId.xy))
 	{
 		return;
 	}
 
 	const Vec2 uv = (Vec2(svDispatchThreadId.xy) + 0.5f) * g_consts.m_viewportSizeOverOne;
-#endif
+#	endif
 
 	const RVec3 hdr = g_inputRt.SampleLevel(g_nearestAnyClampSampler, uv, 0.0f).rgb;
 	const Vec3 tonemapped = linearToSRgb(tonemap(hdr, readExposureAndAverageLuminance().x));
 
-#if defined(ANKI_COMPUTE_SHADER)
+#	if defined(ANKI_COMPUTE_SHADER)
 	g_outUav[svDispatchThreadId.xy] = RVec4(tonemapped, 0.0);
-#else
+#	else
 	return tonemapped;
-#endif
+#	endif
 }
+#endif // defined(ANKI_COMPUTE_SHADER) || defined(ANKI_FRAGMENT_SHADER)
+
+#pragma anki technique_start vert
+#include <AnKi/Shaders/QuadVert.hlsl>
+#pragma anki technique_end vert
+
+#pragma anki technique_start frag
+#pragma anki technique_end frag
+
+#pragma anki technique_start comp
+#pragma anki technique_end comp

+ 0 - 8
AnKi/Shaders/TonemapCompute.ankiprog

@@ -1,8 +0,0 @@
-// Copyright (C) 2009-2023, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#pragma anki technique_start comp
-#include <AnKi/Shaders/Tonemap.hlsl>
-#pragma anki technique_end comp

+ 0 - 12
AnKi/Shaders/TonemapRaster.ankiprog

@@ -1,12 +0,0 @@
-// Copyright (C) 2009-2023, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#pragma anki technique_start vert
-#include <AnKi/Shaders/QuadVert.hlsl>
-#pragma anki technique_end vert
-
-#pragma anki technique_start frag
-#include <AnKi/Shaders/Tonemap.hlsl>
-#pragma anki technique_end frag