瀏覽代碼

Move IrradianceDice to the new format

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

+ 31 - 27
shaders/IrradianceDice.glslp → shaders/IrradianceDice.ankiprog

@@ -5,7 +5,7 @@
 
 
 // Compute the irradiance given a light shading result. The irradiance will be stored in an ambient dice.
 // Compute the irradiance given a light shading result. The irradiance will be stored in an ambient dice.
 
 
-#pragma anki input const U32 WORKGROUP_SIZE
+#pragma anki mutator WORKGROUP_SIZE_XY 8 16 32
 #pragma anki mutator LIGHT_SHADING_TEX 0 1 // 0: texture2D, 1: textureCubeArray
 #pragma anki mutator LIGHT_SHADING_TEX 0 1 // 0: texture2D, 1: textureCubeArray
 #pragma anki mutator STORE_LOCATION 0 1 // 0: in a 3D texture, 1: In an SSBO
 #pragma anki mutator STORE_LOCATION 0 1 // 0: in a 3D texture, 1: In an SSBO
 #pragma anki mutator SECOND_BOUNCE 0 1
 #pragma anki mutator SECOND_BOUNCE 0 1
@@ -18,23 +18,25 @@
 
 
 #define DEBUG_MODE 0 // 0: disable, 1: different color per dice face, 2: different color per cell
 #define DEBUG_MODE 0 // 0: disable, 1: different color per dice face, 2: different color per cell
 
 
-layout(local_size_x = WORKGROUP_SIZE, local_size_y = WORKGROUP_SIZE, local_size_z = 1) in;
+const U32 WORKGROUP_SIZE = WORKGROUP_SIZE_XY * WORKGROUP_SIZE_XY;
+
+layout(local_size_x = WORKGROUP_SIZE_XY, local_size_y = WORKGROUP_SIZE_XY, local_size_z = 1) in;
 
 
 layout(set = 0, binding = 0) uniform sampler u_nearestAnyClampSampler;
 layout(set = 0, binding = 0) uniform sampler u_nearestAnyClampSampler;
 #if LIGHT_SHADING_TEX == 0
 #if LIGHT_SHADING_TEX == 0
-layout(set = 0, binding = 1) uniform texture2D u_lightShadingTex;
+layout(set = 0, binding = 1) uniform texture2D u_lightShadingTex2d;
 #else
 #else
-layout(set = 0, binding = 1) uniform textureCube u_lightShadingTex;
+layout(set = 0, binding = 1) uniform textureCube u_lightShadingTexCube;
 #endif
 #endif
 
 
 #if SECOND_BOUNCE == 1
 #if SECOND_BOUNCE == 1
 layout(set = 0, binding = 2) uniform texture2D u_gbufferTex[3u];
 layout(set = 0, binding = 2) uniform texture2D u_gbufferTex[3u];
 #endif
 #endif
 
 
-// This is a temporary buffer used instead of shared memory because the needs are too large
+// This is a temporary buffer used instead of shared memory because we can't fit it into shared memory
 layout(set = 0, binding = 3, std430) buffer ssbo_
 layout(set = 0, binding = 3, std430) buffer ssbo_
 {
 {
-	Vec4 u_integrationResults[6u][WORKGROUP_SIZE * WORKGROUP_SIZE];
+	Vec4 u_integrationResults[6u * WORKGROUP_SIZE];
 };
 };
 
 
 #if STORE_LOCATION == 0
 #if STORE_LOCATION == 0
