Browse Source

Convert all GBuffer shaders to bindless

Panagiotis Christopoulos Charitos 3 years ago
parent
commit
7d0cc40264
54 changed files with 484 additions and 297 deletions
  1. 11 4
      AnKi/Gr/Vulkan/DescriptorSet.cpp
  2. 1 1
      AnKi/Gr/Vulkan/FrameGarbageCollector.cpp
  3. 6 6
      AnKi/Importer/GltfImporterMaterial.cpp
  4. 21 15
      AnKi/Renderer/Drawer.cpp
  5. 12 8
      AnKi/Renderer/ForwardShading.cpp
  6. 0 8
      AnKi/Renderer/RenderQueue.h
  7. 9 8
      AnKi/Renderer/Renderer.cpp
  8. 35 5
      AnKi/Resource/MaterialResource.cpp
  9. 9 4
      AnKi/Resource/MaterialResource.h
  10. 7 6
      AnKi/Scene/Components/RenderComponent.cpp
  11. 3 3
      AnKi/Scene/ModelNode.cpp
  12. 2 1
      AnKi/ShaderCompiler/ShaderProgramDump.cpp
  13. 5 1
      AnKi/ShaderCompiler/ShaderProgramParser.cpp
  14. 6 6
      AnKi/Shaders/ClusteredShadingCommon.glsl
  15. 8 7
      AnKi/Shaders/ForwardShadingCommon.glsl
  16. 7 7
      AnKi/Shaders/ForwardShadingFog.ankiprog
  17. 12 11
      AnKi/Shaders/ForwardShadingParticles.ankiprog
  18. 2 0
      AnKi/Shaders/GBufferCommon.glsl
  19. 32 57
      AnKi/Shaders/GBufferGeneric.ankiprog
  20. 4 4
      AnKi/Shaders/GBufferPost.ankiprog
  21. 23 25
      AnKi/Shaders/Include/MaterialTypes.h
  22. 4 4
      AnKi/Shaders/IndirectDiffuse.glsl
  23. 4 4
      AnKi/Shaders/IndirectSpecular.glsl
  24. 4 4
      AnKi/Shaders/LightShading.ankiprog
  25. 2 2
      AnKi/Shaders/LightShadingApplyIndirect.ankiprog
  26. 4 4
      AnKi/Shaders/RtShadowsRayGen.ankiprog
  27. 4 4
      AnKi/Shaders/ShadowmapsResolve.glsl
  28. 6 6
      AnKi/Shaders/VolumetricLightingAccumulation.ankiprog
  29. 3 3
      Samples/Sponza/Assets/arch.001_efebbb2a6f84fff0.ankimtl
  30. 3 3
      Samples/Sponza/Assets/arch_e0c8c7e29c806284.ankimtl
  31. 3 3
      Samples/Sponza/Assets/bricks_8bd6f24aa0ad3654.ankimtl
  32. 2 2
      Samples/Sponza/Assets/ceiling_3fd94cde277a48e1.ankimtl
  33. 1 1
      Samples/Sponza/Assets/chain_33ef478b87fe7c15.ankimtl
  34. 3 3
      Samples/Sponza/Assets/column_a_1e1bacae3460b88.ankimtl
  35. 3 3
      Samples/Sponza/Assets/column_b_c9391d56bff59fc3.ankimtl
  36. 3 3
      Samples/Sponza/Assets/column_c_43f866fc7b9f0169.ankimtl
  37. 4 4
      Samples/Sponza/Assets/details_4242afc5fc479920.ankimtl
  38. 4 4
      Samples/Sponza/Assets/fabric_a_945c29fc221550fb.ankimtl
  39. 4 4
      Samples/Sponza/Assets/fabric_c_c8bf70dee411d1bd.ankimtl
  40. 4 4
      Samples/Sponza/Assets/fabric_d_8ff4aebb25bf20b0.ankimtl
  41. 4 4
      Samples/Sponza/Assets/fabric_e_d1c5a44841c48230.ankimtl
  42. 3 3
      Samples/Sponza/Assets/fabric_f_d54bbaca38ed4391.ankimtl
  43. 3 3
      Samples/Sponza/Assets/flagpole_6c7e0eb8dd33b39e.ankimtl
  44. 3 3
      Samples/Sponza/Assets/floor_71cbd2644e53ab8c.ankimtl
  45. 3 3
      Samples/Sponza/Assets/leaf_3a245efd17475037.ankimtl
  46. 3 3
      Samples/Sponza/Assets/lion_c45d3035db3bc17b.ankimtl
  47. 3 3
      Samples/Sponza/Assets/lion_stand_ab5e3642131ad971.ankimtl
  48. 3 3
      Samples/Sponza/Assets/roof_4359bd4e3b26845.ankimtl
  49. 3 3
      Samples/Sponza/Assets/vase_45c3983f6cc9c489.ankimtl
  50. 3 3
      Samples/Sponza/Assets/vase_fl_580cea687de3d758.ankimtl
  51. 3 3
      Samples/Sponza/Assets/vase_hanging_c2d2b40b27cacd7d.ankimtl
  52. 3 3
      Samples/Sponza/Assets/vase_round_71af81a1ac0a7c3e.ankimtl
  53. 165 7
      Tools/Shader/ShaderProgramBinaryDumpMain.cpp
  54. 2 1
      Tools/Shader/ShaderProgramCompilerMain.cpp

+ 11 - 4
AnKi/Gr/Vulkan/DescriptorSet.cpp

@@ -193,7 +193,7 @@ U32 DescriptorSetFactory::BindlessDescriptorSet::bindTexture(const VkImageView v
 	LockGuard<Mutex> lock(m_mtx);
 	LockGuard<Mutex> lock(m_mtx);
 	ANKI_ASSERT(m_freeTexIndexCount > 0 && "Out of indices");
 	ANKI_ASSERT(m_freeTexIndexCount > 0 && "Out of indices");
 
 
-	// Get the index
+	// Pop the index
 	--m_freeTexIndexCount;
 	--m_freeTexIndexCount;
 	const U16 idx = m_freeTexIndices[m_freeTexIndexCount];
 	const U16 idx = m_freeTexIndices[m_freeTexIndexCount];
 	ANKI_ASSERT(idx < m_freeTexIndices.getSize());
 	ANKI_ASSERT(idx < m_freeTexIndices.getSize());
@@ -252,9 +252,9 @@ U32 DescriptorSetFactory::BindlessDescriptorSet::bindImage(const VkImageView vie
 void DescriptorSetFactory::BindlessDescriptorSet::unbindCommon(U32 idx, DynamicArray<U16>& freeIndices,
 void DescriptorSetFactory::BindlessDescriptorSet::unbindCommon(U32 idx, DynamicArray<U16>& freeIndices,
 															   U16& freeIndexCount)
 															   U16& freeIndexCount)
 {
 {
-	ANKI_ASSERT(idx < freeIndices.getSize());
-
 	LockGuard<Mutex> lock(m_mtx);
 	LockGuard<Mutex> lock(m_mtx);
+
+	ANKI_ASSERT(idx < freeIndices.getSize());
 	ANKI_ASSERT(freeIndexCount < freeIndices.getSize());
 	ANKI_ASSERT(freeIndexCount < freeIndices.getSize());
 
 
 	freeIndices[freeIndexCount] = U16(idx);
 	freeIndices[freeIndexCount] = U16(idx);
@@ -805,7 +805,14 @@ void DescriptorSetState::flush(U64& hash, Array<PtrSize, MAX_BINDINGS_PER_DESCRI
 	dynamicOffsetCount = 0;
 	dynamicOffsetCount = 0;
 	bindlessDSet = false;
 	bindlessDSet = false;
 
 
-	if(!m_bindlessDSetBound)
+	// There is a chance where the bindless set is bound but the actual shaders have an empty DS layout (maybe because
+	// the dead code elimination eliminated the bindless set). In that case we can't bind the bindless DS. We have to
+	// treat it as regular set
+	ANKI_ASSERT(!(m_layout.m_entry == nullptr && !m_bindlessDSetBound)
+				&& "DS layout points to bindless but no bindless is bound");
+	const Bool reallyBindless = m_bindlessDSetBound && m_layout.m_entry == nullptr;
+
+	if(!reallyBindless)
 	{
 	{
 		// Get cache entry
 		// Get cache entry
 		ANKI_ASSERT(m_layout.m_entry);
 		ANKI_ASSERT(m_layout.m_entry);

+ 1 - 1
AnKi/Gr/Vulkan/FrameGarbageCollector.cpp

@@ -51,7 +51,7 @@ void FrameGarbageCollector::collectGarbage()
 
 
 			for(U32 bindlessIndex : textureGarbage->m_bindlessIndices)
 			for(U32 bindlessIndex : textureGarbage->m_bindlessIndices)
 			{
 			{
-				m_gr->getDescriptorSetFactory().unbindBindlessImage(bindlessIndex);
+				m_gr->getDescriptorSetFactory().unbindBindlessTexture(bindlessIndex);
 			}
 			}
 			textureGarbage->m_bindlessIndices.destroy(alloc);
 			textureGarbage->m_bindlessIndices.destroy(alloc);
 
 

+ 6 - 6
AnKi/Importer/GltfImporterMaterial.cpp

@@ -130,7 +130,7 @@ Error GltfImporter::writeMaterial(const cgltf_material& mtl, Bool writeRayTracin
 		StringAuto uri(m_alloc);
 		StringAuto uri(m_alloc);
 		uri.sprintf("%s%s", m_texrpath.cstr(), fname.cstr());
 		uri.sprintf("%s%s", m_texrpath.cstr(), fname.cstr());
 
 
-		xml.replaceAll("%diff%", StringAuto(m_alloc).sprintf("<input name=\"u_diffTex\" value=\"%s\"/>", uri.cstr()));
+		xml.replaceAll("%diff%", StringAuto(m_alloc).sprintf("<input name=\"m_diffTex\" value=\"%s\"/>", uri.cstr()));
 		xml.replaceAll("%diffTexMutator%", "1");
 		xml.replaceAll("%diffTexMutator%", "1");
 
 
 		Vec4 constantColor;
 		Vec4 constantColor;
@@ -202,7 +202,7 @@ Error GltfImporter::writeMaterial(const cgltf_material& mtl, Bool writeRayTracin
 					getTextureUri(mtl.pbr_metallic_roughness.metallic_roughness_texture).cstr());
 					getTextureUri(mtl.pbr_metallic_roughness.metallic_roughness_texture).cstr());
 
 
 		xml.replaceAll("%roughness%",
 		xml.replaceAll("%roughness%",
-					   StringAuto(m_alloc).sprintf("<input name=\"u_roughnessTex\" value=\"%s\"/>", uri.cstr()));
+					   StringAuto(m_alloc).sprintf("<input name=\"m_roughnessTex\" value=\"%s\"/>", uri.cstr()));
 
 
 		xml.replaceAll("%roughnessTexMutator%", "1");
 		xml.replaceAll("%roughnessTexMutator%", "1");
 	}
 	}
@@ -226,7 +226,7 @@ Error GltfImporter::writeMaterial(const cgltf_material& mtl, Bool writeRayTracin
 					getTextureUri(mtl.pbr_metallic_roughness.metallic_roughness_texture).cstr());
 					getTextureUri(mtl.pbr_metallic_roughness.metallic_roughness_texture).cstr());
 
 
 		xml.replaceAll("%metallic%",
 		xml.replaceAll("%metallic%",
-					   StringAuto(m_alloc).sprintf("<input name=\"u_metallicTex\" value=\"%s\"/>", uri.cstr()));
+					   StringAuto(m_alloc).sprintf("<input name=\"m_metallicTex\" value=\"%s\"/>", uri.cstr()));
 
 
 		xml.replaceAll("%metalTexMutator%", "1");
 		xml.replaceAll("%metalTexMutator%", "1");
 	}
 	}
@@ -253,7 +253,7 @@ Error GltfImporter::writeMaterial(const cgltf_material& mtl, Bool writeRayTracin
 			uri.sprintf("%s%s", m_texrpath.cstr(), getTextureUri(mtl.normal_texture).cstr());
 			uri.sprintf("%s%s", m_texrpath.cstr(), getTextureUri(mtl.normal_texture).cstr());
 
 
 			xml.replaceAll("%normal%",
 			xml.replaceAll("%normal%",
-						   StringAuto(m_alloc).sprintf("<input name=\"u_normalTex\" value=\"%s\"/>", uri.cstr()));
+						   StringAuto(m_alloc).sprintf("<input name=\"m_normalTex\" value=\"%s\"/>", uri.cstr()));
 
 
 			xml.replaceAll("%normalTexMutator%", "1");
 			xml.replaceAll("%normalTexMutator%", "1");
 		}
 		}
@@ -276,7 +276,7 @@ Error GltfImporter::writeMaterial(const cgltf_material& mtl, Bool writeRayTracin
 		uri.sprintf("%s%s", m_texrpath.cstr(), getTextureUri(mtl.emissive_texture).cstr());
 		uri.sprintf("%s%s", m_texrpath.cstr(), getTextureUri(mtl.emissive_texture).cstr());
 
 
 		xml.replaceAll("%emission%",
 		xml.replaceAll("%emission%",
-					   StringAuto(m_alloc).sprintf("<input name=\"u_emissiveTex\" value=\"%s\"/>", uri.cstr()));
+					   StringAuto(m_alloc).sprintf("<input name=\"m_emissiveTex\" value=\"%s\"/>", uri.cstr()));
 
 
 		xml.replaceAll("%emissiveTexMutator%", "1");
 		xml.replaceAll("%emissiveTexMutator%", "1");
 	}
 	}
