瀏覽代碼

Move ExponentialShadowmappingResolve, GaussianBlur and GaussianBlurCompute to the new format

Panagiotis Christopoulos Charitos 5 年之前
父節點
當前提交
0a2a6a9350

+ 1 - 1
shaders/ExponentialShadowmappingResolve.glslp → shaders/ExponentialShadowmappingResolve.ankiprog

@@ -3,7 +3,7 @@
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 
-#pragma anki input const UVec2 INPUT_TEXTURE_SIZE
+ANKI_SPECIALIZATION_CONSTANT_UVEC2(INPUT_TEXTURE_SIZE, 0, UVec2(1));
 
 #pragma anki start comp
 #include <shaders/GaussianBlurCommon.glsl>

+ 1 - 9
shaders/GaussianBlur.glslp → shaders/GaussianBlur.ankiprog

@@ -7,14 +7,6 @@
 #include <shaders/QuadVert.glsl>
 #pragma anki end
 
-#pragma anki frag
-#if ORIENTATION == 0
-#	define VERTICAL 1
-#elif ORIENTATION == 1
-#	define HORIZONTAL 1
-#else
-#	define BOX 1
-#endif
-
+#pragma anki start frag
 #include <shaders/GaussianBlur.glsl>
 #pragma anki end

+ 11 - 5
shaders/GaussianBlur.glsl

@@ -3,25 +3,31 @@
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 
-// Defines it needs:
-// WORKGROUP_SIZE (only for compute)
-
 #pragma once
 
 #pragma anki mutator ORIENTATION 0 1 2 // 0: VERTICAL, 1: HORIZONTAL, 2: BOX
-#pragma anki mutator KERNEL_SIZE 3 5 7 9 11 13 15
+#pragma anki mutator KERNEL_SIZE 3 5 7 9 11
 #pragma anki mutator COLOR_COMPONENTS 4 3 1
 
-#pragma anki input const UVec2 TEXTURE_SIZE
+ANKI_SPECIALIZATION_CONSTANT_UVEC2(TEXTURE_SIZE, 0, UVec2(1));
 
 #include <shaders/GaussianBlurCommon.glsl>
 
 #if defined(ANKI_COMPUTE_SHADER)
+const UVec2 WORKGROUP_SIZE = UVec2(8, 8);
 #	define USE_COMPUTE 1
 #else
 #	define USE_COMPUTE 0
 #endif
 
+#if ORIENTATION == 0
+#	define VERTICAL 1
+#elif ORIENTATION == 1
+#	define HORIZONTAL 1
+#else
+#	define BOX 1
+#endif
+
 // Determine color type
 #if COLOR_COMPONENTS == 4
 #	define COL_TYPE Vec4

+ 0 - 10
shaders/GaussianBlurCompute.glslp → shaders/GaussianBlurCompute.ankiprog

@@ -3,16 +3,6 @@
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 
-#pragma anki input const UVec2 WORKGROUP_SIZE
-
 #pragma anki start comp
-#if ORIENTATION == 0
-#	define VERTICAL 1
-#elif ORIENTATION == 1
-#	define HORIZONTAL 1
-#else
-#	define BOX 1
-#endif
-
 #include <shaders/GaussianBlur.glsl>
 #pragma anki end

+ 6 - 6
src/anki/renderer/ShadowMapping.cpp