@@ -57,26 +59,26 @@ shared Vec3 s_diceIrradiance[6u];
 Vec3 sampleLightShadingTexture(const U32 face)
 Vec3 sampleLightShadingTexture(const U32 face)
 {
 {
 #if LIGHT_SHADING_TEX == 0
 #if LIGHT_SHADING_TEX == 0
-	const Vec2 INPUT_TEXTURES_SIZE = Vec2(WORKGROUP_SIZE * 6u, WORKGROUP_SIZE);
+	const Vec2 INPUT_TEXTURES_SIZE = Vec2(WORKGROUP_SIZE_XY * 6u, WORKGROUP_SIZE_XY);
 	const Vec2 uv =
 	const Vec2 uv =
-		(Vec2(gl_LocalInvocationID.x + WORKGROUP_SIZE * face, gl_LocalInvocationID.y) + 0.5) / INPUT_TEXTURES_SIZE;
+		(Vec2(gl_LocalInvocationID.x + WORKGROUP_SIZE_XY * face, gl_LocalInvocationID.y) + 0.5) / INPUT_TEXTURES_SIZE;
 
 
-	return textureLod(u_lightShadingTex, u_nearestAnyClampSampler, uv, 0.0).rgb;
+	return textureLod(u_lightShadingTex2d, u_nearestAnyClampSampler, uv, 0.0).rgb;
 #else
 #else
-	const Vec2 uv = (Vec2(gl_LocalInvocationID.x, gl_LocalInvocationID.y) + 0.5) / F32(WORKGROUP_SIZE);
+	const Vec2 uv = (Vec2(gl_LocalInvocationID.x, gl_LocalInvocationID.y) + 0.5) / F32(WORKGROUP_SIZE_XY);
 	const Vec2 ndc = UV_TO_NDC(uv);
 	const Vec2 ndc = UV_TO_NDC(uv);
 	const Vec3 cubeUvw = getCubemapDirection(ndc, face);
 	const Vec3 cubeUvw = getCubemapDirection(ndc, face);
 
 
-	return textureLod(u_lightShadingTex, u_nearestAnyClampSampler, cubeUvw, 0.0).rgb;
+	return textureLod(u_lightShadingTexCube, u_nearestAnyClampSampler, cubeUvw, 0.0).rgb;
 #endif
 #endif
 }
 }
 
 
 void main()
 void main()
 {
 {
-	const F32 WORKGROUP_SIZE_F = F32(WORKGROUP_SIZE);
+	const F32 WORKGROUP_SIZE_XY_F = F32(WORKGROUP_SIZE_XY);
 
 
 	// Compute the NDC used in cubeCoordSolidAngle
 	// Compute the NDC used in cubeCoordSolidAngle
-	const Vec2 faceUv = (Vec2(gl_LocalInvocationID.xy) + 0.5) / WORKGROUP_SIZE_F;
+	const Vec2 faceUv = (Vec2(gl_LocalInvocationID.xy) + 0.5) / WORKGROUP_SIZE_XY_F;
 	const Vec2 ndc = UV_TO_NDC(faceUv);
 	const Vec2 ndc = UV_TO_NDC(faceUv);
 
 
 	// Initialize
 	// Initialize
@@ -90,25 +92,25 @@ void main()
 		// Compute integral part
 		// Compute integral part
 		const F32 lambert = max(0.0, dot(r, diceDir));
 		const F32 lambert = max(0.0, dot(r, diceDir));
 		const Vec3 lightShading = sampleLightShadingTexture(f);
 		const Vec3 lightShading = sampleLightShadingTexture(f);
-		const Vec3 irradiance = lightShading * lambert * cubeCoordSolidAngle(ndc, WORKGROUP_SIZE_F);
+		const Vec3 irradiance = lightShading * lambert * cubeCoordSolidAngle(ndc, WORKGROUP_SIZE_XY_F);
 
 
 		// Store
 		// Store
-		u_integrationResults[f][gl_LocalInvocationID.y * WORKGROUP_SIZE + gl_LocalInvocationID.x] = irradiance.xyzx;
+		u_integrationResults[f * WORKGROUP_SIZE + gl_LocalInvocationID.y * WORKGROUP_SIZE_XY + gl_LocalInvocationID.x] =
+			irradiance.xyzx;
 	}
 	}
 
 
 	memoryBarrierBuffer();
 	memoryBarrierBuffer();
 	barrier();
 	barrier();
 
 
 	// Reduce using prefix sum
 	// Reduce using prefix sum
