Browse Source

Move GpuParticlesSimulation to the new format

Panagiotis Christopoulos Charitos 5 years ago
parent
commit
a316fdb623

+ 2 - 4
shaders/GpuParticlesSimulation.glslp → shaders/GpuParticlesSimulation.ankiprog

@@ -5,14 +5,12 @@
 
 
 // This shader does a particle simulation
 // This shader does a particle simulation
 
 
-#pragma anki input const U32 WORKGROUP_SIZE_X
-
 #pragma anki start comp
 #pragma anki start comp
 
 
 #include <shaders/glsl_cpp_common/GpuParticles.h>
 #include <shaders/glsl_cpp_common/GpuParticles.h>
 #include <shaders/Common.glsl>
 #include <shaders/Common.glsl>
 
 
-layout(local_size_x = WORKGROUP_SIZE_X, local_size_y = 1, local_size_z = 1) in;
+layout(local_size_x = 64, local_size_y = 1, local_size_z = 1) in;
 
 
 layout(set = 0, binding = 0) uniform texture2D u_depthRt;
 layout(set = 0, binding = 0) uniform texture2D u_depthRt;
 
 
@@ -159,4 +157,4 @@ void main()
 	u_particles[particleIdx] = particle;
 	u_particles[particleIdx] = particle;
 }
 }
 
 
-#pragma anki end
+#pragma anki end

+ 5 - 7
src/anki/scene/GpuParticleEmitterNode.cpp

@@ -50,12 +50,11 @@ GpuParticleEmitterNode::~GpuParticleEmitterNode()
 Error GpuParticleEmitterNode::init(const CString& filename)
 Error GpuParticleEmitterNode::init(const CString& filename)
 {
 {
 	// Create program
 	// Create program
-	ANKI_CHECK(getResourceManager().loadResource("shaders/GpuParticlesSimulation.glslp", m_prog));
-	const ShaderProgramResourceVariant* variant;
-	ShaderProgramResourceConstantValueInitList<1> consts(m_prog);
-	consts.add("WORKGROUP_SIZE_X", U32(COMPUTE_SHADER_WORKGROUP_SIZE_X));
-	m_prog->getOrCreateVariant(consts.get(), variant);
+	ANKI_CHECK(getResourceManager().loadResource("shaders/GpuParticlesSimulation.ankiprog", m_prog));
+	const ShaderProgramResourceVariant2* variant;
+	m_prog->getOrCreateVariant(variant);
 	m_grProg = variant->getProgram();
 	m_grProg = variant->getProgram();
+	m_workgroupSizeX = variant->getWorkgroupSizes()[0];
 
 
 	// Load particle props
 	// Load particle props
 	ANKI_CHECK(getResourceManager().loadResource(filename, m_emitterRsrc));
 	ANKI_CHECK(getResourceManager().loadResource(filename, m_emitterRsrc));
@@ -205,8 +204,7 @@ void GpuParticleEmitterNode::simulate(GenericGpuComputeJobQueueElementContext& c
 	cmdb->bindUniformBuffer(1, 4, token.m_buffer, token.m_offset, token.m_range);
 	cmdb->bindUniformBuffer(1, 4, token.m_buffer, token.m_offset, token.m_range);
 
 
 	// Dispatch
 	// Dispatch
-	const U32 workgroupCount =
-		(m_particleCount + COMPUTE_SHADER_WORKGROUP_SIZE_X - 1) / COMPUTE_SHADER_WORKGROUP_SIZE_X;
+	const U32 workgroupCount = (m_particleCount + m_workgroupSizeX - 1) / m_workgroupSizeX;
 	cmdb->dispatchCompute(workgroupCount, 1, 1);
 	cmdb->dispatchCompute(workgroupCount, 1, 1);
 }
 }
 
 

+ 2 - 2
src/anki/scene/GpuParticleEmitterNode.h

@@ -37,13 +37,13 @@ public:
 	}
 	}
 
 
 private:
 private:
-	static constexpr U32 COMPUTE_SHADER_WORKGROUP_SIZE_X = 64;
 	static constexpr U32 MAX_RAND_FACTORS = 32;
 	static constexpr U32 MAX_RAND_FACTORS = 32;
 
 
 	class MoveFeedbackComponent;
 	class MoveFeedbackComponent;
 
 
-	ShaderProgramResourcePtr m_prog;
+	ShaderProgramResource2Ptr m_prog;
 	ShaderProgramPtr m_grProg;
 	ShaderProgramPtr m_grProg;
+	U32 m_workgroupSizeX = 0;
 
 
 	ParticleEmitterResourcePtr m_emitterRsrc;
 	ParticleEmitterResourcePtr m_emitterRsrc;