Răsfoiți Sursa

Move DownscaleBlur and DownscaleBlurCompute to the new format

Panagiotis Christopoulos Charitos 5 ani în urmă
părinte
comite
9f73c3421c

+ 0 - 0
shaders/DownscaleBlur.glslp → shaders/DownscaleBlur.ankiprog


+ 1 - 0
shaders/DownscaleBlur.glsl

@@ -11,6 +11,7 @@ layout(set = 0, binding = 0) uniform sampler u_linearAnyClampSampler;
 layout(set = 0, binding = 1) uniform texture2D u_tex;
 
 #if defined(ANKI_COMPUTE_SHADER)
+const UVec2 WORKGROUP_SIZE = UVec2(16, 16);
 layout(local_size_x = WORKGROUP_SIZE.x, local_size_y = WORKGROUP_SIZE.y, local_size_z = 1) in;
 
 // Push constants hold the size of the output image

+ 0 - 2
shaders/DownscaleBlurCompute.glslp → shaders/DownscaleBlurCompute.ankiprog

@@ -3,8 +3,6 @@
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 
-#pragma anki input const UVec2 WORKGROUP_SIZE
-
 #pragma anki start comp
 #include <shaders/DownscaleBlur.glsl>
 #pragma anki end

+ 7 - 8
src/anki/renderer/DownscaleBlur.cpp

@@ -61,19 +61,18 @@ Error DownscaleBlur::initInternal(const ConfigSet&)
 	}
 
 	// Shader programs
-	const ShaderProgramResourceVariant* variant = nullptr;
+	const ShaderProgramResourceVariant2* variant = nullptr;
 	if(m_useCompute)
 	{
-		ANKI_CHECK(getResourceManager().loadResource("shaders/DownscaleBlurCompute.glslp", m_prog));
-
-		ShaderProgramResourceConstantValueInitList<1> consts(m_prog);
-		consts.add("WORKGROUP_SIZE", UVec2(m_workgroupSize[0], m_workgroupSize[1]));
-
-		m_prog->getOrCreateVariant(consts.get(), variant);
+		ANKI_CHECK(getResourceManager().loadResource("shaders/DownscaleBlurCompute.ankiprog", m_prog));
+		m_prog->getOrCreateVariant(variant);
+		m_workgroupSize[0] = variant->getWorkgroupSizes()[0];
+		m_workgroupSize[1] = variant->getWorkgroupSizes()[1];
+		ANKI_ASSERT(variant->getWorkgroupSizes()[2] == 1);
 	}
 	else
 	{
-		ANKI_CHECK(getResourceManager().loadResource("shaders/DownscaleBlur.glslp", m_prog));
+		ANKI_CHECK(getResourceManager().loadResource("shaders/DownscaleBlur.ankiprog", m_prog));
 		m_prog->getOrCreateVariant(variant);
 	}
 	m_grProg = variant->getProgram();

+ 2 - 2
src/anki/renderer/DownscaleBlur.h

@@ -54,7 +54,7 @@ public:
 
 private:
 	static const Bool m_useCompute = true;
-	Array<U32, 2> m_workgroupSize = {{16, 16}};
+	Array<U32, 2> m_workgroupSize = {{0, 0}};
 
 	U32 m_passCount = 0; ///< It's also the mip count of the m_rtTex.
 
@@ -62,7 +62,7 @@ private:
 
 	DynamicArray<FramebufferDescription> m_fbDescrs;
 
-	ShaderProgramResourcePtr m_prog;
+	ShaderProgramResource2Ptr m_prog;
 	ShaderProgramPtr m_grProg;
 
 	class

+ 1 - 0
src/anki/resource/ShaderProgramResource2.cpp