-	const U32 WG_SIZE = WORKGROUP_SIZE * WORKGROUP_SIZE;
-	ANKI_LOOP for(U32 s = WG_SIZE / 2u; s > 0u; s >>= 1u)
+	ANKI_LOOP for(U32 s = WORKGROUP_SIZE / 2u; s > 0u; s >>= 1u)
 	{
 	{
 		if(gl_LocalInvocationIndex < s)
 		if(gl_LocalInvocationIndex < s)
 		{
 		{
 			ANKI_UNROLL for(U32 f = 0u; f < 6u; ++f)
 			ANKI_UNROLL for(U32 f = 0u; f < 6u; ++f)
 			{
 			{
-				u_integrationResults[f][gl_LocalInvocationIndex] +=
-					u_integrationResults[f][gl_LocalInvocationIndex + s];
+				u_integrationResults[f * WORKGROUP_SIZE + gl_LocalInvocationIndex] +=
+					u_integrationResults[f * WORKGROUP_SIZE + gl_LocalInvocationIndex + s];
 			}
 			}
 		}
 		}
 
 
@@ -118,7 +120,8 @@ void main()
 
 
 	if(gl_LocalInvocationIndex < 6u)
 	if(gl_LocalInvocationIndex < 6u)
 	{
 	{
-		s_diceIrradiance[gl_LocalInvocationIndex] = u_integrationResults[gl_LocalInvocationIndex][0].xyz;
+		s_diceIrradiance[gl_LocalInvocationIndex] =
+			u_integrationResults[gl_LocalInvocationIndex * WORKGROUP_SIZE + 0u].xyz;
 	}
 	}
 
 
 	memoryBarrierShared();
 	memoryBarrierShared();
@@ -137,7 +140,7 @@ void main()
 		const F32 lambert = max(0.0, dot(r, diceDir));
 		const F32 lambert = max(0.0, dot(r, diceDir));
 
 
 		// Read the gbuffer
 		// Read the gbuffer
-		Vec2 gbufferUv = (Vec2(gl_LocalInvocationID.xy) + 0.5) / WORKGROUP_SIZE_F;
+		Vec2 gbufferUv = (Vec2(gl_LocalInvocationID.xy) + 0.5) / WORKGROUP_SIZE_XY_F;
 		gbufferUv.x *= 1.0 / 6.0;
 		gbufferUv.x *= 1.0 / 6.0;
 		gbufferUv.x += (1.0 / 6.0) * F32(f);
 		gbufferUv.x += (1.0 / 6.0) * F32(f);
 		GbufferInfo gbuffer;
 		GbufferInfo gbuffer;
@@ -157,24 +160,25 @@ void main()
 		// Compute 2nd bounce
 		// Compute 2nd bounce
 		const Vec3 lightShading = sampleLightShadingTexture(f);
 		const Vec3 lightShading = sampleLightShadingTexture(f);
 		const Vec3 irradiance =
 		const Vec3 irradiance =
-			(firstBounceIrradiance + lightShading * lambert) * cubeCoordSolidAngle(ndc, WORKGROUP_SIZE_F);
+			(firstBounceIrradiance + lightShading * lambert) * cubeCoordSolidAngle(ndc, WORKGROUP_SIZE_XY_F);
 
 
 		// Store
 		// Store
-		u_integrationResults[f][gl_LocalInvocationID.y * WORKGROUP_SIZE + gl_LocalInvocationID.x] = irradiance.xyzx;
+		u_integrationResults[f * WORKGROUP_SIZE + gl_LocalInvocationID.y * WORKGROUP_SIZE_XY + gl_LocalInvocationID.x] =
+			irradiance.xyzx;
 	}
 	}
 
 
 	memoryBarrierBuffer();
 	memoryBarrierBuffer();
 	barrier();
 	barrier();
 
 
 	// Reduce using prefix sum again
 	// Reduce using prefix sum again