@@ -314,7 +314,7 @@ Error GltfImporter::writeMaterial(const cgltf_material& mtl, Bool writeRayTracin
 		StringAuto uri(m_alloc);
 		StringAuto uri(m_alloc);
 		uri.sprintf("%s%s", m_texrpath.cstr(), it->cstr());
 		uri.sprintf("%s%s", m_texrpath.cstr(), it->cstr());
 
 
-		xml.replaceAll("%height%", StringAuto(m_alloc).sprintf("<input name=\"u_heightTex\" value=\"%s\" \"/>\n"
+		xml.replaceAll("%height%", StringAuto(m_alloc).sprintf("<input name=\"m_heightTex\" value=\"%s\" \"/>\n"
 															   "\t\t<input name=\"m_heightmapScale\" value=\"0.05\"/>",
 															   "\t\t<input name=\"m_heightmapScale\" value=\"0.05\"/>",
 															   uri.cstr()));
 															   uri.cstr()));
 
 

+ 21 - 15
AnKi/Renderer/Drawer.cpp

@@ -46,17 +46,26 @@ void RenderableDrawer::drawRange(RenderingTechnique technique, const Mat4& viewM
 {
 {
 	ANKI_ASSERT(begin && end && begin < end);
 	ANKI_ASSERT(begin && end && begin < end);
 
 
-	// Allocate and set global uniforms
-	StagingGpuMemoryToken globalUniformsToken;
-	MaterialGlobalUniforms* globalIniforms =
-		static_cast<MaterialGlobalUniforms*>(m_r->getStagingGpuMemory().allocateFrame(
-			sizeof(MaterialGlobalUniforms), StagingGpuMemoryType::UNIFORM, globalUniformsToken));
-	memcpy(&globalIniforms->m_viewProjectionMatrix[0], &viewProjMat, sizeof(viewProjMat));
-	const Mat3x4 viewMat3x4(viewMat);
-	memcpy(&globalIniforms->m_viewMatrix[0], &viewMat3x4, sizeof(viewMat3x4));
-	globalIniforms->m_viewRotationMatrix = viewMat.getRotationPart();
-	const Mat3 camRotationMatrix = viewMat.getInverse().getRotationPart();
-	globalIniforms->m_cameraRotationMatrix = camRotationMatrix;
+	// Allocate, set and bind global uniforms
+	{
+		StagingGpuMemoryToken globalUniformsToken;
+		MaterialGlobalUniforms* globalIniforms =
+			static_cast<MaterialGlobalUniforms*>(m_r->getStagingGpuMemory().allocateFrame(
+				sizeof(MaterialGlobalUniforms), StagingGpuMemoryType::UNIFORM, globalUniformsToken));
+		memcpy(&globalIniforms->m_viewProjectionMatrix[0], &viewProjMat, sizeof(viewProjMat));
+		const Mat3x4 viewMat3x4(viewMat);
+		memcpy(&globalIniforms->m_viewMatrix[0], &viewMat3x4, sizeof(viewMat3x4));
+		globalIniforms->m_viewRotationMatrix = viewMat.getRotationPart();
+		const Mat3 camRotationMatrix = viewMat.getInverse().getRotationPart();
+		globalIniforms->m_cameraRotationMatrix = camRotationMatrix;
+
+		cmdb->bindUniformBuffer(MATERIAL_SET_GLOBAL, MATERIAL_BINDING_GLOBAL_UNIFORMS, globalUniformsToken.m_buffer,
+								globalUniformsToken.m_offset, globalUniformsToken.m_range);
+	}
+
+	// More globals
+	cmdb->bindAllBindless(MATERIAL_SET_BINDLESS);
+	cmdb->bindSampler(MATERIAL_SET_GLOBAL, MATERIAL_BINDING_TRILINEAR_REPEAT_SAMPLER, sampler);
 
 
 	// Set a few things
 	// Set a few things
 	DrawContext ctx;
 	DrawContext ctx;
@@ -67,12 +76,9 @@ void RenderableDrawer::drawRange(RenderingTechnique technique, const Mat4& viewM
 	ctx.m_queueCtx.m_cameraTransform = ctx.m_queueCtx.m_viewMatrix.getInverse();
 	ctx.m_queueCtx.m_cameraTransform = ctx.m_queueCtx.m_viewMatrix.getInverse();
 	ctx.m_queueCtx.m_stagingGpuAllocator = &m_r->getStagingGpuMemory();
 	ctx.m_queueCtx.m_stagingGpuAllocator = &m_r->getStagingGpuMemory();
 	ctx.m_queueCtx.m_commandBuffer = cmdb;
 	ctx.m_queueCtx.m_commandBuffer = cmdb;
-	ctx.m_queueCtx.m_sampler = sampler;
 	ctx.m_queueCtx.m_key = RenderingKey(technique, 0, 1, false, false);
 	ctx.m_queueCtx.m_key = RenderingKey(technique, 0, 1, false, false);
 	ctx.m_queueCtx.m_debugDraw = false;
 	ctx.m_queueCtx.m_debugDraw = false;
-	ctx.m_queueCtx.m_globalUniforms.m_buffer = globalUniformsToken.m_buffer;
-	ctx.m_queueCtx.m_globalUniforms.m_offset = globalUniformsToken.m_offset;
-	ctx.m_queueCtx.m_globalUniforms.m_range = globalUniformsToken.m_range;
+	ctx.m_queueCtx.m_sampler = sampler;
 
 
 	ANKI_ASSERT(minLod < MAX_LOD_COUNT && maxLod < MAX_LOD_COUNT);
 	ANKI_ASSERT(minLod < MAX_LOD_COUNT && maxLod < MAX_LOD_COUNT);
 	ctx.m_minLod = U8(minLod);
 	ctx.m_minLod = U8(minLod);

+ 12 - 8
AnKi/Renderer/ForwardShading.cpp

@@ -12,6 +12,7 @@
 #include <AnKi/Renderer/DepthDownscale.h>
 #include <AnKi/Renderer/DepthDownscale.h>
 #include <AnKi/Renderer/LensFlare.h>
 #include <AnKi/Renderer/LensFlare.h>
 #include <AnKi/Renderer/VolumetricLightingAccumulation.h>
 #include <AnKi/Renderer/VolumetricLightingAccumulation.h>
+#include <AnKi/Shaders/Include/MaterialTypes.h>
 
 
 namespace anki {
 namespace anki {
 
 
@@ -34,16 +35,19 @@ void ForwardShading::run(const RenderingContext& ctx, RenderPassWorkContext& rgr
 		cmdb->setBlendFactors(0, BlendFactor::SRC_ALPHA, BlendFactor::ONE_MINUS_SRC_ALPHA);
 		cmdb->setBlendFactors(0, BlendFactor::SRC_ALPHA, BlendFactor::ONE_MINUS_SRC_ALPHA);
 
 
 		const ClusteredShadingContext& rsrc = ctx.m_clusteredShading;
 		const ClusteredShadingContext& rsrc = ctx.m_clusteredShading;
-		cmdb->bindSampler(0, 0, m_r->getSamplers().m_trilinearClamp);
+		const U32 set = MATERIAL_SET_GLOBAL;
+		cmdb->bindSampler(set, MATERIAL_BINDING_LINEAR_CLAMP_SAMPLER, m_r->getSamplers().m_trilinearClamp);
 
 
-		rgraphCtx.bindTexture(0, 1, m_r->getDepthDownscale().getHiZRt(), HIZ_HALF_DEPTH);
-		rgraphCtx.bindColorTexture(0, 2, m_r->getVolumetricLightingAccumulation().getRt());
+		rgraphCtx.bindTexture(set, MATERIAL_BINDING_DEPTH_RT, m_r->getDepthDownscale().getHiZRt(), HIZ_HALF_DEPTH);
+		rgraphCtx.bindColorTexture(set, MATERIAL_BINDING_LIGHT_VOLUME,
+								   m_r->getVolumetricLightingAccumulation().getRt());
 
 
-		bindUniforms(cmdb, 0, 3, rsrc.m_clusteredShadingUniformsToken);
-		bindUniforms(cmdb, 0, 4, rsrc.m_pointLightsToken);
-		bindUniforms(cmdb, 0, 5, rsrc.m_spotLightsToken);
-		rgraphCtx.bindColorTexture(0, 6, m_r->getShadowMapping().getShadowmapRt());
-		bindStorage(cmdb, 0, 7, rsrc.m_clustersToken);
+		bindUniforms(cmdb, set, MATERIAL_BINDING_CLUSTER_SHADING_UNIFORMS, rsrc.m_clusteredShadingUniformsToken);
+		bindUniforms(cmdb, set, MATERIAL_BINDING_CLUSTER_SHADING_LIGHTS, rsrc.m_pointLightsToken);
+		bindUniforms(cmdb, set, MATERIAL_BINDING_CLUSTER_SHADING_LIGHTS + 1, rsrc.m_spotLightsToken);
+		rgraphCtx.bindColorTexture(set, MATERIAL_BINDING_CLUSTER_SHADING_LIGHTS + 2,
+								   m_r->getShadowMapping().getShadowmapRt());
+		bindStorage(cmdb, set, MATERIAL_BINDING_CLUSTERS, rsrc.m_clustersToken);
 
 
 		// Start drawing
 		// Start drawing
 		m_r->getSceneDrawer().drawRange(RenderingTechnique::FORWARD, ctx.m_matrices.m_view,
 		m_r->getSceneDrawer().drawRange(RenderingTechnique::FORWARD, ctx.m_matrices.m_view,

+ 0 - 8
AnKi/Renderer/RenderQueue.h

@@ -45,14 +45,6 @@ public:
 	StackAllocator<U8> m_frameAllocator;
 	StackAllocator<U8> m_frameAllocator;
 	Bool m_debugDraw; ///< If true the drawcall should be drawing some kind of debug mesh.
 	Bool m_debugDraw; ///< If true the drawcall should be drawing some kind of debug mesh.
 	BitSet<U(RenderQueueDebugDrawFlag::COUNT), U32> m_debugDrawFlags = {false};
 	BitSet<U(RenderQueueDebugDrawFlag::COUNT), U32> m_debugDrawFlags = {false};
-
-	class
-	{
-	public:
-		BufferPtr m_buffer;
-		PtrSize m_offset;
-		PtrSize m_range;
-	} m_globalUniforms; ///< Points to a MaterialGlobalUniforms structure.
 };
 };
 
 
 /// Draw callback for drawing.
 /// Draw callback for drawing.

+ 9 - 8
AnKi/Renderer/Renderer.cpp

@@ -113,27 +113,28 @@ Error Renderer::initInternal(UVec2 swapchainResolution)
 		return Error::USER_DATA;
 		return Error::USER_DATA;
 	}
 	}
 
 
+	ANKI_CHECK(m_resources->loadResource("Shaders/ClearTextureCompute.ankiprog", m_clearTexComputeProg));
+
+	// Dummy resources
 	{
 	{
 		TextureInitInfo texinit("RendererDummy");
 		TextureInitInfo texinit("RendererDummy");
 		texinit.m_width = texinit.m_height = 4;
 		texinit.m_width = texinit.m_height = 4;
-		texinit.m_usage = TextureUsageBit::ALL_SAMPLED;
+		texinit.m_usage = TextureUsageBit::ALL_SAMPLED | TextureUsageBit::IMAGE_COMPUTE_WRITE;
 		texinit.m_format = Format::R8G8B8A8_UNORM;
 		texinit.m_format = Format::R8G8B8A8_UNORM;
-		TexturePtr tex = getGrManager().newTexture(texinit);
+		TexturePtr tex = createAndClearRenderTarget(texinit, TextureUsageBit::ALL_SAMPLED);
 
 
 		TextureViewInitInfo viewinit(tex);
 		TextureViewInitInfo viewinit(tex);
 		m_dummyTexView2d = getGrManager().newTextureView(viewinit);
 		m_dummyTexView2d = getGrManager().newTextureView(viewinit);
 
 
 		texinit.m_depth = 4;
 		texinit.m_depth = 4;
 		texinit.m_type = TextureType::_3D;
 		texinit.m_type = TextureType::_3D;
-		tex = getGrManager().newTexture(texinit);
+		tex = createAndClearRenderTarget(texinit, TextureUsageBit::ALL_SAMPLED);
 		viewinit = TextureViewInitInfo(tex);
 		viewinit = TextureViewInitInfo(tex);
 		m_dummyTexView3d = getGrManager().newTextureView(viewinit);
 		m_dummyTexView3d = getGrManager().newTextureView(viewinit);
-	}
 
 
-	m_dummyBuff = getGrManager().newBuffer(BufferInitInfo(
-		1024, BufferUsageBit::ALL_UNIFORM | BufferUsageBit::ALL_STORAGE, BufferMapAccessBit::NONE, "Dummy"));
-
-	ANKI_CHECK(m_resources->loadResource("Shaders/ClearTextureCompute.ankiprog", m_clearTexComputeProg));
+		m_dummyBuff = getGrManager().newBuffer(BufferInitInfo(
+			1024, BufferUsageBit::ALL_UNIFORM | BufferUsageBit::ALL_STORAGE, BufferMapAccessBit::NONE, "Dummy"));
+	}
 
 
 	// Init the stages. Careful with the order!!!!!!!!!!
 	// Init the stages. Careful with the order!!!!!!!!!!
 	m_genericCompute.reset(m_alloc.newInstance<GenericCompute>(this));
 	m_genericCompute.reset(m_alloc.newInstance<GenericCompute>(this));

+ 35 - 5
AnKi/Resource/MaterialResource.cpp

@@ -263,7 +263,7 @@ Error MaterialResource::createVars(Program& prog)
 				// different programs have different signature for AnKiLocalUniforms
 				// different programs have different signature for AnKiLocalUniforms
 				for(const MaterialVariable& otherVar : m_vars)
 				for(const MaterialVariable& otherVar : m_vars)
 				{
 				{
-					if(otherVar.isTexture())
+					if(!otherVar.isUniform())
 					{
 					{
 						continue;
 						continue;
 					}
 					}
@@ -356,7 +356,7 @@ Error MaterialResource::createVars(Program& prog)
 				// Check that there are no other opaque with the same binding
 				// Check that there are no other opaque with the same binding
 				for(const MaterialVariable& otherVar : m_vars)
 				for(const MaterialVariable& otherVar : m_vars)
 				{
 				{
-					if(!otherVar.isTexture())
+					if(!otherVar.isBoundableTexture())
 					{
 					{
 						continue;
 						continue;
 					}
 					}
@@ -561,7 +561,7 @@ Error MaterialResource::findBuiltinMutators(Program& prog)
 			const U32 binding = storageBlocks[i].m_binding;
 			const U32 binding = storageBlocks[i].m_binding;
 			const U32 set = storageBlocks[i].m_set;
 			const U32 set = storageBlocks[i].m_set;
 			if((binding == MATERIAL_BINDING_BONE_TRANSFORMS || binding == MATERIAL_BINDING_PREVIOUS_BONE_TRANSFORMS)
 			if((binding == MATERIAL_BINDING_BONE_TRANSFORMS || binding == MATERIAL_BINDING_PREVIOUS_BONE_TRANSFORMS)
-			   && set == MATERIAL_SET_EXTERNAL)
+			   && set == MATERIAL_SET_LOCAL)
 			{
 			{
 				++foundCount;
 				++foundCount;
 			}
 			}
@@ -636,7 +636,7 @@ Error MaterialResource::parseInput(XmlElement inputEl, Bool async, BitSet<128>&
 	varsSet.set(idx);
 	varsSet.set(idx);
 
 
 	// Set the value
 	// Set the value
-	if(foundVar->isTexture())
+	if(foundVar->isBoundableTexture())
 	{
 	{
 		CString texfname;
 		CString texfname;
 		ANKI_CHECK(inputEl.getAttributeText("value", texfname));
 		ANKI_CHECK(inputEl.getAttributeText("value", texfname));
@@ -644,6 +644,36 @@ Error MaterialResource::parseInput(XmlElement inputEl, Bool async, BitSet<128>&
 
 
 		m_textures.emplaceBack(getAllocator(), foundVar->m_image->getTexture());
 		m_textures.emplaceBack(getAllocator(), foundVar->m_image->getTexture());
 	}
 	}
+	else if(foundVar->m_dataType == ShaderVariableDataType::U32)
+	{
+		// U32 is a bit special. It might be a number or a bindless texture
+
+		CString value;
+		ANKI_CHECK(inputEl.getAttributeText("value", value));
+
+		// Check if the value has letters
+		Bool containsAlpharithmetic = false;
+		for(Char c : value)
+		{
+			if((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'a'))
+			{
+				containsAlpharithmetic = true;
+				break;
+			}
+		}
+
+		// If it has letters it's a texture
+		if(containsAlpharithmetic)
+		{
+			ANKI_CHECK(getManager().loadResource(value, foundVar->m_image, async));
+
+			foundVar->m_U32 = foundVar->m_image->getTextureView()->getOrCreateBindlessTextureIndex();
+		}
+		else
+		{
+			ANKI_CHECK(GetAttribute<U32>()(inputEl, foundVar->m_U32));
+		}
+	}
 	else
 	else
 	{
 	{
 		switch(foundVar->m_dataType)
 		switch(foundVar->m_dataType)
@@ -675,7 +705,7 @@ void MaterialResource::prefillLocalUniforms()
 
 
 	for(const MaterialVariable& var : m_vars)
 	for(const MaterialVariable& var : m_vars)
 	{
 	{
-		if(var.isTexture())
+		if(!var.isUniform())
 		{
 		{
 			continue;
 			continue;
 		}
 		}

+ 9 - 4
AnKi/Resource/MaterialResource.h

@@ -74,15 +74,20 @@ public:
 	template<typename T>
 	template<typename T>
 	const T& getValue() const;
 	const T& getValue() const;
 
 
-	Bool isTexture() const
+	Bool isBoundableTexture() const
 	{
 	{
 		return m_dataType >= ShaderVariableDataType::TEXTURE_FIRST
 		return m_dataType >= ShaderVariableDataType::TEXTURE_FIRST
 			   && m_dataType <= ShaderVariableDataType::TEXTURE_LAST;
 			   && m_dataType <= ShaderVariableDataType::TEXTURE_LAST;
 	}
 	}
 
 
+	Bool isBindlessTexture() const
+	{
+		return m_dataType == ShaderVariableDataType::U32 && m_image.get();
+	}
+
 	Bool isUniform() const
 	Bool isUniform() const
 	{
 	{
-		return !isTexture();
+		return !isBoundableTexture();
 	}
 	}
 
 
 	ShaderVariableDataType getDataType() const
 	ShaderVariableDataType getDataType() const
@@ -94,7 +99,7 @@ public:
 	/// Get the binding of a texture or a sampler type of material variable.
 	/// Get the binding of a texture or a sampler type of material variable.
 	U32 getTextureBinding() const
 	U32 getTextureBinding() const
 	{
 	{
-		ANKI_ASSERT(m_opaqueBinding != MAX_U32 && isTexture());
+		ANKI_ASSERT(m_opaqueBinding != MAX_U32 && isBoundableTexture());
 		return m_opaqueBinding;
 		return m_opaqueBinding;
 	}
 	}
 
 
@@ -142,7 +147,7 @@ protected:
 template<>
 template<>
 inline const ImageResourcePtr& MaterialVariable::getValue() const
 inline const ImageResourcePtr& MaterialVariable::getValue() const
 {
 {
-	ANKI_ASSERT(isTexture());
+	ANKI_ASSERT(m_image.get());
 	return m_image;
 	return m_image;
 }
 }
 
 

+ 7 - 6
AnKi/Scene/Components/RenderComponent.cpp

@@ -23,12 +23,7 @@ void RenderComponent::allocateAndSetupUniforms(const MaterialResourcePtr& mtl, c
 
 
 	CommandBufferPtr cmdb = ctx.m_commandBuffer;
 	CommandBufferPtr cmdb = ctx.m_commandBuffer;
 
 
-	const U32 set = MATERIAL_SET_EXTERNAL;
-
-	cmdb->bindSampler(set, MATERIAL_BINDING_GLOBAL_SAMPLER, ctx.m_sampler);
-
-	cmdb->bindUniformBuffer(set, MATERIAL_BINDING_GLOBAL_UNIFORMS, ctx.m_globalUniforms.m_buffer,
-							ctx.m_globalUniforms.m_offset, ctx.m_globalUniforms.m_range);
+	const U32 set = MATERIAL_SET_LOCAL;
 
 
 	// Fill the RenderableGpuView
 	// Fill the RenderableGpuView
 	const U32 renderableGpuViewsUboSize = sizeof(RenderableGpuView) * transforms.getSize();
 	const U32 renderableGpuViewsUboSize = sizeof(RenderableGpuView) * transforms.getSize();
@@ -72,6 +67,12 @@ void RenderComponent::allocateAndSetupUniforms(const MaterialResourcePtr& mtl, c
 	{
 	{
 		switch(mvar.getDataType())
 		switch(mvar.getDataType())
 		{
 		{
+		case ShaderVariableDataType::U32:
+		{
+			const U32 val = mvar.getValue<U32>();
+			memcpy(localUniformsBegin + mvar.getOffsetInLocalUniforms(), &val, sizeof(val));
+			break;
+		}
 		case ShaderVariableDataType::F32:
 		case ShaderVariableDataType::F32:
 		{
 		{
 			const F32 val = mvar.getValue<F32>();
 			const F32 val = mvar.getValue<F32>();

+ 3 - 3
AnKi/Scene/ModelNode.cpp

@@ -247,11 +247,11 @@ void ModelNode::draw(RenderQueueDrawContext& ctx, ConstWeakArray<void*> userData
 															tokenPrev);
 															tokenPrev);
 			memcpy(trfs, &skinc.getPreviousFrameBoneTransforms()[0], boneCount * sizeof(Mat4));
 			memcpy(trfs, &skinc.getPreviousFrameBoneTransforms()[0], boneCount * sizeof(Mat4));
 
 
-			cmdb->bindStorageBuffer(MATERIAL_SET_EXTERNAL, MATERIAL_BINDING_BONE_TRANSFORMS, token.m_buffer,
+			cmdb->bindStorageBuffer(MATERIAL_SET_LOCAL, MATERIAL_BINDING_BONE_TRANSFORMS, token.m_buffer,
 									token.m_offset, token.m_range);
 									token.m_offset, token.m_range);
 
 
-			cmdb->bindStorageBuffer(MATERIAL_SET_EXTERNAL, MATERIAL_BINDING_PREVIOUS_BONE_TRANSFORMS,
-									tokenPrev.m_buffer, tokenPrev.m_offset, tokenPrev.m_range);
+			cmdb->bindStorageBuffer(MATERIAL_SET_LOCAL, MATERIAL_BINDING_PREVIOUS_BONE_TRANSFORMS, tokenPrev.m_buffer,
+									tokenPrev.m_offset, tokenPrev.m_range);
 		}
 		}
 
 
 		// Program
 		// Program

+ 2 - 1
AnKi/ShaderCompiler/ShaderProgramDump.cpp

@@ -294,7 +294,8 @@ void dumpShaderProgramBinary(const ShaderProgramBinary& binary, StringAuto& huma
 	count = 0;
 	count = 0;
 	for(const ShaderProgramBinaryMutation& mutation : binary.m_mutations)
 	for(const ShaderProgramBinaryMutation& mutation : binary.m_mutations)
 	{
 	{
-		lines.pushBackSprintf(ANKI_TAB "#mut%-4u variantIndex #var%05u values (", count++, mutation.m_variantIndex);
+		lines.pushBackSprintf(ANKI_TAB "#mut%-4u variantIndex #var%05u hash 0x%016" PRIX64 " values (", count++,
+							  mutation.m_variantIndex, mutation.m_hash);
 		if(mutation.m_values.getSize() > 0)
 		if(mutation.m_values.getSize() > 0)
 		{
 		{
 			for(U32 i = 0; i < mutation.m_values.getSize(); ++i)
 			for(U32 i = 0; i < mutation.m_values.getSize(); ++i)

+ 5 - 1
AnKi/ShaderCompiler/ShaderProgramParser.cpp

@@ -76,7 +76,7 @@ static const char SHADER_HEADER[] = R"(#version 460 core
 	layout(set = set_, binding = 0) uniform texture2D u_bindlessTextures2dF32[ANKI_MAX_BINDLESS_TEXTURES]; \
 	layout(set = set_, binding = 0) uniform texture2D u_bindlessTextures2dF32[ANKI_MAX_BINDLESS_TEXTURES]; \
 	layout(set = set_, binding = 1) uniform readonly uimage2D u_bindlessImages2dU32[ANKI_MAX_BINDLESS_IMAGES]; \
 	layout(set = set_, binding = 1) uniform readonly uimage2D u_bindlessImages2dU32[ANKI_MAX_BINDLESS_IMAGES]; \
 	layout(set = set_, binding = 1) uniform readonly iimage2D u_bindlessImages2dI32[ANKI_MAX_BINDLESS_IMAGES]; \
 	layout(set = set_, binding = 1) uniform readonly iimage2D u_bindlessImages2dI32[ANKI_MAX_BINDLESS_IMAGES]; \
-	layout(set = set_, binding = 1) uniform readonly image2D u_bindlessImages2dF32[ANKI_MAX_BINDLESS_IMAGES]
+	layout(set = set_, binding = 1) uniform readonly image2D u_bindlessImages2dF32[ANKI_MAX_BINDLESS_IMAGES];
 
 
 #define F32 float
 #define F32 float
 #define _ANKI_SIZEOF_float 4u
 #define _ANKI_SIZEOF_float 4u
@@ -960,6 +960,10 @@ Error ShaderProgramParser::parsePragmaMember(const StringAuto* begin, const Stri
 	{
 	{
 		member.m_type = ShaderVariableDataType::VEC4;
 		member.m_type = ShaderVariableDataType::VEC4;
 	}
 	}
+	else if(typeStr == "U32")
+	{
+		member.m_type = ShaderVariableDataType::U32;
+	}
 
 
 	if(member.m_type == ShaderVariableDataType::NONE)
 	if(member.m_type == ShaderVariableDataType::NONE)
 	{
 	{

+ 6 - 6
AnKi/Shaders/ClusteredShadingCommon.glsl

@@ -26,12 +26,12 @@ layout(set = CLUSTERED_SHADING_SET, binding = CLUSTERED_SHADING_LIGHTS_BINDING,
 	PointLight u_pointLights2[MAX_VISIBLE_POINT_LIGHTS];
 	PointLight u_pointLights2[MAX_VISIBLE_POINT_LIGHTS];
 };
 };
 
 
-layout(set = CLUSTERED_SHADING_SET, binding = CLUSTERED_SHADING_LIGHTS_BINDING + 1, scalar) uniform b_spotLights
+layout(set = CLUSTERED_SHADING_SET, binding = CLUSTERED_SHADING_LIGHTS_BINDING + 1u, scalar) uniform b_spotLights
 {
 {
 	SpotLight u_spotLights2[MAX_VISIBLE_SPOT_LIGHTS];
 	SpotLight u_spotLights2[MAX_VISIBLE_SPOT_LIGHTS];
 };
 };
 
 
-layout(set = CLUSTERED_SHADING_SET, binding = CLUSTERED_SHADING_LIGHTS_BINDING + 2) uniform texture2D u_shadowAtlasTex;
+layout(set = CLUSTERED_SHADING_SET, binding = CLUSTERED_SHADING_LIGHTS_BINDING + 2u) uniform texture2D u_shadowAtlasTex;
 #endif
 #endif
 
 
 //
 //
@@ -44,7 +44,7 @@ layout(set = CLUSTERED_SHADING_SET, binding = CLUSTERED_SHADING_REFLECTIONS_BIND
 };
 };
 
 
 layout(set = CLUSTERED_SHADING_SET,
 layout(set = CLUSTERED_SHADING_SET,
-	   binding = CLUSTERED_SHADING_REFLECTIONS_BINDING + 1) uniform ANKI_RP textureCubeArray u_reflectionsTex;
+	   binding = CLUSTERED_SHADING_REFLECTIONS_BINDING + 1u) uniform ANKI_RP textureCubeArray u_reflectionsTex;
 #endif
 #endif
 
 
 //
 //
@@ -57,9 +57,9 @@ layout(set = CLUSTERED_SHADING_SET, binding = CLUSTERED_SHADING_DECALS_BINDING,
 };
 };
 
 
 layout(set = CLUSTERED_SHADING_SET,
 layout(set = CLUSTERED_SHADING_SET,
-	   binding = CLUSTERED_SHADING_DECALS_BINDING + 1) uniform ANKI_RP texture2D u_diffuseDecalTex;
+	   binding = CLUSTERED_SHADING_DECALS_BINDING + 1u) uniform ANKI_RP texture2D u_diffuseDecalTex;
 layout(set = CLUSTERED_SHADING_SET,
 layout(set = CLUSTERED_SHADING_SET,
-	   binding = CLUSTERED_SHADING_DECALS_BINDING + 2) uniform ANKI_RP texture2D u_specularRoughnessDecalTex;
+	   binding = CLUSTERED_SHADING_DECALS_BINDING + 2u) uniform ANKI_RP texture2D u_specularRoughnessDecalTex;
 #endif
 #endif
 
 
 //
 //
@@ -79,7 +79,7 @@ layout(set = CLUSTERED_SHADING_SET, binding = CLUSTERED_SHADING_FOG_BINDING, sca
 layout(set = CLUSTERED_SHADING_SET, binding = CLUSTERED_SHADING_GI_BINDING) uniform ANKI_RP texture3D
 layout(set = CLUSTERED_SHADING_SET, binding = CLUSTERED_SHADING_GI_BINDING) uniform ANKI_RP texture3D
 	u_globalIlluminationTextures[MAX_VISIBLE_GLOBAL_ILLUMINATION_PROBES];
 	u_globalIlluminationTextures[MAX_VISIBLE_GLOBAL_ILLUMINATION_PROBES];
 
 
-layout(set = CLUSTERED_SHADING_SET, binding = CLUSTERED_SHADING_GI_BINDING + 1, scalar) uniform b_giProbes
+layout(set = CLUSTERED_SHADING_SET, binding = CLUSTERED_SHADING_GI_BINDING + 1u, scalar) uniform b_giProbes
 {
 {
 	GlobalIlluminationProbe u_giProbes[MAX_VISIBLE_GLOBAL_ILLUMINATION_PROBES];
 	GlobalIlluminationProbe u_giProbes[MAX_VISIBLE_GLOBAL_ILLUMINATION_PROBES];
 };
 };

+ 8 - 7
AnKi/Shaders/ForwardShadingCommon.glsl

@@ -23,13 +23,14 @@ layout(location = VERTEX_ATTRIBUTE_ID_POSITION) in Vec3 in_position;
 //
 //
 #if defined(ANKI_FRAGMENT_SHADER)
 #if defined(ANKI_FRAGMENT_SHADER)
 // Global resources
 // Global resources
-layout(set = MATERIAL_SET_INTERNAL, binding = 0) uniform sampler u_linearAnyClampSampler;
-layout(set = MATERIAL_SET_INTERNAL, binding = 1) uniform texture2D u_gbufferDepthRt;
-layout(set = MATERIAL_SET_INTERNAL, binding = 2) uniform ANKI_RP texture3D u_lightVol;
-#	define CLUSTERED_SHADING_SET MATERIAL_SET_INTERNAL
-#	define CLUSTERED_SHADING_UNIFORMS_BINDING 3
-#	define CLUSTERED_SHADING_LIGHTS_BINDING 4
-#	define CLUSTERED_SHADING_CLUSTERS_BINDING 7
+layout(set = MATERIAL_SET_GLOBAL,
+	   binding = MATERIAL_BINDING_LINEAR_CLAMP_SAMPLER) uniform sampler u_linearAnyClampSampler;
+layout(set = MATERIAL_SET_GLOBAL, binding = MATERIAL_BINDING_DEPTH_RT) uniform texture2D u_gbufferDepthRt;
+layout(set = MATERIAL_SET_GLOBAL, binding = MATERIAL_BINDING_LIGHT_VOLUME) uniform ANKI_RP texture3D u_lightVol;
+#	define CLUSTERED_SHADING_SET MATERIAL_SET_GLOBAL
+#	define CLUSTERED_SHADING_UNIFORMS_BINDING MATERIAL_BINDING_CLUSTER_SHADING_UNIFORMS
+#	define CLUSTERED_SHADING_LIGHTS_BINDING MATERIAL_BINDING_CLUSTER_SHADING_LIGHTS
+#	define CLUSTERED_SHADING_CLUSTERS_BINDING MATERIAL_BINDING_CLUSTERS
 #	include <AnKi/Shaders/ClusteredShadingCommon.glsl>
 #	include <AnKi/Shaders/ClusteredShadingCommon.glsl>
 
 
 layout(location = 0) out Vec4 out_color;
 layout(location = 0) out Vec4 out_color;

+ 7 - 7
AnKi/Shaders/ForwardShadingFog.ankiprog

@@ -22,23 +22,23 @@ struct PerDraw
 #pragma anki member ANKI_RP F32 m_fogDistanceOfMaxThikness
 #pragma anki member ANKI_RP F32 m_fogDistanceOfMaxThikness
 #pragma anki struct end
 #pragma anki struct end
 
 
-layout(set = MATERIAL_SET_EXTERNAL, binding = MATERIAL_BINDING_LOCAL_UNIFORMS, row_major, scalar) buffer b_localUniforms
-{
-	U32 u_localUniforms[];
-};
-
-layout(set = MATERIAL_SET_EXTERNAL, binding = MATERIAL_BINDING_GLOBAL_UNIFORMS, row_major,
+layout(set = MATERIAL_SET_GLOBAL, binding = MATERIAL_BINDING_GLOBAL_UNIFORMS, row_major,
 	   scalar) uniform b_ankiGlobalUniforms
 	   scalar) uniform b_ankiGlobalUniforms
 {
 {
 	MaterialGlobalUniforms u_global;
 	MaterialGlobalUniforms u_global;
 };
 };
 
 
-layout(set = MATERIAL_SET_EXTERNAL, binding = MATERIAL_BINDING_RENDERABLE_GPU_VIEW, row_major,
+layout(set = MATERIAL_SET_LOCAL, binding = MATERIAL_BINDING_RENDERABLE_GPU_VIEW, row_major,
 	   scalar) uniform b_renderableGpuViews
 	   scalar) uniform b_renderableGpuViews
 {
 {
 	RenderableGpuView u_renderableGpuViews[1];
 	RenderableGpuView u_renderableGpuViews[1];
 };
 };
 
 
+layout(set = MATERIAL_SET_LOCAL, binding = MATERIAL_BINDING_LOCAL_UNIFORMS, row_major, scalar) buffer b_localUniforms
+{
+	U32 u_localUniforms[];
+};
+
 #pragma anki start vert
 #pragma anki start vert
 
 
 layout(location = 0) out F32 out_zVSpace;
 layout(location = 0) out F32 out_zVSpace;

+ 12 - 11
AnKi/Shaders/ForwardShadingParticles.ankiprog

@@ -16,33 +16,34 @@
 #pragma anki member ANKI_RP Vec4 m_colorBias
 #pragma anki member ANKI_RP Vec4 m_colorBias
 #pragma anki struct end
 #pragma anki struct end
 
 
-layout(set = MATERIAL_SET_EXTERNAL, binding = MATERIAL_BINDING_LOCAL_UNIFORMS, row_major, scalar) buffer b_localUniforms
+layout(set = MATERIAL_SET_GLOBAL, binding = MATERIAL_BINDING_GLOBAL_UNIFORMS, row_major,
+	   scalar) uniform b_ankiGlobalUniforms
 {
 {
-	U32 u_localUniforms[];
+	MaterialGlobalUniforms u_ankiGlobals;
 };
 };
 
 
-layout(set = MATERIAL_SET_EXTERNAL, binding = MATERIAL_BINDING_GLOBAL_UNIFORMS, row_major,
-	   scalar) uniform b_ankiGlobalUniforms
+layout(set = MATERIAL_SET_GLOBAL, binding = MATERIAL_BINDING_TRILINEAR_REPEAT_SAMPLER) uniform sampler u_globalSampler;
+
+layout(set = MATERIAL_SET_LOCAL, binding = MATERIAL_BINDING_LOCAL_UNIFORMS, row_major, scalar) buffer b_localUniforms
 {
 {
-	MaterialGlobalUniforms u_ankiGlobals;
+	U32 u_localUniforms[];
 };
 };
 
 
-layout(set = MATERIAL_SET_EXTERNAL, binding = MATERIAL_BINDING_RENDERABLE_GPU_VIEW, row_major,
+layout(set = MATERIAL_SET_LOCAL, binding = MATERIAL_BINDING_RENDERABLE_GPU_VIEW, row_major,
 	   scalar) uniform b_renderableGpuViews
 	   scalar) uniform b_renderableGpuViews
 {
 {
 	RenderableGpuView u_renderableGpuViews[1];
 	RenderableGpuView u_renderableGpuViews[1];
 };
 };
 
 
-layout(set = MATERIAL_SET_EXTERNAL, binding = MATERIAL_BINDING_GLOBAL_SAMPLER) uniform sampler u_globalSampler;
 #if ANIMATED_TEXTURE == 0
 #if ANIMATED_TEXTURE == 0
 #	pragma anki reflect u_diffuseMap
 #	pragma anki reflect u_diffuseMap
-layout(set = MATERIAL_SET_EXTERNAL,
-	   binding = MATERIAL_BINDING_FIRST_NON_STANDARD) uniform ANKI_RP texture2D u_diffuseMap;
+layout(set = MATERIAL_SET_LOCAL,
+	   binding = MATERIAL_BINDING_FIRST_NON_STANDARD_LOCAL) uniform ANKI_RP texture2D u_diffuseMap;
 #endif
 #endif
 #if ANIMATED_TEXTURE == 1
 #if ANIMATED_TEXTURE == 1
 #	pragma anki reflect u_diffuseMapArr
 #	pragma anki reflect u_diffuseMapArr
-layout(set = MATERIAL_SET_EXTERNAL,
-	   binding = MATERIAL_BINDING_FIRST_NON_STANDARD) uniform ANKI_RP texture2DArray u_diffuseMapArr;
+layout(set = MATERIAL_SET_LOCAL,
+	   binding = MATERIAL_BINDING_FIRST_NON_STANDARD_LOCAL) uniform ANKI_RP texture2DArray u_diffuseMapArr;
 #endif
 #endif
 
 
 #pragma anki start vert
 #pragma anki start vert

+ 2 - 0
AnKi/Shaders/GBufferCommon.glsl

@@ -13,6 +13,8 @@
 #include <AnKi/Shaders/Include/GpuSceneTypes.h>
 #include <AnKi/Shaders/Include/GpuSceneTypes.h>
 #include <AnKi/Shaders/Common.glsl>
 #include <AnKi/Shaders/Common.glsl>
 
 
+ANKI_BINDLESS_SET(MATERIAL_SET_BINDLESS)
+
 #define REALLY_USING_PARALLAX \
 #define REALLY_USING_PARALLAX \
 	(PARALLAX == 1 && ANKI_TECHNIQUE == RENDERING_TECHNIQUE_GBUFFER && ANKI_LOD == 0 && ALPHA_TEST == 0)
 	(PARALLAX == 1 && ANKI_TECHNIQUE == RENDERING_TECHNIQUE_GBUFFER && ANKI_LOD == 0 && ALPHA_TEST == 0)
 
 

+ 32 - 57
AnKi/Shaders/GBufferGeneric.ankiprog

@@ -41,73 +41,45 @@
 
 
 #include <AnKi/Shaders/GBufferCommon.glsl>
 #include <AnKi/Shaders/GBufferCommon.glsl>
 
 
-layout(set = MATERIAL_SET_EXTERNAL, binding = MATERIAL_BINDING_GLOBAL_SAMPLER) uniform sampler u_globalSampler;
-
-#if DIFFUSE_TEX
-#	pragma anki reflect u_diffTex
-layout(set = MATERIAL_SET_EXTERNAL,
-	   binding = MATERIAL_BINDING_FIRST_NON_STANDARD + 0u) uniform ANKI_RP texture2D u_diffTex;
-#endif
-
-#if SPECULAR_TEX
-#	pragma anki reflect u_specTex
-layout(set = MATERIAL_SET_EXTERNAL,
-	   binding = MATERIAL_BINDING_FIRST_NON_STANDARD + 1u) uniform ANKI_RP texture2D u_specTex;
-#endif
-
-#if ROUGHNESS_TEX
-#	pragma anki reflect u_roughnessTex
-layout(set = MATERIAL_SET_EXTERNAL,
-	   binding = MATERIAL_BINDING_FIRST_NON_STANDARD + 2u) uniform ANKI_RP texture2D u_roughnessTex;
-#endif
-
-#if NORMAL_TEX
-#	pragma anki reflect u_normalTex
-layout(set = MATERIAL_SET_EXTERNAL,
-	   binding = MATERIAL_BINDING_FIRST_NON_STANDARD + 3u) uniform ANKI_RP texture2D u_normalTex;
-#endif
-
-#if METAL_TEX
-#	pragma anki reflect u_metallicTex
-layout(set = MATERIAL_SET_EXTERNAL,
-	   binding = MATERIAL_BINDING_FIRST_NON_STANDARD + 4u) uniform ANKI_RP texture2D u_metallicTex;
-#endif
-
-#if PARALLAX
-#	pragma anki reflect u_heightTex
-layout(set = MATERIAL_SET_EXTERNAL,
-	   binding = MATERIAL_BINDING_FIRST_NON_STANDARD + 5u) uniform ANKI_RP texture2D u_heightTex;
-#endif
-
-#if EMISSIVE_TEX
-#	pragma anki reflect u_emissiveTex
-layout(set = MATERIAL_SET_EXTERNAL,
-	   binding = MATERIAL_BINDING_FIRST_NON_STANDARD + 6u) uniform ANKI_RP texture2D u_emissiveTex;
-#endif
+layout(set = MATERIAL_SET_GLOBAL, binding = MATERIAL_BINDING_TRILINEAR_REPEAT_SAMPLER) uniform sampler u_globalSampler;
 
 
 #pragma anki reflect AnKiLocalUniforms
 #pragma anki reflect AnKiLocalUniforms
 #pragma anki struct AnKiLocalUniforms
 #pragma anki struct AnKiLocalUniforms
+#pragma anki member U32 m_normalTex if NORMAL_TEX is 1
+
 #pragma anki member ANKI_RP Vec3 m_diffColor if DIFFUSE_TEX is 0
 #pragma anki member ANKI_RP Vec3 m_diffColor if DIFFUSE_TEX is 0
+#pragma anki member U32 m_diffTex if DIFFUSE_TEX is 1
+
 #pragma anki member ANKI_RP F32 m_roughness if ROUGHNESS_TEX is 0
 #pragma anki member ANKI_RP F32 m_roughness if ROUGHNESS_TEX is 0
+#pragma anki member U32 m_roughnessTex if ROUGHNESS_TEX is 1
+
 #pragma anki member ANKI_RP Vec3 m_specColor if SPECULAR_TEX is 0
 #pragma anki member ANKI_RP Vec3 m_specColor if SPECULAR_TEX is 0
+#pragma anki member U32 m_specTex if SPECULAR_TEX is 1
+
 #pragma anki member ANKI_RP F32 m_metallic if METAL_TEX is 0
 #pragma anki member ANKI_RP F32 m_metallic if METAL_TEX is 0
+#pragma anki member U32 m_metallicTex if METAL_TEX is 1
+
 #pragma anki member ANKI_RP Vec3 m_emission if EMISSIVE_TEX is 0
 #pragma anki member ANKI_RP Vec3 m_emission if EMISSIVE_TEX is 0
+#pragma anki member U32 m_emissiveTex if EMISSIVE_TEX is 1
+
 #pragma anki member ANKI_RP F32 m_heightmapScale if PARALLAX is 1
 #pragma anki member ANKI_RP F32 m_heightmapScale if PARALLAX is 1
+#pragma anki member U32 m_heightTex if PARALLAX is 1
+
 #pragma anki member ANKI_RP F32 m_subsurface
 #pragma anki member ANKI_RP F32 m_subsurface
 #pragma anki struct end
 #pragma anki struct end
 
 
-layout(set = MATERIAL_SET_EXTERNAL, binding = MATERIAL_BINDING_LOCAL_UNIFORMS, row_major, scalar) buffer b_localUniforms
+layout(set = MATERIAL_SET_LOCAL, binding = MATERIAL_BINDING_LOCAL_UNIFORMS, row_major, scalar) buffer b_localUniforms
 {
 {
 	U32 u_localUniforms[];
 	U32 u_localUniforms[];
 };
 };
 
 
-layout(set = MATERIAL_SET_EXTERNAL, binding = MATERIAL_BINDING_RENDERABLE_GPU_VIEW, row_major,
+layout(set = MATERIAL_SET_LOCAL, binding = MATERIAL_BINDING_RENDERABLE_GPU_VIEW, row_major,
 	   scalar) uniform b_renderableGpuView
 	   scalar) uniform b_renderableGpuView
 {
 {
 	RenderableGpuView u_renderableGpuViews[MAX_INSTANCE_COUNT];
 	RenderableGpuView u_renderableGpuViews[MAX_INSTANCE_COUNT];
 };
 };
 
 
-layout(set = MATERIAL_SET_EXTERNAL, binding = MATERIAL_BINDING_GLOBAL_UNIFORMS, row_major,
+layout(set = MATERIAL_SET_GLOBAL, binding = MATERIAL_BINDING_GLOBAL_UNIFORMS, row_major,
 	   scalar) uniform b_globalUniforms
 	   scalar) uniform b_globalUniforms
 {
 {
 	MaterialGlobalUniforms u_globalUniforms;
 	MaterialGlobalUniforms u_globalUniforms;
@@ -115,14 +87,14 @@ layout(set = MATERIAL_SET_EXTERNAL, binding = MATERIAL_BINDING_GLOBAL_UNIFORMS,
 
 
 #if ANKI_BONES
 #if ANKI_BONES
 #	pragma anki reflect b_boneTransforms
 #	pragma anki reflect b_boneTransforms
-layout(set = MATERIAL_SET_EXTERNAL, binding = MATERIAL_BINDING_BONE_TRANSFORMS, row_major,
+layout(set = MATERIAL_SET_LOCAL, binding = MATERIAL_BINDING_BONE_TRANSFORMS, row_major,
 	   std140) readonly buffer b_boneTransforms
 	   std140) readonly buffer b_boneTransforms
 {
 {
 	Mat4 u_boneTransforms[];
 	Mat4 u_boneTransforms[];
 };
 };
 
 
 #	pragma anki reflect b_prevFrameBoneTransforms
 #	pragma anki reflect b_prevFrameBoneTransforms
-layout(set = MATERIAL_SET_EXTERNAL, binding = MATERIAL_BINDING_PREVIOUS_BONE_TRANSFORMS, row_major,
+layout(set = MATERIAL_SET_LOCAL, binding = MATERIAL_BINDING_PREVIOUS_BONE_TRANSFORMS, row_major,
 	   std140) readonly buffer b_prevFrameBoneTransforms
 	   std140) readonly buffer b_prevFrameBoneTransforms
 {
 {
 	Mat4 u_prevFrameBoneTransforms[];
 	Mat4 u_prevFrameBoneTransforms[];
@@ -351,49 +323,52 @@ void main()
 
 
 #if ANKI_TECHNIQUE == RENDERING_TECHNIQUE_GBUFFER
 #if ANKI_TECHNIQUE == RENDERING_TECHNIQUE_GBUFFER
 #	if REALLY_USING_PARALLAX
 #	if REALLY_USING_PARALLAX
-	const Vec2 uv = computeTextureCoordParallax(u_heightTex, u_globalSampler, in_uv, localUniforms.m_heightmapScale);
+	const Vec2 uv = computeTextureCoordParallax(u_bindlessTextures2dF32[localUniforms.m_heightTex], u_globalSampler,
+												in_uv, localUniforms.m_heightmapScale);
 #	else
 #	else
 	const Vec2 uv = in_uv;
 	const Vec2 uv = in_uv;
 #	endif
 #	endif
 
 
 #	if DIFFUSE_TEX
 #	if DIFFUSE_TEX
 #		if ALPHA_TEST
 #		if ALPHA_TEST
-	const ANKI_RP Vec4 diffColorA = texture(u_diffTex, u_globalSampler, uv);
+	const ANKI_RP Vec4 diffColorA = texture(u_bindlessTextures2dF32[localUniforms.m_diffTex], u_globalSampler, uv);
 	doAlphaText(diffColorA.a);
 	doAlphaText(diffColorA.a);
 	const ANKI_RP Vec3 diffColor = diffColorA.rgb;
 	const ANKI_RP Vec3 diffColor = diffColorA.rgb;
 #		else
 #		else
-	const ANKI_RP Vec3 diffColor = texture(u_diffTex, u_globalSampler, uv).rgb;
+	const ANKI_RP Vec3 diffColor = texture(u_bindlessTextures2dF32[localUniforms.m_diffTex], u_globalSampler, uv).rgb;
 #		endif
 #		endif
 #	else
 #	else
 	const ANKI_RP Vec3 diffColor = localUniforms.m_diffColor;
 	const ANKI_RP Vec3 diffColor = localUniforms.m_diffColor;
 #	endif
 #	endif
 
 
 #	if SPECULAR_TEX
 #	if SPECULAR_TEX
-	const ANKI_RP Vec3 specColor = texture(u_specTex, u_globalSampler, uv).rgb;
+	const ANKI_RP Vec3 specColor = texture(u_bindlessTextures2dF32[localUniforms.m_specTex], u_globalSampler, uv).rgb;
 #	else
 #	else
 	const ANKI_RP Vec3 specColor = localUniforms.m_specColor;
 	const ANKI_RP Vec3 specColor = localUniforms.m_specColor;
 #	endif
 #	endif
 
 
 #	if ROUGHNESS_TEX
 #	if ROUGHNESS_TEX
-	const ANKI_RP F32 roughness = texture(u_roughnessTex, u_globalSampler, uv).g;
+	const ANKI_RP F32 roughness = texture(u_bindlessTextures2dF32[localUniforms.m_roughnessTex], u_globalSampler, uv).g;
 #	else
 #	else
 	const ANKI_RP F32 roughness = localUniforms.m_roughness;
 	const ANKI_RP F32 roughness = localUniforms.m_roughness;
 #	endif
 #	endif
 
 
 #	if METAL_TEX
 #	if METAL_TEX
-	const ANKI_RP F32 metallic = texture(u_metallicTex, u_globalSampler, uv).b;
+	const ANKI_RP F32 metallic = texture(u_bindlessTextures2dF32[localUniforms.m_metallicTex], u_globalSampler, uv).b;
 #	else
 #	else
 	const ANKI_RP F32 metallic = localUniforms.m_metallic;
 	const ANKI_RP F32 metallic = localUniforms.m_metallic;
 #	endif
 #	endif
 
 
 #	if NORMAL_TEX
 #	if NORMAL_TEX
-	const ANKI_RP Vec3 normal = readNormalFromTexture(u_normalTex, u_globalSampler, uv);
+	const ANKI_RP Vec3 normal =
+		readNormalFromTexture(u_bindlessTextures2dF32[localUniforms.m_normalTex], u_globalSampler, uv);
 #	else
 #	else
 	const ANKI_RP Vec3 normal = normalize(in_normal);
 	const ANKI_RP Vec3 normal = normalize(in_normal);
 #	endif
 #	endif
 
 
 #	if EMISSIVE_TEX
 #	if EMISSIVE_TEX
-	const ANKI_RP Vec3 emission = texture(u_emissiveTex, u_globalSampler, uv).rgb;
+	const ANKI_RP Vec3 emission =
+		texture(u_bindlessTextures2dF32[localUniforms.m_emissiveTex], u_globalSampler, uv).rgb;
 #	else
 #	else
 	const ANKI_RP Vec3 emission = localUniforms.m_emission;
 	const ANKI_RP Vec3 emission = localUniforms.m_emission;
 #	endif
 #	endif
@@ -413,7 +388,7 @@ void main()
 #endif
 #endif
 
 
 #if ANKI_TECHNIQUE != RENDERING_TECHNIQUE_GBUFFER && ALPHA_TEST
 #if ANKI_TECHNIQUE != RENDERING_TECHNIQUE_GBUFFER && ALPHA_TEST
-	doAlphaText(texture(u_diffTex, u_globalSampler, in_uv).a);
+	doAlphaText(texture(u_bindlessTextures2dF32[localUniforms.m_diffTex], u_globalSampler, in_uv).a);
 #endif
 #endif
 }
 }
 
 

+ 4 - 4
AnKi/Shaders/GBufferPost.ankiprog

@@ -19,10 +19,10 @@ layout(set = 0, binding = 0) uniform sampler u_nearestAnyClampSampler;
 layout(set = 0, binding = 1) uniform texture2D u_depthTex;
 layout(set = 0, binding = 1) uniform texture2D u_depthTex;
 layout(set = 0, binding = 2) uniform sampler u_trilinearRepeatSampler;
 layout(set = 0, binding = 2) uniform sampler u_trilinearRepeatSampler;
 
 
-#define CLUSTERED_SHADING_SET 0
-#define CLUSTERED_SHADING_UNIFORMS_BINDING 3
-#define CLUSTERED_SHADING_DECALS_BINDING 4
-#define CLUSTERED_SHADING_CLUSTERS_BINDING 7
+#define CLUSTERED_SHADING_SET 0u
+#define CLUSTERED_SHADING_UNIFORMS_BINDING 3u
+#define CLUSTERED_SHADING_DECALS_BINDING 4u
+#define CLUSTERED_SHADING_CLUSTERS_BINDING 7u
 #include <AnKi/Shaders/ClusteredShadingCommon.glsl>
 #include <AnKi/Shaders/ClusteredShadingCommon.glsl>
 
 
 layout(location = 0) in Vec2 in_uv;
 layout(location = 0) in Vec2 in_uv;

+ 23 - 25
AnKi/Shaders/Include/MaterialTypes.h

@@ -18,31 +18,29 @@ struct MaterialGlobalUniforms
 	Mat3 m_cameraRotationMatrix;
 	Mat3 m_cameraRotationMatrix;
 };
 };
 
 
-// Begin standard bindings
-const U32 MATERIAL_BINDING_GLOBAL_SAMPLER = 0u;
+const U32 MATERIAL_SET_BINDLESS = 0u;
+const U32 MATERIAL_SET_GLOBAL = 1u;
+const U32 MATERIAL_SET_LOCAL = 2u;
+
+// Begin global bindings
+const U32 MATERIAL_BINDING_TRILINEAR_REPEAT_SAMPLER = 0u;
+const U32 MATERIAL_BINDING_GLOBAL_UNIFORMS = 1u;
+
+// For forward shading:
+const U32 MATERIAL_BINDING_LINEAR_CLAMP_SAMPLER = 2u;
+const U32 MATERIAL_BINDING_DEPTH_RT = 3u;
+const U32 MATERIAL_BINDING_LIGHT_VOLUME = 4u;
+const U32 MATERIAL_BINDING_CLUSTER_SHADING_UNIFORMS = 5u;
+const U32 MATERIAL_BINDING_CLUSTER_SHADING_LIGHTS = 6u;
+const U32 MATERIAL_BINDING_CLUSTERS = 9u;
+// End global bindings
+
+// Begin local bindings
+const U32 MATERIAL_BINDING_LOCAL_UNIFORMS = 0u;
 const U32 MATERIAL_BINDING_RENDERABLE_GPU_VIEW = 1u;
 const U32 MATERIAL_BINDING_RENDERABLE_GPU_VIEW = 1u;
-const U32 MATERIAL_BINDING_LOCAL_UNIFORMS = 2u;
-const U32 MATERIAL_BINDING_GLOBAL_UNIFORMS = 3u;
-const U32 MATERIAL_BINDING_BONE_TRANSFORMS = 4u;
-const U32 MATERIAL_BINDING_PREVIOUS_BONE_TRANSFORMS = 5u;
-// End standard bindings
-
-const U32 MATERIAL_BINDING_STANDARD_BINDING_COUNT = 6u;
-const U32 MATERIAL_BINDING_FIRST_NON_STANDARD = MATERIAL_BINDING_STANDARD_BINDING_COUNT;
-
-const U32 MATERIAL_SET_INTERNAL = 0u;
-const U32 MATERIAL_SET_EXTERNAL = 1u;
-
-#define ANKI_MATERIAL_UNIFORM_BUFFER(bindingNum, structName, varName) \
-	layout(set = MATERIAL_SET_EXTERNAL, binding = bindingNum, row_major, scalar) uniform b_##varName \
-	{ \
-		structName varName; \
-	};
-
-#define ANKI_MATERIAL_STORAGE_BUFFER(bindingNum, structName, varName) \
-	layout(set = MATERIAL_SET_EXTERNAL, binding = bindingNum, row_major, scalar) buffer b_##varName \
-	{ \
-		structName varName; \
-	};
+const U32 MATERIAL_BINDING_BONE_TRANSFORMS = 2u;
+const U32 MATERIAL_BINDING_PREVIOUS_BONE_TRANSFORMS = 3u;
+const U32 MATERIAL_BINDING_FIRST_NON_STANDARD_LOCAL = 4u;
+// End local bindings
 
 
 ANKI_END_NAMESPACE
 ANKI_END_NAMESPACE

+ 4 - 4
AnKi/Shaders/IndirectDiffuse.glsl

@@ -19,10 +19,10 @@ ANKI_SPECIALIZATION_CONSTANT_U32(SAMPLE_COUNT, 6u);
 #include <AnKi/Shaders/TonemappingFunctions.glsl>
 #include <AnKi/Shaders/TonemappingFunctions.glsl>
 #include <AnKi/Shaders/Include/IndirectDiffuseTypes.h>
 #include <AnKi/Shaders/Include/IndirectDiffuseTypes.h>
 
 
-#define CLUSTERED_SHADING_SET 0
-#define CLUSTERED_SHADING_UNIFORMS_BINDING 0
-#define CLUSTERED_SHADING_GI_BINDING 1
-#define CLUSTERED_SHADING_CLUSTERS_BINDING 3
+#define CLUSTERED_SHADING_SET 0u
+#define CLUSTERED_SHADING_UNIFORMS_BINDING 0u
+#define CLUSTERED_SHADING_GI_BINDING 1u
+#define CLUSTERED_SHADING_CLUSTERS_BINDING 3u
 #include <AnKi/Shaders/ClusteredShadingCommon.glsl>
 #include <AnKi/Shaders/ClusteredShadingCommon.glsl>
 
 
 layout(set = 0, binding = 4) uniform sampler u_linearAnyClampSampler;
 layout(set = 0, binding = 4) uniform sampler u_linearAnyClampSampler;

+ 4 - 4
AnKi/Shaders/IndirectSpecular.glsl

@@ -27,10 +27,10 @@ layout(set = 0, binding = 6) uniform sampler u_trilinearRepeatSampler;
 layout(set = 0, binding = 7) uniform ANKI_RP texture2D u_noiseTex;
 layout(set = 0, binding = 7) uniform ANKI_RP texture2D u_noiseTex;
 const Vec2 NOISE_TEX_SIZE = Vec2(64.0);
 const Vec2 NOISE_TEX_SIZE = Vec2(64.0);
 
 
-#define CLUSTERED_SHADING_SET 0
-#define CLUSTERED_SHADING_UNIFORMS_BINDING 8
-#define CLUSTERED_SHADING_REFLECTIONS_BINDING 9
-#define CLUSTERED_SHADING_CLUSTERS_BINDING 11
+#define CLUSTERED_SHADING_SET 0u
+#define CLUSTERED_SHADING_UNIFORMS_BINDING 8u
+#define CLUSTERED_SHADING_REFLECTIONS_BINDING 9u
+#define CLUSTERED_SHADING_CLUSTERS_BINDING 11u
 #include <AnKi/Shaders/ClusteredShadingCommon.glsl>
 #include <AnKi/Shaders/ClusteredShadingCommon.glsl>
 
 
 #if defined(ANKI_COMPUTE_SHADER)
 #if defined(ANKI_COMPUTE_SHADER)

+ 4 - 4
AnKi/Shaders/LightShading.ankiprog

@@ -18,10 +18,10 @@ ANKI_SPECIALIZATION_CONSTANT_U32(TILE_SIZE, 3u);
 #include <AnKi/Shaders/Functions.glsl>
 #include <AnKi/Shaders/Functions.glsl>
 #include <AnKi/Shaders/RtShadows.glsl>
 #include <AnKi/Shaders/RtShadows.glsl>
 
 
-#define CLUSTERED_SHADING_SET 0
-#define CLUSTERED_SHADING_UNIFORMS_BINDING 0
-#define CLUSTERED_SHADING_LIGHTS_BINDING 1
-#define CLUSTERED_SHADING_CLUSTERS_BINDING 4
+#define CLUSTERED_SHADING_SET 0u
+#define CLUSTERED_SHADING_UNIFORMS_BINDING 0u
+#define CLUSTERED_SHADING_LIGHTS_BINDING 1u
+#define CLUSTERED_SHADING_CLUSTERS_BINDING 4u
 #include <AnKi/Shaders/ClusteredShadingCommon.glsl>
 #include <AnKi/Shaders/ClusteredShadingCommon.glsl>
 
 
 layout(set = 0, binding = 5) uniform sampler u_nearestAnyClampSampler;
 layout(set = 0, binding = 5) uniform sampler u_nearestAnyClampSampler;

+ 2 - 2
AnKi/Shaders/LightShadingApplyIndirect.ankiprog

@@ -22,8 +22,8 @@ layout(set = 0, binding = 7) uniform ANKI_RP texture2D u_gbuffer1Tex;
 layout(set = 0, binding = 8) uniform ANKI_RP texture2D u_gbuffer2Tex;
 layout(set = 0, binding = 8) uniform ANKI_RP texture2D u_gbuffer2Tex;
 layout(set = 0, binding = 9) uniform ANKI_RP texture2D u_integrationLut;
 layout(set = 0, binding = 9) uniform ANKI_RP texture2D u_integrationLut;
 
 
-#define CLUSTERED_SHADING_SET 0
-#define CLUSTERED_SHADING_UNIFORMS_BINDING 10
+#define CLUSTERED_SHADING_SET 0u
+#define CLUSTERED_SHADING_UNIFORMS_BINDING 10u
 #include <AnKi/Shaders/ClusteredShadingCommon.glsl>
 #include <AnKi/Shaders/ClusteredShadingCommon.glsl>
 
 
 layout(push_constant, std430) uniform b_pc
 layout(push_constant, std430) uniform b_pc

+ 4 - 4
AnKi/Shaders/RtShadowsRayGen.ankiprog

@@ -13,10 +13,10 @@
 #include <AnKi/Shaders/PackFunctions.glsl>
 #include <AnKi/Shaders/PackFunctions.glsl>
 #include <AnKi/Shaders/RtShadows.glsl>
 #include <AnKi/Shaders/RtShadows.glsl>
 
 
-#define CLUSTERED_SHADING_SET 0
-#define CLUSTERED_SHADING_UNIFORMS_BINDING 0
-#define CLUSTERED_SHADING_LIGHTS_BINDING 1
-#define CLUSTERED_SHADING_CLUSTERS_BINDING 4
+#define CLUSTERED_SHADING_SET 0u
+#define CLUSTERED_SHADING_UNIFORMS_BINDING 0u
+#define CLUSTERED_SHADING_LIGHTS_BINDING 1u
+#define CLUSTERED_SHADING_CLUSTERS_BINDING 4u
 #include <AnKi/Shaders/ClusteredShadingCommon.glsl>
 #include <AnKi/Shaders/ClusteredShadingCommon.glsl>
 
 
 // Used by the hit shaders. When changing the binding you need to update other shaders
 // Used by the hit shaders. When changing the binding you need to update other shaders

+ 4 - 4
AnKi/Shaders/ShadowmapsResolve.glsl

@@ -8,10 +8,10 @@ ANKI_SPECIALIZATION_CONSTANT_UVEC2(TILE_COUNTS, 2u);
 ANKI_SPECIALIZATION_CONSTANT_U32(Z_SPLIT_COUNT, 4u);
 ANKI_SPECIALIZATION_CONSTANT_U32(Z_SPLIT_COUNT, 4u);
 ANKI_SPECIALIZATION_CONSTANT_U32(TILE_SIZE, 5u);
 ANKI_SPECIALIZATION_CONSTANT_U32(TILE_SIZE, 5u);
 
 
-#define CLUSTERED_SHADING_SET 0
-#define CLUSTERED_SHADING_UNIFORMS_BINDING 0
-#define CLUSTERED_SHADING_LIGHTS_BINDING 1
-#define CLUSTERED_SHADING_CLUSTERS_BINDING 4
+#define CLUSTERED_SHADING_SET 0u
+#define CLUSTERED_SHADING_UNIFORMS_BINDING 0u
+#define CLUSTERED_SHADING_LIGHTS_BINDING 1u
+#define CLUSTERED_SHADING_CLUSTERS_BINDING 4u
 #include <AnKi/Shaders/ClusteredShadingCommon.glsl>
 #include <AnKi/Shaders/ClusteredShadingCommon.glsl>
 
 
 layout(set = 0, binding = 5) uniform sampler u_linearAnyClampSampler;
 layout(set = 0, binding = 5) uniform sampler u_linearAnyClampSampler;

+ 6 - 6
AnKi/Shaders/VolumetricLightingAccumulation.ankiprog

@@ -26,12 +26,12 @@ layout(set = 0, binding = 2) writeonly uniform image3D u_volume;
 layout(set = 0, binding = 3) uniform texture2D u_noiseTex;
 layout(set = 0, binding = 3) uniform texture2D u_noiseTex;
 layout(set = 0, binding = 4) uniform texture3D u_prevVolume;
 layout(set = 0, binding = 4) uniform texture3D u_prevVolume;
 
 
-#define CLUSTERED_SHADING_SET 0
-#define CLUSTERED_SHADING_UNIFORMS_BINDING 5
-#define CLUSTERED_SHADING_LIGHTS_BINDING 6
-#define CLUSTERED_SHADING_GI_BINDING 9
-#define CLUSTERED_SHADING_FOG_BINDING 11
-#define CLUSTERED_SHADING_CLUSTERS_BINDING 12
+#define CLUSTERED_SHADING_SET 0u
+#define CLUSTERED_SHADING_UNIFORMS_BINDING 5u
+#define CLUSTERED_SHADING_LIGHTS_BINDING 6u
+#define CLUSTERED_SHADING_GI_BINDING 9u
+#define CLUSTERED_SHADING_FOG_BINDING 11u
+#define CLUSTERED_SHADING_CLUSTERS_BINDING 12u
 #include <AnKi/Shaders/ClusteredShadingCommon.glsl>
 #include <AnKi/Shaders/ClusteredShadingCommon.glsl>
 
 
 struct FogUniforms
 struct FogUniforms

+ 3 - 3
Samples/Sponza/Assets/arch.001_efebbb2a6f84fff0.ankimtl

@@ -25,11 +25,11 @@
 
 
 	<inputs>
 	<inputs>
 		
 		
-		<input name="u_diffTex" value="Assets/sponza_arch_diff.ankitex"/>
+		<input name="m_diffTex" value="Assets/sponza_arch_diff.ankitex"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
-		<input name="u_roughnessTex" value="Assets/sponza_arch_spec.ankitex"/>
+		<input name="m_roughnessTex" value="Assets/sponza_arch_spec.ankitex"/>
 		<input name="m_metallic" value="0.000000"/>
 		<input name="m_metallic" value="0.000000"/>
-		<input name="u_normalTex" value="Assets/sponza_arch_ddn.ankitex"/>
+		<input name="m_normalTex" value="Assets/sponza_arch_ddn.ankitex"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
 		
 		

+ 3 - 3
Samples/Sponza/Assets/arch_e0c8c7e29c806284.ankimtl

@@ -25,11 +25,11 @@
 
 
 	<inputs>
 	<inputs>
 		
 		
-		<input name="u_diffTex" value="Assets/sponza_arch_diff_tga.ankitex"/>
+		<input name="m_diffTex" value="Assets/sponza_arch_diff_tga.ankitex"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
-		<input name="u_roughnessTex" value="Assets/sponza_arch_spec_tga.ankitex"/>
+		<input name="m_roughnessTex" value="Assets/sponza_arch_spec_tga.ankitex"/>
 		<input name="m_metallic" value="0.000000"/>
 		<input name="m_metallic" value="0.000000"/>
-		<input name="u_normalTex" value="Assets/sponza_arch_ddn_tga.ankitex"/>
+		<input name="m_normalTex" value="Assets/sponza_arch_ddn_tga.ankitex"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
 		
 		

+ 3 - 3
Samples/Sponza/Assets/bricks_8bd6f24aa0ad3654.ankimtl

@@ -25,11 +25,11 @@
 
 
 	<inputs>
 	<inputs>
 		
 		
-		<input name="u_diffTex" value="Assets/sponza_bricks_a_diff_tga.ankitex"/>
+		<input name="m_diffTex" value="Assets/sponza_bricks_a_diff_tga.ankitex"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
-		<input name="u_roughnessTex" value="Assets/sponza_arch_spec_tga.ankitex"/>
+		<input name="m_roughnessTex" value="Assets/sponza_arch_spec_tga.ankitex"/>
 		<input name="m_metallic" value="0.000000"/>
 		<input name="m_metallic" value="0.000000"/>
-		<input name="u_normalTex" value="Assets/sponza_bricks_a_ddn_tga.ankitex"/>
+		<input name="m_normalTex" value="Assets/sponza_bricks_a_ddn_tga.ankitex"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
 		
 		

+ 2 - 2
Samples/Sponza/Assets/ceiling_3fd94cde277a48e1.ankimtl

@@ -25,9 +25,9 @@
 
 
 	<inputs>
 	<inputs>
 		
 		
-		<input name="u_diffTex" value="Assets/sponza_ceiling_a_diff_tga.ankitex"/>
+		<input name="m_diffTex" value="Assets/sponza_ceiling_a_diff_tga.ankitex"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
-		<input name="u_roughnessTex" value="Assets/Sponza_Ceiling_roughness_tga.ankitex"/>
+		<input name="m_roughnessTex" value="Assets/Sponza_Ceiling_roughness_tga.ankitex"/>
 		<input name="m_metallic" value="0.000000"/>
 		<input name="m_metallic" value="0.000000"/>
 		
 		
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>

+ 1 - 1
Samples/Sponza/Assets/chain_33ef478b87fe7c15.ankimtl

@@ -25,7 +25,7 @@
 
 
 	<inputs>
 	<inputs>
 		
 		
-		<input name="u_diffTex" value="Assets/chain_texture_tga.ankitex"/>
+		<input name="m_diffTex" value="Assets/chain_texture_tga.ankitex"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
 		<input name="m_roughness" value="0.500000"/>
 		<input name="m_roughness" value="0.500000"/>
 		<input name="m_metallic" value="0.000000"/>
 		<input name="m_metallic" value="0.000000"/>

+ 3 - 3
Samples/Sponza/Assets/column_a_1e1bacae3460b88.ankimtl

@@ -25,11 +25,11 @@
 
 
 	<inputs>
 	<inputs>
 		
 		
-		<input name="u_diffTex" value="Assets/sponza_column_a_diff_tga.ankitex"/>
+		<input name="m_diffTex" value="Assets/sponza_column_a_diff_tga.ankitex"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
-		<input name="u_roughnessTex" value="Assets/sponza_column_a_spec_tga.ankitex"/>
+		<input name="m_roughnessTex" value="Assets/sponza_column_a_spec_tga.ankitex"/>
 		<input name="m_metallic" value="0.000000"/>
 		<input name="m_metallic" value="0.000000"/>
-		<input name="u_normalTex" value="Assets/sponza_column_a_ddn_tga.ankitex"/>
+		<input name="m_normalTex" value="Assets/sponza_column_a_ddn_tga.ankitex"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
 		
 		

+ 3 - 3
Samples/Sponza/Assets/column_b_c9391d56bff59fc3.ankimtl

@@ -25,11 +25,11 @@
 
 
 	<inputs>
 	<inputs>
 		
 		
-		<input name="u_diffTex" value="Assets/sponza_column_b_diff_tga.ankitex"/>
+		<input name="m_diffTex" value="Assets/sponza_column_b_diff_tga.ankitex"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
-		<input name="u_roughnessTex" value="Assets/Sponza_Column_b_roughness_tga.ankitex"/>
+		<input name="m_roughnessTex" value="Assets/Sponza_Column_b_roughness_tga.ankitex"/>
 		<input name="m_metallic" value="0.000000"/>
 		<input name="m_metallic" value="0.000000"/>
-		<input name="u_normalTex" value="Assets/sponza_column_b_ddn_tga.ankitex"/>
+		<input name="m_normalTex" value="Assets/sponza_column_b_ddn_tga.ankitex"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
 		
 		

+ 3 - 3
Samples/Sponza/Assets/column_c_43f866fc7b9f0169.ankimtl

@@ -25,11 +25,11 @@
 
 
 	<inputs>
 	<inputs>
 		
 		
-		<input name="u_diffTex" value="Assets/sponza_column_c_diff_tga.ankitex"/>
+		<input name="m_diffTex" value="Assets/sponza_column_c_diff_tga.ankitex"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
-		<input name="u_roughnessTex" value="Assets/Sponza_Column_c_roughness_tga.ankitex"/>
+		<input name="m_roughnessTex" value="Assets/Sponza_Column_c_roughness_tga.ankitex"/>
 		<input name="m_metallic" value="0.000000"/>
 		<input name="m_metallic" value="0.000000"/>
-		<input name="u_normalTex" value="Assets/sponza_column_c_ddn_tga.ankitex"/>
+		<input name="m_normalTex" value="Assets/sponza_column_c_ddn_tga.ankitex"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
 		
 		

+ 4 - 4
Samples/Sponza/Assets/details_4242afc5fc479920.ankimtl

@@ -25,11 +25,11 @@
 
 
 	<inputs>
 	<inputs>
 		
 		
-		<input name="u_diffTex" value="Assets/sponza_details_diff.ankitex"/>
+		<input name="m_diffTex" value="Assets/sponza_details_diff.ankitex"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
-		<input name="u_roughnessTex" value="Assets/Sponza_Details_metallic-Sponza_Details_roughness.ankitex"/>
-		<input name="u_metallicTex" value="Assets/Sponza_Details_metallic-Sponza_Details_roughness.ankitex"/>
-		<input name="u_normalTex" value="Assets/Sponza_Details_normal.ankitex"/>
+		<input name="m_roughnessTex" value="Assets/Sponza_Details_metallic-Sponza_Details_roughness.ankitex"/>
+		<input name="m_metallicTex" value="Assets/Sponza_Details_metallic-Sponza_Details_roughness.ankitex"/>
+		<input name="m_normalTex" value="Assets/Sponza_Details_normal.ankitex"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
 		
 		

+ 4 - 4
Samples/Sponza/Assets/fabric_a_945c29fc221550fb.ankimtl

@@ -25,11 +25,11 @@
 
 
 	<inputs>
 	<inputs>
 		
 		
-		<input name="u_diffTex" value="Assets/sponza_fabric_blue_diff.ankitex"/>
+		<input name="m_diffTex" value="Assets/sponza_fabric_blue_diff.ankitex"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
-		<input name="u_roughnessTex" value="Assets/Sponza_Fabric_metallic-Sponza_Curtain_roughness.ankitex"/>
-		<input name="u_metallicTex" value="Assets/Sponza_Fabric_metallic-Sponza_Curtain_roughness.ankitex"/>
-		<input name="u_normalTex" value="Assets/Sponza_Curtain_Red_normal.ankitex"/>
+		<input name="m_roughnessTex" value="Assets/Sponza_Fabric_metallic-Sponza_Curtain_roughness.ankitex"/>
+		<input name="m_metallicTex" value="Assets/Sponza_Fabric_metallic-Sponza_Curtain_roughness.ankitex"/>
+		<input name="m_normalTex" value="Assets/Sponza_Curtain_Red_normal.ankitex"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.100000"/>
 		<input name="m_subsurface" value="0.100000"/>
 		
 		

+ 4 - 4
Samples/Sponza/Assets/fabric_c_c8bf70dee411d1bd.ankimtl

@@ -25,11 +25,11 @@
 
 
 	<inputs>
 	<inputs>
 		
 		
-		<input name="u_diffTex" value="Assets/sponza_fabric_green_diff.ankitex"/>
+		<input name="m_diffTex" value="Assets/sponza_fabric_green_diff.ankitex"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
-		<input name="u_roughnessTex" value="Assets/Sponza_Fabric_metallic-Sponza_Curtain_roughness.ankitex"/>
-		<input name="u_metallicTex" value="Assets/Sponza_Fabric_metallic-Sponza_Curtain_roughness.ankitex"/>
-		<input name="u_normalTex" value="Assets/Sponza_Curtain_Red_normal.ankitex"/>
+		<input name="m_roughnessTex" value="Assets/Sponza_Fabric_metallic-Sponza_Curtain_roughness.ankitex"/>
+		<input name="m_metallicTex" value="Assets/Sponza_Fabric_metallic-Sponza_Curtain_roughness.ankitex"/>
+		<input name="m_normalTex" value="Assets/Sponza_Curtain_Red_normal.ankitex"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.250000"/>
 		<input name="m_subsurface" value="0.250000"/>
 		
 		

+ 4 - 4
Samples/Sponza/Assets/fabric_d_8ff4aebb25bf20b0.ankimtl

@@ -25,11 +25,11 @@
 
 
 	<inputs>
 	<inputs>
 		
 		
-		<input name="u_diffTex" value="Assets/sponza_fabric_diff.ankitex"/>
+		<input name="m_diffTex" value="Assets/sponza_fabric_diff.ankitex"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
-		<input name="u_roughnessTex" value="Assets/Sponza_Fabric_metallic-Sponza_Curtain_roughness.ankitex"/>
-		<input name="u_metallicTex" value="Assets/Sponza_Fabric_metallic-Sponza_Curtain_roughness.ankitex"/>
-		<input name="u_normalTex" value="Assets/Sponza_Curtain_Red_normal.ankitex"/>
+		<input name="m_roughnessTex" value="Assets/Sponza_Fabric_metallic-Sponza_Curtain_roughness.ankitex"/>
+		<input name="m_metallicTex" value="Assets/Sponza_Fabric_metallic-Sponza_Curtain_roughness.ankitex"/>
+		<input name="m_normalTex" value="Assets/Sponza_Curtain_Red_normal.ankitex"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.100000"/>
 		<input name="m_subsurface" value="0.100000"/>
 		
 		

+ 4 - 4
Samples/Sponza/Assets/fabric_e_d1c5a44841c48230.ankimtl

@@ -25,11 +25,11 @@
 
 
 	<inputs>
 	<inputs>
 		
 		
-		<input name="u_diffTex" value="Assets/sponza_fabric_green_diff.ankitex"/>
+		<input name="m_diffTex" value="Assets/sponza_fabric_green_diff.ankitex"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
-		<input name="u_roughnessTex" value="Assets/Sponza_Fabric_metallic-Sponza_Curtain_roughness.ankitex"/>
-		<input name="u_metallicTex" value="Assets/Sponza_Fabric_metallic-Sponza_Curtain_roughness.ankitex"/>
-		<input name="u_normalTex" value="Assets/Sponza_Curtain_Red_normal.ankitex"/>
+		<input name="m_roughnessTex" value="Assets/Sponza_Fabric_metallic-Sponza_Curtain_roughness.ankitex"/>
+		<input name="m_metallicTex" value="Assets/Sponza_Fabric_metallic-Sponza_Curtain_roughness.ankitex"/>
+		<input name="m_normalTex" value="Assets/Sponza_Curtain_Red_normal.ankitex"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.100000"/>
 		<input name="m_subsurface" value="0.100000"/>
 		
 		

+ 3 - 3
Samples/Sponza/Assets/fabric_f_d54bbaca38ed4391.ankimtl

@@ -25,11 +25,11 @@
 
 
 	<inputs>
 	<inputs>
 		
 		
-		<input name="u_diffTex" value="Assets/sponza_curtain_green_diff_tga.ankitex"/>
+		<input name="m_diffTex" value="Assets/sponza_curtain_green_diff_tga.ankitex"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
-		<input name="u_roughnessTex" value="Assets/Sponza_Curtain_roughness_tga_001.ankitex"/>
+		<input name="m_roughnessTex" value="Assets/Sponza_Curtain_roughness_tga_001.ankitex"/>
 		<input name="m_metallic" value="0.000000"/>
 		<input name="m_metallic" value="0.000000"/>
-		<input name="u_normalTex" value="Assets/Sponza_Curtain_Red_normal_tga_001.ankitex"/>
+		<input name="m_normalTex" value="Assets/Sponza_Curtain_Red_normal_tga_001.ankitex"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.250000"/>
 		<input name="m_subsurface" value="0.250000"/>
 		
 		

+ 3 - 3
Samples/Sponza/Assets/flagpole_6c7e0eb8dd33b39e.ankimtl

@@ -25,11 +25,11 @@
 
 
 	<inputs>
 	<inputs>
 		
 		
-		<input name="u_diffTex" value="Assets/sponza_flagpole_diff.ankitex"/>
+		<input name="m_diffTex" value="Assets/sponza_flagpole_diff.ankitex"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
-		<input name="u_roughnessTex" value="Assets/Sponza_FlagPole_roughness.ankitex"/>
+		<input name="m_roughnessTex" value="Assets/Sponza_FlagPole_roughness.ankitex"/>
 		<input name="m_metallic" value="0.000000"/>
 		<input name="m_metallic" value="0.000000"/>
-		<input name="u_normalTex" value="Assets/Sponza_FlagPole_normal.ankitex"/>
+		<input name="m_normalTex" value="Assets/Sponza_FlagPole_normal.ankitex"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
 		
 		

+ 3 - 3
Samples/Sponza/Assets/floor_71cbd2644e53ab8c.ankimtl

@@ -25,11 +25,11 @@
 
 
 	<inputs>
 	<inputs>
 		
 		
-		<input name="u_diffTex" value="Assets/sponza_floor_a_diff.ankitex"/>
+		<input name="m_diffTex" value="Assets/sponza_floor_a_diff.ankitex"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
-		<input name="u_roughnessTex" value="Assets/Sponza_Floor_roughness.ankitex"/>
+		<input name="m_roughnessTex" value="Assets/Sponza_Floor_roughness.ankitex"/>
 		<input name="m_metallic" value="0.000000"/>
 		<input name="m_metallic" value="0.000000"/>
-		<input name="u_normalTex" value="Assets/Sponza_Floor_normal.ankitex"/>
+		<input name="m_normalTex" value="Assets/Sponza_Floor_normal.ankitex"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
 		
 		

+ 3 - 3
Samples/Sponza/Assets/leaf_3a245efd17475037.ankimtl

@@ -25,11 +25,11 @@
 
 
 	<inputs>
 	<inputs>
 		
 		
-		<input name="u_diffTex" value="Assets/sponza_thorn_diff.ankitex"/>
+		<input name="m_diffTex" value="Assets/sponza_thorn_diff.ankitex"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
-		<input name="u_roughnessTex" value="Assets/Sponza_Thorn_roughness.ankitex"/>
+		<input name="m_roughnessTex" value="Assets/Sponza_Thorn_roughness.ankitex"/>
 		<input name="m_metallic" value="0.000000"/>
 		<input name="m_metallic" value="0.000000"/>
-		<input name="u_normalTex" value="Assets/sponza_thorn_ddn.ankitex"/>
+		<input name="m_normalTex" value="Assets/sponza_thorn_ddn.ankitex"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.100000"/>
 		<input name="m_subsurface" value="0.100000"/>
 		
 		

+ 3 - 3
Samples/Sponza/Assets/lion_c45d3035db3bc17b.ankimtl

@@ -25,11 +25,11 @@
 
 
 	<inputs>
 	<inputs>
 		
 		
-		<input name="u_diffTex" value="Assets/lion.ankitex"/>
+		<input name="m_diffTex" value="Assets/lion.ankitex"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
-		<input name="u_roughnessTex" value="Assets/Lion_Roughness.ankitex"/>
+		<input name="m_roughnessTex" value="Assets/Lion_Roughness.ankitex"/>
 		<input name="m_metallic" value="0.000000"/>
 		<input name="m_metallic" value="0.000000"/>
-		<input name="u_normalTex" value="Assets/lion_ddn.ankitex"/>
+		<input name="m_normalTex" value="Assets/lion_ddn.ankitex"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
 		
 		

+ 3 - 3
Samples/Sponza/Assets/lion_stand_ab5e3642131ad971.ankimtl

@@ -25,11 +25,11 @@
 
 
 	<inputs>
 	<inputs>
 		
 		
-		<input name="u_diffTex" value="Assets/background.ankitex"/>
+		<input name="m_diffTex" value="Assets/background.ankitex"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
-		<input name="u_roughnessTex" value="Assets/Background_Roughness.ankitex"/>
+		<input name="m_roughnessTex" value="Assets/Background_Roughness.ankitex"/>
 		<input name="m_metallic" value="0.000000"/>
 		<input name="m_metallic" value="0.000000"/>
-		<input name="u_normalTex" value="Assets/background_ddn.ankitex"/>
+		<input name="m_normalTex" value="Assets/background_ddn.ankitex"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
 		
 		

+ 3 - 3
Samples/Sponza/Assets/roof_4359bd4e3b26845.ankimtl

@@ -25,11 +25,11 @@
 
 
 	<inputs>
 	<inputs>
 		
 		
-		<input name="u_diffTex" value="Assets/sponza_roof_diff.ankitex"/>
+		<input name="m_diffTex" value="Assets/sponza_roof_diff.ankitex"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
-		<input name="u_roughnessTex" value="Assets/Sponza_Roof_roughness.ankitex"/>
+		<input name="m_roughnessTex" value="Assets/Sponza_Roof_roughness.ankitex"/>
 		<input name="m_metallic" value="0.000000"/>
 		<input name="m_metallic" value="0.000000"/>
-		<input name="u_normalTex" value="Assets/Sponza_Roof_normal.ankitex"/>
+		<input name="m_normalTex" value="Assets/Sponza_Roof_normal.ankitex"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
 		
 		

+ 3 - 3
Samples/Sponza/Assets/vase_45c3983f6cc9c489.ankimtl

@@ -25,11 +25,11 @@
 
 
 	<inputs>
 	<inputs>
 		
 		
-		<input name="u_diffTex" value="Assets/vase_dif.ankitex"/>
+		<input name="m_diffTex" value="Assets/vase_dif.ankitex"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
-		<input name="u_roughnessTex" value="Assets/Vase_roughness.ankitex"/>
+		<input name="m_roughnessTex" value="Assets/Vase_roughness.ankitex"/>
 		<input name="m_metallic" value="0.000000"/>
 		<input name="m_metallic" value="0.000000"/>
-		<input name="u_normalTex" value="Assets/vase_ddn.ankitex"/>
+		<input name="m_normalTex" value="Assets/vase_ddn.ankitex"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
 		
 		

+ 3 - 3
Samples/Sponza/Assets/vase_fl_580cea687de3d758.ankimtl

@@ -25,11 +25,11 @@
 
 
 	<inputs>
 	<inputs>
 		
 		
-		<input name="u_diffTex" value="Assets/vase_plant_tga.ankitex"/>
+		<input name="m_diffTex" value="Assets/vase_plant_tga.ankitex"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
-		<input name="u_roughnessTex" value="Assets/VaseRound_roughness.ankitex"/>
+		<input name="m_roughnessTex" value="Assets/VaseRound_roughness.ankitex"/>
 		<input name="m_metallic" value="0.000000"/>
 		<input name="m_metallic" value="0.000000"/>
-		<input name="u_normalTex" value="Assets/VasePlant_normal.ankitex"/>
+		<input name="m_normalTex" value="Assets/VasePlant_normal.ankitex"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.250000"/>
 		<input name="m_subsurface" value="0.250000"/>
 		
 		

+ 3 - 3
Samples/Sponza/Assets/vase_hanging_c2d2b40b27cacd7d.ankimtl

@@ -25,11 +25,11 @@
 
 
 	<inputs>
 	<inputs>
 		
 		
-		<input name="u_diffTex" value="Assets/vase_hanging_tga.ankitex"/>
+		<input name="m_diffTex" value="Assets/vase_hanging_tga.ankitex"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
-		<input name="u_roughnessTex" value="Assets/VaseHanging_roughness_tga.ankitex"/>
+		<input name="m_roughnessTex" value="Assets/VaseHanging_roughness_tga.ankitex"/>
 		<input name="m_metallic" value="0.000000"/>
 		<input name="m_metallic" value="0.000000"/>
-		<input name="u_normalTex" value="Assets/VaseHanging_normal_tga.ankitex"/>
+		<input name="m_normalTex" value="Assets/VaseHanging_normal_tga.ankitex"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
 		
 		

+ 3 - 3
Samples/Sponza/Assets/vase_round_71af81a1ac0a7c3e.ankimtl

@@ -25,11 +25,11 @@
 
 
 	<inputs>
 	<inputs>
 		
 		
-		<input name="u_diffTex" value="Assets/vase_round_tga.ankitex"/>
+		<input name="m_diffTex" value="Assets/vase_round_tga.ankitex"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
 		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
-		<input name="u_roughnessTex" value="Assets/VaseRound_roughness.ankitex"/>
+		<input name="m_roughnessTex" value="Assets/VaseRound_roughness.ankitex"/>
 		<input name="m_metallic" value="0.000000"/>
 		<input name="m_metallic" value="0.000000"/>
-		<input name="u_normalTex" value="Assets/VaseRound_normal.ankitex"/>
+		<input name="m_normalTex" value="Assets/VaseRound_normal.ankitex"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
 		
 		

+ 165 - 7
Tools/Shader/ShaderProgramBinaryDumpMain.cpp

@@ -4,37 +4,195 @@
 // http://www.anki3d.org/LICENSE
 // http://www.anki3d.org/LICENSE
 
 
 #include <AnKi/ShaderCompiler/ShaderProgramCompiler.h>
 #include <AnKi/ShaderCompiler/ShaderProgramCompiler.h>
+#include <AnKi/ShaderCompiler/MaliOfflineCompiler.h>
 
 
 using namespace anki;
 using namespace anki;
 
 
 static const char* USAGE = R"(Dump the shader binary to stdout
 static const char* USAGE = R"(Dump the shader binary to stdout
-Usage: %s in_file
+Usage: %s [options] input_shader_program_binary
+Options:
+-stats : Print performance statistics for all shaders. By default it doesn't
 )";
 )";
 
 
-Error dump(const char* fname)
+static Error parseCommandLineArgs(int argc, char** argv, Bool& dumpStats, StringAuto& filename)
+{
+	// Parse config
+	if(argc < 2)
+	{
+		return Error::USER_DATA;
+	}
+
+	dumpStats = false;
+	filename = argv[argc - 1];
+
+	for(I i = 1; i < argc - 1; i++)
+	{
+		if(strcmp(argv[i], "-stats") == 0)
+		{
+			dumpStats = true;
+		}
+	}
+
+	return Error::NONE;
+}
+
+ANKI_USE_RESULT Error dumpStats(const ShaderProgramBinary& bin)
 {
 {
 	HeapAllocator<U8> alloc(allocAligned, nullptr);
 	HeapAllocator<U8> alloc(allocAligned, nullptr);
 
 
-	ShaderProgramBinaryWrapper bin(alloc);
-	ANKI_CHECK(bin.deserializeFromFile(fname));
+	printf("\nMali offline compiler stats:\n");
+	fflush(stdout);
+
+	class Stats
+	{
+	public:
+		F64 m_fma;
+		F64 m_cvt;
+		F64 m_sfu;
+		F64 m_loadStore;
+		F64 m_varying;
+		F64 m_texture;
+		F64 m_workRegisters;
+		F64 m_fp16ArithmeticPercentage;
+
+		Stats(F64 v)
+		{
+			m_fma = m_cvt = m_sfu = m_loadStore = m_varying = m_texture = m_workRegisters = m_fp16ArithmeticPercentage =
+				v;
+		}
+	};
+
+	class StageStats
+	{
+	public:
+		Stats m_avgStats{0.0};
+		Stats m_maxStats{-1.0};
+		Stats m_minStats{MAX_F64};
+		U32 m_spillingCount = 0;
+		U32 m_count = 0;
+	};
+
+	Array<StageStats, U32(ShaderType::COUNT)> allStats;
+
+	for(const ShaderProgramBinaryVariant& variant : bin.m_variants)
+	{
+		for(ShaderType shaderType : EnumIterable<ShaderType>())
+		{
+			if(variant.m_codeBlockIndices[shaderType] == MAX_U32)
+			{
+				continue;
+			}
+
+			const ShaderProgramBinaryCodeBlock& codeBlock = bin.m_codeBlocks[variant.m_codeBlockIndices[shaderType]];
+
+			MaliOfflineCompilerOut maliocOut;
+			const Error err = runMaliOfflineCompiler(ANKI_SOURCE_DIRECTORY "/ThirdParty/Bin/MaliOfflineCompiler/malioc",
+													 codeBlock.m_binary, shaderType, alloc, maliocOut);
+
+			if(err)
+			{
+				ANKI_LOGE("Mali offline compiler failed");
+				return Error::FUNCTION_FAILED;
+			}
+
+			// Appends stats
+			StageStats& stage = allStats[shaderType];
+
+			if(maliocOut.m_spilling)
+			{
+				++stage.m_spillingCount;
+			}
+
+			++stage.m_count;
+
+			stage.m_avgStats.m_fma += maliocOut.m_fma;
+			stage.m_avgStats.m_cvt += maliocOut.m_cvt;
+			stage.m_avgStats.m_sfu += maliocOut.m_sfu;
+			stage.m_avgStats.m_loadStore += maliocOut.m_loadStore;
+			stage.m_avgStats.m_varying += maliocOut.m_varying;
+			stage.m_avgStats.m_texture += maliocOut.m_texture;
+			stage.m_avgStats.m_workRegisters += maliocOut.m_workRegisters;
+			stage.m_avgStats.m_fp16ArithmeticPercentage += maliocOut.m_fp16ArithmeticPercentage;
+
+			stage.m_maxStats.m_fma = max<F64>(stage.m_maxStats.m_fma, maliocOut.m_fma);
+			stage.m_maxStats.m_cvt = max<F64>(stage.m_maxStats.m_cvt, maliocOut.m_cvt);
+			stage.m_maxStats.m_sfu = max<F64>(stage.m_maxStats.m_sfu, maliocOut.m_sfu);
+			stage.m_maxStats.m_loadStore = max<F64>(stage.m_maxStats.m_loadStore, maliocOut.m_loadStore);
+			stage.m_maxStats.m_varying = max<F64>(stage.m_maxStats.m_varying, maliocOut.m_varying);
+			stage.m_maxStats.m_texture = max<F64>(stage.m_maxStats.m_texture, maliocOut.m_texture);
+			stage.m_maxStats.m_workRegisters = max<F64>(stage.m_maxStats.m_workRegisters, maliocOut.m_workRegisters);
+			stage.m_maxStats.m_fp16ArithmeticPercentage =
+				max<F64>(stage.m_maxStats.m_fp16ArithmeticPercentage, maliocOut.m_fp16ArithmeticPercentage);
+
+			stage.m_minStats.m_fma = min<F64>(stage.m_minStats.m_fma, maliocOut.m_fma);
+			stage.m_minStats.m_cvt = min<F64>(stage.m_minStats.m_cvt, maliocOut.m_cvt);
+			stage.m_minStats.m_sfu = min<F64>(stage.m_minStats.m_sfu, maliocOut.m_sfu);
+			stage.m_minStats.m_loadStore = min<F64>(stage.m_minStats.m_loadStore, maliocOut.m_loadStore);
+			stage.m_minStats.m_varying = min<F64>(stage.m_minStats.m_varying, maliocOut.m_varying);
+			stage.m_minStats.m_texture = min<F64>(stage.m_minStats.m_texture, maliocOut.m_texture);
+			stage.m_minStats.m_workRegisters = min<F64>(stage.m_minStats.m_workRegisters, maliocOut.m_workRegisters);
+			stage.m_minStats.m_fp16ArithmeticPercentage =
+				min<F64>(stage.m_minStats.m_fp16ArithmeticPercentage, maliocOut.m_fp16ArithmeticPercentage);
+		}
+	}
+
+	for(ShaderType shaderType : EnumIterable<ShaderType>())
+	{
+		const StageStats& stage = allStats[shaderType];
+		if(stage.m_count == 0)
+		{
+			continue;
+		}
+
+		printf("Stage %u\n", U32(shaderType));
+		printf("\tSpilling count %u\n", stage.m_spillingCount);
+
+		const Stats& avg = stage.m_avgStats;
+		printf("\tAvarage: Regs %f FMA %f CVT %f SFU %f LS %f VAR %f TEX %f FP16 %f%%\n",
+			   avg.m_workRegisters / F64(stage.m_count), avg.m_fma / F64(stage.m_count), avg.m_cvt / F64(stage.m_count),
+			   avg.m_sfu / F64(stage.m_count), avg.m_loadStore / F64(stage.m_count), avg.m_varying / F64(stage.m_count),
+			   avg.m_texture / F64(stage.m_count), avg.m_fp16ArithmeticPercentage / F64(stage.m_count));
+
+		const Stats& maxs = stage.m_maxStats;
+		printf("\tMax: Regs %f FMA %f CVT %f SFU %f LS %f VAR %f TEX %f FP16 %f%%\n", maxs.m_workRegisters, maxs.m_fma,
+			   maxs.m_cvt, maxs.m_sfu, maxs.m_loadStore, maxs.m_varying, maxs.m_texture,
+			   maxs.m_fp16ArithmeticPercentage);
+	}
+
+	return Error::NONE;
+}
+
+Error dump(CString fname, Bool bDumpStats)
+{
+	HeapAllocator<U8> alloc(allocAligned, nullptr);
+
+	ShaderProgramBinaryWrapper binw(alloc);
+	ANKI_CHECK(binw.deserializeFromFile(fname));
 
 
 	StringAuto txt(alloc);
 	StringAuto txt(alloc);
-	dumpShaderProgramBinary(bin.getBinary(), txt);
+	dumpShaderProgramBinary(binw.getBinary(), txt);
 
 
 	printf("%s\n", txt.cstr());
 	printf("%s\n", txt.cstr());
 
 
+	if(bDumpStats)
+	{
+		ANKI_CHECK(dumpStats(binw.getBinary()));
+	}
+
 	return Error::NONE;
 	return Error::NONE;
 }
 }
 
 
 int main(int argc, char** argv)
 int main(int argc, char** argv)
 {
 {
-	if(argc != 2)
+	StringAuto filename(HeapAllocator<U8>(allocAligned, nullptr));
+	Bool dumpStats;
+	if(parseCommandLineArgs(argc, argv, dumpStats, filename))
 	{
 	{
 		ANKI_LOGE(USAGE, argv[0]);
 		ANKI_LOGE(USAGE, argv[0]);
 		return 1;
 		return 1;
 	}
 	}
 
 
-	const Error err = dump(argv[1]);
+	const Error err = dump(filename, dumpStats);
 	if(err)
 	if(err)
 	{
 	{
 		ANKI_LOGE("Can't dump due to an error. Bye");
 		ANKI_LOGE("Can't dump due to an error. Bye");

+ 2 - 1
Tools/Shader/ShaderProgramCompilerMain.cpp

@@ -7,7 +7,8 @@
 #include <AnKi/Util.h>
 #include <AnKi/Util.h>
 using namespace anki;
 using namespace anki;
 
 
-static const char* USAGE = R"(Usage: %s [options] input_shader_program_file
+static const char* USAGE = R"(Compile an AnKi shader program
+Usage: %s [options] input_shader_program_file
 Options:
 Options:
 -o <name of output>  : The name of the output binary
 -o <name of output>  : The name of the output binary
 -j <thread count>    : Number of threads. Defaults to system's max
 -j <thread count>    : Number of threads. Defaults to system's max