@@ -301,6 +301,7 @@ void ShaderProgramResource2::initVariant(
 				const U32 constIdx = m_constBinaryMapping[binaryConstIdx].m_constsIdx;
 				const U32 component = m_constBinaryMapping[binaryConstIdx].m_component;
 				const Const& c = m_consts[constIdx];
+				(void)c;
 				ANKI_ASSERT(c.m_dataType == ShaderVariableDataType::INT || c.m_dataType == ShaderVariableDataType::IVEC2
 							|| c.m_dataType == ShaderVariableDataType::IVEC3
 							|| c.m_dataType == ShaderVariableDataType::IVEC4);

+ 96 - 79
src/anki/resource/ShaderProgramResource2.h

@@ -83,9 +83,9 @@ public:
 
 	const Array<U32, 3>& getWorkgroupSizes() const
 	{
-		ANKI_ASSERT(m_workgroupSizes[0] != MAX_U32);
-		ANKI_ASSERT(m_workgroupSizes[1] != MAX_U32);
-		ANKI_ASSERT(m_workgroupSizes[2] != MAX_U32);
+		ANKI_ASSERT(m_workgroupSizes[0] != MAX_U32 && m_workgroupSizes[0] != 0);
+		ANKI_ASSERT(m_workgroupSizes[1] != MAX_U32 && m_workgroupSizes[1] != 0);
+		ANKI_ASSERT(m_workgroupSizes[2] != MAX_U32 && m_workgroupSizes[2] != 0);
 		return m_workgroupSizes;
 	}
 
@@ -96,6 +96,71 @@ private:
 	Array<U32, 3> m_workgroupSizes;
 };
 
+/// The value of a constant.
+class ShaderProgramResourceConstantValue2
+{
+public:
+	union
+	{
+		I32 m_int;
+		IVec2 m_ivec2;
+		IVec3 m_ivec3;
+		IVec4 m_ivec4;
+
+		F32 m_float;
+		Vec2 m_vec2;
+		Vec3 m_vec3;
+		Vec4 m_vec4;
+	};
+
+	U32 m_constantIndex;
+	U8 _m_padding[sizeof(Vec4) - sizeof(m_constantIndex)];
+
+	ShaderProgramResourceConstantValue2()
+	{
+		zeroMemory(*this);
+	}
+};
+static_assert(sizeof(ShaderProgramResourceConstantValue2) == sizeof(Vec4) * 2, "Need it to be packed");
+
+/// Smart initializer of multiple ShaderProgramResourceConstantValue.
+class ShaderProgramResourceVariantInitInfo2
+{
+	friend class ShaderProgramResource2;
+
+public:
+	ShaderProgramResourceVariantInitInfo2()
+	{
+	}
+
+	ShaderProgramResourceVariantInitInfo2(const ShaderProgramResource2Ptr& ptr)
+		: m_ptr(ptr)
+	{
+	}
+
+	~ShaderProgramResourceVariantInitInfo2()
+	{
+	}
+
+	template<typename T>
+	ShaderProgramResourceVariantInitInfo2& addConstant(CString name, const T& value);
+
+	ShaderProgramResourceVariantInitInfo2& addMutation(CString name, MutatorValue t);
+
+private:
+	static constexpr U32 MAX_CONSTANTS = 32;
+	static constexpr U32 MAX_MUTATORS = 32;
+
+	ShaderProgramResource2Ptr m_ptr;
+
+	U32 m_constantValueCount = 0;
+	Array<ShaderProgramResourceConstantValue2, MAX_CONSTANTS> m_constantValues;
+
+	U32 m_mutationCount = 0;
+	Array<MutatorValue, MAX_MUTATORS> m_mutation; ///< The order of storing the values is important. It will be hashed.
+	BitSet<MAX_MUTATORS> m_setMutators = {false};
+};
+
 /// Shader program resource. It loads special AnKi programs.
 class ShaderProgramResource2 : public ResourceObject
 {
@@ -160,6 +225,12 @@ public:
 	void getOrCreateVariant(
 		const ShaderProgramResourceVariantInitInfo2& info, const ShaderProgramResourceVariant2*& variant) const;
 
+	/// @copydoc getOrCreateVariant
+	void getOrCreateVariant(const ShaderProgramResourceVariant2*& variant) const
+	{
+		getOrCreateVariant(ShaderProgramResourceVariantInitInfo2(), variant);
+	}
+
 private:
 	using Mutator = ShaderProgramResourceMutator2;
 	using Const = ShaderProgramResourceConstant2;
@@ -188,84 +259,30 @@ private:
 	static ANKI_USE_RESULT Error parseConst(CString constName, U32& componentIdx, U32& componentCount, CString& name);
 };
 
