瀏覽代碼

Move FinalComposite to the new format

Panagiotis Christopoulos Charitos 5 年之前
父節點
當前提交
40ad443c08

+ 4 - 4
shaders/FinalComposite.glslp → shaders/FinalComposite.ankiprog

@@ -7,9 +7,9 @@
 #pragma anki mutator BLOOM_ENABLED 0 1
 #pragma anki mutator DBG_ENABLED 0 1
 
-#pragma anki input const U32 LUT_SIZE
-#pragma anki input const UVec2 FB_SIZE
-#pragma anki input const U32 MOTION_BLUR_SAMPLES
+ANKI_SPECIALIZATION_CONSTANT_I32(LUT_SIZE, 0, 1);
+ANKI_SPECIALIZATION_CONSTANT_IVEC2(FB_SIZE, 1, IVec2(1, 1));
+ANKI_SPECIALIZATION_CONSTANT_I32(MOTION_BLUR_SAMPLES, 3, 1);
 
 #pragma anki start vert
 #include <shaders/QuadVert.glsl>
@@ -89,7 +89,7 @@ void main()
 	out_color = colorGrading(out_color);
 
 #if BLUE_NOISE
-	const Vec3 bnUvw = Vec3(FB_SIZE / Vec2(64.0) * uv, u_blueNoiseLayerPad3.x);
+	const Vec3 bnUvw = Vec3(Vec2(FB_SIZE) / Vec2(64.0) * uv, u_blueNoiseLayerPad3.x);
 	Vec3 blueNoise = textureLod(u_blueNoise, u_trilinearRepeatSampler, bnUvw, 0.0).rgb;
 	blueNoise = blueNoise * 2.0 - 1.0;
 	blueNoise = sign(blueNoise) * (1.0 - sqrt(1.0 - abs(blueNoise)));

+ 1 - 0
src/anki/core/App.cpp