-	ANKI_LOOP for(U32 s = WG_SIZE / 2u; s > 0u; s >>= 1u)
+	ANKI_LOOP for(U32 s = WORKGROUP_SIZE / 2u; s > 0u; s >>= 1u)
 	{
 	{
 		if(gl_LocalInvocationIndex < s)
 		if(gl_LocalInvocationIndex < s)
 		{
 		{
 			ANKI_UNROLL for(U32 f = 0u; f < 6u; ++f)
 			ANKI_UNROLL for(U32 f = 0u; f < 6u; ++f)
 			{
 			{
-				u_integrationResults[f][gl_LocalInvocationIndex] +=
-					u_integrationResults[f][gl_LocalInvocationIndex + s];
+				u_integrationResults[f * WORKGROUP_SIZE + gl_LocalInvocationIndex] +=
+					u_integrationResults[f * WORKGROUP_SIZE + gl_LocalInvocationIndex + s];
 			}
 			}
 		}
 		}
 
 
@@ -190,7 +194,7 @@ void main()
 
 
 #if DEBUG_MODE == 0
 #if DEBUG_MODE == 0
 #	if SECOND_BOUNCE == 1
 #	if SECOND_BOUNCE == 1
-		Vec3 irradiance = u_integrationResults[f][0].xyz;
+		Vec3 irradiance = u_integrationResults[f * WORKGROUP_SIZE + 0u].xyz;
 #	else
 #	else
 		Vec3 irradiance = s_diceIrradiance[f];
 		Vec3 irradiance = s_diceIrradiance[f];
 #	endif
 #	endif

+ 8 - 10
src/anki/renderer/GlobalIllumination.cpp

@@ -227,18 +227,16 @@ Error GlobalIllumination::initLightShading(const ConfigSet& cfg)
 
 
 Error GlobalIllumination::initIrradiance(const ConfigSet& cfg)
 Error GlobalIllumination::initIrradiance(const ConfigSet& cfg)
 {
 {
-	ANKI_CHECK(m_r->getResourceManager().loadResource("shaders/IrradianceDice.glslp", m_irradiance.m_prog));
+	ANKI_CHECK(m_r->getResourceManager().loadResource("shaders/IrradianceDice.ankiprog", m_irradiance.m_prog));
 
 
-	ShaderProgramResourceConstantValueInitList<1> consts(m_irradiance.m_prog);
-	consts.add("WORKGROUP_SIZE", m_tileSize);
+	ShaderProgramResourceVariantInitInfo2 variantInitInfo(m_irradiance.m_prog);
+	variantInitInfo.addMutation("WORKGROUP_SIZE_XY", m_tileSize);
+	variantInitInfo.addMutation("LIGHT_SHADING_TEX", 0);
+	variantInitInfo.addMutation("STORE_LOCATION", 0);
+	variantInitInfo.addMutation("SECOND_BOUNCE", 1);
 
 
-	ShaderProgramResourceMutationInitList<3> mutations(m_irradiance.m_prog);
-	mutations.add("LIGHT_SHADING_TEX", 0);
-	mutations.add("STORE_LOCATION", 0);
-	mutations.add("SECOND_BOUNCE", 1);
-
-	const ShaderProgramResourceVariant* variant;
-	m_irradiance.m_prog->getOrCreateVariant(mutations.get(), consts.get(), variant);
+	const ShaderProgramResourceVariant2* variant;
+	m_irradiance.m_prog->getOrCreateVariant(variantInitInfo, variant);
 	m_irradiance.m_grProg = variant->getProgram();
 	m_irradiance.m_grProg = variant->getProgram();
 
 
 	return Error::NONE;
 	return Error::NONE;

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

@@ -92,7 +92,7 @@ private:
 	class
 	class
 	{
 	{
 	public:
 	public:
-		ShaderProgramResourcePtr m_prog;
+		ShaderProgramResource2Ptr m_prog;
 		ShaderProgramPtr m_grProg;
 		ShaderProgramPtr m_grProg;
 	} m_irradiance; ///< Irradiance.
 	} m_irradiance; ///< Irradiance.
 
 

+ 8 - 9
src/anki/renderer/ProbeReflections.cpp

@@ -147,18 +147,17 @@ Error ProbeReflections::initIrradiance(const ConfigSet& config)
 
 
 	// Create prog
 	// Create prog
 	{
 	{
-		ANKI_CHECK(m_r->getResourceManager().loadResource("shaders/IrradianceDice.glslp", m_irradiance.m_prog));
+		ANKI_CHECK(m_r->getResourceManager().loadResource("shaders/IrradianceDice.ankiprog", m_irradiance.m_prog));
 
 
-		ShaderProgramResourceConstantValueInitList<1> consts(m_irradiance.m_prog);
-		consts.add("WORKGROUP_SIZE", U32(m_irradiance.m_workgroupSize));
+		ShaderProgramResourceVariantInitInfo2 variantInitInfo(m_irradiance.m_prog);
 
 
-		ShaderProgramResourceMutationInitList<3> mutations(m_irradiance.m_prog);
-		mutations.add("LIGHT_SHADING_TEX", 1);
-		mutations.add("STORE_LOCATION", 1);
-		mutations.add("SECOND_BOUNCE", 0);
+		variantInitInfo.addMutation("WORKGROUP_SIZE_XY", U32(m_irradiance.m_workgroupSize));
+		variantInitInfo.addMutation("LIGHT_SHADING_TEX", 1);
+		variantInitInfo.addMutation("STORE_LOCATION", 1);
+		variantInitInfo.addMutation("SECOND_BOUNCE", 0);
 
 
-		const ShaderProgramResourceVariant* variant;
-		m_irradiance.m_prog->getOrCreateVariant(mutations.get(), consts.get(), variant);
+		const ShaderProgramResourceVariant2* variant;
+		m_irradiance.m_prog->getOrCreateVariant(variantInitInfo, variant);
 		m_irradiance.m_grProg = variant->getProgram();
 		m_irradiance.m_grProg = variant->getProgram();
 	}
 	}
 
 

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

@@ -80,7 +80,7 @@ private:
 	class
 	class
 	{
 	{
 	public:
 	public:
-		ShaderProgramResourcePtr m_prog;
+		ShaderProgramResource2Ptr m_prog;
 		ShaderProgramPtr m_grProg;
 		ShaderProgramPtr m_grProg;
 		BufferPtr m_diceValuesBuff;
 		BufferPtr m_diceValuesBuff;
 		U32 m_workgroupSize = 16;
 		U32 m_workgroupSize = 16;

+ 3 - 4
src/anki/shader_compiler/ShaderProgramReflection.cpp

@@ -477,15 +477,14 @@ Error SpirvReflector::opaqueReflection(const spirv_cross::Resource& res, Dynamic
 		const Bool sizeSame = other.m_arraySize == newOpaque.m_arraySize;
 		const Bool sizeSame = other.m_arraySize == newOpaque.m_arraySize;
 		const Bool typeSame = other.m_type == newOpaque.m_type;
 		const Bool typeSame = other.m_type == newOpaque.m_type;
 
 
-		const Bool err0 = bindingSame && (!nameSame || !sizeSame || !typeSame);
-		const Bool err1 = nameSame && (!bindingSame || !sizeSame || !typeSame);
-		if(err0 || err1)
+		const Bool err = nameSame && (!bindingSame || !sizeSame || !typeSame);
+		if(err)
 		{
 		{
 			ANKI_SHADER_COMPILER_LOGE("Linking error");
 			ANKI_SHADER_COMPILER_LOGE("Linking error");
 			return Error::USER_DATA;
 			return Error::USER_DATA;
 		}
 		}
 
 
-		if(bindingSame)
+		if(nameSame)
 		{
 		{
 			found = true;
 			found = true;
 			break;
 			break;

+ 15 - 1
tests/shader_compiler/ShaderProgramCompiler.cpp

@@ -32,6 +32,10 @@ layout(push_constant) uniform ankiMaterial
 	Vec4 u_color;
 	Vec4 u_color;
 };
 };
 
 
+layout(set = 0, binding = 1) uniform texture2D u_tex2d;
+layout(set = 0, binding = 1) uniform texture3D u_tex3d;
+layout(set = 0, binding = 2) uniform sampler u_sampler;
+
 #pragma anki start vert
 #pragma anki start vert
 out gl_PerVertex
 out gl_PerVertex
 {
 {
@@ -49,7 +53,17 @@ layout(location = 0) out Vec3 out_color;
 
 
 void main()
 void main()
 {
 {
-	out_color = Vec3(0.0) + u_color.xyz;
+	out_color = Vec3(0);
+
+	if(INSTANCE_COUNT == 1)
+		out_color += textureLod(sampler2D(u_tex2d, u_sampler), Vec2(0), 0.0).rgb;
+	else if(INSTANCE_COUNT == 2)
+		out_color += textureLod(sampler3D(u_tex3d, u_sampler), Vec3(0), 0.0).rgb;
+	else
+		out_color += textureLod(sampler2D(u_tex2d, u_sampler), Vec2(0), 0.0).rgb
+			+ textureLod(sampler3D(u_tex3d, u_sampler), Vec3(0), 0.0).rgb;
+
+	out_color += u_color.xyz;
 }
 }
 #pragma anki end
 #pragma anki end
 	)";
 	)";

+ 1 - 1
tools/format_source.sh

@@ -1,6 +1,6 @@
 #!/bin/bash
 #!/bin/bash
 
 
-files=(`find ./src ./tests ./sandbox ./tools ./shaders ./samples -name '*.h' -o -name '*.hpp' -o -name '*.c' -o -name '*.cpp' -o -name '*.glsl' -o -name '*.glslp'`)
+files=(`find ./src ./tests ./sandbox ./tools ./shaders ./samples -name '*.h' -o -name '*.hpp' -o -name '*.c' -o -name '*.cpp' -o -name '*.glsl' -o -name '*.glslp' -o -name '*.ankiprog'`)
 
 
 filecount=${#files[@]}
 filecount=${#files[@]}