@@ -115,16 +115,16 @@ Error ShadowMapping::initAtlas(const ConfigSet& cfg)
 
 	// Programs and shaders
 	{
-		ANKI_CHECK(
-			getResourceManager().loadResource("shaders/ExponentialShadowmappingResolve.glslp", m_atlas.m_resolveProg));
+		ANKI_CHECK(getResourceManager().loadResource(
+			"shaders/ExponentialShadowmappingResolve.ankiprog", m_atlas.m_resolveProg));
 
-		ShaderProgramResourceConstantValueInitList<1> consts(m_atlas.m_resolveProg);
-		consts.add("INPUT_TEXTURE_SIZE",
+		ShaderProgramResourceVariantInitInfo2 variantInitInfo(m_atlas.m_resolveProg);
+		variantInitInfo.addConstant("INPUT_TEXTURE_SIZE",
 			UVec2(m_scratch.m_tileCountX * m_scratch.m_tileResolution,
 				m_scratch.m_tileCountY * m_scratch.m_tileResolution));
 
-		const ShaderProgramResourceVariant* variant;
-		m_atlas.m_resolveProg->getOrCreateVariant(consts.get(), variant);
+		const ShaderProgramResourceVariant2* variant;
+		m_atlas.m_resolveProg->getOrCreateVariant(variantInitInfo, variant);
 		m_atlas.m_resolveGrProg = variant->getProgram();
 	}
 

+ 1 - 1
src/anki/renderer/ShadowMapping.h

@@ -56,7 +56,7 @@ private:
 		U32 m_tileResolution = 0; ///< Tile resolution.
 		U32 m_tileCountBothAxis = 0;
 
-		ShaderProgramResourcePtr m_resolveProg;
+		ShaderProgramResource2Ptr m_resolveProg;
 		ShaderProgramPtr m_resolveGrProg;
 
 		WeakArray<ResolveWorkItem> m_resolveWorkItems;

+ 20 - 16
src/anki/renderer/Ssao.cpp

@@ -56,30 +56,34 @@ Error Ssao::initBlur(const ConfigSet& config)
 	// shader
 	if(m_blurUseCompute)
 	{
-		ANKI_CHECK(m_r->getResourceManager().loadResource("shaders/GaussianBlurCompute.glslp", m_blur.m_prog));
+		ANKI_CHECK(m_r->getResourceManager().loadResource("shaders/GaussianBlurCompute.ankiprog", m_blur.m_prog));
 
-		ShaderProgramResourceMutationInitList<3> mutators(m_blur.m_prog);
-		mutators.add("ORIENTATION", 2).add("KERNEL_SIZE", 3).add("COLOR_COMPONENTS", 1);
-		ShaderProgramResourceConstantValueInitList<2> consts(m_blur.m_prog);
-		consts.add("TEXTURE_SIZE", UVec2(m_width, m_height))
-			.add("WORKGROUP_SIZE", UVec2(m_workgroupSize[0], m_workgroupSize[1]));
+		ShaderProgramResourceVariantInitInfo2 variantInitInfo(m_blur.m_prog);
+		variantInitInfo.addMutation("ORIENTATION", 2);
+		variantInitInfo.addMutation("KERNEL_SIZE", 3);
+		variantInitInfo.addMutation("COLOR_COMPONENTS", 1);
+		variantInitInfo.addConstant("TEXTURE_SIZE", UVec2(m_width, m_height));
 
-		const ShaderProgramResourceVariant* variant;
-		m_blur.m_prog->getOrCreateVariant(mutators.get(), consts.get(), variant);
+		const ShaderProgramResourceVariant2* variant;
+		m_blur.m_prog->getOrCreateVariant(variantInitInfo, variant);
+
+		m_blur.m_workgroupSize[0] = variant->getWorkgroupSizes()[0];
+		m_blur.m_workgroupSize[1] = variant->getWorkgroupSizes()[1];
 
 		m_blur.m_grProg = variant->getProgram();
 	}
 	else
 	{
-		ANKI_CHECK(m_r->getResourceManager().loadResource("shaders/GaussianBlur.glslp", m_blur.m_prog));
+		ANKI_CHECK(m_r->getResourceManager().loadResource("shaders/GaussianBlur.ankiprog", m_blur.m_prog));
 
-		ShaderProgramResourceMutationInitList<3> mutators(m_blur.m_prog);
-		mutators.add("ORIENTATION", 2).add("KERNEL_SIZE", 3).add("COLOR_COMPONENTS", 1);
-		ShaderProgramResourceConstantValueInitList<1> consts(m_blur.m_prog);
-		consts.add("TEXTURE_SIZE", UVec2(m_width, m_height));
+		ShaderProgramResourceVariantInitInfo2 variantInitInfo(m_blur.m_prog);
+		variantInitInfo.addMutation("ORIENTATION", 2);
+		variantInitInfo.addMutation("KERNEL_SIZE", 3);
+		variantInitInfo.addMutation("COLOR_COMPONENTS", 1);
+		variantInitInfo.addConstant("TEXTURE_SIZE", UVec2(m_width, m_height));
 
-		const ShaderProgramResourceVariant* variant;
-		m_blur.m_prog->getOrCreateVariant(mutators.get(), consts.get(), variant);
+		const ShaderProgramResourceVariant2* variant;
+		m_blur.m_prog->getOrCreateVariant(variantInitInfo, variant);
 
 		m_blur.m_grProg = variant->getProgram();
 	}
@@ -179,7 +183,7 @@ void Ssao::runBlur(RenderPassWorkContext& rgraphCtx)
 	if(m_blurUseCompute)
 	{
 		rgraphCtx.bindImage(0, 2, m_runCtx.m_rts[1], TextureSubresourceInfo());
-		dispatchPPCompute(cmdb, m_workgroupSize[0], m_workgroupSize[1], m_width, m_height);
+		dispatchPPCompute(cmdb, m_blur.m_workgroupSize[0], m_blur.m_workgroupSize[1], m_width, m_height);
 	}
 	else
 	{

+ 2 - 1
src/anki/renderer/Ssao.h

@@ -57,8 +57,9 @@ private:
 	class
 	{
 	public:
-		ShaderProgramResourcePtr m_prog;
+		ShaderProgramResource2Ptr m_prog;
 		ShaderProgramPtr m_grProg;
+		Array<U32, 2> m_workgroupSize = {};
 	} m_blur; ///< Box blur.
 
 	class

+ 19 - 1
src/anki/shader_compiler/ShaderProgramCompiler.cpp

@@ -689,7 +689,7 @@ static Error doReflection(
 	return Error::NONE;
 }
 
-Error compileShaderProgram(CString fname,
+Error compileShaderProgramInternal(CString fname,
 	ShaderProgramFilesystemInterface& fsystem,
 	ShaderProgramPostParseInterface* postParseCallback,
 	GenericMemoryPoolAllocator<U8> tempAllocator,
@@ -897,6 +897,24 @@ Error compileShaderProgram(CString fname,
 	return Error::NONE;
 }
 
+Error compileShaderProgram(CString fname,
+	ShaderProgramFilesystemInterface& fsystem,
+	ShaderProgramPostParseInterface* postParseCallback,
+	GenericMemoryPoolAllocator<U8> tempAllocator,
+	const GpuDeviceCapabilities& gpuCapabilities,
+	const BindlessLimits& bindlessLimits,
+	ShaderProgramBinaryWrapper& binaryW)
+{
+	const Error err = compileShaderProgramInternal(
+		fname, fsystem, postParseCallback, tempAllocator, gpuCapabilities, bindlessLimits, binaryW);
+	if(err)
+	{
+		ANKI_SHADER_COMPILER_LOGE("Failed to compile: %s", fname.cstr());
+	}
+
+	return err;
+}
+
 #define ANKI_TAB "    "
 
 static void disassembleBlock(

+ 1 - 1
src/anki/shader_compiler/ShaderProgramCompiler.h

@@ -19,7 +19,7 @@ namespace anki
 /// @memberof ShaderProgramCompiler
 class ShaderProgramBinaryWrapper : public NonCopyable
 {
-	friend Error compileShaderProgram(CString fname,
+	friend Error compileShaderProgramInternal(CString fname,
 		ShaderProgramFilesystemInterface& fsystem,
 		ShaderProgramPostParseInterface* postParseCallback,
 		GenericMemoryPoolAllocator<U8> tempAllocator,