-/// The value of a constant.
-class ShaderProgramResourceConstantValue2
+template<typename T>
+inline ShaderProgramResourceVariantInitInfo2& ShaderProgramResourceVariantInitInfo2::addConstant(
+	CString name, const T& value)
 {
-public:
-	union
-	{
-		I32 m_int;
-		IVec2 m_ivec2;
-		IVec3 m_ivec3;
-		IVec4 m_ivec4;
-
-		F32 m_float;
-		Vec2 m_vec2;
-		Vec3 m_vec3;
-		Vec4 m_vec4;
-	};
-
-	U32 m_constantIndex;
-	U8 _m_padding[sizeof(Vec4) - sizeof(m_constantIndex)];
-
-	ShaderProgramResourceConstantValue2()
-	{
-		zeroMemory(*this);
-	}
-};
-static_assert(sizeof(ShaderProgramResourceConstantValue2) == sizeof(Vec4) * 2, "Need it to be packed");
-
-/// Smart initializer of multiple ShaderProgramResourceConstantValue.
-class ShaderProgramResourceVariantInitInfo2
+	const ShaderProgramResourceConstant2* in = m_ptr->tryFindConstant(name);
+	ANKI_ASSERT(in);
+	ANKI_ASSERT(in->m_dataType == getShaderVariableTypeFromTypename<T>());
+	m_constantValues[m_constantValueCount].m_constantIndex = U32(in - m_ptr->getConstants().getBegin());
+	memcpy(&m_constantValues[m_constantValueCount].m_int, &value, sizeof(T));
+	++m_constantValueCount;
+	return *this;
+}
+
+inline ShaderProgramResourceVariantInitInfo2& ShaderProgramResourceVariantInitInfo2::addMutation(
+	CString name, MutatorValue t)
 {
-	friend class ShaderProgramResource2;
-
-public:
-	ShaderProgramResourceVariantInitInfo2(const ShaderProgramResource2Ptr& ptr)
-		: m_ptr(ptr)
-	{
-	}
-
-	~ShaderProgramResourceVariantInitInfo2()
-	{
-	}
-
-	template<typename T>
-	ShaderProgramResourceVariantInitInfo2& addConstant(CString name, const T& value)
-	{
-		const ShaderProgramResourceConstant2* in = m_ptr->tryFindConstant(name);
-		ANKI_ASSERT(in);
-		ANKI_ASSERT(in->m_dataType == getShaderVariableTypeFromTypename<T>());
-		m_constantValues[m_constantValueCount].m_constantIndex = U32(in - m_ptr->getConstants().getBegin());
-		memcpy(&m_constantValues[m_constantValueCount].m_int, &value, sizeof(T));
-		++m_constantValueCount;
-		return *this;
-	}
-
-	ShaderProgramResourceVariantInitInfo2& addMutation(CString name, MutatorValue t)
-	{
-		const ShaderProgramResourceMutator2* m = m_ptr->tryFindMutator(name);
-		const PtrSize idx = m - m_ptr->getMutators().getBegin();
-		ANKI_ASSERT(m);
-		m_mutation[idx] = t;
-		m_setMutators.set(idx);
-		++m_mutationCount;
-		return *this;
-	}
-
-private:
-	static constexpr U32 MAX_CONSTANTS = 32;
-	static constexpr U32 MAX_MUTATORS = 32;
-
-	ShaderProgramResource2Ptr m_ptr;
-
-	U32 m_constantValueCount = 0;
-	Array<ShaderProgramResourceConstantValue2, MAX_CONSTANTS> m_constantValues;
-
-	U32 m_mutationCount = 0;
-	Array<MutatorValue, MAX_MUTATORS> m_mutation; ///< The order of storing the values is important. It will be hashed.
-	BitSet<MAX_MUTATORS> m_setMutators = {false};
-};
+	const ShaderProgramResourceMutator2* m = m_ptr->tryFindMutator(name);
+	const PtrSize idx = m - m_ptr->getMutators().getBegin();
+	ANKI_ASSERT(m);
+	m_mutation[idx] = t;
+	m_setMutators.set(idx);
+	++m_mutationCount;
+	return *this;
+}
 /// @}
 
 } // end namespace anki