@@ -710,6 +710,7 @@ void App::initMemoryCallbacks(AllocAlignedCallback allocCb, void* allocCbUserDat
 
 Error App::compileAllShaders()
 {
+	ANKI_TRACE_SCOPED_EVENT(COMPILE_SHADERS);
 	ANKI_CORE_LOGI("Compiling shaders");
 	U32 shadersCompileCount = 0;
 

+ 15 - 14
src/anki/renderer/FinalComposite.cpp

@@ -43,22 +43,23 @@ Error FinalComposite::initInternal(const ConfigSet& config)
 	ANKI_CHECK(getResourceManager().loadResource("engine_data/BlueNoiseLdrRgb64x64.ankitex", m_blueNoise));
 
 	// Progs
-	ANKI_CHECK(getResourceManager().loadResource("shaders/FinalComposite.glslp", m_prog));
-
-	ShaderProgramResourceMutationInitList<3> mutations(m_prog);
-	mutations.add("BLUE_NOISE", 1).add("BLOOM_ENABLED", 1).add("DBG_ENABLED", 0);
-
-	ShaderProgramResourceConstantValueInitList<3> consts(m_prog);
-	consts.add("LUT_SIZE", U32(LUT_SIZE))
-		.add("FB_SIZE", UVec2(m_r->getWidth(), m_r->getHeight()))
-		.add("MOTION_BLUR_SAMPLES", config.getNumberU32("r_motionBlurSamples"));
-
-	const ShaderProgramResourceVariant* variant;
-	m_prog->getOrCreateVariant(mutations.get(), consts.get(), variant);
+	ANKI_CHECK(getResourceManager().loadResource("shaders/FinalComposite.ankiprog", m_prog));
+
+	ShaderProgramResourceVariantInitInfo2 variantInitInfo(m_prog);
+	variantInitInfo.addMutation("BLUE_NOISE", 1);
+	variantInitInfo.addMutation("BLOOM_ENABLED", 1);
+	variantInitInfo.addMutation("DBG_ENABLED", 0);
+	variantInitInfo.addConstant("LUT_SIZE", I32(LUT_SIZE));
+	variantInitInfo.addConstant("LUT_SIZE", I32(LUT_SIZE));
+	variantInitInfo.addConstant("FB_SIZE", IVec2(m_r->getWidth(), m_r->getHeight()));
+	variantInitInfo.addConstant("MOTION_BLUR_SAMPLES", I32(config.getNumberU32("r_motionBlurSamples")));
+
+	const ShaderProgramResourceVariant2* variant;
+	m_prog->getOrCreateVariant(variantInitInfo, variant);
 	m_grProgs[0] = variant->getProgram();
 
-	mutations[2].m_value = 1;
-	m_prog->getOrCreateVariant(mutations.get(), consts.get(), variant);
+	variantInitInfo.addMutation("DBG_ENABLED", 1);
+	m_prog->getOrCreateVariant(variantInitInfo, variant);
 	m_grProgs[1] = variant->getProgram();
 
 	return Error::NONE;

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

@@ -34,7 +34,7 @@ private:
 
 	FramebufferDescription m_fbDescr;
 
-	ShaderProgramResourcePtr m_prog;
+	ShaderProgramResource2Ptr m_prog;
 	Array<ShaderProgramPtr, 2> m_grProgs; ///< One with Dbg and one without
 
 	TextureResourcePtr m_lut; ///< Color grading lookup texture.

+ 9 - 8
src/anki/resource/ShaderProgramResource2.cpp

@@ -186,18 +186,19 @@ void ShaderProgramResource2::getOrCreateVariant(
 {
 	// Sanity checks
 	ANKI_ASSERT(info.m_setMutators.getEnabledBitCount() == m_mutators.getSize());
+	ANKI_ASSERT(info.m_setConstants.getEnabledBitCount() == m_consts.getSize());
 
 	// Compute variant hash
 	U64 hash = 0;
-	if(info.m_mutationCount)
+	if(m_mutators.getSize())
 	{
-		hash = computeHash(info.m_mutation.getBegin(), info.m_mutationCount * sizeof(info.m_mutation[0]));
+		hash = computeHash(info.m_mutation.getBegin(), m_mutators.getSize() * sizeof(info.m_mutation[0]));
 	}
 
-	if(info.m_constantValueCount)
+	if(m_consts.getSize())
 	{
-		hash = appendHash(
-			info.m_constantValues.getBegin(), info.m_constantValueCount * sizeof(info.m_constantValues[0]), hash);
+		hash =
+			appendHash(info.m_constantValues.getBegin(), m_consts.getSize() * sizeof(info.m_constantValues[0]), hash);
 	}
 
 	// Check if the variant is in the cache
@@ -233,7 +234,7 @@ void ShaderProgramResource2::initVariant(
 	if(m_mutators.getSize())
 	{
 		// Create the mutation hash
-		const U64 hash = computeHash(info.m_mutation.getBegin(), info.m_mutationCount * sizeof(info.m_mutation[0]));
+		const U64 hash = computeHash(info.m_mutation.getBegin(), m_mutators.getSize() * sizeof(info.m_mutation[0]));
 
 		// Search for the mutation in the binary
 		// TODO optimize the search
@@ -265,7 +266,7 @@ void ShaderProgramResource2::initVariant(
 
 		// Get value
 		const ShaderProgramResourceConstantValue2* value = nullptr;
-		for(U32 i = 0; i < info.m_constantValueCount; ++i)
+		for(U32 i = 0; i < m_consts.getSize(); ++i)
 		{
 			if(info.m_constantValues[i].m_constantIndex == inputIdx)
 			{
@@ -307,7 +308,7 @@ void ShaderProgramResource2::initVariant(
 							|| c.m_dataType == ShaderVariableDataType::IVEC4);
 
 				// Find the value
-				for(U32 i = 0; i < info.m_constantValueCount; ++i)
+				for(U32 i = 0; i < m_consts.getSize(); ++i)
 				{
 					if(info.m_constantValues[i].m_constantIndex == constIdx)
 					{

+ 8 - 9
src/anki/resource/ShaderProgramResource2.h

@@ -153,10 +153,9 @@ private:
 
 	ShaderProgramResource2Ptr m_ptr;
 
-	U32 m_constantValueCount = 0;
 	Array<ShaderProgramResourceConstantValue2, MAX_CONSTANTS> m_constantValues;
+	BitSet<MAX_CONSTANTS> m_setConstants = {false};
 
-	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};
 };
@@ -266,9 +265,10 @@ inline ShaderProgramResourceVariantInitInfo2& ShaderProgramResourceVariantInitIn
 	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;
+	const U32 constIdx = U32(in - m_ptr->getConstants().getBegin());
+	m_constantValues[constIdx].m_constantIndex = constIdx;
+	memcpy(&m_constantValues[constIdx].m_int, &value, sizeof(T));
+	m_setConstants.set(constIdx);
 	return *this;
 }
 
@@ -276,11 +276,10 @@ inline ShaderProgramResourceVariantInitInfo2& ShaderProgramResourceVariantInitIn
 	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;
+	const PtrSize mutatorIdx = m - m_ptr->getMutators().getBegin();
+	m_mutation[mutatorIdx] = t;
+	m_setMutators.set(mutatorIdx);
 	return *this;
 }
 /// @}