Browse Source

Refactor binding terms. Use DX now

Panagiotis Christopoulos Charitos 1 year ago
parent
commit
ba2ed75cb0
57 changed files with 734 additions and 840 deletions
  1. 3 3
      AnKi/Core/GpuMemory/GpuSceneBuffer.cpp
  2. 13 76
      AnKi/Gr/CommandBuffer.h
  3. 1 2
      AnKi/Gr/Common.cpp
  4. 62 57
      AnKi/Gr/Common.h
  5. 20 43
      AnKi/Gr/D3D/D3DCommandBuffer.cpp
  6. 15 16
      AnKi/Gr/D3D/D3DDescriptor.cpp
  7. 7 18
      AnKi/Gr/D3D/D3DDescriptor.h
  8. 18 16
      AnKi/Gr/RenderGraph.h
  9. 2 2
      AnKi/Gr/RenderGraph.inl.h
  10. 46 48
      AnKi/Gr/Vulkan/VkCommandBuffer.cpp
  11. 21 11
      AnKi/Gr/Vulkan/VkCommon.h
  12. 4 4
      AnKi/Gr/Vulkan/VkDescriptor.cpp
  13. 7 17
      AnKi/Gr/Vulkan/VkDescriptor.h
  14. 1 1
      AnKi/Gr/Vulkan/VkShaderProgram.cpp
  15. 8 8
      AnKi/Renderer/Bloom.cpp
  16. 8 8
      AnKi/Renderer/ClusterBinning.cpp
  17. 11 11
      AnKi/Renderer/Dbg.cpp
  18. 7 7
      AnKi/Renderer/DepthDownscale.cpp
  19. 5 5
      AnKi/Renderer/DownscaleBlur.cpp
  20. 11 11
      AnKi/Renderer/FinalComposite.cpp
  21. 12 12
      AnKi/Renderer/ForwardShading.cpp
  22. 6 6
      AnKi/Renderer/GBufferPost.cpp
  23. 4 4
      AnKi/Renderer/IndirectDiffuseProbes.cpp
  24. 7 7
      AnKi/Renderer/LensFlare.cpp
  25. 26 28
      AnKi/Renderer/LightShading.cpp
  26. 2 2
      AnKi/Renderer/MainRenderer.cpp
  27. 5 5
      AnKi/Renderer/MotionVectors.cpp
  28. 7 7
      AnKi/Renderer/ProbeReflections.cpp
  29. 1 1
      AnKi/Renderer/Renderer.cpp
  30. 14 4
      AnKi/Renderer/RendererObject.h
  31. 51 52
      AnKi/Renderer/RtShadows.cpp
  32. 10 10
      AnKi/Renderer/Scale.cpp
  33. 10 11
      AnKi/Renderer/ShadowMapping.cpp
  34. 13 13
      AnKi/Renderer/ShadowmapsResolve.cpp
  35. 11 11
      AnKi/Renderer/Sky.cpp
  36. 15 16
      AnKi/Renderer/Ssao.cpp
  37. 7 7
      AnKi/Renderer/Ssr.cpp
  38. 7 7
      AnKi/Renderer/TemporalAA.cpp
  39. 2 2
      AnKi/Renderer/Tonemapping.cpp
  40. 14 14
      AnKi/Renderer/Utils/Drawer.cpp
  41. 69 70
      AnKi/Renderer/Utils/GpuVisibility.cpp
  42. 11 12
      AnKi/Renderer/Utils/HzbGenerator.cpp
  43. 2 2
      AnKi/Renderer/Utils/MipmapGenerator.cpp
  44. 20 21
      AnKi/Renderer/Utils/TraditionalDeferredShading.cpp
  45. 3 3
      AnKi/Renderer/VolumetricFog.cpp
  46. 13 15
      AnKi/Renderer/VolumetricLightingAccumulation.cpp
  47. 6 6
      AnKi/Renderer/VrsSriGeneration.cpp
  48. 1 1
      AnKi/Scene/Components/GlobalIlluminationProbeComponent.cpp
  49. 26 42
      AnKi/ShaderCompiler/ShaderCompiler.cpp
  50. 23 23
      AnKi/Shaders/Include/MaterialTypes.h
  51. 9 9
      AnKi/Shaders/Include/UnifiedGeometryTypes.def.h
  52. 27 22
      AnKi/Shaders/MaterialShadersCommon.hlsl
  53. 2 3
      AnKi/Ui/Canvas.cpp
  54. 15 15
      Tests/Gr/Gr.cpp
  55. 4 4
      Tests/Gr/GrMeshShaders.cpp
  56. 2 2
      Tests/Gr/GrTextureBuffer.cpp
  57. 7 7
      Tests/Gr/GrWorkGraphs.cpp

+ 3 - 3
AnKi/Core/GpuMemory/GpuSceneBuffer.cpp

@@ -137,9 +137,9 @@ void GpuSceneMicroPatcher::patchGpuScene(CommandBuffer& cmdb)
 	const RebarAllocation dataToken = RebarTransientMemoryPool::getSingleton().allocateFrame(m_crntFramePatchData.getSizeInBytes(), mapped);
 	memcpy(mapped, &m_crntFramePatchData[0], m_crntFramePatchData.getSizeInBytes());
 
-	cmdb.bindStorageBuffer(ANKI_REG(t0), headersToken);
-	cmdb.bindStorageBuffer(ANKI_REG(t1), dataToken);
-	cmdb.bindStorageBuffer(ANKI_REG(u0), BufferView(&GpuSceneBuffer::getSingleton().getBuffer()));
+	cmdb.bindSrv(0, 0, headersToken);
+	cmdb.bindSrv(1, 0, dataToken);
+	cmdb.bindUav(0, 0, BufferView(&GpuSceneBuffer::getSingleton().getBuffer()));
 
 	cmdb.bindShaderProgram(m_grProgram.get());
 

+ 13 - 76
AnKi/Gr/CommandBuffer.h

@@ -106,72 +106,6 @@ public:
 	}
 };
 
-/// Maps to HLSL register(X#, S)
-class Register
-{
-public:
-	U32 m_bindPoint = kMaxU32;
-	HlslResourceType m_resourceType = HlslResourceType::kCount;
-	U8 m_space = kMaxU8;
-
-	Register(HlslResourceType type, U32 bindingPoint, U8 space = 0)
-		: m_bindPoint(bindingPoint)
-		, m_resourceType(type)
-		, m_space(space)
-	{
-		validate();
-	}
-
-	/// Construct using a couple of strings like ("t0", "space10")
-	Register(const Char* reg, const Char* space = "space0")
-	{
-		ANKI_ASSERT(reg && space);
-		m_resourceType = toResourceType(reg[0]);
-		++reg;
-		m_bindPoint = 0;
-		do
-		{
-			ANKI_ASSERT(*reg >= '0' && *reg <= '9');
-			m_bindPoint *= 10;
-			m_bindPoint += *reg - '0';
-			++reg;
-		} while(*reg != '\0');
-		ANKI_ASSERT(strlen(space) == 6);
-		ANKI_ASSERT(space[5] >= '0' && space[5] <= '9');
-		m_space = U8(space[5] - '0');
-	}
-
-	void validate() const
-	{
-		ANKI_ASSERT(m_bindPoint != kMaxU32);
-		ANKI_ASSERT(m_resourceType < HlslResourceType::kCount);
-		ANKI_ASSERT(m_space < kMaxDescriptorSets);
-	}
-
-private:
-	static HlslResourceType toResourceType(Char c)
-	{
-		switch(c)
-		{
-		case 'b':
-			return HlslResourceType::kCbv;
-		case 'u':
-			return HlslResourceType::kUav;
-		case 't':
-			return HlslResourceType::kSrv;
-		case 's':
-			return HlslResourceType::kSampler;
-		default:
-			ANKI_ASSERT(0);
-			return HlslResourceType::kCount;
-		}
-	}
-};
-
-/// Break the code style to define something HLSL like
-#define ANKI_REG(reg) Register(ANKI_STRINGIZE(reg))
-#define ANKI_REG2(reg, space) Register(ANKI_STRINGIZE(reg), ANKI_STRINGIZE(space))
-
 /// Command buffer.
 class CommandBuffer : public GrObject
 {
@@ -272,23 +206,26 @@ public:
 	/// Set the line width. By default it's undefined.
 	void setLineWidth(F32 lineWidth);
 
+	/// Bind constant buffer.
+	void bindConstantBuffer(U32 reg, U32 space, const BufferView& buff);
+
 	/// Bind sampler.
-	void bindSampler(Register reg, Sampler* sampler);
+	void bindSampler(U32 reg, U32 space, Sampler* sampler);
 
 	/// Bind a texture.
-	void bindTexture(Register reg, const TextureView& texView);
+	void bindSrv(U32 reg, U32 space, const TextureView& texView);
 
-	/// Bind uniform buffer.
-	void bindUniformBuffer(Register reg, const BufferView& buff);
+	/// Bind a buffer.
+	void bindSrv(U32 reg, U32 space, const BufferView& buffer, Format fmt = Format::kNone);
 
-	/// Bind storage buffer.
-	void bindStorageBuffer(Register reg, const BufferView& buff);
+	/// Bind AS.
+	void bindSrv(U32 reg, U32 space, AccelerationStructure* as);
 
-	/// Bind texel buffer.
-	void bindTexelBuffer(Register reg, const BufferView& buff, Format fmt);
+	/// Bind a texture.
+	void bindUav(U32 reg, U32 space, const TextureView& texView);
 
-	/// Bind AS.
-	void bindAccelerationStructure(Register reg, AccelerationStructure* as);
+	/// Bind a buffer.
+	void bindUav(U32 reg, U32 space, const BufferView& buffer, Format fmt = Format::kNone);
 
 	/// Set push constants.
 	void setPushConstants(const void* data, U32 dataSize);

+ 1 - 2
AnKi/Gr/Common.cpp

@@ -140,8 +140,7 @@ Error ShaderReflection::linkShaderReflection(const ShaderReflection& a, const Sh
 				const ShaderReflectionBinding& abinding = a.m_descriptor.m_bindings[set][binding2];
 
 				if(abinding.m_registerBindingPoint == bbinding.m_registerBindingPoint
-				   && descriptorTypeToHlslResourceType(abinding.m_type, abinding.m_flags)
-						  == descriptorTypeToHlslResourceType(bbinding.m_type, bbinding.m_flags))
+				   && descriptorTypeToHlslResourceType(abinding.m_type) == descriptorTypeToHlslResourceType(bbinding.m_type))
 				{
 					if(abinding != bbinding)
 					{

+ 62 - 57
AnKi/Gr/Common.h

@@ -827,18 +827,6 @@ enum class GpuQueueType : U8
 };
 ANKI_ENUM_ALLOW_NUMERIC_OPERATIONS(GpuQueueType)
 
-enum class HlslResourceType : U8
-{
-	kCbv,
-	kSrv,
-	kUav,
-	kSampler, // !!!!WARNING!!! Keep it last
-
-	kCount,
-	kFirst = 0
-};
-ANKI_ENUM_ALLOW_NUMERIC_OPERATIONS(HlslResourceType)
-
 enum class VertexAttributeSemantic : U8
 {
 	kPosition,
@@ -855,50 +843,68 @@ enum class VertexAttributeSemantic : U8
 };
 ANKI_ENUM_ALLOW_NUMERIC_OPERATIONS(VertexAttributeSemantic)
 
-/// This doesn't match Vulkan or D3D.
+/// This matches D3D.
 enum class DescriptorType : U8
 {
-	kTexture, ///< Vulkan: Image (sampled or storage). D3D: Textures
-	kSampler,
-	kUniformBuffer,
-	kStorageBuffer, ///< Vulkan: Storage buffers. D3D: Structured, ByteAddressBuffer
-	kTexelBuffer,
+	kConstantBuffer,
+	kSrvStructuredBuffer,
+	kUavStructuredBuffer,
+	kSrvByteAddressBuffer,
+	kUavByteAddressBuffer,
+	kSrvTexelBuffer,
+	kUavTexelBuffer,
+	kSrvTexture,
+	kUavTexture,
 	kAccelerationStructure,
+	kSampler,
 
 	kCount,
 	kFirst = 0
 };
 ANKI_ENUM_ALLOW_NUMERIC_OPERATIONS(DescriptorType)
 
-enum class DescriptorFlag : U8
+enum class HlslResourceType : U8
 {
-	kNone,
-	kRead = 1 << 0,
-	kWrite = 1 << 1,
-	kReadWrite = kRead | kWrite,
-	kByteAddressBuffer = 1 << 2
+	kCbv,
+	kSrv,
+	kUav,
+	kSampler, // !!!!WARNING!!! Keep it last
+
+	kCount,
+	kFirst = 0
 };
-ANKI_ENUM_ALLOW_NUMERIC_OPERATIONS(DescriptorFlag)
+ANKI_ENUM_ALLOW_NUMERIC_OPERATIONS(HlslResourceType)
 
-inline HlslResourceType descriptorTypeToHlslResourceType(DescriptorType type, DescriptorFlag flag)
+inline HlslResourceType descriptorTypeToHlslResourceType(DescriptorType type)
 {
-	ANKI_ASSERT(type < DescriptorType::kCount && flag != DescriptorFlag::kNone);
-	if(type == DescriptorType::kSampler)
-	{
-		return HlslResourceType::kSampler;
-	}
-	else if(type == DescriptorType::kUniformBuffer)
-	{
-		return HlslResourceType::kCbv;
-	}
-	else if(!!(flag & DescriptorFlag::kWrite))
-	{
-		return HlslResourceType::kUav;
-	}
-	else
+	HlslResourceType out = HlslResourceType::kCount;
+
+	switch(type)
 	{
-		return HlslResourceType::kSrv;
+	case DescriptorType::kConstantBuffer:
+		out = HlslResourceType::kCbv;
+		break;
+	case DescriptorType::kSrvStructuredBuffer:
+	case DescriptorType::kSrvByteAddressBuffer:
+	case DescriptorType::kSrvTexelBuffer:
+	case DescriptorType::kSrvTexture:
+	case DescriptorType::kAccelerationStructure:
+		out = HlslResourceType::kSrv;
+		break;
+	case DescriptorType::kUavStructuredBuffer:
+	case DescriptorType::kUavByteAddressBuffer:
+	case DescriptorType::kUavTexelBuffer:
+	case DescriptorType::kUavTexture:
+		out = HlslResourceType::kUav;
+		break;
+	case DescriptorType::kSampler:
+		out = HlslResourceType::kSampler;
+		break;
+	default:
+		ANKI_ASSERT(0);
 	}
+
+	return out;
 }
 
 ANKI_BEGIN_PACKED_STRUCT
@@ -915,26 +921,23 @@ public:
 	};
 
 	DescriptorType m_type = DescriptorType::kCount;
-	DescriptorFlag m_flags = DescriptorFlag::kNone;
 
+	/// Order the bindings. THIS IS IMPORTANT because the backends expect them in a specific order.
 	Bool operator<(const ShaderReflectionBinding& b) const
 	{
-#define ANKI_LESS(member) \
-	if(member != b.member) \
-	{ \
-		return member < b.member; \
-	}
-		const HlslResourceType hlslType = descriptorTypeToHlslResourceType(m_type, m_flags);
-		const HlslResourceType bhlslType = descriptorTypeToHlslResourceType(b.m_type, b.m_flags);
-		if(hlslType != bhlslType)
+		const HlslResourceType ahlsl = descriptorTypeToHlslResourceType(m_type);
+		const HlslResourceType bhlsl = descriptorTypeToHlslResourceType(b.m_type);
+		if(ahlsl != bhlsl)
 		{
-			return hlslType < bhlslType;
+			return ahlsl < bhlsl;
 		}
 
-		ANKI_LESS(m_registerBindingPoint)
-		ANKI_LESS(m_arraySize)
-		ANKI_LESS(m_d3dStructuredBufferStride)
-#undef ANKI_LESS
+		if(m_registerBindingPoint != b.m_registerBindingPoint)
+		{
+			return m_registerBindingPoint < b.m_registerBindingPoint;
+		}
+
+		ANKI_ASSERT(!"Can't have 2 bindings with the same HlslResourceType and same binding point");
 		return false;
 	}
 
@@ -947,9 +950,9 @@ public:
 	{
 		ANKI_ASSERT(m_registerBindingPoint < kMaxU32);
 		ANKI_ASSERT(m_type < DescriptorType::kCount);
-		ANKI_ASSERT(m_flags != DescriptorFlag::kNone);
 		ANKI_ASSERT(m_arraySize > 0);
-		ANKI_ASSERT(ANKI_GR_BACKEND_VULKAN || m_type != DescriptorType::kStorageBuffer || m_d3dStructuredBufferStride != 0);
+		ANKI_ASSERT(!(ANKI_GR_BACKEND_DIRECT3D && (m_type == DescriptorType::kSrvStructuredBuffer || m_type == DescriptorType::kUavStructuredBuffer)
+					  && m_d3dStructuredBufferStride == 0));
 	}
 };
 ANKI_END_PACKED_STRUCT
@@ -958,7 +961,9 @@ ANKI_BEGIN_PACKED_STRUCT
 class ShaderReflectionDescriptorRelated
 {
 public:
+	/// The D3D backend expects bindings inside a space need to be ordered by HLSL type and then by register.
 	Array2d<ShaderReflectionBinding, kMaxDescriptorSets, kMaxBindingsPerDescriptorSet> m_bindings;
+
 	Array<U8, kMaxDescriptorSets> m_bindingCounts = {};
 
 	U32 m_pushConstantsSize = 0;

+ 20 - 43
AnKi/Gr/D3D/D3DCommandBuffer.cpp

@@ -210,81 +210,58 @@ void CommandBuffer::setBlendOperation(U32 attachment, BlendOperation funcRgb, Bl
 	self.m_graphicsState.setBlendOperation(attachment, funcRgb, funcA);
 }
 
-void CommandBuffer::bindTexture(Register reg, const TextureView& texView)
+void CommandBuffer::bindSrv(U32 reg, U32 space, const TextureView& texView)
 {
-	reg.validate();
 	ANKI_D3D_SELF(CommandBufferImpl);
 
 	const TextureImpl& impl = static_cast<const TextureImpl&>(texView.getTexture());
+	const DescriptorHeapHandle handle = impl.getOrCreateSrv(texView.getSubresource());
+	self.m_descriptors.bindSrv(space, reg, handle);
+}
 
-	if(reg.m_resourceType == HlslResourceType::kSrv)
-	{
-		const DescriptorHeapHandle handle = impl.getOrCreateSrv(texView.getSubresource());
-		self.m_descriptors.bindSrv(reg.m_space, reg.m_bindPoint, handle);
-	}
-	else
-	{
-		const DescriptorHeapHandle handle = impl.getOrCreateUav(texView.getSubresource());
-		self.m_descriptors.bindUav(reg.m_space, reg.m_bindPoint, handle);
-	}
+void CommandBuffer::bindUav(U32 reg, U32 space, const TextureView& texView)
+{
+	ANKI_D3D_SELF(CommandBufferImpl);
+
+	const TextureImpl& impl = static_cast<const TextureImpl&>(texView.getTexture());
+	const DescriptorHeapHandle handle = impl.getOrCreateUav(texView.getSubresource());
+	self.m_descriptors.bindUav(space, reg, handle);
 }
 
-void CommandBuffer::bindSampler(Register reg, Sampler* sampler)
+void CommandBuffer::bindSampler(U32 reg, U32 space, Sampler* sampler)
 {
-	reg.validate();
 	ANKI_ASSERT(sampler);
 	ANKI_D3D_SELF(CommandBufferImpl);
 
 	const SamplerImpl& impl = static_cast<const SamplerImpl&>(*sampler);
-	self.m_descriptors.bindSampler(reg.m_space, reg.m_bindPoint, impl.m_handle);
+	self.m_descriptors.bindSampler(space, reg, impl.m_handle);
 
 	self.m_mcmdb->pushObjectRef(sampler);
 }
 
-void CommandBuffer::bindUniformBuffer(Register reg, const BufferView& buff)
+void CommandBuffer::bindConstantBuffer(U32 reg, U32 space, const BufferView& buff)
 {
-	reg.validate();
 	ANKI_D3D_SELF(CommandBufferImpl);
 
 	const BufferImpl& impl = static_cast<const BufferImpl&>(buff.getBuffer());
-	self.m_descriptors.bindCbv(reg.m_space, reg.m_bindPoint, &impl.getD3DResource(), buff.getOffset(), buff.getRange());
+	self.m_descriptors.bindCbv(space, reg, &impl.getD3DResource(), buff.getOffset(), buff.getRange());
 }
 
-void CommandBuffer::bindStorageBuffer(Register reg, const BufferView& buff)
+void CommandBuffer::bindSrv(U32 reg, U32 space, const BufferView& buff, Format fmt)
 {
-	reg.validate();
 	ANKI_D3D_SELF(CommandBufferImpl);
-
 	const BufferImpl& impl = static_cast<const BufferImpl&>(buff.getBuffer());
-	if(reg.m_resourceType == HlslResourceType::kUav)
-	{
-		self.m_descriptors.bindUav(reg.m_space, reg.m_bindPoint, &impl.getD3DResource(), buff.getOffset(), buff.getRange());
-	}
-	else
-	{
-		ANKI_ASSERT(reg.m_resourceType == HlslResourceType::kSrv);
-		self.m_descriptors.bindSrv(reg.m_space, reg.m_bindPoint, &impl.getD3DResource(), buff.getOffset(), buff.getRange());
-	}
+	self.m_descriptors.bindSrv(space, reg, &impl.getD3DResource(), buff.getOffset(), buff.getRange(), fmt);
 }
 
-void CommandBuffer::bindTexelBuffer(Register reg, const BufferView& buff, Format fmt)
+void CommandBuffer::bindUav(U32 reg, U32 space, const BufferView& buff, Format fmt)
 {
-	reg.validate();
 	ANKI_D3D_SELF(CommandBufferImpl);
-
 	const BufferImpl& impl = static_cast<const BufferImpl&>(buff.getBuffer());
-	if(reg.m_resourceType == HlslResourceType::kUav)
-	{
-		self.m_descriptors.bindUav(reg.m_space, reg.m_bindPoint, &impl.getD3DResource(), buff.getOffset(), buff.getRange(), fmt);
-	}
-	else
-	{
-		ANKI_ASSERT(reg.m_resourceType == HlslResourceType::kSrv);
-		self.m_descriptors.bindSrv(reg.m_space, reg.m_bindPoint, &impl.getD3DResource(), buff.getOffset(), buff.getRange(), fmt);
-	}
+	self.m_descriptors.bindUav(space, reg, &impl.getD3DResource(), buff.getOffset(), buff.getRange(), fmt);
 }
 
-void CommandBuffer::bindAccelerationStructure([[maybe_unused]] Register reg, [[maybe_unused]] AccelerationStructure* as)
+void CommandBuffer::bindSrv([[maybe_unused]] U32 reg, [[maybe_unused]] U32 space, [[maybe_unused]] AccelerationStructure* as)
 {
 	ANKI_ASSERT(!"TODO");
 }

+ 15 - 16
AnKi/Gr/D3D/D3DDescriptor.cpp

@@ -282,7 +282,7 @@ Error RootSignatureFactory::getOrCreateRootSignature(const ShaderReflection& ref
 			const Bool isSampler = (akBinding.m_type == DescriptorType::kSampler);
 			akBinding.validate();
 			D3D12_DESCRIPTOR_RANGE1& range = (isSampler) ? *samplerRanges.emplaceBack() : *nonSamplerRanges.emplaceBack();
-			const HlslResourceType hlslRsrcType = descriptorTypeToHlslResourceType(akBinding.m_type, akBinding.m_flags);
+			const HlslResourceType hlslRsrcType = descriptorTypeToHlslResourceType(akBinding.m_type);
 
 			range = {};
 			range.NumDescriptors = akBinding.m_arraySize;
@@ -315,6 +315,7 @@ Error RootSignatureFactory::getOrCreateRootSignature(const ShaderReflection& ref
 			}
 		}
 
+		// Add the root parameter
 		if(nonSamplerRanges.getSize())
 		{
 			D3D12_ROOT_PARAMETER1& table = *rootParameters.emplaceBack();
@@ -325,6 +326,7 @@ Error RootSignatureFactory::getOrCreateRootSignature(const ShaderReflection& ref
 			table.ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
 		}
 
+		// Add the root parameter
 		if(samplerRanges.getSize())
 		{
 			D3D12_ROOT_PARAMETER1& table = *rootParameters.emplaceBack();
@@ -388,7 +390,7 @@ Error RootSignatureFactory::getOrCreateRootSignature(const ShaderReflection& ref
 		{
 			const ShaderReflectionBinding& inBinding = refl.m_descriptor.m_bindings[spaceIdx][bindingIdx];
 			inBinding.validate();
-			const HlslResourceType hlslResourceType = descriptorTypeToHlslResourceType(inBinding.m_type, inBinding.m_flags);
+			const HlslResourceType hlslResourceType = descriptorTypeToHlslResourceType(inBinding.m_type);
 
 			if(hlslResourceType < HlslResourceType::kSampler)
 			{
@@ -408,9 +410,8 @@ Error RootSignatureFactory::getOrCreateRootSignature(const ShaderReflection& ref
 				}
 
 				RootSignature::Descriptor& outDescriptor = signature->m_spaces[spaceIdx].m_descriptors[hlslResourceType][idxInDescriptorsArr];
-				outDescriptor.m_flags = inBinding.m_flags;
 				outDescriptor.m_type = inBinding.m_type;
-				if(outDescriptor.m_type == DescriptorType::kStorageBuffer)
+				if(outDescriptor.m_type == DescriptorType::kSrvStructuredBuffer || outDescriptor.m_type == DescriptorType::kUavStructuredBuffer)
 				{
 					ANKI_ASSERT(inBinding.m_d3dStructuredBufferStride < kMaxU16);
 					outDescriptor.m_structuredBufferStride = inBinding.m_d3dStructuredBufferStride;
@@ -544,10 +545,10 @@ void DescriptorState::flush(ID3D12GraphicsCommandList& cmdList)
 				}
 
 				const Descriptor& outDescriptor = stateSpace.m_descriptors[hlslResourceType][registerBinding];
-				ANKI_ASSERT((inDescriptor.m_flags & ~DescriptorFlag::kByteAddressBuffer) == outDescriptor.m_flags
-							&& inDescriptor.m_type == outDescriptor.m_type && "Have bound the wrong thing");
+				ANKI_ASSERT(inDescriptor.m_type == outDescriptor.m_type && "Have bound the wrong thing");
+				ANKI_ASSERT(descriptorTypeToHlslResourceType(inDescriptor.m_type) == hlslResourceType);
 
-				if(inDescriptor.m_type == DescriptorType::kUniformBuffer)
+				if(inDescriptor.m_type == DescriptorType::kConstantBuffer)
 				{
 					// ConstantBuffer
 
@@ -559,7 +560,7 @@ void DescriptorState::flush(ID3D12GraphicsCommandList& cmdList)
 
 					getDevice().CreateConstantBufferView(&desc, cbvSrvUavHeapOffset.getCpuOffset());
 				}
-				else if(inDescriptor.m_type == DescriptorType::kTexture)
+				else if(inDescriptor.m_type == DescriptorType::kSrvTexture || inDescriptor.m_type == DescriptorType::kUavTexture)
 				{
 					// Texture2D or RWTexture2D
 
@@ -575,8 +576,7 @@ void DescriptorState::flush(ID3D12GraphicsCommandList& cmdList)
 					getDevice().CopyDescriptorsSimple(1, samplerHeapOffset.getCpuOffset(), outDescriptor.m_heapOffset,
 													  D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER);
 				}
-				else if(inDescriptor.m_type == DescriptorType::kStorageBuffer && !!(inDescriptor.m_flags & DescriptorFlag::kWrite)
-						&& !!(inDescriptor.m_flags & DescriptorFlag::kByteAddressBuffer))
+				else if(inDescriptor.m_type == DescriptorType::kUavByteAddressBuffer)
 				{
 					// RWByteAddressBuffer
 
@@ -597,7 +597,7 @@ void DescriptorState::flush(ID3D12GraphicsCommandList& cmdList)
 
 					getDevice().CreateUnorderedAccessView(view.m_resource, nullptr, &uavDesc, cbvSrvUavHeapOffset.getCpuOffset());
 				}
-				else if(inDescriptor.m_type == DescriptorType::kStorageBuffer && !!(inDescriptor.m_flags & DescriptorFlag::kWrite))
+				else if(inDescriptor.m_type == DescriptorType::kUavStructuredBuffer)
 				{
 					// RWStructuredBuffer
 
@@ -618,8 +618,7 @@ void DescriptorState::flush(ID3D12GraphicsCommandList& cmdList)
 
 					getDevice().CreateUnorderedAccessView(view.m_resource, nullptr, &uavDesc, cbvSrvUavHeapOffset.getCpuOffset());
 				}
-				else if(inDescriptor.m_type == DescriptorType::kStorageBuffer && !(inDescriptor.m_flags & DescriptorFlag::kWrite)
-						&& !!(inDescriptor.m_flags & DescriptorFlag::kByteAddressBuffer))
+				else if(inDescriptor.m_type == DescriptorType::kSrvByteAddressBuffer)
 				{
 					// ByteAddressBuffer
 
@@ -640,7 +639,7 @@ void DescriptorState::flush(ID3D12GraphicsCommandList& cmdList)
 
 					getDevice().CreateShaderResourceView(view.m_resource, &srvDesc, cbvSrvUavHeapOffset.getCpuOffset());
 				}
-				else if(inDescriptor.m_type == DescriptorType::kStorageBuffer && !(inDescriptor.m_flags & DescriptorFlag::kWrite))
+				else if(inDescriptor.m_type == DescriptorType::kSrvStructuredBuffer)
 				{
 					// StructuredBuffer
 
@@ -661,7 +660,7 @@ void DescriptorState::flush(ID3D12GraphicsCommandList& cmdList)
 
 					getDevice().CreateShaderResourceView(view.m_resource, &srvDesc, cbvSrvUavHeapOffset.getCpuOffset());
 				}
-				else if(inDescriptor.m_type == DescriptorType::kTexelBuffer && !!(inDescriptor.m_flags & DescriptorFlag::kWrite))
+				else if(inDescriptor.m_type == DescriptorType::kUavTexelBuffer)
 				{
 					// RWBuffer
 
@@ -680,7 +679,7 @@ void DescriptorState::flush(ID3D12GraphicsCommandList& cmdList)
 
 					getDevice().CreateUnorderedAccessView(view.m_resource, nullptr, &uavDesc, cbvSrvUavHeapOffset.getCpuOffset());
 				}
-				else if(inDescriptor.m_type == DescriptorType::kTexelBuffer && !(inDescriptor.m_flags & DescriptorFlag::kWrite))
+				else if(inDescriptor.m_type == DescriptorType::kSrvTexelBuffer)
 				{
 					// Buffer
 

+ 7 - 18
AnKi/Gr/D3D/D3DDescriptor.h

@@ -267,7 +267,6 @@ private:
 	{
 	public:
 		DescriptorType m_type = DescriptorType::kCount;
-		DescriptorFlag m_flags = DescriptorFlag::kNone;
 		U16 m_structuredBufferStride = kMaxU8;
 	};
 
@@ -330,13 +329,11 @@ public:
 #if ANKI_ASSERTIONS_ENABLED
 		if(fmt == Format::kNone)
 		{
-			descriptor.m_type = DescriptorType::kStorageBuffer;
-			descriptor.m_flags = DescriptorFlag::kReadWrite;
+			descriptor.m_type = DescriptorType::kUavStructuredBuffer;
 		}
 		else
 		{
-			descriptor.m_type = DescriptorType::kTexelBuffer;
-			descriptor.m_flags = DescriptorFlag::kReadWrite;
+			descriptor.m_type = DescriptorType::kUavTexelBuffer;
 		}
 #endif
 
@@ -349,8 +346,7 @@ public:
 		descriptor.m_heapOffset = handle.getCpuOffset();
 		descriptor.m_isHandle = true;
 #if ANKI_ASSERTIONS_ENABLED
-		descriptor.m_type = DescriptorType::kTexture;
-		descriptor.m_flags = DescriptorFlag::kReadWrite;
+		descriptor.m_type = DescriptorType::kUavTexture;
 #endif
 
 		m_spaces[space].m_cbvSrvUavDirty = true;
@@ -367,13 +363,11 @@ public:
 #if ANKI_ASSERTIONS_ENABLED
 		if(fmt == Format::kNone)
 		{
-			descriptor.m_type = DescriptorType::kStorageBuffer;
-			descriptor.m_flags = DescriptorFlag::kRead;
+			descriptor.m_type = DescriptorType::kSrvStructuredBuffer;
 		}
 		else
 		{
-			descriptor.m_type = DescriptorType::kTexelBuffer;
-			descriptor.m_flags = DescriptorFlag::kRead;
+			descriptor.m_type = DescriptorType::kSrvTexelBuffer;
 		}
 #endif
 
@@ -386,8 +380,7 @@ public:
 		descriptor.m_heapOffset = handle.getCpuOffset();
 		descriptor.m_isHandle = true;
 #if ANKI_ASSERTIONS_ENABLED
-		descriptor.m_type = DescriptorType::kTexture;
-		descriptor.m_flags = DescriptorFlag::kRead;
+		descriptor.m_type = DescriptorType::kSrvTexture;
 #endif
 
 		m_spaces[space].m_cbvSrvUavDirty = true;
@@ -402,8 +395,7 @@ public:
 		descriptor.m_bufferView.m_format = Format::kNone;
 		descriptor.m_isHandle = false;
 #if ANKI_ASSERTIONS_ENABLED
-		descriptor.m_type = DescriptorType::kUniformBuffer;
-		descriptor.m_flags = DescriptorFlag::kRead;
+		descriptor.m_type = DescriptorType::kConstantBuffer;
 #endif
 
 		m_spaces[space].m_cbvSrvUavDirty = true;
@@ -416,7 +408,6 @@ public:
 		descriptor.m_isHandle = true;
 #if ANKI_ASSERTIONS_ENABLED
 		descriptor.m_type = DescriptorType::kSampler;
-		descriptor.m_flags = DescriptorFlag::kRead;
 #endif
 
 		m_spaces[space].m_samplersDirty = true;
@@ -454,7 +445,6 @@ private:
 		Bool m_isHandle;
 #if ANKI_ASSERTIONS_ENABLED
 		DescriptorType m_type = DescriptorType::kCount;
-		DescriptorFlag m_flags = DescriptorFlag::kNone;
 #endif
 
 		Descriptor()
@@ -475,7 +465,6 @@ private:
 			m_isHandle = b.m_isHandle;
 #if ANKI_ASSERTIONS_ENABLED
 			m_type = b.m_type;
-			m_flags = b.m_flags;
 #endif
 			return *this;
 		}

+ 18 - 16
AnKi/Gr/RenderGraph.h

@@ -132,43 +132,45 @@ public:
 		return TextureView(tex, subresource);
 	}
 
-	/// Convenience method.
-	void bindTexture(Register reg, RenderTargetHandle handle, const TextureSubresourceDesc& subresource)
+	void bindSrv(U32 reg, U32 space, RenderTargetHandle handle, const TextureSubresourceDesc& subresource = TextureSubresourceDesc::all())
 	{
 		Texture* tex;
 		getRenderTargetState(handle, subresource, tex);
-		m_commandBuffer->bindTexture(reg, TextureView(tex, subresource));
+		m_commandBuffer->bindSrv(reg, space, TextureView(tex, subresource));
 	}
 
-	/// Convenience method to bind the whole texture.
-	void bindTexture(Register reg, RenderTargetHandle handle)
+	void bindUav(U32 reg, U32 space, RenderTargetHandle handle, const TextureSubresourceDesc& subresource = TextureSubresourceDesc::all())
 	{
-		const TextureSubresourceDesc subresource = TextureSubresourceDesc::all();
 		Texture* tex;
-		getRenderTargetState(handle, subresource, tex); // Doesn't care about the aspect so it's OK
-		m_commandBuffer->bindTexture(reg, TextureView(tex, subresource));
+		getRenderTargetState(handle, subresource, tex);
+		m_commandBuffer->bindUav(reg, space, TextureView(tex, subresource));
 	}
 
-	/// Convenience method.
-	void bindStorageBuffer(Register reg, BufferHandle handle)
+	void bindSrv(U32 reg, U32 space, BufferHandle handle)
 	{
 		Buffer* buff;
 		PtrSize offset, range;
 		getBufferState(handle, buff, offset, range);
-		m_commandBuffer->bindStorageBuffer(reg, BufferView(buff, offset, range));
+		m_commandBuffer->bindSrv(reg, space, BufferView(buff, offset, range));
 	}
 
-	/// Convenience method.
-	void bindUniformBuffer(Register reg, BufferHandle handle)
+	void bindUav(U32 reg, U32 space, BufferHandle handle)
 	{
 		Buffer* buff;
 		PtrSize offset, range;
 		getBufferState(handle, buff, offset, range);
-		m_commandBuffer->bindUniformBuffer(reg, BufferView(buff, offset, range));
+		m_commandBuffer->bindUav(reg, space, BufferView(buff, offset, range));
 	}
 
-	/// Convenience method.
-	void bindAccelerationStructure(Register reg, AccelerationStructureHandle handle);
+	void bindSrv(U32 reg, U32 space, AccelerationStructureHandle handle);
+
+	void bindConstantBuffer(U32 reg, U32 space, BufferHandle handle)
+	{
+		Buffer* buff;
+		PtrSize offset, range;
+		getBufferState(handle, buff, offset, range);
+		m_commandBuffer->bindConstantBuffer(reg, space, BufferView(buff, offset, range));
+	}
 
 private:
 	const RenderGraph* m_rgraph ANKI_DEBUG_CODE(= nullptr);

+ 2 - 2
AnKi/Gr/RenderGraph.inl.h

@@ -7,9 +7,9 @@
 
 namespace anki {
 
-inline void RenderPassWorkContext::bindAccelerationStructure(Register reg, AccelerationStructureHandle handle)
+inline void RenderPassWorkContext::bindSrv(U32 reg, U32 space, AccelerationStructureHandle handle)
 {
-	m_commandBuffer->bindAccelerationStructure(reg, m_rgraph->getAs(handle));
+	m_commandBuffer->bindSrv(reg, space, m_rgraph->getAs(handle));
 }
 
 inline void RenderPassWorkContext::getBufferState(BufferHandle handle, Buffer*& buff, PtrSize& offset, PtrSize& range) const

+ 46 - 48
AnKi/Gr/Vulkan/VkCommandBuffer.cpp

@@ -195,108 +195,106 @@ void CommandBuffer::setBlendOperation(U32 attachment, BlendOperation funcRgb, Bl
 	self.m_graphicsState.setBlendOperation(attachment, funcRgb, funcA);
 }
 
-void CommandBuffer::bindTexture(Register reg, const TextureView& texView)
+void CommandBuffer::bindSrv(U32 reg, U32 space, const TextureView& texView)
 {
-	reg.validate();
 	ANKI_VK_SELF(CommandBufferImpl);
 	self.commandCommon();
 
 	const TextureImpl& tex = static_cast<const TextureImpl&>(texView.getTexture());
 
-	if(reg.m_resourceType == HlslResourceType::kSrv)
-	{
-		ANKI_ASSERT(texView.isGoodForSampling());
-		const VkImageLayout lay = tex.computeLayout(TextureUsageBit::kAllSrv & tex.getTextureUsage());
-		self.m_descriptorState.bindSampledTexture(reg.m_space, reg.m_bindPoint, tex.getImageView(texView.getSubresource()), lay);
-	}
-	else
-	{
-		ANKI_ASSERT(texView.isGoodForStorage());
-		self.m_descriptorState.bindStorageTexture(reg.m_space, reg.m_bindPoint, tex.getImageView(texView.getSubresource()));
+	ANKI_ASSERT(texView.isGoodForSampling());
+	const VkImageLayout lay = tex.computeLayout(TextureUsageBit::kAllSrv & tex.getTextureUsage());
+	self.m_descriptorState.bindSampledTexture(space, reg, tex.getImageView(texView.getSubresource()), lay);
+}
 
-		const Bool isPresentable = !!(tex.getTextureUsage() & TextureUsageBit::kPresent);
-		if(isPresentable)
-		{
-			self.m_renderedToDefaultFb = true;
-		}
+void CommandBuffer::bindUav(U32 reg, U32 space, const TextureView& texView)
+{
+	ANKI_VK_SELF(CommandBufferImpl);
+	self.commandCommon();
+
+	const TextureImpl& tex = static_cast<const TextureImpl&>(texView.getTexture());
+
+	ANKI_ASSERT(texView.isGoodForStorage());
+	self.m_descriptorState.bindStorageTexture(space, reg, tex.getImageView(texView.getSubresource()));
+
+	const Bool isPresentable = !!(tex.getTextureUsage() & TextureUsageBit::kPresent);
+	if(isPresentable)
+	{
+		self.m_renderedToDefaultFb = true;
 	}
 }
 
-void CommandBuffer::bindSampler(Register reg, Sampler* sampler)
+void CommandBuffer::bindSampler(U32 reg, U32 space, Sampler* sampler)
 {
-	reg.validate();
 	ANKI_VK_SELF(CommandBufferImpl);
 	self.commandCommon();
 
 	const VkSampler handle = static_cast<const SamplerImpl&>(*sampler).m_sampler->getHandle();
-	self.m_descriptorState.bindSampler(reg.m_space, reg.m_bindPoint, handle);
+	self.m_descriptorState.bindSampler(space, reg, handle);
 	self.m_microCmdb->pushObjectRef(sampler);
 }
 
-void CommandBuffer::bindUniformBuffer(Register reg, const BufferView& buff)
+void CommandBuffer::bindConstantBuffer(U32 reg, U32 space, const BufferView& buff)
 {
-	reg.validate();
 	ANKI_ASSERT(buff.isValid());
 
 	ANKI_VK_SELF(CommandBufferImpl);
 	self.commandCommon();
 
 	const VkBuffer handle = static_cast<const BufferImpl&>(buff.getBuffer()).getHandle();
-	self.m_descriptorState.bindUniformBuffer(reg.m_space, reg.m_bindPoint, handle, buff.getOffset(), buff.getRange());
+	self.m_descriptorState.bindUniformBuffer(space, reg, handle, buff.getOffset(), buff.getRange());
 }
 
-void CommandBuffer::bindStorageBuffer(Register reg, const BufferView& buff)
+void CommandBuffer::bindSrv(U32 reg, U32 space, const BufferView& buff, Format fmt)
 {
-	reg.validate();
 	ANKI_ASSERT(buff.isValid());
 
 	ANKI_VK_SELF(CommandBufferImpl);
 	self.commandCommon();
 
 	const VkBuffer handle = static_cast<const BufferImpl&>(buff.getBuffer()).getHandle();
-	if(reg.m_resourceType == HlslResourceType::kSrv)
+
+	if(fmt == Format::kNone)
 	{
-		self.m_descriptorState.bindReadStorageBuffer(reg.m_space, reg.m_bindPoint, handle, buff.getOffset(), buff.getRange());
+		self.m_descriptorState.bindReadStorageBuffer(space, reg, handle, buff.getOffset(), buff.getRange());
 	}
 	else
 	{
-		self.m_descriptorState.bindReadWriteStorageBuffer(reg.m_space, reg.m_bindPoint, handle, buff.getOffset(), buff.getRange());
+		const VkBufferView view = static_cast<const BufferImpl&>(buff.getBuffer()).getOrCreateBufferView(fmt, buff.getOffset(), buff.getRange());
+		self.m_descriptorState.bindReadTexelBuffer(space, reg, view);
 	}
 }
 
-void CommandBuffer::bindAccelerationStructure(Register reg, AccelerationStructure* as)
+void CommandBuffer::bindUav(U32 reg, U32 space, const BufferView& buff, Format fmt)
 {
-	reg.validate();
-	ANKI_VK_SELF(CommandBufferImpl);
-	self.commandCommon();
-
-	const VkAccelerationStructureKHR& handle = static_cast<const AccelerationStructureImpl&>(*as).getHandle();
-	self.m_descriptorState.bindAccelerationStructure(reg.m_space, reg.m_bindPoint, &handle);
-	self.m_microCmdb->pushObjectRef(as);
-}
-
-void CommandBuffer::bindTexelBuffer(Register reg, const BufferView& buff, Format fmt)
-{
-	reg.validate();
-	ANKI_ASSERT(fmt != Format::kNone);
-	reg.validate();
+	ANKI_ASSERT(buff.isValid());
 
 	ANKI_VK_SELF(CommandBufferImpl);
 	self.commandCommon();
 
-	const VkBufferView view = static_cast<const BufferImpl&>(buff.getBuffer()).getOrCreateBufferView(fmt, buff.getOffset(), buff.getRange());
+	const VkBuffer handle = static_cast<const BufferImpl&>(buff.getBuffer()).getHandle();
 
-	if(reg.m_resourceType == HlslResourceType::kSrv)
+	if(fmt == Format::kNone)
 	{
-		self.m_descriptorState.bindReadTexelBuffer(reg.m_space, reg.m_bindPoint, view);
+		self.m_descriptorState.bindReadWriteStorageBuffer(space, reg, handle, buff.getOffset(), buff.getRange());
 	}
 	else
 	{
-		ANKI_ASSERT(reg.m_resourceType == HlslResourceType::kUav);
-		self.m_descriptorState.bindReadWriteTexelBuffer(reg.m_space, reg.m_bindPoint, view);
+		const VkBufferView view = static_cast<const BufferImpl&>(buff.getBuffer()).getOrCreateBufferView(fmt, buff.getOffset(), buff.getRange());
+		self.m_descriptorState.bindReadWriteTexelBuffer(space, reg, view);
 	}
 }
 
+void CommandBuffer::bindSrv(U32 reg, U32 space, AccelerationStructure* as)
+{
+	ANKI_VK_SELF(CommandBufferImpl);
+	self.commandCommon();
+
+	const VkAccelerationStructureKHR& handle = static_cast<const AccelerationStructureImpl&>(*as).getHandle();
+	self.m_descriptorState.bindAccelerationStructure(space, reg, &handle);
+	self.m_microCmdb->pushObjectRef(as);
+}
+
 void CommandBuffer::bindShaderProgram(ShaderProgram* prog)
 {
 	ANKI_VK_SELF(CommandBufferImpl);

+ 21 - 11
AnKi/Gr/Vulkan/VkCommon.h

@@ -237,29 +237,39 @@ static_assert(!(BufferUsageBit::kAll & PrivateBufferUsageBit::kAllPrivate), "Upd
 	return out;
 }
 
-[[nodiscard]] inline VkDescriptorType convertDescriptorType(DescriptorType ak, DescriptorFlag flags)
+[[nodiscard]] inline VkDescriptorType convertDescriptorType(DescriptorType ak)
 {
 	VkDescriptorType out;
+
 	switch(ak)
 	{
-	case DescriptorType::kTexture:
-		out = !!(flags & DescriptorFlag::kWrite) ? VK_DESCRIPTOR_TYPE_STORAGE_IMAGE : VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
+	case DescriptorType::kConstantBuffer:
+		out = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
 		break;
-	case DescriptorType::kSampler:
-		out = VK_DESCRIPTOR_TYPE_SAMPLER;
+	case DescriptorType::kSrvStructuredBuffer:
+	case DescriptorType::kUavStructuredBuffer:
+	case DescriptorType::kSrvByteAddressBuffer:
+	case DescriptorType::kUavByteAddressBuffer:
+		out = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
 		break;
-	case DescriptorType::kUniformBuffer:
-		out = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
+	case DescriptorType::kSrvTexelBuffer:
+		out = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
 		break;
-	case DescriptorType::kTexelBuffer:
-		out = !!(flags & DescriptorFlag::kWrite) ? VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER : VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
+	case DescriptorType::kUavTexelBuffer:
+		out = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
 		break;
-	case DescriptorType::kStorageBuffer:
-		out = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
+	case DescriptorType::kSrvTexture:
+		out = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
+		break;
+	case DescriptorType::kUavTexture:
+		out = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
 		break;
 	case DescriptorType::kAccelerationStructure:
 		out = VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR;
 		break;
+	case DescriptorType::kSampler:
+		out = VK_DESCRIPTOR_TYPE_SAMPLER;
+		break;
 	default:
 		out = VK_DESCRIPTOR_TYPE_MAX_ENUM;
 		ANKI_ASSERT(0);

+ 4 - 4
AnKi/Gr/Vulkan/VkDescriptor.cpp

@@ -355,7 +355,7 @@ Error PipelineLayoutFactory2::getOrCreateDescriptorSetLayout(ConstWeakArray<Shad
 		U32 count = 0;
 		for(const ShaderReflectionBinding& reflBinding : reflBindings)
 		{
-			bindings[count].m_type = convertDescriptorType(reflBinding.m_type, reflBinding.m_flags);
+			bindings[count].m_type = convertDescriptorType(reflBinding.m_type);
 			bindings[count].m_arraySize = reflBinding.m_arraySize;
 			bindings[count].m_binding = reflBinding.m_vkBinding;
 			++count;
@@ -540,14 +540,14 @@ void DescriptorState::flush(VkCommandBuffer cmdb, DescriptorAllocator& dalloc)
 				for(U32 arrayIdx = 0; arrayIdx < binding.m_arraySize; ++arrayIdx)
 				{
 					VkWriteDescriptorSet& writeInfo = set.m_writeInfos[writeInfoCount++];
-					const HlslResourceType hlslType = descriptorTypeToHlslResourceType(binding.m_type, binding.m_flags);
+					const HlslResourceType hlslType = descriptorTypeToHlslResourceType(binding.m_type);
 					ANKI_ASSERT(binding.m_registerBindingPoint + arrayIdx < set.m_descriptors[hlslType].getSize() && "Forgot to bind something");
 					const Descriptor& desc = set.m_descriptors[hlslType][binding.m_registerBindingPoint + arrayIdx];
 
-					ANKI_ASSERT(desc.m_type == binding.m_type && desc.m_flags == binding.m_flags && "Have bound the wrong type");
+					ANKI_ASSERT(desc.m_type == binding.m_type && "Have bound the wrong type");
 
 					writeInfo = writeTemplate;
-					writeInfo.descriptorType = convertDescriptorType(binding.m_type, binding.m_flags);
+					writeInfo.descriptorType = convertDescriptorType(binding.m_type);
 					writeInfo.dstArrayElement = arrayIdx;
 					writeInfo.dstBinding = binding.m_vkBinding;
 

+ 7 - 17
AnKi/Gr/Vulkan/VkDescriptor.h

@@ -183,8 +183,7 @@ public:
 		desc.m_image.imageLayout = layout;
 		desc.m_image.sampler = 0;
 #if ANKI_ASSERTIONS_ENABLED
-		desc.m_type = DescriptorType::kTexture;
-		desc.m_flags = DescriptorFlag::kRead;
+		desc.m_type = DescriptorType::kSrvTexture;
 #endif
 	}
 
@@ -196,8 +195,7 @@ public:
 		desc.m_image.imageLayout = VK_IMAGE_LAYOUT_GENERAL;
 		desc.m_image.sampler = 0;
 #if ANKI_ASSERTIONS_ENABLED
-		desc.m_type = DescriptorType::kTexture;
-		desc.m_flags = DescriptorFlag::kReadWrite;
+		desc.m_type = DescriptorType::kUavTexture;
 #endif
 	}
 
@@ -210,7 +208,6 @@ public:
 		desc.m_image.sampler = sampler;
 #if ANKI_ASSERTIONS_ENABLED
 		desc.m_type = DescriptorType::kSampler;
-		desc.m_flags = DescriptorFlag::kRead;
 #endif
 	}
 
@@ -222,8 +219,7 @@ public:
 		desc.m_buffer.offset = offset;
 		desc.m_buffer.range = range;
 #if ANKI_ASSERTIONS_ENABLED
-		desc.m_type = DescriptorType::kUniformBuffer;
-		desc.m_flags = DescriptorFlag::kRead;
+		desc.m_type = DescriptorType::kConstantBuffer;
 #endif
 	}
 
@@ -235,8 +231,7 @@ public:
 		desc.m_buffer.offset = offset;
 		desc.m_buffer.range = range;
 #if ANKI_ASSERTIONS_ENABLED
-		desc.m_type = DescriptorType::kStorageBuffer;
-		desc.m_flags = DescriptorFlag::kRead;
+		desc.m_type = DescriptorType::kSrvStructuredBuffer;
 #endif
 	}
 
@@ -248,8 +243,7 @@ public:
 		desc.m_buffer.offset = offset;
 		desc.m_buffer.range = range;
 #if ANKI_ASSERTIONS_ENABLED
-		desc.m_type = DescriptorType::kStorageBuffer;
-		desc.m_flags = DescriptorFlag::kReadWrite;
+		desc.m_type = DescriptorType::kUavStructuredBuffer;
 #endif
 	}
 
@@ -259,8 +253,7 @@ public:
 		Descriptor& desc = getDescriptor(HlslResourceType::kSrv, space, registerBinding);
 		desc.m_bufferView = bufferView;
 #if ANKI_ASSERTIONS_ENABLED
-		desc.m_type = DescriptorType::kTexelBuffer;
-		desc.m_flags = DescriptorFlag::kRead;
+		desc.m_type = DescriptorType::kSrvTexelBuffer;
 #endif
 	}
 
@@ -270,8 +263,7 @@ public:
 		Descriptor& desc = getDescriptor(HlslResourceType::kUav, space, registerBinding);
 		desc.m_bufferView = bufferView;
 #if ANKI_ASSERTIONS_ENABLED
-		desc.m_type = DescriptorType::kTexelBuffer;
-		desc.m_flags = DescriptorFlag::kReadWrite;
+		desc.m_type = DescriptorType::kUavTexelBuffer;
 #endif
 	}
 
@@ -285,7 +277,6 @@ public:
 		desc.m_as.pAccelerationStructures = handle;
 #if ANKI_ASSERTIONS_ENABLED
 		desc.m_type = DescriptorType::kAccelerationStructure;
-		desc.m_flags = DescriptorFlag::kRead;
 #endif
 	}
 
@@ -313,7 +304,6 @@ private:
 
 #if ANKI_ASSERTIONS_ENABLED
 		DescriptorType m_type = DescriptorType::kCount;
-		DescriptorFlag m_flags = DescriptorFlag::kNone;
 #endif
 	};
 

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

@@ -513,7 +513,7 @@ void ShaderProgramImpl::rewriteSpirv(ShaderReflectionDescriptorRelated& refl, Gr
 				for(U32 i = 0; i < refl.m_bindingCounts[set]; ++i)
 				{
 					const ShaderReflectionBinding& x = refl.m_bindings[set][i];
-					if(x.m_registerBindingPoint == registerBindingPoint && hlslResourceType == descriptorTypeToHlslResourceType(x.m_type, x.m_flags))
+					if(x.m_registerBindingPoint == registerBindingPoint && hlslResourceType == descriptorTypeToHlslResourceType(x.m_type))
 					{
 						ANKI_ASSERT(foundBindingIdx == kMaxU32);
 						foundBindingIdx = i;

+ 8 - 8
AnKi/Renderer/Bloom.cpp

@@ -112,17 +112,17 @@ void Bloom::populateRenderGraph(RenderingContext& ctx)
 			const TextureSubresourceDesc inputTexSubresource =
 				TextureSubresourceDesc::surface(getRenderer().getDownscaleBlur().getMipmapCount() - 1, 0, 0);
 
-			cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_trilinearClamp.get());
-			rgraphCtx.bindTexture(ANKI_REG(t0), getRenderer().getDownscaleBlur().getRt(), inputTexSubresource);
+			cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_trilinearClamp.get());
+			rgraphCtx.bindSrv(0, 0, getRenderer().getDownscaleBlur().getRt(), inputTexSubresource);
 
 			const Vec4 consts(g_bloomThresholdCVar.get(), g_bloomScaleCVar.get(), 0.0f, 0.0f);
 			cmdb.setPushConstants(&consts, sizeof(consts));
 
-			rgraphCtx.bindTexture(ANKI_REG(u0), getRenderer().getTonemapping().getRt());
+			rgraphCtx.bindUav(0, 0, getRenderer().getTonemapping().getRt());
 
 			if(g_preferComputeCVar.get())
 			{
-				rgraphCtx.bindTexture(ANKI_REG(u1), m_runCtx.m_exposureRt);
+				rgraphCtx.bindUav(1, 0, m_runCtx.m_exposureRt);
 
 				dispatchPPCompute(cmdb, 8, 8, m_exposure.m_rtDescr.m_width, m_exposure.m_rtDescr.m_height);
 			}
@@ -167,13 +167,13 @@ void Bloom::populateRenderGraph(RenderingContext& ctx)
 
 			cmdb.bindShaderProgram(m_upscale.m_grProg.get());
 
-			cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_trilinearClamp.get());
-			rgraphCtx.bindTexture(ANKI_REG(t0), m_runCtx.m_exposureRt);
-			cmdb.bindTexture(ANKI_REG(t1), TextureView(&m_upscale.m_lensDirtImage->getTexture(), TextureSubresourceDesc::all()));
+			cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_trilinearClamp.get());
+			rgraphCtx.bindSrv(0, 0, m_runCtx.m_exposureRt);
+			cmdb.bindSrv(1, 0, TextureView(&m_upscale.m_lensDirtImage->getTexture(), TextureSubresourceDesc::all()));
 
 			if(g_preferComputeCVar.get())
 			{
-				rgraphCtx.bindTexture(ANKI_REG(u0), m_runCtx.m_upscaleRt);
+				rgraphCtx.bindUav(0, 0, m_runCtx.m_upscaleRt);
 
 				dispatchPPCompute(cmdb, 8, 8, m_upscale.m_rtDescr.m_width, m_upscale.m_rtDescr.m_height);
 			}

+ 8 - 8
AnKi/Renderer/ClusterBinning.cpp

@@ -87,10 +87,10 @@ void ClusterBinning::populateRenderGraph(RenderingContext& ctx)
 			for(GpuSceneNonRenderableObjectType type : EnumIterable<GpuSceneNonRenderableObjectType>())
 			{
 				const BufferView& buff = getRenderer().getPrimaryNonRenderableVisibility().getVisibleIndicesBuffer(type);
-				cmdb.bindStorageBuffer(Register(HlslResourceType::kSrv, U32(type)), buff);
+				cmdb.bindSrv(U32(type), 0, buff);
 			}
 
-			cmdb.bindStorageBuffer(ANKI_REG(u0), indirectArgsBuff);
+			cmdb.bindUav(0, 0, indirectArgsBuff);
 
 			cmdb.dispatchCompute(1, 1, 1);
 
@@ -116,7 +116,7 @@ void ClusterBinning::populateRenderGraph(RenderingContext& ctx)
 				cmdb.bindShaderProgram(m_binningGrProgs[type].get());
 
 				const BufferView& idsBuff = getRenderer().getPrimaryNonRenderableVisibility().getVisibleIndicesBuffer(type);
-				cmdb.bindStorageBuffer(ANKI_REG(t0), idsBuff);
+				cmdb.bindSrv(0, 0, idsBuff);
 
 				PtrSize objBufferOffset = 0;
 				PtrSize objBufferRange = 0;
@@ -158,8 +158,8 @@ void ClusterBinning::populateRenderGraph(RenderingContext& ctx)
 					objBufferRange = getAlignedRoundDown(elementSize, GpuSceneBuffer::getSingleton().getBufferView().getRange());
 				}
 
-				cmdb.bindStorageBuffer(ANKI_REG(t1), BufferView(&GpuSceneBuffer::getSingleton().getBuffer(), objBufferOffset, objBufferRange));
-				cmdb.bindStorageBuffer(ANKI_REG(u0), m_runCtx.m_clustersBuffer);
+				cmdb.bindSrv(1, 0, BufferView(&GpuSceneBuffer::getSingleton().getBuffer(), objBufferOffset, objBufferRange));
+				cmdb.bindUav(0, 0, m_runCtx.m_clustersBuffer);
 
 				struct ClusterBinningUniforms
 				{
@@ -270,11 +270,11 @@ void ClusterBinning::populateRenderGraph(RenderingContext& ctx)
 					objBufferRange = getAlignedRoundDown(objSize, GpuSceneBuffer::getSingleton().getBufferView().getRange());
 				}
 
-				cmdb.bindStorageBuffer(ANKI_REG(t0), BufferView(&GpuSceneBuffer::getSingleton().getBuffer(), objBufferOffset, objBufferRange));
-				cmdb.bindStorageBuffer(ANKI_REG(u0), m_runCtx.m_packedObjectsBuffers[type]);
+				cmdb.bindSrv(0, 0, BufferView(&GpuSceneBuffer::getSingleton().getBuffer(), objBufferOffset, objBufferRange));
+				cmdb.bindUav(0, 0, m_runCtx.m_packedObjectsBuffers[type]);
 
 				const BufferView& idsBuff = getRenderer().getPrimaryNonRenderableVisibility().getVisibleIndicesBuffer(type);
-				cmdb.bindStorageBuffer(ANKI_REG(t1), idsBuff);
+				cmdb.bindSrv(1, 0, idsBuff);
 
 				cmdb.dispatchComputeIndirect(BufferView(indirectArgsBuff).setOffset(indirectArgsBuffOffset).setRange(sizeof(DispatchIndirectArgs)));
 

+ 11 - 11
AnKi/Renderer/Dbg.cpp

@@ -135,12 +135,12 @@ void Dbg::drawNonRenderable(GpuSceneNonRenderableObjectType type, U32 objCount,
 	unis.m_camTrf = ctx.m_matrices.m_cameraTransform;
 	cmdb.setPushConstants(&unis, sizeof(unis));
 
-	cmdb.bindStorageBuffer(ANKI_REG(t1), getRenderer().getClusterBinning().getPackedObjectsBuffer(type));
-	cmdb.bindStorageBuffer(ANKI_REG(t2), getRenderer().getPrimaryNonRenderableVisibility().getVisibleIndicesBuffer(type));
+	cmdb.bindSrv(1, 0, getRenderer().getClusterBinning().getPackedObjectsBuffer(type));
+	cmdb.bindSrv(2, 0, getRenderer().getPrimaryNonRenderableVisibility().getVisibleIndicesBuffer(type));
 
-	cmdb.bindSampler(ANKI_REG(s1), getRenderer().getSamplers().m_trilinearRepeat.get());
-	cmdb.bindTexture(ANKI_REG(t3), TextureView(&image.getTexture(), TextureSubresourceDesc::all()));
-	cmdb.bindTexture(ANKI_REG(t4), TextureView(&m_spotLightImage->getTexture(), TextureSubresourceDesc::all()));
+	cmdb.bindSampler(1, 0, getRenderer().getSamplers().m_trilinearRepeat.get());
+	cmdb.bindSrv(3, 0, TextureView(&image.getTexture(), TextureSubresourceDesc::all()));
+	cmdb.bindSrv(4, 0, TextureView(&m_spotLightImage->getTexture(), TextureSubresourceDesc::all()));
 
 	cmdb.draw(PrimitiveTopology::kTriangles, 6, objCount);
 }
@@ -160,8 +160,8 @@ void Dbg::run(RenderPassWorkContext& rgraphCtx, const RenderingContext& ctx)
 	cmdb.setDepthCompareOperation((m_depthTestOn) ? CompareOperation::kLess : CompareOperation::kAlways);
 	cmdb.setLineWidth(2.0f);
 
-	cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_nearestNearestClamp.get());
-	rgraphCtx.bindTexture(ANKI_REG(t0), getRenderer().getGBuffer().getDepthRt());
+	cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_nearestNearestClamp.get());
+	rgraphCtx.bindSrv(0, 0, getRenderer().getGBuffer().getDepthRt());
 
 	// GBuffer renderables
 	{
@@ -187,12 +187,12 @@ void Dbg::run(RenderPassWorkContext& rgraphCtx, const RenderingContext& ctx)
 		cmdb.setVertexAttribute(VertexAttributeSemantic::kPosition, 0, Format::kR32G32B32_Sfloat, 0);
 		cmdb.bindIndexBuffer(BufferView(m_cubeIndicesBuffer.get()), IndexType::kU16);
 
-		cmdb.bindStorageBuffer(ANKI_REG(t1), GpuSceneArrays::RenderableBoundingVolumeGBuffer::getSingleton().getBufferView());
+		cmdb.bindSrv(1, 0, GpuSceneArrays::RenderableBoundingVolumeGBuffer::getSingleton().getBufferView());
 
 		BufferView indicesBuff;
 		BufferHandle dep;
 		getRenderer().getGBuffer().getVisibleAabbsBuffer(indicesBuff, dep);
-		cmdb.bindStorageBuffer(ANKI_REG(t2), indicesBuff);
+		cmdb.bindSrv(2, 0, indicesBuff);
 
 		cmdb.drawIndexed(PrimitiveTopology::kLines, 12 * 2, allAabbCount);
 	}
@@ -203,12 +203,12 @@ void Dbg::run(RenderPassWorkContext& rgraphCtx, const RenderingContext& ctx)
 
 		if(allAabbCount)
 		{
-			cmdb.bindStorageBuffer(ANKI_REG(t1), GpuSceneArrays::RenderableBoundingVolumeForward::getSingleton().getBufferView());
+			cmdb.bindSrv(1, 0, GpuSceneArrays::RenderableBoundingVolumeForward::getSingleton().getBufferView());
 
 			BufferView indicesBuff;
 			BufferHandle dep;
 			getRenderer().getForwardShading().getVisibleAabbsBuffer(indicesBuff, dep);
-			cmdb.bindStorageBuffer(ANKI_REG(t2), indicesBuff);
+			cmdb.bindSrv(2, 0, indicesBuff);
 
 			cmdb.drawIndexed(PrimitiveTopology::kLines, 12 * 2, allAabbCount);
 		}

+ 7 - 7
AnKi/Renderer/DepthDownscale.cpp

@@ -127,13 +127,13 @@ void DepthDownscale::populateRenderGraph(RenderingContext& ctx)
 					surface.m_mipmap = 0; // Put something random
 				}
 
-				rgraphCtx.bindTexture(Register(HlslResourceType::kUav, mip + 1), m_runCtx.m_rt, surface);
+				rgraphCtx.bindUav(mip + 1, 0, m_runCtx.m_rt, surface);
 			}
 
-			cmdb.bindStorageBuffer(ANKI_REG(u0), BufferView(m_counterBuffer.get(), 0, sizeof(U32)));
+			cmdb.bindUav(0, 0, BufferView(m_counterBuffer.get(), 0, sizeof(U32)));
 
-			cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_trilinearClamp.get());
-			rgraphCtx.bindTexture(ANKI_REG(t0), getRenderer().getGBuffer().getDepthRt());
+			cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_trilinearClamp.get());
+			rgraphCtx.bindSrv(0, 0, getRenderer().getGBuffer().getDepthRt());
 
 			cmdb.dispatchCompute(dispatchThreadGroupCountXY[0], dispatchThreadGroupCountXY[1], 1);
 		});
@@ -166,15 +166,15 @@ void DepthDownscale::populateRenderGraph(RenderingContext& ctx)
 				CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 
 				cmdb.bindShaderProgram(m_grProg.get());
-				cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_trilinearClamp.get());
+				cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_trilinearClamp.get());
 
 				if(mip == 0)
 				{
-					rgraphCtx.bindTexture(ANKI_REG(t0), getRenderer().getGBuffer().getDepthRt());
+					rgraphCtx.bindSrv(0, 0, getRenderer().getGBuffer().getDepthRt());
 				}
 				else
 				{
-					rgraphCtx.bindTexture(ANKI_REG(t0), m_runCtx.m_rt, TextureSubresourceDesc::surface(mip - 1, 0, 0));
+					rgraphCtx.bindSrv(0, 0, m_runCtx.m_rt, TextureSubresourceDesc::surface(mip - 1, 0, 0));
 				}
 
 				const UVec2 size = (getRenderer().getInternalResolution() / 2) >> mip;

+ 5 - 5
AnKi/Renderer/DownscaleBlur.cpp

@@ -119,25 +119,25 @@ void DownscaleBlur::run(U32 passIdx, RenderPassWorkContext& rgraphCtx)
 	const U32 vpWidth = m_rtTex->getWidth() >> passIdx;
 	const U32 vpHeight = m_rtTex->getHeight() >> passIdx;
 
-	cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_trilinearClamp.get());
+	cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_trilinearClamp.get());
 
 	if(passIdx > 0)
 	{
-		rgraphCtx.bindTexture(ANKI_REG(t0), m_runCtx.m_rt, TextureSubresourceDesc::surface(passIdx - 1, 0, 0));
+		rgraphCtx.bindSrv(0, 0, m_runCtx.m_rt, TextureSubresourceDesc::surface(passIdx - 1, 0, 0));
 	}
 	else
 	{
-		rgraphCtx.bindTexture(ANKI_REG(t0), getRenderer().getLightShading().getRt());
+		rgraphCtx.bindSrv(0, 0, getRenderer().getLightShading().getRt());
 	}
 
-	rgraphCtx.bindTexture(ANKI_REG(u0), getRenderer().getTonemapping().getRt());
+	rgraphCtx.bindUav(0, 0, getRenderer().getTonemapping().getRt());
 
 	if(g_preferComputeCVar.get())
 	{
 		const Vec4 fbSize(F32(vpWidth), F32(vpHeight), 0.0f, 0.0f);
 		cmdb.setPushConstants(&fbSize, sizeof(fbSize));
 
-		rgraphCtx.bindTexture(ANKI_REG(u1), m_runCtx.m_rt, TextureSubresourceDesc::surface(passIdx, 0, 0));
+		rgraphCtx.bindUav(1, 0, m_runCtx.m_rt, TextureSubresourceDesc::surface(passIdx, 0, 0));
 
 		dispatchPPCompute(cmdb, 8, 8, vpWidth, vpHeight);
 	}

+ 11 - 11
AnKi/Renderer/FinalComposite.cpp

@@ -133,20 +133,20 @@ void FinalComposite::run(RenderPassWorkContext& rgraphCtx)
 	// Bind stuff
 	if(!hasDebugRt)
 	{
-		cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_nearestNearestClamp.get());
-		cmdb.bindSampler(ANKI_REG(s1), getRenderer().getSamplers().m_trilinearClamp.get());
-		cmdb.bindSampler(ANKI_REG(s2), getRenderer().getSamplers().m_trilinearRepeat.get());
+		cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_nearestNearestClamp.get());
+		cmdb.bindSampler(1, 0, getRenderer().getSamplers().m_trilinearClamp.get());
+		cmdb.bindSampler(2, 0, getRenderer().getSamplers().m_trilinearRepeat.get());
 
-		rgraphCtx.bindTexture(ANKI_REG(t0), getRenderer().getScale().getTonemappedRt());
+		rgraphCtx.bindSrv(0, 0, getRenderer().getScale().getTonemappedRt());
 
-		rgraphCtx.bindTexture(ANKI_REG(t1), getRenderer().getBloom().getRt());
-		cmdb.bindTexture(ANKI_REG(t2), TextureView(&m_lut->getTexture(), TextureSubresourceDesc::all()));
-		rgraphCtx.bindTexture(ANKI_REG(t3), getRenderer().getMotionVectors().getMotionVectorsRt());
-		rgraphCtx.bindTexture(ANKI_REG(t4), getRenderer().getGBuffer().getDepthRt());
+		rgraphCtx.bindSrv(1, 0, getRenderer().getBloom().getRt());
+		cmdb.bindSrv(2, 0, TextureView(&m_lut->getTexture(), TextureSubresourceDesc::all()));
+		rgraphCtx.bindSrv(3, 0, getRenderer().getMotionVectors().getMotionVectorsRt());
+		rgraphCtx.bindSrv(4, 0, getRenderer().getGBuffer().getDepthRt());
 
 		if(dbgEnabled)
 		{
-			rgraphCtx.bindTexture(ANKI_REG(t5), getRenderer().getDbg().getRt());
+			rgraphCtx.bindSrv(5, 0, getRenderer().getDbg().getRt());
 		}
 
 		const UVec4 pc(g_motionBlurSamplesCVar.get(), floatBitsToUint(g_filmGrainStrengthCVar.get()), getRenderer().getFrameCount() & kMaxU32, 0);
@@ -154,14 +154,14 @@ void FinalComposite::run(RenderPassWorkContext& rgraphCtx)
 	}
 	else
 	{
-		cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_nearestNearestClamp.get());
+		cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_nearestNearestClamp.get());
 
 		U32 count = 0;
 		for(const RenderTargetHandle& handle : dbgRts)
 		{
 			if(handle.isValid())
 			{
-				rgraphCtx.bindTexture(Register(HlslResourceType::kSrv, count++), handle);
+				rgraphCtx.bindSrv(count++, 0, handle);
 			}
 		}
 	}

+ 12 - 12
AnKi/Renderer/ForwardShading.cpp

@@ -57,23 +57,23 @@ void ForwardShading::run(const RenderingContext& ctx, RenderPassWorkContext& rgr
 		cmdb.setBlendFactors(0, BlendFactor::kSrcAlpha, BlendFactor::kOneMinusSrcAlpha);
 
 		// Bind stuff
-		cmdb.bindSampler(ANKI_REG(ANKI_MATERIAL_REGISTER_LINEAR_CLAMP_SAMPLER), getRenderer().getSamplers().m_trilinearClamp.get());
-		cmdb.bindSampler(ANKI_REG(ANKI_MATERIAL_REGISTER_SHADOW_SAMPLER), getRenderer().getSamplers().m_trilinearClampShadow.get());
+		cmdb.bindSampler(ANKI_MATERIAL_REGISTER_LINEAR_CLAMP_SAMPLER, 0, getRenderer().getSamplers().m_trilinearClamp.get());
+		cmdb.bindSampler(ANKI_MATERIAL_REGISTER_SHADOW_SAMPLER, 0, getRenderer().getSamplers().m_trilinearClampShadow.get());
 
-		rgraphCtx.bindTexture(ANKI_REG(ANKI_MATERIAL_REGISTER_SCENE_DEPTH), getRenderer().getDepthDownscale().getRt(),
-							  DepthDownscale::kQuarterInternalResolution);
-		rgraphCtx.bindTexture(ANKI_REG(ANKI_MATERIAL_REGISTER_LIGHT_VOLUME), getRenderer().getVolumetricLightingAccumulation().getRt());
+		rgraphCtx.bindSrv(ANKI_MATERIAL_REGISTER_SCENE_DEPTH, 0, getRenderer().getDepthDownscale().getRt(),
+						  DepthDownscale::kQuarterInternalResolution);
+		rgraphCtx.bindSrv(ANKI_MATERIAL_REGISTER_LIGHT_VOLUME, 0, getRenderer().getVolumetricLightingAccumulation().getRt());
 
-		cmdb.bindUniformBuffer(ANKI_REG(ANKI_MATERIAL_REGISTER_CLUSTER_SHADING_UNIFORMS), ctx.m_globalRenderingUniformsBuffer);
+		cmdb.bindConstantBuffer(ANKI_MATERIAL_REGISTER_CLUSTER_SHADING_UNIFORMS, 0, ctx.m_globalRenderingUniformsBuffer);
 
-		cmdb.bindStorageBuffer(ANKI_REG(ANKI_MATERIAL_REGISTER_CLUSTER_SHADING_POINT_LIGHTS),
-							   getRenderer().getClusterBinning().getPackedObjectsBuffer(GpuSceneNonRenderableObjectType::kLight));
-		cmdb.bindStorageBuffer(ANKI_REG(ANKI_MATERIAL_REGISTER_CLUSTER_SHADING_SPOT_LIGHTS),
-							   getRenderer().getClusterBinning().getPackedObjectsBuffer(GpuSceneNonRenderableObjectType::kLight));
+		cmdb.bindSrv(ANKI_MATERIAL_REGISTER_CLUSTER_SHADING_POINT_LIGHTS, 0,
+					 getRenderer().getClusterBinning().getPackedObjectsBuffer(GpuSceneNonRenderableObjectType::kLight));
+		cmdb.bindSrv(ANKI_MATERIAL_REGISTER_CLUSTER_SHADING_SPOT_LIGHTS, 0,
+					 getRenderer().getClusterBinning().getPackedObjectsBuffer(GpuSceneNonRenderableObjectType::kLight));
 
-		rgraphCtx.bindTexture(ANKI_REG(ANKI_MATERIAL_REGISTER_SHADOW_ATLAS), getRenderer().getShadowMapping().getShadowmapRt());
+		rgraphCtx.bindSrv(ANKI_MATERIAL_REGISTER_SHADOW_ATLAS, 0, getRenderer().getShadowMapping().getShadowmapRt());
 
-		cmdb.bindStorageBuffer(ANKI_REG(ANKI_MATERIAL_REGISTER_CLUSTERS), getRenderer().getClusterBinning().getClustersBuffer());
+		cmdb.bindSrv(ANKI_MATERIAL_REGISTER_CLUSTERS, 0, getRenderer().getClusterBinning().getClustersBuffer());
 
 		// Draw
 		RenderableDrawerArguments args;

+ 6 - 6
AnKi/Renderer/GBufferPost.cpp

@@ -56,15 +56,15 @@ void GBufferPost::populateRenderGraph(RenderingContext& ctx)
 		cmdb.setBlendFactors(1, BlendFactor::kOne, BlendFactor::kSrcAlpha, BlendFactor::kZero, BlendFactor::kOne);
 
 		// Bind all
-		cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_nearestNearestClamp.get());
+		cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_nearestNearestClamp.get());
 
-		rgraphCtx.bindTexture(ANKI_REG(t0), getRenderer().getGBuffer().getDepthRt());
+		rgraphCtx.bindSrv(0, 0, getRenderer().getGBuffer().getDepthRt());
 
-		cmdb.bindSampler(ANKI_REG(s1), getRenderer().getSamplers().m_trilinearRepeat.get());
+		cmdb.bindSampler(1, 0, getRenderer().getSamplers().m_trilinearRepeat.get());
 
-		cmdb.bindUniformBuffer(ANKI_REG(b0), ctx.m_globalRenderingUniformsBuffer);
-		cmdb.bindStorageBuffer(ANKI_REG(t0), getRenderer().getClusterBinning().getPackedObjectsBuffer(GpuSceneNonRenderableObjectType::kDecal));
-		cmdb.bindStorageBuffer(ANKI_REG(t1), getRenderer().getClusterBinning().getClustersBuffer());
+		cmdb.bindConstantBuffer(0, 0, ctx.m_globalRenderingUniformsBuffer);
+		cmdb.bindSrv(0, 0, getRenderer().getClusterBinning().getPackedObjectsBuffer(GpuSceneNonRenderableObjectType::kDecal));
+		cmdb.bindSrv(1, 0, getRenderer().getClusterBinning().getClustersBuffer());
 
 		// Draw
 		cmdb.draw(PrimitiveTopology::kTriangles, 3);

+ 4 - 4
AnKi/Renderer/IndirectDiffuseProbes.cpp

@@ -448,15 +448,15 @@ void IndirectDiffuseProbes::populateRenderGraph(RenderingContext& rctx)
 				cmdb.bindShaderProgram(m_irradiance.m_grProg.get());
 
 				// Bind resources
-				cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_nearestNearestClamp.get());
-				rgraphCtx.bindTexture(ANKI_REG(t0), lightShadingRt);
+				cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_nearestNearestClamp.get());
+				rgraphCtx.bindSrv(0, 0, lightShadingRt);
 
 				for(U32 i = 0; i < kGBufferColorRenderTargetCount - 1; ++i)
 				{
-					rgraphCtx.bindTexture(Register(HlslResourceType::kSrv, i + 1), gbufferColorRts[i]);
+					rgraphCtx.bindSrv(i + 1, 0, gbufferColorRts[i]);
 				}
 
-				rgraphCtx.bindTexture(ANKI_REG(u0), irradianceVolume);
+				rgraphCtx.bindUav(0, 0, irradianceVolume);
 
 				class
 				{

+ 7 - 7
AnKi/Renderer/LensFlare.cpp

@@ -75,17 +75,17 @@ void LensFlare::populateRenderGraph(RenderingContext& ctx)
 		cmdb.setPushConstants(&ctx.m_matrices.m_viewProjectionJitter, sizeof(ctx.m_matrices.m_viewProjectionJitter));
 
 		// Write flare info
-		Vec4* flarePositions = allocateAndBindStorageBuffer<Vec4>(cmdb, ANKI_REG(t0), flareCount);
+		Vec4* flarePositions = allocateAndBindSrvStructuredBuffer<Vec4>(cmdb, 0, 0, flareCount);
 		for(const LensFlareComponent& comp : SceneGraph::getSingleton().getComponentArrays().getLensFlares())
 		{
 			*flarePositions = Vec4(comp.getWorldPosition(), 1.0f);
 			++flarePositions;
 		}
 
-		rgraphCtx.bindStorageBuffer(ANKI_REG(u0), m_runCtx.m_indirectBuffHandle);
+		rgraphCtx.bindUav(0, 0, m_runCtx.m_indirectBuffHandle);
 		// Bind neareset because you don't need high quality
-		cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_nearestNearestClamp.get());
-		rgraphCtx.bindTexture(ANKI_REG(t1), getRenderer().getDepthDownscale().getRt(), DepthDownscale::kEighthInternalResolution);
+		cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_nearestNearestClamp.get());
+		rgraphCtx.bindSrv(1, 0, getRenderer().getDepthDownscale().getRt(), DepthDownscale::kEighthInternalResolution);
 
 		cmdb.dispatchCompute(flareCount, 1, 1);
 	});
@@ -122,7 +122,7 @@ void LensFlare::runDrawFlares(const RenderingContext& ctx, CommandBuffer& cmdb)
 		U32 spritesCount = max<U32>(1, m_maxSpritesPerFlare);
 
 		// Get uniform memory
-		LensFlareSprite* tmpSprites = allocateAndBindStorageBuffer<LensFlareSprite>(cmdb, ANKI_REG(t0), spritesCount);
+		LensFlareSprite* tmpSprites = allocateAndBindSrvStructuredBuffer<LensFlareSprite>(cmdb, 0, 0, spritesCount);
 		WeakArray<LensFlareSprite> sprites(tmpSprites, spritesCount);
 
 		// misc
@@ -137,8 +137,8 @@ void LensFlare::runDrawFlares(const RenderingContext& ctx, CommandBuffer& cmdb)
 		++c;
 
 		// Render
-		cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_trilinearRepeat.get());
-		cmdb.bindTexture(ANKI_REG(t1), TextureView(&comp.getImage().getTexture(), TextureSubresourceDesc::all()));
+		cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_trilinearRepeat.get());
+		cmdb.bindSrv(1, 0, TextureView(&comp.getImage().getTexture(), TextureSubresourceDesc::all()));
 
 		cmdb.drawIndirect(PrimitiveTopology::kTriangleStrip, BufferView(m_runCtx.m_indirectBuff).incrementOffset(count * sizeof(DrawIndirectArgs)));
 

+ 26 - 28
AnKi/Renderer/LightShading.cpp

@@ -108,25 +108,23 @@ void LightShading::run(const RenderingContext& ctx, RenderPassWorkContext& rgrap
 		cmdb.setDepthWrite(false);
 
 		// Bind all
-		cmdb.bindUniformBuffer(ANKI_REG(b0), ctx.m_globalRenderingUniformsBuffer);
-		cmdb.bindStorageBuffer(ANKI_REG(t0), getRenderer().getClusterBinning().getPackedObjectsBuffer(GpuSceneNonRenderableObjectType::kLight));
-		cmdb.bindStorageBuffer(ANKI_REG(t1), getRenderer().getClusterBinning().getPackedObjectsBuffer(GpuSceneNonRenderableObjectType::kLight));
-		cmdb.bindStorageBuffer(ANKI_REG(t2),
-							   getRenderer().getClusterBinning().getPackedObjectsBuffer(GpuSceneNonRenderableObjectType::kGlobalIlluminationProbe));
-		cmdb.bindStorageBuffer(ANKI_REG(t3),
-							   getRenderer().getClusterBinning().getPackedObjectsBuffer(GpuSceneNonRenderableObjectType::kReflectionProbe));
-		cmdb.bindStorageBuffer(ANKI_REG(t4), getRenderer().getClusterBinning().getClustersBuffer());
-
-		cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_nearestNearestClamp.get());
-		cmdb.bindSampler(ANKI_REG(s1), getRenderer().getSamplers().m_trilinearClamp.get());
-		rgraphCtx.bindTexture(ANKI_REG(t5), getRenderer().getGBuffer().getColorRt(0));
-		rgraphCtx.bindTexture(ANKI_REG(t6), getRenderer().getGBuffer().getColorRt(1));
-		rgraphCtx.bindTexture(ANKI_REG(t7), getRenderer().getGBuffer().getColorRt(2));
-		rgraphCtx.bindTexture(ANKI_REG(t8), getRenderer().getGBuffer().getDepthRt());
-		rgraphCtx.bindTexture(ANKI_REG(t9), getRenderer().getShadowmapsResolve().getRt());
-		rgraphCtx.bindTexture(ANKI_REG(t10), getRenderer().getSsao().getRt());
-		rgraphCtx.bindTexture(ANKI_REG(t11), getRenderer().getSsr().getRt());
-		cmdb.bindTexture(ANKI_REG(t12), TextureView(&getRenderer().getProbeReflections().getIntegrationLut(), TextureSubresourceDesc::all()));
+		cmdb.bindConstantBuffer(0, 0, ctx.m_globalRenderingUniformsBuffer);
+		cmdb.bindSrv(0, 0, getRenderer().getClusterBinning().getPackedObjectsBuffer(GpuSceneNonRenderableObjectType::kLight));
+		cmdb.bindSrv(1, 0, getRenderer().getClusterBinning().getPackedObjectsBuffer(GpuSceneNonRenderableObjectType::kLight));
+		cmdb.bindSrv(2, 0, getRenderer().getClusterBinning().getPackedObjectsBuffer(GpuSceneNonRenderableObjectType::kGlobalIlluminationProbe));
+		cmdb.bindSrv(3, 0, getRenderer().getClusterBinning().getPackedObjectsBuffer(GpuSceneNonRenderableObjectType::kReflectionProbe));
+		cmdb.bindSrv(4, 0, getRenderer().getClusterBinning().getClustersBuffer());
+
+		cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_nearestNearestClamp.get());
+		cmdb.bindSampler(1, 0, getRenderer().getSamplers().m_trilinearClamp.get());
+		rgraphCtx.bindSrv(5, 0, getRenderer().getGBuffer().getColorRt(0));
+		rgraphCtx.bindSrv(6, 0, getRenderer().getGBuffer().getColorRt(1));
+		rgraphCtx.bindSrv(7, 0, getRenderer().getGBuffer().getColorRt(2));
+		rgraphCtx.bindSrv(8, 0, getRenderer().getGBuffer().getDepthRt());
+		rgraphCtx.bindSrv(9, 0, getRenderer().getShadowmapsResolve().getRt());
+		rgraphCtx.bindSrv(10, 0, getRenderer().getSsao().getRt());
+		rgraphCtx.bindSrv(11, 0, getRenderer().getSsr().getRt());
+		cmdb.bindSrv(12, 0, TextureView(&getRenderer().getProbeReflections().getIntegrationLut(), TextureSubresourceDesc::all()));
 
 		// Draw
 		drawQuad(cmdb);
@@ -175,16 +173,16 @@ void LightShading::run(const RenderingContext& ctx, RenderPassWorkContext& rgrap
 
 			cmdb.setPushConstants(&pc, sizeof(pc));
 
-			cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_trilinearRepeatAnisoResolutionScalingBias.get());
-			cmdb.bindTexture(ANKI_REG(t0), TextureView(&sky->getImageResource().getTexture(), TextureSubresourceDesc::all()));
+			cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_trilinearRepeatAnisoResolutionScalingBias.get());
+			cmdb.bindSrv(0, 0, TextureView(&sky->getImageResource().getTexture(), TextureSubresourceDesc::all()));
 		}
 		else
 		{
 			cmdb.bindShaderProgram(m_skybox.m_grProgs[2].get());
 
-			cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_trilinearClamp.get());
-			rgraphCtx.bindTexture(ANKI_REG(t0), getRenderer().getSky().getSkyLutRt());
-			cmdb.bindUniformBuffer(ANKI_REG(b0), ctx.m_globalRenderingUniformsBuffer);
+			cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_trilinearClamp.get());
+			rgraphCtx.bindSrv(0, 0, getRenderer().getSky().getSkyLutRt());
+			cmdb.bindConstantBuffer(0, 0, ctx.m_globalRenderingUniformsBuffer);
 		}
 
 		drawQuad(cmdb);
@@ -198,11 +196,11 @@ void LightShading::run(const RenderingContext& ctx, RenderPassWorkContext& rgrap
 		cmdb.bindShaderProgram(m_applyFog.m_grProg.get());
 
 		// Bind all
-		cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_nearestNearestClamp.get());
-		cmdb.bindSampler(ANKI_REG(s1), getRenderer().getSamplers().m_trilinearClamp.get());
+		cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_nearestNearestClamp.get());
+		cmdb.bindSampler(1, 0, getRenderer().getSamplers().m_trilinearClamp.get());
 
-		rgraphCtx.bindTexture(ANKI_REG(t0), getRenderer().getGBuffer().getDepthRt());
-		rgraphCtx.bindTexture(ANKI_REG(t1), getRenderer().getVolumetricFog().getRt());
+		rgraphCtx.bindSrv(0, 0, getRenderer().getGBuffer().getDepthRt());
+		rgraphCtx.bindSrv(1, 0, getRenderer().getVolumetricFog().getRt());
 
 		class PushConsts
 		{

+ 2 - 2
AnKi/Renderer/MainRenderer.cpp

@@ -118,8 +118,8 @@ Error MainRenderer::render(Texture* presentTex)
 			cmdb.setViewport(0, 0, m_swapchainResolution.x(), m_swapchainResolution.y());
 
 			cmdb.bindShaderProgram(m_blitGrProg.get());
-			cmdb.bindSampler(ANKI_REG(s0), m_r->getSamplers().m_trilinearClamp.get());
-			rgraphCtx.bindTexture(ANKI_REG(t0), m_runCtx.m_ctx->m_outRenderTarget);
+			cmdb.bindSampler(0, 0, m_r->getSamplers().m_trilinearClamp.get());
+			rgraphCtx.bindSrv(0, 0, m_runCtx.m_ctx->m_outRenderTarget);
 
 			cmdb.draw(PrimitiveTopology::kTriangles, 3);
 		});

+ 5 - 5
AnKi/Renderer/MotionVectors.cpp

@@ -71,9 +71,9 @@ void MotionVectors::populateRenderGraph(RenderingContext& ctx)
 
 		cmdb.bindShaderProgram(m_grProg.get());
 
-		cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_nearestNearestClamp.get());
-		rgraphCtx.bindTexture(ANKI_REG(t0), getRenderer().getGBuffer().getDepthRt());
-		rgraphCtx.bindTexture(ANKI_REG(t1), getRenderer().getGBuffer().getColorRt(3));
+		cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_nearestNearestClamp.get());
+		rgraphCtx.bindSrv(0, 0, getRenderer().getGBuffer().getDepthRt());
+		rgraphCtx.bindSrv(1, 0, getRenderer().getGBuffer().getColorRt(3));
 
 		class Uniforms
 		{
@@ -82,7 +82,7 @@ void MotionVectors::populateRenderGraph(RenderingContext& ctx)
 			Mat4 m_currentInvViewProjMat;
 			Mat4 m_prevViewProjMat;
 		} * pc;
-		pc = allocateAndBindConstants<Uniforms>(cmdb, ANKI_REG(b0));
+		pc = allocateAndBindConstants<Uniforms>(cmdb, 0, 0);
 
 		pc->m_currentViewProjMat = ctx.m_matrices.m_viewProjection;
 		pc->m_currentInvViewProjMat = ctx.m_matrices.m_invertedViewProjection;
@@ -90,7 +90,7 @@ void MotionVectors::populateRenderGraph(RenderingContext& ctx)
 
 		if(g_preferComputeCVar.get())
 		{
-			rgraphCtx.bindTexture(ANKI_REG(u0), m_runCtx.m_motionVectorsRtHandle);
+			rgraphCtx.bindUav(0, 0, m_runCtx.m_motionVectorsRtHandle);
 		}
 
 		if(g_preferComputeCVar.get())

+ 7 - 7
AnKi/Renderer/ProbeReflections.cpp

@@ -424,11 +424,11 @@ void ProbeReflections::populateRenderGraph(RenderingContext& rctx)
 
 			cmdb.bindShaderProgram(m_irradiance.m_grProg.get());
 
-			cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_nearestNearestClamp.get());
+			cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_nearestNearestClamp.get());
 
-			rgraphCtx.bindTexture(ANKI_REG(t0), probeTexture);
+			rgraphCtx.bindSrv(0, 0, probeTexture);
 
-			cmdb.bindStorageBuffer(ANKI_REG(u0), BufferView(m_irradiance.m_diceValuesBuff.get()));
+			cmdb.bindUav(0, 0, BufferView(m_irradiance.m_diceValuesBuff.get()));
 
 			cmdb.dispatchCompute(1, 1, 1);
 		});
@@ -455,18 +455,18 @@ void ProbeReflections::populateRenderGraph(RenderingContext& rctx)
 			cmdb.bindShaderProgram(m_irradianceToRefl.m_grProg.get());
 
 			// Bind resources
-			cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_nearestNearestClamp.get());
+			cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_nearestNearestClamp.get());
 
 			for(U32 i = 0; i < kGBufferColorRenderTargetCount - 1; ++i)
 			{
-				rgraphCtx.bindTexture(Register(HlslResourceType::kSrv, i), gbufferColorRts[i]);
+				rgraphCtx.bindSrv(i, 0, gbufferColorRts[i]);
 			}
 
-			cmdb.bindStorageBuffer(ANKI_REG(t3), BufferView(m_irradiance.m_diceValuesBuff.get()));
+			cmdb.bindSrv(3, 0, BufferView(m_irradiance.m_diceValuesBuff.get()));
 
 			for(U8 f = 0; f < 6; ++f)
 			{
-				rgraphCtx.bindTexture(Register(HlslResourceType::kUav, f), probeTexture, TextureSubresourceDesc::surface(0, f, 0));
+				rgraphCtx.bindUav(f, 0, probeTexture, TextureSubresourceDesc::surface(0, f, 0));
 			}
 
 			dispatchPPCompute(cmdb, 8, 8, m_lightShading.m_tileSize, m_lightShading.m_tileSize);

+ 1 - 1
AnKi/Renderer/Renderer.cpp

@@ -565,7 +565,7 @@ TexturePtr Renderer::createAndClearRenderTarget(const TextureInitInfo& inf, Text
 
 					const TextureView view(tex.get(), TextureSubresourceDesc::surface(mip, face, layer));
 
-					cmdb->bindTexture(ANKI_REG(u0), view);
+					cmdb->bindUav(0, 0, view);
 
 					const TextureBarrierInfo barrier = {view, TextureUsageBit::kNone, TextureUsageBit::kUavCompute};
 					cmdb->setPipelineBarrier({&barrier, 1}, {}, {});

+ 14 - 4
AnKi/Renderer/RendererObject.h

@@ -62,22 +62,32 @@ protected:
 	}
 
 	template<typename T>
-	static T* allocateAndBindConstants(CommandBuffer& cmdb, Register reg)
+	static T* allocateAndBindConstants(CommandBuffer& cmdb, U32 reg, U32 space)
 	{
 		T* ptr;
 		const RebarAllocation alloc = RebarTransientMemoryPool::getSingleton().allocateFrame(1, ptr);
 		ANKI_ASSERT(isAligned(alignof(T), ptrToNumber(ptr)));
-		cmdb.bindUniformBuffer(reg, alloc);
+		cmdb.bindConstantBuffer(reg, space, alloc);
 		return ptr;
 	}
 
 	template<typename T>
-	static T* allocateAndBindStorageBuffer(CommandBuffer& cmdb, Register reg, U32 count = 1)
+	static T* allocateAndBindSrvStructuredBuffer(CommandBuffer& cmdb, U32 reg, U32 space, U32 count = 1)
 	{
 		T* ptr;
 		const RebarAllocation alloc = RebarTransientMemoryPool::getSingleton().allocateFrame(count, ptr);
 		ANKI_ASSERT(isAligned(alignof(T), ptrToNumber(ptr)));
-		cmdb.bindStorageBuffer(reg, alloc);
+		cmdb.bindSrv(reg, space, alloc);
+		return ptr;
+	}
+
+	template<typename T>
+	static T* allocateAndBindUavStructuredBuffer(CommandBuffer& cmdb, U32 reg, U32 space, U32 count = 1)
+	{
+		T* ptr;
+		const RebarAllocation alloc = RebarTransientMemoryPool::getSingleton().allocateFrame(count, ptr);
+		ANKI_ASSERT(isAligned(alignof(T), ptrToNumber(ptr)));
+		cmdb.bindUav(reg, space, alloc);
 		return ptr;
 	}
 

+ 51 - 52
AnKi/Renderer/RtShadows.cpp

@@ -221,8 +221,8 @@ void RtShadows::populateRenderGraph(RenderingContext& ctx)
 
 			cmdb.bindShaderProgram(m_setupBuildSbtGrProg.get());
 
-			cmdb.bindStorageBuffer(ANKI_REG(t0), GpuSceneArrays::RenderableBoundingVolumeRt::getSingleton().getBufferView());
-			cmdb.bindStorageBuffer(ANKI_REG(u0), sbtBuildIndirectArgsBuffer);
+			cmdb.bindSrv(0, 0, GpuSceneArrays::RenderableBoundingVolumeRt::getSingleton().getBufferView());
+			cmdb.bindUav(0, 0, sbtBuildIndirectArgsBuffer);
 
 			cmdb.dispatchCompute(1, 1, 1);
 		});
@@ -260,11 +260,11 @@ void RtShadows::populateRenderGraph(RenderingContext& ctx)
 
 			cmdb.bindShaderProgram(m_buildSbtGrProg.get());
 
-			cmdb.bindStorageBuffer(ANKI_REG(t0), GpuSceneArrays::Renderable::getSingleton().getBufferView());
-			cmdb.bindStorageBuffer(ANKI_REG(t1), BufferView(&GpuSceneBuffer::getSingleton().getBuffer()));
-			cmdb.bindStorageBuffer(ANKI_REG(t2), visibleRenderableIndicesBuff);
-			cmdb.bindStorageBuffer(ANKI_REG(t3), BufferView(&m_rtLibraryGrProg->getShaderGroupHandlesGpuBuffer()));
-			cmdb.bindStorageBuffer(ANKI_REG(u0), sbtBuffer);
+			cmdb.bindSrv(0, 0, GpuSceneArrays::Renderable::getSingleton().getBufferView());
+			cmdb.bindSrv(1, 0, BufferView(&GpuSceneBuffer::getSingleton().getBuffer()));
+			cmdb.bindSrv(2, 0, visibleRenderableIndicesBuff);
+			cmdb.bindSrv(3, 0, BufferView(&m_rtLibraryGrProg->getShaderGroupHandlesGpuBuffer()));
+			cmdb.bindUav(0, 0, sbtBuffer);
 
 			RtShadowsSbtBuildUniforms unis = {};
 			ANKI_ASSERT(m_sbtRecordSize % 4 == 0);
@@ -308,37 +308,36 @@ void RtShadows::populateRenderGraph(RenderingContext& ctx)
 
 				memset(globalUniforms, 0, sizeof(*globalUniforms)); // Don't care for now
 
-				cmdb.bindUniformBuffer(ANKI_REG(ANKI_MATERIAL_REGISTER_GLOBAL_UNIFORMS), globalUniformsToken);
+				cmdb.bindConstantBuffer(ANKI_MATERIAL_REGISTER_GLOBAL_UNIFORMS, 0, globalUniformsToken);
 			}
 
 			// More globals
-			cmdb.bindSampler(ANKI_REG(ANKI_MATERIAL_REGISTER_TILINEAR_REPEAT_SAMPLER), getRenderer().getSamplers().m_trilinearRepeat.get());
-			cmdb.bindStorageBuffer(ANKI_REG(ANKI_MATERIAL_REGISTER_GPU_SCENE), GpuSceneBuffer::getSingleton().getBufferView());
+			cmdb.bindSampler(ANKI_MATERIAL_REGISTER_TILINEAR_REPEAT_SAMPLER, 0, getRenderer().getSamplers().m_trilinearRepeat.get());
+			cmdb.bindSrv(ANKI_MATERIAL_REGISTER_GPU_SCENE, 0, GpuSceneBuffer::getSingleton().getBufferView());
 
 #define ANKI_UNIFIED_GEOM_FORMAT(fmt, shaderType, reg) \
-	cmdb.bindTexelBuffer( \
-		ANKI_REG(reg), \
+	cmdb.bindSrv( \
+		reg, 0, \
 		BufferView(&UnifiedGeometryBuffer::getSingleton().getBuffer(), 0, \
 				   getAlignedRoundDown(getFormatInfo(Format::k##fmt).m_texelSize, UnifiedGeometryBuffer::getSingleton().getBuffer().getSize())), \
 		Format::k##fmt);
 #include <AnKi/Shaders/Include/UnifiedGeometryTypes.def.h>
 
-			cmdb.bindUniformBuffer(ANKI_REG2(b0, space2), ctx.m_globalRenderingUniformsBuffer);
+			cmdb.bindConstantBuffer(0, 2, ctx.m_globalRenderingUniformsBuffer);
 
-			cmdb.bindSampler(ANKI_REG2(s0, space2), getRenderer().getSamplers().m_trilinearRepeat.get());
+			cmdb.bindSampler(0, 2, getRenderer().getSamplers().m_trilinearRepeat.get());
 
-			rgraphCtx.bindTexture(ANKI_REG2(u0, space2), m_runCtx.m_intermediateShadowsRts[0]);
-			rgraphCtx.bindTexture(ANKI_REG2(t0, space2), m_runCtx.m_historyRt);
-			cmdb.bindSampler(ANKI_REG2(s1, space2), getRenderer().getSamplers().m_trilinearClamp.get());
-			rgraphCtx.bindTexture(ANKI_REG2(t1, space2), getRenderer().getDepthDownscale().getRt(), DepthDownscale::kQuarterInternalResolution);
-			rgraphCtx.bindTexture(ANKI_REG2(t2, space2), getRenderer().getMotionVectors().getMotionVectorsRt());
-			cmdb.bindTexture(ANKI_REG2(t3, space2), TextureView(m_dummyHistoryLenTex.get(), TextureSubresourceDesc::all()));
-			rgraphCtx.bindTexture(ANKI_REG2(t4, space2), getRenderer().getGBuffer().getColorRt(2));
-			rgraphCtx.bindAccelerationStructure(ANKI_REG2(t5, space2),
-												getRenderer().getAccelerationStructureBuilder().getAccelerationStructureHandle());
-			rgraphCtx.bindTexture(ANKI_REG2(t6, space2), m_runCtx.m_prevMomentsRt);
-			rgraphCtx.bindTexture(ANKI_REG2(u1, space2), m_runCtx.m_currentMomentsRt);
-			cmdb.bindTexture(ANKI_REG2(t7, space2), TextureView(&m_blueNoiseImage->getTexture(), TextureSubresourceDesc::all()));
+			rgraphCtx.bindUav(0, 2, m_runCtx.m_intermediateShadowsRts[0]);
+			rgraphCtx.bindSrv(0, 2, m_runCtx.m_historyRt);
+			cmdb.bindSampler(1, 2, getRenderer().getSamplers().m_trilinearClamp.get());
+			rgraphCtx.bindSrv(1, 2, getRenderer().getDepthDownscale().getRt(), DepthDownscale::kQuarterInternalResolution);
+			rgraphCtx.bindSrv(2, 2, getRenderer().getMotionVectors().getMotionVectorsRt());
+			cmdb.bindSrv(3, 2, TextureView(m_dummyHistoryLenTex.get(), TextureSubresourceDesc::all()));
+			rgraphCtx.bindSrv(4, 2, getRenderer().getGBuffer().getColorRt(2));
+			rgraphCtx.bindSrv(5, 2, getRenderer().getAccelerationStructureBuilder().getAccelerationStructureHandle());
+			rgraphCtx.bindSrv(6, 2, m_runCtx.m_prevMomentsRt);
+			rgraphCtx.bindUav(1, 2, m_runCtx.m_currentMomentsRt);
+			cmdb.bindSrv(7, 2, TextureView(&m_blueNoiseImage->getTexture(), TextureSubresourceDesc::all()));
 
 			cmdb.traceRays(sbtBuffer, m_sbtRecordSize, GpuSceneArrays::RenderableBoundingVolumeRt::getSingleton().getElementCount(), 1,
 						   getRenderer().getInternalResolution().x() / 2, getRenderer().getInternalResolution().y() / 2, 1);
@@ -397,15 +396,15 @@ void RtShadows::populateRenderGraph(RenderingContext& ctx)
 
 			cmdb.bindShaderProgram(m_svgfVarianceGrProg.get());
 
-			cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_trilinearClamp.get());
+			cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_trilinearClamp.get());
 
-			rgraphCtx.bindTexture(ANKI_REG(t0), m_runCtx.m_intermediateShadowsRts[0]);
-			rgraphCtx.bindTexture(ANKI_REG(t1), m_runCtx.m_currentMomentsRt);
-			cmdb.bindTexture(ANKI_REG(t2), TextureView(m_dummyHistoryLenTex.get(), TextureSubresourceDesc::all()));
-			rgraphCtx.bindTexture(ANKI_REG(t3), getRenderer().getDepthDownscale().getRt(), DepthDownscale::kQuarterInternalResolution);
+			rgraphCtx.bindSrv(0, 0, m_runCtx.m_intermediateShadowsRts[0]);
+			rgraphCtx.bindSrv(1, 0, m_runCtx.m_currentMomentsRt);
+			cmdb.bindSrv(2, 0, TextureView(m_dummyHistoryLenTex.get(), TextureSubresourceDesc::all()));
+			rgraphCtx.bindSrv(3, 0, getRenderer().getDepthDownscale().getRt(), DepthDownscale::kQuarterInternalResolution);
 
-			rgraphCtx.bindTexture(ANKI_REG(u0), m_runCtx.m_intermediateShadowsRts[1]);
-			rgraphCtx.bindTexture(ANKI_REG(u1), m_runCtx.m_varianceRts[1]);
+			rgraphCtx.bindUav(0, 0, m_runCtx.m_intermediateShadowsRts[1]);
+			rgraphCtx.bindUav(1, 0, m_runCtx.m_varianceRts[1]);
 
 			const Mat4& invProjMat = ctx.m_matrices.m_projectionJitter.getInverse();
 			cmdb.setPushConstants(&invProjMat, sizeof(invProjMat));
@@ -456,20 +455,20 @@ void RtShadows::populateRenderGraph(RenderingContext& ctx)
 					cmdb.bindShaderProgram(m_svgfAtrousGrProg.get());
 				}
 
-				cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_nearestNearestClamp.get());
+				cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_nearestNearestClamp.get());
 
-				rgraphCtx.bindTexture(ANKI_REG(t0), getRenderer().getDepthDownscale().getRt(), DepthDownscale::kQuarterInternalResolution);
-				rgraphCtx.bindTexture(ANKI_REG(t1), m_runCtx.m_intermediateShadowsRts[readRtIdx]);
-				rgraphCtx.bindTexture(ANKI_REG(t2), m_runCtx.m_varianceRts[readRtIdx]);
+				rgraphCtx.bindSrv(0, 0, getRenderer().getDepthDownscale().getRt(), DepthDownscale::kQuarterInternalResolution);
+				rgraphCtx.bindSrv(1, 0, m_runCtx.m_intermediateShadowsRts[readRtIdx]);
+				rgraphCtx.bindSrv(2, 0, m_runCtx.m_varianceRts[readRtIdx]);
 
 				if(!lastPass)
 				{
-					rgraphCtx.bindTexture(ANKI_REG(u0), m_runCtx.m_intermediateShadowsRts[!readRtIdx]);
-					rgraphCtx.bindTexture(ANKI_REG(u1), m_runCtx.m_varianceRts[!readRtIdx]);
+					rgraphCtx.bindUav(0, 0, m_runCtx.m_intermediateShadowsRts[!readRtIdx]);
+					rgraphCtx.bindUav(1, 0, m_runCtx.m_varianceRts[!readRtIdx]);
 				}
 				else
 				{
-					rgraphCtx.bindTexture(ANKI_REG(u0), m_runCtx.m_historyRt);
+					rgraphCtx.bindUav(0, 0, m_runCtx.m_historyRt);
 				}
 
 				const Mat4& invProjMat = ctx.m_matrices.m_projectionJitter.getInverse();
@@ -496,12 +495,12 @@ void RtShadows::populateRenderGraph(RenderingContext& ctx)
 
 			cmdb.bindShaderProgram(m_upscaleGrProg.get());
 
-			cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_trilinearClamp.get());
+			cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_trilinearClamp.get());
 
-			rgraphCtx.bindTexture(ANKI_REG(t0), m_runCtx.m_historyRt);
-			rgraphCtx.bindTexture(ANKI_REG(u0), m_runCtx.m_upscaledRt);
-			rgraphCtx.bindTexture(ANKI_REG(t1), getRenderer().getDepthDownscale().getRt(), DepthDownscale::kQuarterInternalResolution);
-			rgraphCtx.bindTexture(ANKI_REG(t2), getRenderer().getGBuffer().getDepthRt());
+			rgraphCtx.bindSrv(0, 0, m_runCtx.m_historyRt);
+			rgraphCtx.bindUav(0, 0, m_runCtx.m_upscaledRt);
+			rgraphCtx.bindSrv(1, 0, getRenderer().getDepthDownscale().getRt(), DepthDownscale::kQuarterInternalResolution);
+			rgraphCtx.bindSrv(2, 0, getRenderer().getGBuffer().getDepthRt());
 
 			dispatchPPCompute(cmdb, 8, 8, getRenderer().getInternalResolution().x(), getRenderer().getInternalResolution().y());
 		});
@@ -515,14 +514,14 @@ void RtShadows::runDenoise(const RenderingContext& ctx, RenderPassWorkContext& r
 
 	cmdb.bindShaderProgram((horizontal) ? m_grDenoiseHorizontalProg.get() : m_grDenoiseVerticalProg.get());
 
-	cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_nearestNearestClamp.get());
-	rgraphCtx.bindTexture(ANKI_REG(t0), m_runCtx.m_intermediateShadowsRts[(horizontal) ? 0 : 1]);
-	rgraphCtx.bindTexture(ANKI_REG(t1), getRenderer().getDepthDownscale().getRt(), DepthDownscale::kQuarterInternalResolution);
-	rgraphCtx.bindTexture(ANKI_REG(t2), getRenderer().getGBuffer().getColorRt(2));
-	rgraphCtx.bindTexture(ANKI_REG(t3), m_runCtx.m_currentMomentsRt);
-	cmdb.bindTexture(ANKI_REG(t4), TextureView(m_dummyHistoryLenTex.get(), TextureSubresourceDesc::all()));
+	cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_nearestNearestClamp.get());
+	rgraphCtx.bindSrv(0, 0, m_runCtx.m_intermediateShadowsRts[(horizontal) ? 0 : 1]);
+	rgraphCtx.bindSrv(1, 0, getRenderer().getDepthDownscale().getRt(), DepthDownscale::kQuarterInternalResolution);
+	rgraphCtx.bindSrv(2, 0, getRenderer().getGBuffer().getColorRt(2));
+	rgraphCtx.bindSrv(3, 0, m_runCtx.m_currentMomentsRt);
+	cmdb.bindSrv(4, 0, TextureView(m_dummyHistoryLenTex.get(), TextureSubresourceDesc::all()));
 
-	rgraphCtx.bindTexture(ANKI_REG(u0), (horizontal) ? m_runCtx.m_intermediateShadowsRts[1] : m_runCtx.m_historyRt);
+	rgraphCtx.bindUav(0, 0, (horizontal) ? m_runCtx.m_intermediateShadowsRts[1] : m_runCtx.m_historyRt);
 
 	RtShadowsDenoiseUniforms consts;
 	consts.m_invViewProjMat = ctx.m_matrices.m_invertedViewProjectionJitter;

+ 10 - 10
AnKi/Renderer/Scale.cpp

@@ -298,12 +298,12 @@ void Scale::runFsrOrBilinearScaling(RenderPassWorkContext& rgraphCtx)
 
 	cmdb.bindShaderProgram(m_scaleGrProg.get());
 
-	cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_trilinearClamp.get());
-	rgraphCtx.bindTexture(ANKI_REG(t0), inRt);
+	cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_trilinearClamp.get());
+	rgraphCtx.bindSrv(0, 0, inRt);
 
 	if(preferCompute)
 	{
-		rgraphCtx.bindTexture(ANKI_REG(u0), outRt);
+		rgraphCtx.bindUav(0, 0, outRt);
 	}
 
 	if(m_upscalingMethod == UpscalingMethod::kFsr)
@@ -363,12 +363,12 @@ void Scale::runRcasSharpening(RenderPassWorkContext& rgraphCtx)
 
 	cmdb.bindShaderProgram(m_sharpenGrProg.get());
 
-	cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_trilinearClamp.get());
-	rgraphCtx.bindTexture(ANKI_REG(t0), inRt);
+	cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_trilinearClamp.get());
+	rgraphCtx.bindSrv(0, 0, inRt);
 
 	if(preferCompute)
 	{
-		rgraphCtx.bindTexture(ANKI_REG(u0), outRt);
+		rgraphCtx.bindUav(0, 0, outRt);
 	}
 
 	class
@@ -434,10 +434,10 @@ void Scale::runTonemapping(RenderPassWorkContext& rgraphCtx)
 
 	cmdb.bindShaderProgram(m_tonemapGrProg.get());
 
-	cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_nearestNearestClamp.get());
-	rgraphCtx.bindTexture(ANKI_REG(t0), inRt);
+	cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_nearestNearestClamp.get());
+	rgraphCtx.bindSrv(0, 0, inRt);
 
-	rgraphCtx.bindTexture(ANKI_REG(u0), getRenderer().getTonemapping().getRt());
+	rgraphCtx.bindUav(0, 0, getRenderer().getTonemapping().getRt());
 
 	if(preferCompute)
 	{
@@ -450,7 +450,7 @@ void Scale::runTonemapping(RenderPassWorkContext& rgraphCtx)
 		pc.m_viewportSizeOverOne = 1.0f / Vec2(getRenderer().getPostProcessResolution());
 		pc.m_viewportSize = getRenderer().getPostProcessResolution();
 		cmdb.setPushConstants(&pc, sizeof(pc));
-		rgraphCtx.bindTexture(ANKI_REG(u1), outRt);
+		rgraphCtx.bindUav(1, 0, outRt);
 
 		dispatchPPCompute(cmdb, 8, 8, getRenderer().getPostProcessResolution().x(), getRenderer().getPostProcessResolution().y());
 	}

+ 10 - 11
AnKi/Renderer/ShadowMapping.cpp

@@ -556,17 +556,16 @@ BufferView ShadowMapping::createVetVisibilityPass(CString passName, const LightC
 		const UVec4 lightIndex(lightc.getGpuSceneLightAllocation().getIndex());
 		cmdb.setPushConstants(&lightIndex, sizeof(lightIndex));
 
-		cmdb.bindStorageBuffer(ANKI_REG(t0), hashBuff);
-		cmdb.bindStorageBuffer(ANKI_REG(u0), mdiBuff.isValid() ? mdiBuff : BufferView(&getRenderer().getDummyBuffer()).setRange(sizeof(U32)));
-		cmdb.bindStorageBuffer(ANKI_REG(u1), GpuSceneArrays::Light::getSingleton().getBufferView());
-		cmdb.bindStorageBuffer(ANKI_REG(u2), GpuSceneArrays::LightVisibleRenderablesHash::getSingleton().getBufferView());
-		cmdb.bindStorageBuffer(ANKI_REG(u3), clearTileIndirectArgs);
-		cmdb.bindStorageBuffer(ANKI_REG(u4), dispatchMeshIndirectArgs.isValid()
-												 ? dispatchMeshIndirectArgs
-												 : BufferView(&getRenderer().getDummyBuffer()).setRange(sizeof(DispatchIndirectArgs)));
-		cmdb.bindStorageBuffer(ANKI_REG(u5), drawIndirectArgs.isValid()
-												 ? drawIndirectArgs
-												 : BufferView(&getRenderer().getDummyBuffer()).setRange(sizeof(DrawIndirectArgs)));
+		cmdb.bindSrv(0, 0, hashBuff);
+		cmdb.bindUav(0, 0, mdiBuff.isValid() ? mdiBuff : BufferView(&getRenderer().getDummyBuffer()).setRange(sizeof(U32)));
+		cmdb.bindUav(1, 0, GpuSceneArrays::Light::getSingleton().getBufferView());
+		cmdb.bindUav(2, 0, GpuSceneArrays::LightVisibleRenderablesHash::getSingleton().getBufferView());
+		cmdb.bindUav(3, 0, clearTileIndirectArgs);
+		cmdb.bindUav(4, 0,
+					 dispatchMeshIndirectArgs.isValid() ? dispatchMeshIndirectArgs
+														: BufferView(&getRenderer().getDummyBuffer()).setRange(sizeof(DispatchIndirectArgs)));
+		cmdb.bindUav(5, 0,
+					 drawIndirectArgs.isValid() ? drawIndirectArgs : BufferView(&getRenderer().getDummyBuffer()).setRange(sizeof(DrawIndirectArgs)));
 
 		ANKI_ASSERT(RenderStateBucketContainer::getSingleton().getBucketCount(RenderingTechnique::kDepth) <= 64 && "TODO");
 		cmdb.dispatchCompute(1, 1, 1);

+ 13 - 13
AnKi/Renderer/ShadowmapsResolve.cpp

@@ -111,29 +111,29 @@ void ShadowmapsResolve::run(RenderPassWorkContext& rgraphCtx, RenderingContext&
 
 	cmdb.bindShaderProgram(m_grProg.get());
 
-	cmdb.bindUniformBuffer(ANKI_REG(b0), ctx.m_globalRenderingUniformsBuffer);
-	cmdb.bindStorageBuffer(ANKI_REG(t0), getRenderer().getClusterBinning().getPackedObjectsBuffer(GpuSceneNonRenderableObjectType::kLight));
-	cmdb.bindStorageBuffer(ANKI_REG(t1), getRenderer().getClusterBinning().getPackedObjectsBuffer(GpuSceneNonRenderableObjectType::kLight));
-	rgraphCtx.bindTexture(ANKI_REG(t2), getRenderer().getShadowMapping().getShadowmapRt());
-	cmdb.bindStorageBuffer(ANKI_REG(t3), getRenderer().getClusterBinning().getClustersBuffer());
+	cmdb.bindConstantBuffer(0, 0, ctx.m_globalRenderingUniformsBuffer);
+	cmdb.bindSrv(0, 0, getRenderer().getClusterBinning().getPackedObjectsBuffer(GpuSceneNonRenderableObjectType::kLight));
+	cmdb.bindSrv(1, 0, getRenderer().getClusterBinning().getPackedObjectsBuffer(GpuSceneNonRenderableObjectType::kLight));
+	rgraphCtx.bindSrv(2, 0, getRenderer().getShadowMapping().getShadowmapRt());
+	cmdb.bindSrv(3, 0, getRenderer().getClusterBinning().getClustersBuffer());
 
-	cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_trilinearClamp.get());
-	cmdb.bindSampler(ANKI_REG(s1), getRenderer().getSamplers().m_trilinearClampShadow.get());
-	cmdb.bindSampler(ANKI_REG(s2), getRenderer().getSamplers().m_trilinearRepeat.get());
+	cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_trilinearClamp.get());
+	cmdb.bindSampler(1, 0, getRenderer().getSamplers().m_trilinearClampShadow.get());
+	cmdb.bindSampler(2, 0, getRenderer().getSamplers().m_trilinearRepeat.get());
 
 	if(m_quarterRez)
 	{
-		rgraphCtx.bindTexture(ANKI_REG(t4), getRenderer().getDepthDownscale().getRt(), DepthDownscale::kQuarterInternalResolution);
+		rgraphCtx.bindSrv(4, 0, getRenderer().getDepthDownscale().getRt(), DepthDownscale::kQuarterInternalResolution);
 	}
 	else
 	{
-		rgraphCtx.bindTexture(ANKI_REG(t4), getRenderer().getGBuffer().getDepthRt());
+		rgraphCtx.bindSrv(4, 0, getRenderer().getGBuffer().getDepthRt());
 	}
-	cmdb.bindTexture(ANKI_REG(t5), TextureView(&m_noiseImage->getTexture(), TextureSubresourceDesc::all()));
+	cmdb.bindSrv(5, 0, TextureView(&m_noiseImage->getTexture(), TextureSubresourceDesc::all()));
 
 	if(getRenderer().getRtShadowsEnabled())
 	{
-		rgraphCtx.bindTexture(ANKI_REG(t6), getRenderer().getRtShadows().getRt());
+		rgraphCtx.bindSrv(6, 0, getRenderer().getRtShadows().getRt());
 	}
 
 	if(g_preferComputeCVar.get() || g_shadowMappingPcfCVar.get())
@@ -144,7 +144,7 @@ void ShadowmapsResolve::run(RenderPassWorkContext& rgraphCtx, RenderingContext&
 
 	if(g_preferComputeCVar.get())
 	{
-		rgraphCtx.bindTexture(ANKI_REG(u0), m_runCtx.m_rt);
+		rgraphCtx.bindUav(0, 0, m_runCtx.m_rt);
 		dispatchPPCompute(cmdb, 8, 8, m_rtDescr.m_width, m_rtDescr.m_height);
 	}
 	else

+ 11 - 11
AnKi/Renderer/Sky.cpp

@@ -112,7 +112,7 @@ void Sky::populateRenderGraph(RenderingContext& ctx)
 
 			cmdb.bindShaderProgram(m_transmittanceLutGrProg.get());
 
-			rgraphCtx.bindTexture(ANKI_REG(u0), transmittanceLutRt);
+			rgraphCtx.bindUav(0, 0, transmittanceLutRt);
 
 			dispatchPPCompute(cmdb, 8, 8, kTransmittanceLutSize.x(), kTransmittanceLutSize.y());
 		});
@@ -133,9 +133,9 @@ void Sky::populateRenderGraph(RenderingContext& ctx)
 
 			cmdb.bindShaderProgram(m_multipleScatteringLutGrProg.get());
 
-			rgraphCtx.bindTexture(ANKI_REG(t0), transmittanceLutRt);
-			cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_trilinearClamp.get());
-			rgraphCtx.bindTexture(ANKI_REG(u0), multipleScatteringLutRt);
+			rgraphCtx.bindSrv(0, 0, transmittanceLutRt);
+			cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_trilinearClamp.get());
+			rgraphCtx.bindUav(0, 0, multipleScatteringLutRt);
 
 			dispatchPPCompute(cmdb, 8, 8, kMultipleScatteringLutSize.x(), kMultipleScatteringLutSize.y());
 		});
@@ -157,11 +157,11 @@ void Sky::populateRenderGraph(RenderingContext& ctx)
 
 			cmdb.bindShaderProgram(m_skyLutGrProg.get());
 
-			rgraphCtx.bindTexture(ANKI_REG(t0), transmittanceLutRt);
-			rgraphCtx.bindTexture(ANKI_REG(t1), multipleScatteringLutRt);
-			cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_trilinearClamp.get());
-			rgraphCtx.bindTexture(ANKI_REG(u0), m_runCtx.m_skyLutRt);
-			cmdb.bindUniformBuffer(ANKI_REG(b0), ctx.m_globalRenderingUniformsBuffer);
+			rgraphCtx.bindSrv(0, 0, transmittanceLutRt);
+			rgraphCtx.bindSrv(1, 0, multipleScatteringLutRt);
+			cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_trilinearClamp.get());
+			rgraphCtx.bindUav(0, 0, m_runCtx.m_skyLutRt);
+			cmdb.bindConstantBuffer(0, 0, ctx.m_globalRenderingUniformsBuffer);
 
 			dispatchPPCompute(cmdb, 8, 8, kSkyLutSize.x(), kSkyLutSize.y());
 		});
@@ -180,8 +180,8 @@ void Sky::populateRenderGraph(RenderingContext& ctx)
 
 			cmdb.bindShaderProgram(m_computeSunColorGrProg.get());
 
-			rgraphCtx.bindTexture(ANKI_REG(t0), transmittanceLutRt);
-			cmdb.bindStorageBuffer(ANKI_REG(u0), ctx.m_globalRenderingUniformsBuffer);
+			rgraphCtx.bindSrv(0, 0, transmittanceLutRt);
+			cmdb.bindUav(0, 0, ctx.m_globalRenderingUniformsBuffer);
 
 			cmdb.dispatchCompute(1, 1, 1);
 		});

+ 15 - 16
AnKi/Renderer/Ssao.cpp

@@ -130,13 +130,12 @@ void Ssao::populateRenderGraph(RenderingContext& ctx)
 
 			cmdb.bindShaderProgram(m_grProg.get());
 
-			rgraphCtx.bindTexture(ANKI_REG(t0), getRenderer().getGBuffer().getColorRt(2));
-			rgraphCtx.bindTexture(ANKI_REG(t1),
-								  (g_ssaoQuarterRez.get()) ? getRenderer().getDepthDownscale().getRt() : getRenderer().getGBuffer().getDepthRt());
+			rgraphCtx.bindSrv(0, 0, getRenderer().getGBuffer().getColorRt(2));
+			rgraphCtx.bindSrv(1, 0, (g_ssaoQuarterRez.get()) ? getRenderer().getDepthDownscale().getRt() : getRenderer().getGBuffer().getDepthRt());
 
-			cmdb.bindTexture(ANKI_REG(t2), TextureView(&m_noiseImage->getTexture(), TextureSubresourceDesc::all()));
-			cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_trilinearRepeat.get());
-			cmdb.bindSampler(ANKI_REG(s1), getRenderer().getSamplers().m_trilinearClamp.get());
+			cmdb.bindSrv(2, 0, TextureView(&m_noiseImage->getTexture(), TextureSubresourceDesc::all()));
+			cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_trilinearRepeat.get());
+			cmdb.bindSampler(1, 0, getRenderer().getSamplers().m_trilinearClamp.get());
 
 			const UVec2 rez = (g_ssaoQuarterRez.get()) ? getRenderer().getInternalResolution() / 2u : getRenderer().getInternalResolution();
 
@@ -156,7 +155,7 @@ void Ssao::populateRenderGraph(RenderingContext& ctx)
 
 			if(g_preferComputeCVar.get())
 			{
-				rgraphCtx.bindTexture(ANKI_REG(u0), finalRt);
+				rgraphCtx.bindUav(0, 0, finalRt);
 
 				dispatchPPCompute(cmdb, 8, 8, rez.x(), rez.y());
 			}
@@ -194,9 +193,9 @@ void Ssao::populateRenderGraph(RenderingContext& ctx)
 
 			cmdb.bindShaderProgram(m_spatialDenoiseGrProg.get());
 
-			cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_trilinearClamp.get());
-			rgraphCtx.bindTexture(ANKI_REG(t0), finalRt);
-			rgraphCtx.bindTexture(ANKI_REG(t1), getRenderer().getGBuffer().getDepthRt());
+			cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_trilinearClamp.get());
+			rgraphCtx.bindSrv(0, 0, finalRt);
+			rgraphCtx.bindSrv(1, 0, getRenderer().getGBuffer().getDepthRt());
 
 			const UVec2 rez = (g_ssaoQuarterRez.get()) ? getRenderer().getInternalResolution() / 2u : getRenderer().getInternalResolution();
 
@@ -207,7 +206,7 @@ void Ssao::populateRenderGraph(RenderingContext& ctx)
 
 			if(g_preferComputeCVar.get())
 			{
-				rgraphCtx.bindTexture(ANKI_REG(u0), bentNormalsAndSsaoTempRt);
+				rgraphCtx.bindUav(0, 0, bentNormalsAndSsaoTempRt);
 				dispatchPPCompute(cmdb, 8, 8, rez.x(), rez.y());
 			}
 			else
@@ -244,16 +243,16 @@ void Ssao::populateRenderGraph(RenderingContext& ctx)
 
 			cmdb.bindShaderProgram(m_tempralDenoiseGrProg.get());
 
-			cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_trilinearClamp.get());
-			rgraphCtx.bindTexture(ANKI_REG(t0), bentNormalsAndSsaoTempRt);
-			rgraphCtx.bindTexture(ANKI_REG(t1), historyRt);
-			rgraphCtx.bindTexture(ANKI_REG(t2), getRenderer().getMotionVectors().getMotionVectorsRt());
+			cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_trilinearClamp.get());
+			rgraphCtx.bindSrv(0, 0, bentNormalsAndSsaoTempRt);
+			rgraphCtx.bindSrv(1, 0, historyRt);
+			rgraphCtx.bindSrv(2, 0, getRenderer().getMotionVectors().getMotionVectorsRt());
 
 			const UVec2 rez = (g_ssaoQuarterRez.get()) ? getRenderer().getInternalResolution() / 2u : getRenderer().getInternalResolution();
 
 			if(g_preferComputeCVar.get())
 			{
-				rgraphCtx.bindTexture(ANKI_REG(u0), finalRt);
+				rgraphCtx.bindUav(0, 0, finalRt);
 				dispatchPPCompute(cmdb, 8, 8, rez.x(), rez.y());
 			}
 			else

+ 7 - 7
AnKi/Renderer/Ssr.cpp

@@ -126,17 +126,17 @@ void Ssr::populateRenderGraph(RenderingContext& ctx)
 		consts.m_unprojectionParameters = ctx.m_matrices.m_unprojectionParameters;
 		consts.m_prevViewProjMatMulInvViewProjMat = ctx.m_prevMatrices.m_viewProjection * ctx.m_matrices.m_viewProjectionJitter.getInverse();
 		consts.m_normalMat = Mat3x4(Vec3(0.0f), ctx.m_matrices.m_view.getRotationPart());
-		*allocateAndBindConstants<SsrUniforms>(cmdb, ANKI_REG(b0)) = consts;
+		*allocateAndBindConstants<SsrUniforms>(cmdb, 0, 0) = consts;
 
-		cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_trilinearClamp.get());
-		rgraphCtx.bindTexture(ANKI_REG(t0), getRenderer().getGBuffer().getColorRt(1));
-		rgraphCtx.bindTexture(ANKI_REG(t1), getRenderer().getGBuffer().getColorRt(2));
-		rgraphCtx.bindTexture(ANKI_REG(t2), getRenderer().getDepthDownscale().getRt());
-		rgraphCtx.bindTexture(ANKI_REG(t3), getRenderer().getDownscaleBlur().getRt());
+		cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_trilinearClamp.get());
+		rgraphCtx.bindSrv(0, 0, getRenderer().getGBuffer().getColorRt(1));
+		rgraphCtx.bindSrv(1, 0, getRenderer().getGBuffer().getColorRt(2));
+		rgraphCtx.bindSrv(2, 0, getRenderer().getDepthDownscale().getRt());
+		rgraphCtx.bindSrv(3, 0, getRenderer().getDownscaleBlur().getRt());
 
 		if(g_preferComputeCVar.get())
 		{
-			rgraphCtx.bindTexture(ANKI_REG(u0), m_runCtx.m_ssrRt);
+			rgraphCtx.bindUav(0, 0, m_runCtx.m_ssrRt);
 			dispatchPPCompute(cmdb, 8, 8, rez.x(), rez.y());
 		}
 		else

+ 7 - 7
AnKi/Renderer/TemporalAA.cpp

@@ -113,16 +113,16 @@ void TemporalAA::populateRenderGraph(RenderingContext& ctx)
 
 		cmdb.bindShaderProgram(m_grProg.get());
 
-		cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_trilinearClamp.get());
-		rgraphCtx.bindTexture(ANKI_REG(t0), getRenderer().getLightShading().getRt());
-		rgraphCtx.bindTexture(ANKI_REG(t1), m_runCtx.m_historyRt);
-		rgraphCtx.bindTexture(ANKI_REG(t2), getRenderer().getMotionVectors().getMotionVectorsRt());
-		rgraphCtx.bindTexture(ANKI_REG(u0), getRenderer().getTonemapping().getRt());
+		cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_trilinearClamp.get());
+		rgraphCtx.bindSrv(0, 0, getRenderer().getLightShading().getRt());
+		rgraphCtx.bindSrv(1, 0, m_runCtx.m_historyRt);
+		rgraphCtx.bindSrv(2, 0, getRenderer().getMotionVectors().getMotionVectorsRt());
+		rgraphCtx.bindUav(0, 0, getRenderer().getTonemapping().getRt());
 
 		if(g_preferComputeCVar.get())
 		{
-			rgraphCtx.bindTexture(ANKI_REG(u1), m_runCtx.m_renderRt);
-			rgraphCtx.bindTexture(ANKI_REG(u2), m_runCtx.m_tonemappedRt);
+			rgraphCtx.bindUav(1, 0, m_runCtx.m_renderRt);
+			rgraphCtx.bindUav(2, 0, m_runCtx.m_tonemappedRt);
 
 			dispatchPPCompute(cmdb, 8, 8, getRenderer().getInternalResolution().x(), getRenderer().getInternalResolution().y());
 		}

+ 2 - 2
AnKi/Renderer/Tonemapping.cpp

@@ -62,8 +62,8 @@ void Tonemapping::populateRenderGraph(RenderingContext& ctx)
 		CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 
 		cmdb.bindShaderProgram(m_grProg.get());
-		rgraphCtx.bindTexture(ANKI_REG(u0), m_runCtx.m_exposureLuminanceHandle);
-		rgraphCtx.bindTexture(ANKI_REG(t0), getRenderer().getDownscaleBlur().getRt(), TextureSubresourceDesc::surface(m_inputTexMip, 0, 0));
+		rgraphCtx.bindUav(0, 0, m_runCtx.m_exposureLuminanceHandle);
+		rgraphCtx.bindSrv(0, 0, getRenderer().getDownscaleBlur().getRt(), TextureSubresourceDesc::surface(m_inputTexMip, 0, 0));
 
 		cmdb.dispatchCompute(1, 1, 1);
 	});

+ 14 - 14
AnKi/Renderer/Utils/Drawer.cpp

@@ -44,36 +44,36 @@ void RenderableDrawer::setState(const RenderableDrawerArguments& args, CommandBu
 		ANKI_ASSERT(args.m_viewport != UVec4(0u));
 		globalUniforms->m_viewport = Vec4(args.m_viewport);
 
-		cmdb.bindUniformBuffer(ANKI_REG(ANKI_MATERIAL_REGISTER_GLOBAL_UNIFORMS), globalUniformsToken);
+		cmdb.bindConstantBuffer(ANKI_MATERIAL_REGISTER_GLOBAL_UNIFORMS, 0, globalUniformsToken);
 	}
 
 	// More globals
-	cmdb.bindSampler(ANKI_REG(ANKI_MATERIAL_REGISTER_TILINEAR_REPEAT_SAMPLER), args.m_sampler);
-	cmdb.bindStorageBuffer(ANKI_REG(ANKI_MATERIAL_REGISTER_GPU_SCENE), GpuSceneBuffer::getSingleton().getBufferView());
+	cmdb.bindSampler(ANKI_MATERIAL_REGISTER_TILINEAR_REPEAT_SAMPLER, 0, args.m_sampler);
+	cmdb.bindSrv(ANKI_MATERIAL_REGISTER_GPU_SCENE, 0, GpuSceneBuffer::getSingleton().getBufferView());
 
 #define ANKI_UNIFIED_GEOM_FORMAT(fmt, shaderType, reg) \
-	cmdb.bindTexelBuffer( \
-		ANKI_REG(reg), \
+	cmdb.bindSrv( \
+		reg, 0, \
 		BufferView(&UnifiedGeometryBuffer::getSingleton().getBuffer(), 0, \
 				   getAlignedRoundDown(getFormatInfo(Format::k##fmt).m_texelSize, UnifiedGeometryBuffer::getSingleton().getBuffer().getSize())), \
 		Format::k##fmt);
 #include <AnKi/Shaders/Include/UnifiedGeometryTypes.def.h>
 
-	cmdb.bindStorageBuffer(ANKI_REG(ANKI_MATERIAL_REGISTER_MESHLET_BOUNDING_VOLUMES), UnifiedGeometryBuffer::getSingleton().getBufferView());
-	cmdb.bindStorageBuffer(ANKI_REG(ANKI_MATERIAL_REGISTER_MESHLET_GEOMETRY_DESCRIPTORS), UnifiedGeometryBuffer::getSingleton().getBufferView());
+	cmdb.bindSrv(ANKI_MATERIAL_REGISTER_MESHLET_BOUNDING_VOLUMES, 0, UnifiedGeometryBuffer::getSingleton().getBufferView());
+	cmdb.bindSrv(ANKI_MATERIAL_REGISTER_MESHLET_GEOMETRY_DESCRIPTORS, 0, UnifiedGeometryBuffer::getSingleton().getBufferView());
 	if(args.m_mesh.m_meshletInstancesBuffer.isValid())
 	{
-		cmdb.bindStorageBuffer(ANKI_REG(ANKI_MATERIAL_REGISTER_MESHLET_INSTANCES), args.m_mesh.m_meshletInstancesBuffer);
+		cmdb.bindSrv(ANKI_MATERIAL_REGISTER_MESHLET_INSTANCES, 0, args.m_mesh.m_meshletInstancesBuffer);
 	}
-	cmdb.bindStorageBuffer(ANKI_REG(ANKI_MATERIAL_REGISTER_RENDERABLES), GpuSceneArrays::Renderable::getSingleton().getBufferView());
-	cmdb.bindStorageBuffer(ANKI_REG(ANKI_MATERIAL_REGISTER_MESH_LODS), GpuSceneArrays::MeshLod::getSingleton().getBufferView());
-	cmdb.bindStorageBuffer(ANKI_REG(ANKI_MATERIAL_REGISTER_TRANSFORMS), GpuSceneArrays::Transform::getSingleton().getBufferView());
-	cmdb.bindStorageBuffer(ANKI_REG(ANKI_MATERIAL_REGISTER_PARTICLE_EMITTERS), GpuSceneArrays::ParticleEmitter::getSingleton().getBufferViewSafe());
-	cmdb.bindSampler(ANKI_REG(ANKI_MATERIAL_REGISTER_NEAREST_CLAMP_SAMPLER), getRenderer().getSamplers().m_nearestNearestClamp.get());
+	cmdb.bindSrv(ANKI_MATERIAL_REGISTER_RENDERABLES, 0, GpuSceneArrays::Renderable::getSingleton().getBufferView());
+	cmdb.bindSrv(ANKI_MATERIAL_REGISTER_MESH_LODS, 0, GpuSceneArrays::MeshLod::getSingleton().getBufferView());
+	cmdb.bindSrv(ANKI_MATERIAL_REGISTER_TRANSFORMS, 0, GpuSceneArrays::Transform::getSingleton().getBufferView());
+	cmdb.bindSrv(ANKI_MATERIAL_REGISTER_PARTICLE_EMITTERS, 0, GpuSceneArrays::ParticleEmitter::getSingleton().getBufferViewSafe());
+	cmdb.bindSampler(ANKI_MATERIAL_REGISTER_NEAREST_CLAMP_SAMPLER, 0, getRenderer().getSamplers().m_nearestNearestClamp.get());
 
 	if(args.m_mesh.m_firstMeshletBuffer.isValid())
 	{
-		cmdb.bindStorageBuffer(ANKI_REG(ANKI_MATERIAL_REGISTER_FIRST_MESHLET), args.m_mesh.m_firstMeshletBuffer);
+		cmdb.bindSrv(ANKI_MATERIAL_REGISTER_FIRST_MESHLET, 0, args.m_mesh.m_firstMeshletBuffer);
 	}
 
 	// Misc

+ 69 - 70
AnKi/Renderer/Utils/GpuVisibility.cpp

@@ -636,37 +636,37 @@ void GpuVisibility::populateRenderGraphInternal(Bool distanceBased, BaseGpuVisib
 				ANKI_ASSERT(0);
 			}
 
-			cmdb.bindStorageBuffer(ANKI_REG(t0), aabbsBuffer);
-			cmdb.bindStorageBuffer(ANKI_REG(t1), GpuSceneArrays::Renderable::getSingleton().getBufferView());
-			cmdb.bindStorageBuffer(ANKI_REG(t2), GpuSceneArrays::MeshLod::getSingleton().getBufferView());
-			cmdb.bindStorageBuffer(ANKI_REG(t3), GpuSceneArrays::Transform::getSingleton().getBufferView());
-			cmdb.bindStorageBuffer(ANKI_REG(t4), GpuSceneArrays::ParticleEmitter::getSingleton().getBufferViewSafe());
+			cmdb.bindSrv(0, 0, aabbsBuffer);
+			cmdb.bindSrv(1, 0, GpuSceneArrays::Renderable::getSingleton().getBufferView());
+			cmdb.bindSrv(2, 0, GpuSceneArrays::MeshLod::getSingleton().getBufferView());
+			cmdb.bindSrv(3, 0, GpuSceneArrays::Transform::getSingleton().getBufferView());
+			cmdb.bindSrv(4, 0, GpuSceneArrays::ParticleEmitter::getSingleton().getBufferViewSafe());
 
-			cmdb.bindStorageBuffer(ANKI_REG(u0), stage1Mem.m_counters);
+			cmdb.bindUav(0, 0, stage1Mem.m_counters);
 
-			cmdb.bindStorageBuffer(ANKI_REG(u1), (bLegacyRendering) ? stage1Mem.m_visibleRenderables : BufferView(&getRenderer().getDummyBuffer()));
-			cmdb.bindStorageBuffer(ANKI_REG(u2), (bMeshletRendering) ? stage1Mem.m_visibleMeshlets : BufferView(&getRenderer().getDummyBuffer()));
+			cmdb.bindUav(1, 0, (bLegacyRendering) ? stage1Mem.m_visibleRenderables : BufferView(&getRenderer().getDummyBuffer()));
+			cmdb.bindUav(2, 0, (bMeshletRendering) ? stage1Mem.m_visibleMeshlets : BufferView(&getRenderer().getDummyBuffer()));
 
-			cmdb.bindStorageBuffer(ANKI_REG(u3), (bLegacyRendering) ? stage1Mem.m_renderablePrefixSums : BufferView(&getRenderer().getDummyBuffer()));
-			cmdb.bindStorageBuffer(ANKI_REG(u4), (bMeshletRendering) ? stage1Mem.m_meshletPrefixSums : BufferView(&getRenderer().getDummyBuffer()));
+			cmdb.bindUav(3, 0, (bLegacyRendering) ? stage1Mem.m_renderablePrefixSums : BufferView(&getRenderer().getDummyBuffer()));
+			cmdb.bindUav(4, 0, (bMeshletRendering) ? stage1Mem.m_meshletPrefixSums : BufferView(&getRenderer().getDummyBuffer()));
 
-			cmdb.bindStorageBuffer(ANKI_REG(u5), stage1Mem.m_gpuVisIndirectDispatchArgs);
+			cmdb.bindUav(5, 0, stage1Mem.m_gpuVisIndirectDispatchArgs);
 
-			cmdb.bindStorageBuffer(ANKI_REG(u6), m_outOfMemoryReadbackBuffer);
+			cmdb.bindUav(6, 0, m_outOfMemoryReadbackBuffer);
 
 			if(gatherAabbIndices)
 			{
-				cmdb.bindStorageBuffer(ANKI_REG(u7), stage1Mem.m_visibleAabbIndices);
+				cmdb.bindUav(7, 0, stage1Mem.m_visibleAabbIndices);
 			}
 
 			if(genHash)
 			{
-				cmdb.bindStorageBuffer(ANKI_REG(u8), stage1Mem.m_hash);
+				cmdb.bindUav(8, 0, stage1Mem.m_hash);
 			}
 
 			if(frustumTestData)
 			{
-				FrustumGpuVisibilityUniforms* unis = allocateAndBindConstants<FrustumGpuVisibilityUniforms>(cmdb, ANKI_REG(b0));
+				FrustumGpuVisibilityUniforms* unis = allocateAndBindConstants<FrustumGpuVisibilityUniforms>(cmdb, 0, 0);
 
 				Array<Plane, 6> planes;
 				extractClipPlanes(frustumTestData->m_viewProjMat, planes);
@@ -687,8 +687,8 @@ void GpuVisibility::populateRenderGraphInternal(Bool distanceBased, BaseGpuVisib
 
 				if(frustumTestData->m_hzbRt.isValid())
 				{
-					rpass.bindTexture(ANKI_REG(t5), frustumTestData->m_hzbRt);
-					cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_nearestNearestClamp.get());
+					rpass.bindSrv(5, 0, frustumTestData->m_hzbRt);
+					cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_nearestNearestClamp.get());
 				}
 			}
 			else
@@ -730,16 +730,16 @@ void GpuVisibility::populateRenderGraphInternal(Bool distanceBased, BaseGpuVisib
 			{
 				cmdb.bindShaderProgram(m_gatherGrProg.get());
 
-				cmdb.bindStorageBuffer(ANKI_REG(t0), GpuSceneArrays::Renderable::getSingleton().getBufferView());
-				cmdb.bindStorageBuffer(ANKI_REG(t1), GpuSceneArrays::ParticleEmitter::getSingleton().getBufferViewSafe());
-				cmdb.bindStorageBuffer(ANKI_REG(t2), GpuSceneArrays::MeshLod::getSingleton().getBufferView());
+				cmdb.bindSrv(0, 0, GpuSceneArrays::Renderable::getSingleton().getBufferView());
+				cmdb.bindSrv(1, 0, GpuSceneArrays::ParticleEmitter::getSingleton().getBufferViewSafe());
+				cmdb.bindSrv(2, 0, GpuSceneArrays::MeshLod::getSingleton().getBufferView());
 
-				cmdb.bindStorageBuffer(ANKI_REG(t3), stage1Mem.m_visibleRenderables);
-				cmdb.bindStorageBuffer(ANKI_REG(t4), stage1Mem.m_counters);
-				cmdb.bindStorageBuffer(ANKI_REG(t5), stage1Mem.m_renderablePrefixSums);
+				cmdb.bindSrv(3, 0, stage1Mem.m_visibleRenderables);
+				cmdb.bindSrv(4, 0, stage1Mem.m_counters);
+				cmdb.bindSrv(5, 0, stage1Mem.m_renderablePrefixSums);
 
 				UVec2* firstDrawIndirectArgAndCount =
-					allocateAndBindStorageBuffer<UVec2>(cmdb, ANKI_REG(t6), out.m_legacy.m_bucketIndirectArgsRanges.getSize());
+					allocateAndBindSrvStructuredBuffer<UVec2>(cmdb, 6, 0, out.m_legacy.m_bucketIndirectArgsRanges.getSize());
 				for(U32 ibucket = 0; ibucket < out.m_legacy.m_bucketIndirectArgsRanges.getSize(); ++ibucket)
 				{
 					firstDrawIndirectArgAndCount->x() = out.m_legacy.m_bucketIndirectArgsRanges[ibucket].m_firstInstance;
@@ -747,13 +747,13 @@ void GpuVisibility::populateRenderGraphInternal(Bool distanceBased, BaseGpuVisib
 					++firstDrawIndirectArgAndCount;
 				}
 
-				cmdb.bindStorageBuffer(ANKI_REG(u0), stage2Mem.m_legacy.m_instanceRateRenderables);
-				cmdb.bindStorageBuffer(ANKI_REG(u1), stage2Mem.m_legacy.m_drawIndexedIndirectArgs);
-				cmdb.bindStorageBuffer(ANKI_REG(u2), stage2Mem.m_legacy.m_drawIndexedIndirectArgs);
+				cmdb.bindUav(0, 0, stage2Mem.m_legacy.m_instanceRateRenderables);
+				cmdb.bindUav(1, 0, stage2Mem.m_legacy.m_drawIndexedIndirectArgs);
+				cmdb.bindUav(2, 0, stage2Mem.m_legacy.m_drawIndexedIndirectArgs);
 
-				cmdb.bindStorageBuffer(ANKI_REG(u3), stage2Mem.m_legacy.m_mdiDrawCounts);
+				cmdb.bindUav(3, 0, stage2Mem.m_legacy.m_mdiDrawCounts);
 
-				cmdb.bindStorageBuffer(ANKI_REG(u4), m_outOfMemoryReadbackBuffer);
+				cmdb.bindUav(4, 0, m_outOfMemoryReadbackBuffer);
 
 				cmdb.dispatchComputeIndirect(
 					BufferView(stage1Mem.m_gpuVisIndirectDispatchArgs)
@@ -769,32 +769,31 @@ void GpuVisibility::populateRenderGraphInternal(Bool distanceBased, BaseGpuVisib
 
 				cmdb.bindShaderProgram(m_meshletGrProgs[hzbTex][passthrough][meshShaders][bStoreMeshletsFailedHzb].get());
 
-				cmdb.bindStorageBuffer(ANKI_REG(t0), GpuSceneArrays::Renderable::getSingleton().getBufferView());
-				cmdb.bindStorageBuffer(ANKI_REG(t1), GpuSceneArrays::MeshLod::getSingleton().getBufferView());
-				cmdb.bindStorageBuffer(ANKI_REG(t2), GpuSceneArrays::Transform::getSingleton().getBufferView());
+				cmdb.bindSrv(0, 0, GpuSceneArrays::Renderable::getSingleton().getBufferView());
+				cmdb.bindSrv(1, 0, GpuSceneArrays::MeshLod::getSingleton().getBufferView());
+				cmdb.bindSrv(2, 0, GpuSceneArrays::Transform::getSingleton().getBufferView());
 
-				cmdb.bindStorageBuffer(ANKI_REG(t3), UnifiedGeometryBuffer::getSingleton().getBufferView());
+				cmdb.bindSrv(3, 0, UnifiedGeometryBuffer::getSingleton().getBufferView());
 
 				if(hzbTex)
 				{
-					rpass.bindTexture(ANKI_REG(t4), frustumTestData->m_hzbRt);
-					cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_nearestNearestClamp.get());
+					rpass.bindSrv(4, 0, frustumTestData->m_hzbRt);
+					cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_nearestNearestClamp.get());
 				}
 
-				cmdb.bindStorageBuffer(ANKI_REG(u0), stage1Mem.m_counters);
-				cmdb.bindStorageBuffer(ANKI_REG(t5), stage1Mem.m_meshletPrefixSums);
-				cmdb.bindStorageBuffer(ANKI_REG(t6), stage1Mem.m_visibleMeshlets);
+				cmdb.bindUav(0, 0, stage1Mem.m_counters);
+				cmdb.bindSrv(5, 0, stage1Mem.m_meshletPrefixSums);
+				cmdb.bindSrv(6, 0, stage1Mem.m_visibleMeshlets);
 
-				cmdb.bindStorageBuffer(ANKI_REG(u1), (bHwMeshletRendering) ? stage2Mem.m_meshlet.m_dispatchMeshIndirectArgs
-																		   : stage2Mem.m_meshlet.m_indirectDrawArgs);
-				cmdb.bindStorageBuffer(ANKI_REG(u2), stage2Mem.m_meshlet.m_meshletInstances);
+				cmdb.bindUav(1, 0, (bHwMeshletRendering) ? stage2Mem.m_meshlet.m_dispatchMeshIndirectArgs : stage2Mem.m_meshlet.m_indirectDrawArgs);
+				cmdb.bindUav(2, 0, stage2Mem.m_meshlet.m_meshletInstances);
 
-				cmdb.bindStorageBuffer(ANKI_REG(u3), m_outOfMemoryReadbackBuffer);
+				cmdb.bindUav(3, 0, m_outOfMemoryReadbackBuffer);
 
 				if(bStoreMeshletsFailedHzb)
 				{
-					cmdb.bindStorageBuffer(ANKI_REG(u4), stage2Mem.m_meshlet.m_meshletsFailedHzb);
-					cmdb.bindStorageBuffer(ANKI_REG(u5), stage1Mem.m_gpuVisIndirectDispatchArgs);
+					cmdb.bindUav(4, 0, stage2Mem.m_meshlet.m_meshletsFailedHzb);
+					cmdb.bindUav(5, 0, stage1Mem.m_gpuVisIndirectDispatchArgs);
 				}
 
 				if(!passthrough)
@@ -858,23 +857,23 @@ void GpuVisibility::populateRenderGraphStage3(FrustumGpuVisibilityInput& in, Gpu
 		const Bool bStoreMeshletsFailedHzb = false;
 		cmdb.bindShaderProgram(m_meshletGrProgs[hzbTex][passthrough][bHwMeshletRendering][bStoreMeshletsFailedHzb].get());
 
-		cmdb.bindStorageBuffer(ANKI_REG(t0), GpuSceneArrays::Renderable::getSingleton().getBufferView());
-		cmdb.bindStorageBuffer(ANKI_REG(t1), GpuSceneArrays::MeshLod::getSingleton().getBufferView());
-		cmdb.bindStorageBuffer(ANKI_REG(t2), GpuSceneArrays::Transform::getSingleton().getBufferView());
+		cmdb.bindSrv(0, 0, GpuSceneArrays::Renderable::getSingleton().getBufferView());
+		cmdb.bindSrv(1, 0, GpuSceneArrays::MeshLod::getSingleton().getBufferView());
+		cmdb.bindSrv(2, 0, GpuSceneArrays::Transform::getSingleton().getBufferView());
 
-		cmdb.bindStorageBuffer(ANKI_REG(t3), UnifiedGeometryBuffer::getSingleton().getBufferView());
+		cmdb.bindSrv(3, 0, UnifiedGeometryBuffer::getSingleton().getBufferView());
 
-		rpass.bindTexture(ANKI_REG(t4), hzbRt);
-		cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_nearestNearestClamp.get());
+		rpass.bindSrv(4, 0, hzbRt);
+		cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_nearestNearestClamp.get());
 
-		cmdb.bindStorageBuffer(ANKI_REG(u0), stage1And2Mem.m_counters);
-		cmdb.bindStorageBuffer(ANKI_REG(t5), stage1And2Mem.m_meshletPrefixSums);
-		cmdb.bindStorageBuffer(ANKI_REG(t6), stage1And2Mem.m_meshletsFailedHzb);
+		cmdb.bindUav(0, 0, stage1And2Mem.m_counters);
+		cmdb.bindSrv(5, 0, stage1And2Mem.m_meshletPrefixSums);
+		cmdb.bindSrv(6, 0, stage1And2Mem.m_meshletsFailedHzb);
 
-		cmdb.bindStorageBuffer(ANKI_REG(u1), (bHwMeshletRendering) ? stage3Mem.m_dispatchMeshIndirectArgs : stage3Mem.m_indirectDrawArgs);
-		cmdb.bindStorageBuffer(ANKI_REG(u2), stage3Mem.m_meshletInstances);
+		cmdb.bindUav(1, 0, (bHwMeshletRendering) ? stage3Mem.m_dispatchMeshIndirectArgs : stage3Mem.m_indirectDrawArgs);
+		cmdb.bindUav(2, 0, stage3Mem.m_meshletInstances);
 
-		cmdb.bindStorageBuffer(ANKI_REG(u3), m_outOfMemoryReadbackBuffer);
+		cmdb.bindUav(3, 0, m_outOfMemoryReadbackBuffer);
 
 		GpuVisibilityMeshletUniforms consts;
 		consts.m_viewProjectionMatrix = in.m_viewProjectionMatrix;
@@ -1040,7 +1039,7 @@ void GpuVisibilityNonRenderables::populateRenderGraph(GpuVisibilityNonRenderable
 		default:
 			ANKI_ASSERT(0);
 		}
-		cmdb.bindStorageBuffer(ANKI_REG(t0), objBuffer);
+		cmdb.bindSrv(0, 0, objBuffer);
 
 		GpuVisibilityNonRenderableUniforms unis;
 		Array<Plane, 6> planes;
@@ -1051,12 +1050,12 @@ void GpuVisibilityNonRenderables::populateRenderGraph(GpuVisibilityNonRenderable
 		}
 		cmdb.setPushConstants(&unis, sizeof(unis));
 
-		rgraph.bindStorageBuffer(ANKI_REG(u0), visibleIndicesBuffHandle);
-		cmdb.bindStorageBuffer(ANKI_REG(u1), BufferView(counterBuffer.get(), counterBufferOffset, sizeof(U32) * kCountersPerDispatch));
+		rgraph.bindUav(0, 0, visibleIndicesBuffHandle);
+		cmdb.bindUav(1, 0, BufferView(counterBuffer.get(), counterBufferOffset, sizeof(U32) * kCountersPerDispatch));
 
 		if(needsFeedback)
 		{
-			cmdb.bindStorageBuffer(ANKI_REG(u2), feedbackBuffer);
+			cmdb.bindUav(2, 0, feedbackBuffer);
 		}
 
 		dispatchPPCompute(cmdb, 64, 1, objCount, 1);
@@ -1133,14 +1132,14 @@ void GpuVisibilityAccelerationStructures::pupulateRenderGraph(GpuVisibilityAccel
 
 			cmdb.setPushConstants(&unis, sizeof(unis));
 
-			cmdb.bindStorageBuffer(ANKI_REG(t0), GpuSceneArrays::RenderableBoundingVolumeRt::getSingleton().getBufferView());
-			cmdb.bindStorageBuffer(ANKI_REG(t1), GpuSceneArrays::Renderable::getSingleton().getBufferView());
-			cmdb.bindStorageBuffer(ANKI_REG(t2), GpuSceneArrays::MeshLod::getSingleton().getBufferView());
-			cmdb.bindStorageBuffer(ANKI_REG(t3), GpuSceneArrays::Transform::getSingleton().getBufferView());
-			cmdb.bindStorageBuffer(ANKI_REG(u0), instancesBuff);
-			cmdb.bindStorageBuffer(ANKI_REG(u1), indicesBuff);
-			cmdb.bindStorageBuffer(ANKI_REG(u2), BufferView(m_counterBuffer.get(), 0, sizeof(U32) * 2));
-			cmdb.bindStorageBuffer(ANKI_REG(u3), zeroInstancesDispatchArgsBuff);
+			cmdb.bindSrv(0, 0, GpuSceneArrays::RenderableBoundingVolumeRt::getSingleton().getBufferView());
+			cmdb.bindSrv(1, 0, GpuSceneArrays::Renderable::getSingleton().getBufferView());
+			cmdb.bindSrv(2, 0, GpuSceneArrays::MeshLod::getSingleton().getBufferView());
+			cmdb.bindSrv(3, 0, GpuSceneArrays::Transform::getSingleton().getBufferView());
+			cmdb.bindUav(0, 0, instancesBuff);
+			cmdb.bindUav(1, 0, indicesBuff);
+			cmdb.bindUav(2, 0, BufferView(m_counterBuffer.get(), 0, sizeof(U32) * 2));
+			cmdb.bindUav(3, 0, zeroInstancesDispatchArgsBuff);
 
 			const U32 aabbCount = GpuSceneArrays::RenderableBoundingVolumeRt::getSingleton().getElementCount();
 			dispatchPPCompute(cmdb, 64, 1, aabbCount, 1);
@@ -1160,8 +1159,8 @@ void GpuVisibilityAccelerationStructures::pupulateRenderGraph(GpuVisibilityAccel
 
 			cmdb.bindShaderProgram(m_zeroRemainingInstancesGrProg.get());
 
-			cmdb.bindStorageBuffer(ANKI_REG(t0), indicesBuff);
-			cmdb.bindStorageBuffer(ANKI_REG(U0), instancesBuff);
+			cmdb.bindSrv(0, 0, indicesBuff);
+			cmdb.bindUav(0, 0, instancesBuff);
 
 			cmdb.dispatchComputeIndirect(zeroInstancesDispatchArgsBuff);
 		});

+ 11 - 12
AnKi/Renderer/Utils/HzbGenerator.cpp

@@ -103,7 +103,7 @@ void HzbGenerator::populateRenderGraphInternal(ConstWeakArray<DispatchInput> dis
 		CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 
 		cmdb.bindShaderProgram(m_genPyramidGrProg.get());
-		cmdb.bindSampler(ANKI_REG(s0), m_maxSampler.isCreated() ? m_maxSampler.get() : getRenderer().getSamplers().m_trilinearClamp.get());
+		cmdb.bindSampler(0, 0, m_maxSampler.isCreated() ? m_maxSampler.get() : getRenderer().getSamplers().m_trilinearClamp.get());
 
 		for(U32 dispatch = 0; dispatch < dispatchCount; ++dispatch)
 		{
@@ -133,7 +133,6 @@ void HzbGenerator::populateRenderGraphInternal(ConstWeakArray<DispatchInput> dis
 
 			cmdb.setPushConstants(&pc, sizeof(pc));
 
-			Register mipsReg(ANKI_REG(u1));
 			for(U32 mip = 0; mip < kMaxMipsSinglePassDownsamplerCanProduce; ++mip)
 			{
 				TextureSubresourceDesc subresource = TextureSubresourceDesc::firstSurface();
@@ -146,14 +145,14 @@ void HzbGenerator::populateRenderGraphInternal(ConstWeakArray<DispatchInput> dis
 					subresource.m_mipmap = 0; // Put something random
 				}
 
-				rgraphCtx.bindTexture(mipsReg, in.m_dstHzbRt, subresource);
-				++mipsReg.m_bindPoint;
+				rgraphCtx.bindUav(1 + mip, 0, in.m_dstHzbRt, subresource);
 			}
 
-			cmdb.bindStorageBuffer(ANKI_REG(u0), BufferView(m_counterBuffer.get())
-													 .incrementOffset((counterBufferElement + dispatch) * m_counterBufferElementSize)
-													 .setRange(sizeof(U32)));
-			rgraphCtx.bindTexture(ANKI_REG(t0), in.m_srcDepthRt, TextureSubresourceDesc::firstSurface(DepthStencilAspectBit::kDepth));
+			cmdb.bindUav(0, 0,
+						 BufferView(m_counterBuffer.get())
+							 .incrementOffset((counterBufferElement + dispatch) * m_counterBufferElementSize)
+							 .setRange(sizeof(U32)));
+			rgraphCtx.bindSrv(0, 0, in.m_srcDepthRt, TextureSubresourceDesc::firstSurface(DepthStencilAspectBit::kDepth));
 
 			cmdb.dispatchCompute(dispatchThreadGroupCountXY[0], dispatchThreadGroupCountXY[1], 1);
 		}
@@ -196,9 +195,9 @@ void HzbGenerator::populateRenderGraphDirectionalLight(const HzbDirectionalLight
 		pass.setWork([this, depthBufferRt = in.m_depthBufferRt, maxDepthRt, maxDepthRtSize](RenderPassWorkContext& rgraphCtx) {
 			CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 
-			rgraphCtx.bindTexture(ANKI_REG(t0), depthBufferRt, TextureSubresourceDesc::firstSurface(DepthStencilAspectBit::kDepth));
-			cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_trilinearClamp.get());
-			rgraphCtx.bindTexture(ANKI_REG(u0), maxDepthRt);
+			rgraphCtx.bindSrv(0, 0, depthBufferRt, TextureSubresourceDesc::firstSurface(DepthStencilAspectBit::kDepth));
+			cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_trilinearClamp.get());
+			rgraphCtx.bindUav(0, 0, maxDepthRt);
 
 			cmdb.bindShaderProgram(m_maxDepthGrProg.get());
 
@@ -270,7 +269,7 @@ void HzbGenerator::populateRenderGraphDirectionalLight(const HzbDirectionalLight
 
 			cmdb.bindShaderProgram(m_maxBoxGrProg.get());
 
-			rgraphCtx.bindTexture(ANKI_REG(t0), maxDepthRt);
+			rgraphCtx.bindSrv(0, 0, maxDepthRt);
 
 			struct Uniforms
 			{

+ 2 - 2
AnKi/Renderer/Utils/MipmapGenerator.cpp

@@ -45,8 +45,8 @@ void MipmapGenerator::populateRenderGraph(const MipmapGeneratorTargetArguments&
 					cmdb.bindShaderProgram(m_genMipsGrProg.get());
 					cmdb.setViewport(0, 0, viewport.x(), viewport.y());
 
-					rgraphCtx.bindTexture(ANKI_REG(t0), rt, TextureSubresourceDesc::surface(readMip, face, layer));
-					cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_trilinearClamp.get());
+					rgraphCtx.bindSrv(0, 0, rt, TextureSubresourceDesc::surface(readMip, face, layer));
+					cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_trilinearClamp.get());
 
 					drawQuad(cmdb);
 				});

+ 20 - 21
AnKi/Renderer/Utils/TraditionalDeferredShading.cpp

@@ -59,8 +59,8 @@ void TraditionalDeferredLightShading::drawLights(TraditionalDeferredLightShading
 	{
 		cmdb.bindShaderProgram(m_skyboxGrProgs[skyc->getSkyboxType()].get());
 
-		cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_nearestNearestClamp.get());
-		rgraphCtx.bindTexture(ANKI_REG(t0), info.m_gbufferDepthRenderTarget, info.m_gbufferDepthRenderTargetSubresource);
+		cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_nearestNearestClamp.get());
+		rgraphCtx.bindSrv(0, 0, info.m_gbufferDepthRenderTarget, info.m_gbufferDepthRenderTargetSubresource);
 
 		TraditionalDeferredSkyboxUniforms unis = {};
 		unis.m_invertedViewProjectionMat = info.m_invViewProjectionMatrix;
@@ -74,16 +74,16 @@ void TraditionalDeferredLightShading::drawLights(TraditionalDeferredLightShading
 		}
 		else if(skyc->getSkyboxType() == SkyboxType::kImage2D)
 		{
-			cmdb.bindSampler(ANKI_REG(s1), getRenderer().getSamplers().m_trilinearRepeatAniso.get());
-			cmdb.bindTexture(ANKI_REG(t1), TextureView(&skyc->getImageResource().getTexture(), TextureSubresourceDesc::all()));
+			cmdb.bindSampler(1, 0, getRenderer().getSamplers().m_trilinearRepeatAniso.get());
+			cmdb.bindSrv(1, 0, TextureView(&skyc->getImageResource().getTexture(), TextureSubresourceDesc::all()));
 		}
 		else
 		{
-			cmdb.bindSampler(ANKI_REG(s1), getRenderer().getSamplers().m_trilinearClamp.get());
-			rgraphCtx.bindTexture(ANKI_REG(t1), info.m_skyLutRenderTarget);
+			cmdb.bindSampler(1, 0, getRenderer().getSamplers().m_trilinearClamp.get());
+			rgraphCtx.bindSrv(1, 0, info.m_skyLutRenderTarget);
 		}
 
-		cmdb.bindUniformBuffer(ANKI_REG(b0), info.m_globalRendererConsts);
+		cmdb.bindConstantBuffer(0, 0, info.m_globalRendererConsts);
 
 		cmdb.setPushConstants(&unis, sizeof(unis));
 
@@ -92,7 +92,7 @@ void TraditionalDeferredLightShading::drawLights(TraditionalDeferredLightShading
 
 	// Light shading
 	{
-		TraditionalDeferredShadingUniforms* unis = allocateAndBindConstants<TraditionalDeferredShadingUniforms>(cmdb, ANKI_REG(b0));
+		TraditionalDeferredShadingUniforms* unis = allocateAndBindConstants<TraditionalDeferredShadingUniforms>(cmdb, 0, 0);
 
 		unis->m_invViewProjMat = info.m_invViewProjectionMatrix;
 		unis->m_cameraPos = info.m_cameraPosWSpace.xyz();
@@ -103,39 +103,38 @@ void TraditionalDeferredLightShading::drawLights(TraditionalDeferredLightShading
 			unis->m_dirLight.m_lightMatrix = info.m_dirLightMatrix;
 		}
 
-		cmdb.bindStorageBuffer(ANKI_REG(t0), info.m_visibleLightsBuffer);
+		cmdb.bindSrv(0, 0, info.m_visibleLightsBuffer);
 		if(GpuSceneArrays::Light::getSingleton().getElementCount() > 0)
 		{
-			cmdb.bindStorageBuffer(ANKI_REG(t1), GpuSceneArrays::Light::getSingleton().getBufferView());
+			cmdb.bindSrv(1, 0, GpuSceneArrays::Light::getSingleton().getBufferView());
 		}
 		else
 		{
 			// Set something random
-			cmdb.bindStorageBuffer(ANKI_REG(t1), GpuSceneBuffer::getSingleton().getBufferView());
+			cmdb.bindSrv(1, 0, GpuSceneBuffer::getSingleton().getBufferView());
 		}
 
 		// NOTE: Use nearest sampler because we don't want the result to sample the near tiles
-		cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_nearestNearestClamp.get());
+		cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_nearestNearestClamp.get());
 
-		rgraphCtx.bindTexture(ANKI_REG(t2), info.m_gbufferRenderTargets[0], info.m_gbufferRenderTargetSubresource[0]);
-		rgraphCtx.bindTexture(ANKI_REG(t3), info.m_gbufferRenderTargets[1], info.m_gbufferRenderTargetSubresource[1]);
-		rgraphCtx.bindTexture(ANKI_REG(t4), info.m_gbufferRenderTargets[2], info.m_gbufferRenderTargetSubresource[2]);
-		rgraphCtx.bindTexture(ANKI_REG(t5), info.m_gbufferDepthRenderTarget, info.m_gbufferDepthRenderTargetSubresource);
+		rgraphCtx.bindSrv(2, 0, info.m_gbufferRenderTargets[0], info.m_gbufferRenderTargetSubresource[0]);
+		rgraphCtx.bindSrv(3, 0, info.m_gbufferRenderTargets[1], info.m_gbufferRenderTargetSubresource[1]);
+		rgraphCtx.bindSrv(4, 0, info.m_gbufferRenderTargets[2], info.m_gbufferRenderTargetSubresource[2]);
+		rgraphCtx.bindSrv(5, 0, info.m_gbufferDepthRenderTarget, info.m_gbufferDepthRenderTargetSubresource);
 
-		cmdb.bindSampler(ANKI_REG(s1), m_shadowSampler.get());
+		cmdb.bindSampler(1, 0, m_shadowSampler.get());
 		if(dirLightc && dirLightc->getShadowEnabled())
 		{
 			ANKI_ASSERT(info.m_directionalLightShadowmapRenderTarget.isValid());
-			rgraphCtx.bindTexture(ANKI_REG(t6), info.m_directionalLightShadowmapRenderTarget,
-								  info.m_directionalLightShadowmapRenderTargetSubresource);
+			rgraphCtx.bindSrv(6, 0, info.m_directionalLightShadowmapRenderTarget, info.m_directionalLightShadowmapRenderTargetSubresource);
 		}
 		else
 		{
 			// No shadows for the dir light, bind a random depth texture (need depth because validation complains)
-			rgraphCtx.bindTexture(ANKI_REG(t6), info.m_gbufferDepthRenderTarget, info.m_gbufferDepthRenderTargetSubresource);
+			rgraphCtx.bindSrv(6, 0, info.m_gbufferDepthRenderTarget, info.m_gbufferDepthRenderTargetSubresource);
 		}
 
-		cmdb.bindUniformBuffer(ANKI_REG(b1), info.m_globalRendererConsts);
+		cmdb.bindConstantBuffer(1, 0, info.m_globalRendererConsts);
 
 		cmdb.bindShaderProgram(m_lightGrProg[info.m_computeSpecular].get());
 

+ 3 - 3
AnKi/Renderer/VolumetricFog.cpp

@@ -58,10 +58,10 @@ void VolumetricFog::populateRenderGraph(RenderingContext& ctx)
 
 		cmdb.bindShaderProgram(m_grProg.get());
 
-		cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_trilinearClamp.get());
-		rgraphCtx.bindTexture(ANKI_REG(t0), getRenderer().getVolumetricLightingAccumulation().getRt());
+		cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_trilinearClamp.get());
+		rgraphCtx.bindSrv(0, 0, getRenderer().getVolumetricLightingAccumulation().getRt());
 
-		rgraphCtx.bindTexture(ANKI_REG(u0), m_runCtx.m_rt);
+		rgraphCtx.bindUav(0, 0, m_runCtx.m_rt);
 
 		const SkyboxComponent* sky = SceneGraph::getSingleton().getSkybox();
 

+ 13 - 15
AnKi/Renderer/VolumetricLightingAccumulation.cpp

@@ -95,25 +95,23 @@ void VolumetricLightingAccumulation::populateRenderGraph(RenderingContext& ctx)
 		cmdb.bindShaderProgram(m_grProg.get());
 
 		// Bind all
-		cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_trilinearRepeat.get());
-		cmdb.bindSampler(ANKI_REG(s1), getRenderer().getSamplers().m_trilinearClamp.get());
-		cmdb.bindSampler(ANKI_REG(s2), getRenderer().getSamplers().m_trilinearClampShadow.get());
+		cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_trilinearRepeat.get());
+		cmdb.bindSampler(1, 0, getRenderer().getSamplers().m_trilinearClamp.get());
+		cmdb.bindSampler(2, 0, getRenderer().getSamplers().m_trilinearClampShadow.get());
 
-		rgraphCtx.bindTexture(ANKI_REG(u0), m_runCtx.m_rts[1]);
+		rgraphCtx.bindUav(0, 0, m_runCtx.m_rts[1]);
 
-		cmdb.bindTexture(ANKI_REG(t0), TextureView(&m_noiseImage->getTexture(), TextureSubresourceDesc::all()));
+		cmdb.bindSrv(0, 0, TextureView(&m_noiseImage->getTexture(), TextureSubresourceDesc::all()));
 
-		rgraphCtx.bindTexture(ANKI_REG(t1), m_runCtx.m_rts[0]);
+		rgraphCtx.bindSrv(1, 0, m_runCtx.m_rts[0]);
 
-		cmdb.bindUniformBuffer(ANKI_REG(b0), ctx.m_globalRenderingUniformsBuffer);
-		cmdb.bindStorageBuffer(ANKI_REG(t2), getRenderer().getClusterBinning().getPackedObjectsBuffer(GpuSceneNonRenderableObjectType::kLight));
-		cmdb.bindStorageBuffer(ANKI_REG(t3), getRenderer().getClusterBinning().getPackedObjectsBuffer(GpuSceneNonRenderableObjectType::kLight));
-		rgraphCtx.bindTexture(ANKI_REG(t4), getRenderer().getShadowMapping().getShadowmapRt());
-		cmdb.bindStorageBuffer(ANKI_REG(t5),
-							   getRenderer().getClusterBinning().getPackedObjectsBuffer(GpuSceneNonRenderableObjectType::kGlobalIlluminationProbe));
-		cmdb.bindStorageBuffer(ANKI_REG(t6),
-							   getRenderer().getClusterBinning().getPackedObjectsBuffer(GpuSceneNonRenderableObjectType::kFogDensityVolume));
-		cmdb.bindStorageBuffer(ANKI_REG(t7), getRenderer().getClusterBinning().getClustersBuffer());
+		cmdb.bindConstantBuffer(0, 0, ctx.m_globalRenderingUniformsBuffer);
+		cmdb.bindSrv(2, 0, getRenderer().getClusterBinning().getPackedObjectsBuffer(GpuSceneNonRenderableObjectType::kLight));
+		cmdb.bindSrv(3, 0, getRenderer().getClusterBinning().getPackedObjectsBuffer(GpuSceneNonRenderableObjectType::kLight));
+		rgraphCtx.bindSrv(4, 0, getRenderer().getShadowMapping().getShadowmapRt());
+		cmdb.bindSrv(5, 0, getRenderer().getClusterBinning().getPackedObjectsBuffer(GpuSceneNonRenderableObjectType::kGlobalIlluminationProbe));
+		cmdb.bindSrv(6, 0, getRenderer().getClusterBinning().getPackedObjectsBuffer(GpuSceneNonRenderableObjectType::kFogDensityVolume));
+		cmdb.bindSrv(7, 0, getRenderer().getClusterBinning().getClustersBuffer());
 
 		const SkyboxComponent* sky = SceneGraph::getSingleton().getSkybox();
 

+ 6 - 6
AnKi/Renderer/VrsSriGeneration.cpp

@@ -140,9 +140,9 @@ void VrsSriGeneration::populateRenderGraph(RenderingContext& ctx)
 
 			cmdb.bindShaderProgram(m_grProg.get());
 
-			rgraphCtx.bindTexture(ANKI_REG(t0), getRenderer().getLightShading().getRt());
-			cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_nearestNearestClamp.get());
-			rgraphCtx.bindTexture(ANKI_REG(u0), m_runCtx.m_rt);
+			rgraphCtx.bindSrv(0, 0, getRenderer().getLightShading().getRt());
+			cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_nearestNearestClamp.get());
+			rgraphCtx.bindUav(0, 0, m_runCtx.m_rt);
 			const Vec4 pc(1.0f / Vec2(getRenderer().getInternalResolution()), g_vrsThresholdCVar.get(), 0.0f);
 			cmdb.setPushConstants(&pc, sizeof(pc));
 
@@ -167,9 +167,9 @@ void VrsSriGeneration::populateRenderGraph(RenderingContext& ctx)
 
 			cmdb.bindShaderProgram(m_downscaleGrProg.get());
 
-			rgraphCtx.bindTexture(ANKI_REG(t0), m_runCtx.m_rt);
-			cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_nearestNearestClamp.get());
-			rgraphCtx.bindTexture(ANKI_REG(u0), m_runCtx.m_downscaledRt);
+			rgraphCtx.bindSrv(0, 0, m_runCtx.m_rt);
+			cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_nearestNearestClamp.get());
+			rgraphCtx.bindUav(0, 0, m_runCtx.m_downscaledRt);
 			const Vec4 pc(1.0f / Vec2(rezDownscaled), 0.0f, 0.0f);
 			cmdb.setPushConstants(&pc, sizeof(pc));
 

+ 1 - 1
AnKi/Scene/Components/GlobalIlluminationProbeComponent.cpp

@@ -73,7 +73,7 @@ Error GlobalIlluminationProbeComponent::update(SceneComponentUpdateInfo& info, B
 		cmdb->setPipelineBarrier({&texBarrier, 1}, {}, {});
 
 		cmdb->bindShaderProgram(&variant->getProgram());
-		cmdb->bindTexture(ANKI_REG(u0), TextureView(m_volTex.get(), TextureSubresourceDesc::all()));
+		cmdb->bindUav(0, 0, TextureView(m_volTex.get(), TextureSubresourceDesc::all()));
 
 		const Vec4 clearColor(0.0f);
 		cmdb->setPushConstants(&clearColor, sizeof(clearColor));

+ 26 - 42
AnKi/ShaderCompiler/ShaderCompiler.cpp

@@ -117,8 +117,7 @@ Error doReflectionSpirv(ConstWeakArray<U8> spirv, ShaderType type, ShaderReflect
 	spirv_cross::ShaderResources rsrc = spvc.get_shader_resources();
 	spirv_cross::ShaderResources rsrcActive = spvc.get_shader_resources(spvc.get_active_interface_variables());
 
-	auto func = [&](const spirv_cross::SmallVector<spirv_cross::Resource>& resources, const DescriptorType origType,
-					const DescriptorFlag origFlags) -> Error {
+	auto func = [&](const spirv_cross::SmallVector<spirv_cross::Resource>& resources, const DescriptorType origType) -> Error {
 		for(const spirv_cross::Resource& r : resources)
 		{
 			const U32 id = r.id;
@@ -152,19 +151,16 @@ Error doReflectionSpirv(ConstWeakArray<U8> spirv, ShaderType type, ShaderReflect
 
 			// Images are special, they might be texel buffers
 			DescriptorType type = origType;
-			DescriptorFlag flags = origFlags;
-			if(type == DescriptorType::kTexture && typeInfo.image.dim == spv::DimBuffer)
+			if((type == DescriptorType::kSrvTexture || type == DescriptorType::kUavTexture) && typeInfo.image.dim == spv::DimBuffer)
 			{
-				type = DescriptorType::kTexelBuffer;
-
 				if(typeInfo.image.sampled == 1)
 				{
-					flags = DescriptorFlag::kRead;
+					type = DescriptorType::kSrvTexelBuffer;
 				}
 				else
 				{
 					ANKI_ASSERT(typeInfo.image.sampled == 2);
-					flags = DescriptorFlag::kReadWrite;
+					type = DescriptorType::kUavTexelBuffer;
 				}
 			}
 
@@ -177,7 +173,7 @@ Error doReflectionSpirv(ConstWeakArray<U8> spirv, ShaderType type, ShaderReflect
 					errorStr.sprintf("Unexpected unbound array for bindless: %s", r.name.c_str());
 				}
 
-				if(type != DescriptorType::kTexture || flags != DescriptorFlag::kRead)
+				if(type != DescriptorType::kSrvTexture)
 				{
 					errorStr.sprintf("Unexpected bindless binding: %s", r.name.c_str());
 					return Error::kUserData;
@@ -189,14 +185,15 @@ Error doReflectionSpirv(ConstWeakArray<U8> spirv, ShaderType type, ShaderReflect
 			{
 				// Regular binding
 
-				if(origType == DescriptorType::kStorageBuffer && binding >= kDxcVkBindingShifts[set][HlslResourceType::kSrv]
-				   && binding < kDxcVkBindingShifts[set][HlslResourceType::kSrv] + 1000)
+				// Use the binding to find out if it's a read or write storage buffer, there is no other way
+				if(origType == DescriptorType::kSrvStructuredBuffer
+				   && (binding < kDxcVkBindingShifts[set][HlslResourceType::kSrv]
+					   || binding >= kDxcVkBindingShifts[set][HlslResourceType::kSrv] + 1000))
 				{
-					// Storage buffer is read only
-					flags = DescriptorFlag::kRead;
+					type = DescriptorType::kUavStructuredBuffer;
 				}
 
-				const HlslResourceType hlslResourceType = descriptorTypeToHlslResourceType(type, flags);
+				const HlslResourceType hlslResourceType = descriptorTypeToHlslResourceType(type);
 				if(binding < kDxcVkBindingShifts[set][hlslResourceType] || binding >= kDxcVkBindingShifts[set][hlslResourceType] + 1000)
 				{
 					errorStr.sprintf("Unexpected binding: %s", r.name.c_str());
@@ -207,7 +204,6 @@ Error doReflectionSpirv(ConstWeakArray<U8> spirv, ShaderType type, ShaderReflect
 				akBinding.m_registerBindingPoint = binding - kDxcVkBindingShifts[set][hlslResourceType];
 				akBinding.m_arraySize = U16(arraySize);
 				akBinding.m_type = type;
-				akBinding.m_flags = flags;
 
 				refl.m_descriptor.m_bindings[set][refl.m_descriptor.m_bindingCounts[set]] = akBinding;
 				++refl.m_descriptor.m_bindingCounts[set];
@@ -217,37 +213,37 @@ Error doReflectionSpirv(ConstWeakArray<U8> spirv, ShaderType type, ShaderReflect
 		return Error::kNone;
 	};
 
-	Error err = func(rsrc.uniform_buffers, DescriptorType::kUniformBuffer, DescriptorFlag::kRead);
+	Error err = func(rsrc.uniform_buffers, DescriptorType::kConstantBuffer);
 	if(err)
 	{
 		return err;
 	}
 
-	err = func(rsrc.separate_images, DescriptorType::kTexture, DescriptorFlag::kRead); // This also handles texel buffers
+	err = func(rsrc.separate_images, DescriptorType::kSrvTexture); // This also handles texel buffers
 	if(err)
 	{
 		return err;
 	}
 
-	err = func(rsrc.separate_samplers, DescriptorType::kSampler, DescriptorFlag::kRead);
+	err = func(rsrc.separate_samplers, DescriptorType::kSampler);
 	if(err)
 	{
 		return err;
 	}
 
-	err = func(rsrc.storage_buffers, DescriptorType::kStorageBuffer, DescriptorFlag::kReadWrite);
+	err = func(rsrc.storage_buffers, DescriptorType::kSrvStructuredBuffer);
 	if(err)
 	{
 		return err;
 	}
 
-	err = func(rsrc.storage_images, DescriptorType::kTexture, DescriptorFlag::kReadWrite);
+	err = func(rsrc.storage_images, DescriptorType::kUavTexture);
 	if(err)
 	{
 		return err;
 	}
 
-	err = func(rsrc.acceleration_structures, DescriptorType::kAccelerationStructure, DescriptorFlag::kRead);
+	err = func(rsrc.acceleration_structures, DescriptorType::kAccelerationStructure);
 	if(err)
 	{
 		return err;
@@ -466,7 +462,6 @@ Error doReflectionDxil(ConstWeakArray<U8> dxil, ShaderType type, ShaderReflectio
 			ShaderReflectionBinding akBinding;
 
 			akBinding.m_type = DescriptorType::kCount;
-			akBinding.m_flags = DescriptorFlag::kNone;
 			akBinding.m_arraySize = U16(bindDesc.BindCount);
 			akBinding.m_registerBindingPoint = bindDesc.BindPoint;
 
@@ -487,71 +482,60 @@ Error doReflectionDxil(ConstWeakArray<U8> dxil, ShaderType type, ShaderReflectio
 					continue;
 				}
 
-				akBinding.m_type = DescriptorType::kUniformBuffer;
-				akBinding.m_flags = DescriptorFlag::kRead;
+				akBinding.m_type = DescriptorType::kConstantBuffer;
 			}
 			else if(bindDesc.Type == D3D_SIT_TEXTURE && bindDesc.Dimension != D3D_SRV_DIMENSION_BUFFER)
 			{
 				// Texture2D etc
-				akBinding.m_type = DescriptorType::kTexture;
-				akBinding.m_flags = DescriptorFlag::kRead;
+				akBinding.m_type = DescriptorType::kSrvTexture;
 			}
 			else if(bindDesc.Type == D3D_SIT_TEXTURE && bindDesc.Dimension == D3D_SRV_DIMENSION_BUFFER)
 			{
 				// Buffer
-				akBinding.m_type = DescriptorType::kTexelBuffer;
-				akBinding.m_flags = DescriptorFlag::kRead;
+				akBinding.m_type = DescriptorType::kSrvTexelBuffer;
 			}
 			else if(bindDesc.Type == D3D_SIT_SAMPLER)
 			{
 				// SamplerState
 				akBinding.m_type = DescriptorType::kSampler;
-				akBinding.m_flags = DescriptorFlag::kRead;
 			}
 			else if(bindDesc.Type == D3D_SIT_UAV_RWTYPED && bindDesc.Dimension == D3D_SRV_DIMENSION_BUFFER)
 			{
 				// RWBuffer
-				akBinding.m_type = DescriptorType::kTexelBuffer;
-				akBinding.m_flags = DescriptorFlag::kReadWrite;
+				akBinding.m_type = DescriptorType::kUavTexelBuffer;
 			}
 			else if(bindDesc.Type == D3D_SIT_UAV_RWTYPED && bindDesc.Dimension != D3D_SRV_DIMENSION_BUFFER)
 			{
 				// RWTexture2D etc
-				akBinding.m_type = DescriptorType::kTexture;
-				akBinding.m_flags = DescriptorFlag::kReadWrite;
+				akBinding.m_type = DescriptorType::kUavTexture;
 			}
 			else if(bindDesc.Type == D3D_SIT_BYTEADDRESS)
 			{
 				// ByteAddressBuffer
-				akBinding.m_type = DescriptorType::kStorageBuffer;
-				akBinding.m_flags = DescriptorFlag::kRead | DescriptorFlag::kByteAddressBuffer;
+				akBinding.m_type = DescriptorType::kSrvByteAddressBuffer;
 				akBinding.m_d3dStructuredBufferStride = sizeof(U32);
 			}
 			else if(bindDesc.Type == D3D_SIT_UAV_RWBYTEADDRESS)
 			{
 				// RWByteAddressBuffer
-				akBinding.m_type = DescriptorType::kStorageBuffer;
-				akBinding.m_flags = DescriptorFlag::kReadWrite | DescriptorFlag::kByteAddressBuffer;
+				akBinding.m_type = DescriptorType::kUavByteAddressBuffer;
 				akBinding.m_d3dStructuredBufferStride = sizeof(U32);
 			}
 			else if(bindDesc.Type == D3D_SIT_RTACCELERATIONSTRUCTURE)
 			{
 				// RaytracingAccelerationStructure
 				akBinding.m_type = DescriptorType::kAccelerationStructure;
-				akBinding.m_flags = DescriptorFlag::kRead;
 			}
 			else if(bindDesc.Type == D3D_SIT_STRUCTURED)
 			{
 				// StructuredBuffer
-				akBinding.m_type = DescriptorType::kStorageBuffer;
-				akBinding.m_flags = DescriptorFlag::kRead;
+				akBinding.m_type = DescriptorType::kSrvStructuredBuffer;
 				akBinding.m_d3dStructuredBufferStride = U16(bindDesc.NumSamples);
 			}
 			else if(bindDesc.Type == D3D_SIT_UAV_RWSTRUCTURED)
 			{
 				// RWStructuredBuffer
-				akBinding.m_type = DescriptorType::kStorageBuffer;
-				akBinding.m_flags = DescriptorFlag::kReadWrite;
+				akBinding.m_type = DescriptorType::kUavStructuredBuffer;
 				akBinding.m_d3dStructuredBufferStride = U16(bindDesc.NumSamples);
 			}
 			else

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

@@ -21,32 +21,32 @@ struct MaterialGlobalUniforms
 };
 static_assert(sizeof(MaterialGlobalUniforms) == 15 * sizeof(Vec4));
 
-#define ANKI_MATERIAL_REGISTER_TILINEAR_REPEAT_SAMPLER s0
-#define ANKI_MATERIAL_REGISTER_GLOBAL_UNIFORMS b0
-#define ANKI_MATERIAL_REGISTER_GPU_SCENE t0
-
-#define ANKI_MATERIAL_REGISTER_MESHLET_BOUNDING_VOLUMES t1 ///< Points to the unified geom buffer
-#define ANKI_MATERIAL_REGISTER_MESHLET_GEOMETRY_DESCRIPTORS t2 ///< Points to the unified geom buffer
-#define ANKI_MATERIAL_REGISTER_MESHLET_INSTANCES t3
-#define ANKI_MATERIAL_REGISTER_RENDERABLES t4
-#define ANKI_MATERIAL_REGISTER_MESH_LODS t5
-#define ANKI_MATERIAL_REGISTER_PARTICLE_EMITTERS t6
-#define ANKI_MATERIAL_REGISTER_TRANSFORMS t7
-#define ANKI_MATERIAL_REGISTER_NEAREST_CLAMP_SAMPLER s1
-#define ANKI_MATERIAL_REGISTER_FIRST_MESHLET t8
+#define ANKI_MATERIAL_REGISTER_TILINEAR_REPEAT_SAMPLER 0
+#define ANKI_MATERIAL_REGISTER_GLOBAL_UNIFORMS 0
+#define ANKI_MATERIAL_REGISTER_GPU_SCENE 0
+
+#define ANKI_MATERIAL_REGISTER_MESHLET_BOUNDING_VOLUMES 1 ///< Points to the unified geom buffer
+#define ANKI_MATERIAL_REGISTER_MESHLET_GEOMETRY_DESCRIPTORS 2 ///< Points to the unified geom buffer
+#define ANKI_MATERIAL_REGISTER_MESHLET_INSTANCES 3
+#define ANKI_MATERIAL_REGISTER_RENDERABLES 4
+#define ANKI_MATERIAL_REGISTER_MESH_LODS 5
+#define ANKI_MATERIAL_REGISTER_PARTICLE_EMITTERS 6
+#define ANKI_MATERIAL_REGISTER_TRANSFORMS 7
+#define ANKI_MATERIAL_REGISTER_NEAREST_CLAMP_SAMPLER 1
+#define ANKI_MATERIAL_REGISTER_FIRST_MESHLET 8
 
 // For FW shading:
-#define ANKI_MATERIAL_REGISTER_LINEAR_CLAMP_SAMPLER s2
-#define ANKI_MATERIAL_REGISTER_SHADOW_SAMPLER s3
-#define ANKI_MATERIAL_REGISTER_SCENE_DEPTH t9
-#define ANKI_MATERIAL_REGISTER_LIGHT_VOLUME t10
-#define ANKI_MATERIAL_REGISTER_CLUSTER_SHADING_UNIFORMS b1
-#define ANKI_MATERIAL_REGISTER_CLUSTER_SHADING_POINT_LIGHTS t11
-#define ANKI_MATERIAL_REGISTER_CLUSTER_SHADING_SPOT_LIGHTS t12
-#define ANKI_MATERIAL_REGISTER_SHADOW_ATLAS t13
-#define ANKI_MATERIAL_REGISTER_CLUSTERS t14
+#define ANKI_MATERIAL_REGISTER_LINEAR_CLAMP_SAMPLER 2
+#define ANKI_MATERIAL_REGISTER_SHADOW_SAMPLER 3
+#define ANKI_MATERIAL_REGISTER_SCENE_DEPTH 9
+#define ANKI_MATERIAL_REGISTER_LIGHT_VOLUME 10
+#define ANKI_MATERIAL_REGISTER_CLUSTER_SHADING_UNIFORMS 1
+#define ANKI_MATERIAL_REGISTER_CLUSTER_SHADING_POINT_LIGHTS 11
+#define ANKI_MATERIAL_REGISTER_CLUSTER_SHADING_SPOT_LIGHTS 12
+#define ANKI_MATERIAL_REGISTER_SHADOW_ATLAS 13
+#define ANKI_MATERIAL_REGISTER_CLUSTERS 14
 
 // Always last because it's variable. Texture buffer bindings pointing to unified geom buffer:
-#define ANKI_MATERIAL_REGISTER_UNIFIED_GEOMETRY_START t15
+#define ANKI_MATERIAL_REGISTER_UNIFIED_GEOMETRY_START 15
 
 ANKI_END_NAMESPACE

+ 9 - 9
AnKi/Shaders/Include/UnifiedGeometryTypes.def.h

@@ -9,23 +9,23 @@
 #	define ANKI_UNIFIED_GEOM_FORMAT_SEPERATOR
 #endif
 
-ANKI_UNIFIED_GEOM_FORMAT(R32_Sfloat, F32, t14)
+ANKI_UNIFIED_GEOM_FORMAT(R32_Sfloat, F32, 14)
 ANKI_UNIFIED_GEOM_FORMAT_SEPERATOR
-ANKI_UNIFIED_GEOM_FORMAT(R32G32_Sfloat, Vec2, t15)
+ANKI_UNIFIED_GEOM_FORMAT(R32G32_Sfloat, Vec2, 15)
 ANKI_UNIFIED_GEOM_FORMAT_SEPERATOR
-ANKI_UNIFIED_GEOM_FORMAT(R32G32B32_Sfloat, Vec3, t16)
+ANKI_UNIFIED_GEOM_FORMAT(R32G32B32_Sfloat, Vec3, 16)
 ANKI_UNIFIED_GEOM_FORMAT_SEPERATOR
-ANKI_UNIFIED_GEOM_FORMAT(R32G32B32A32_Sfloat, Vec4, t17)
+ANKI_UNIFIED_GEOM_FORMAT(R32G32B32A32_Sfloat, Vec4, 17)
 ANKI_UNIFIED_GEOM_FORMAT_SEPERATOR
-ANKI_UNIFIED_GEOM_FORMAT(R16G16B16A16_Unorm, Vec4, t18)
+ANKI_UNIFIED_GEOM_FORMAT(R16G16B16A16_Unorm, Vec4, 18)
 ANKI_UNIFIED_GEOM_FORMAT_SEPERATOR
-ANKI_UNIFIED_GEOM_FORMAT(R8G8B8A8_Snorm, Vec4, t19)
+ANKI_UNIFIED_GEOM_FORMAT(R8G8B8A8_Snorm, Vec4, 19)
 ANKI_UNIFIED_GEOM_FORMAT_SEPERATOR
-ANKI_UNIFIED_GEOM_FORMAT(R8G8B8A8_Uint, UVec4, t20)
+ANKI_UNIFIED_GEOM_FORMAT(R8G8B8A8_Uint, UVec4, 20)
 ANKI_UNIFIED_GEOM_FORMAT_SEPERATOR
-ANKI_UNIFIED_GEOM_FORMAT(R16_Uint, U32, t21)
+ANKI_UNIFIED_GEOM_FORMAT(R16_Uint, U32, 21)
 ANKI_UNIFIED_GEOM_FORMAT_SEPERATOR
-ANKI_UNIFIED_GEOM_FORMAT(R8_Uint, U32, t22)
+ANKI_UNIFIED_GEOM_FORMAT(R8_Uint, U32, 22)
 
 #undef ANKI_UNIFIED_GEOM_FORMAT
 #undef ANKI_UNIFIED_GEOM_FORMAT_SEPERATOR

+ 27 - 22
AnKi/Shaders/MaterialShadersCommon.hlsl

@@ -13,23 +13,26 @@
 #include <AnKi/Shaders/VisibilityAndCollisionFunctions.hlsl>
 #include <AnKi/Shaders/PackFunctions.hlsl>
 
-SamplerState g_globalSampler : register(ANKI_MATERIAL_REGISTER_TILINEAR_REPEAT_SAMPLER);
-ConstantBuffer<MaterialGlobalUniforms> g_globalUniforms : register(ANKI_MATERIAL_REGISTER_GLOBAL_UNIFORMS);
-ByteAddressBuffer g_gpuScene : register(ANKI_MATERIAL_REGISTER_GPU_SCENE);
+#define _ANKI_REG(type, binding) type##binding
+#define ANKI_REG(type, binding) _ANKI_REG(type, binding)
+
+SamplerState g_globalSampler : register(ANKI_REG(s, ANKI_MATERIAL_REGISTER_TILINEAR_REPEAT_SAMPLER));
+ConstantBuffer<MaterialGlobalUniforms> g_globalUniforms : register(ANKI_REG(b, ANKI_MATERIAL_REGISTER_GLOBAL_UNIFORMS));
+ByteAddressBuffer g_gpuScene : register(ANKI_REG(t, ANKI_MATERIAL_REGISTER_GPU_SCENE));
 
 // Unified geom:
-#define ANKI_UNIFIED_GEOM_FORMAT(fmt, shaderType, reg) Buffer<shaderType> g_unifiedGeom_##fmt : register(reg);
+#define ANKI_UNIFIED_GEOM_FORMAT(fmt, shaderType, reg) Buffer<shaderType> g_unifiedGeom_##fmt : register(ANKI_REG(t, reg));
 #include <AnKi/Shaders/Include/UnifiedGeometryTypes.def.h>
 
-StructuredBuffer<MeshletBoundingVolume> g_meshletBoundingVolumes : register(ANKI_MATERIAL_REGISTER_MESHLET_BOUNDING_VOLUMES);
-StructuredBuffer<MeshletGeometryDescriptor> g_meshletGeometryDescriptors : register(ANKI_MATERIAL_REGISTER_MESHLET_GEOMETRY_DESCRIPTORS);
-StructuredBuffer<GpuSceneMeshletInstance> g_meshletInstances : register(ANKI_MATERIAL_REGISTER_MESHLET_INSTANCES);
-StructuredBuffer<GpuSceneRenderable> g_renderables : register(ANKI_MATERIAL_REGISTER_RENDERABLES);
-StructuredBuffer<GpuSceneMeshLod> g_meshLods : register(ANKI_MATERIAL_REGISTER_MESH_LODS);
-StructuredBuffer<Mat3x4> g_transforms : register(ANKI_MATERIAL_REGISTER_TRANSFORMS);
-SamplerState g_nearestClampSampler : register(ANKI_MATERIAL_REGISTER_NEAREST_CLAMP_SAMPLER);
-StructuredBuffer<GpuSceneParticleEmitter> g_particleEmitters : register(ANKI_MATERIAL_REGISTER_PARTICLE_EMITTERS);
-StructuredBuffer<U32> g_firstMeshlet : register(ANKI_MATERIAL_REGISTER_FIRST_MESHLET);
+StructuredBuffer<MeshletBoundingVolume> g_meshletBoundingVolumes : register(ANKI_REG(t, ANKI_MATERIAL_REGISTER_MESHLET_BOUNDING_VOLUMES));
+StructuredBuffer<MeshletGeometryDescriptor> g_meshletGeometryDescriptors : register(ANKI_REG(t, ANKI_MATERIAL_REGISTER_MESHLET_GEOMETRY_DESCRIPTORS));
+StructuredBuffer<GpuSceneMeshletInstance> g_meshletInstances : register(ANKI_REG(t, ANKI_MATERIAL_REGISTER_MESHLET_INSTANCES));
+StructuredBuffer<GpuSceneRenderable> g_renderables : register(ANKI_REG(t, ANKI_MATERIAL_REGISTER_RENDERABLES));
+StructuredBuffer<GpuSceneMeshLod> g_meshLods : register(ANKI_REG(t, ANKI_MATERIAL_REGISTER_MESH_LODS));
+StructuredBuffer<GpuSceneParticleEmitter> g_particleEmitters : register(ANKI_REG(t, ANKI_MATERIAL_REGISTER_PARTICLE_EMITTERS));
+StructuredBuffer<Mat3x4> g_transforms : register(ANKI_REG(t, ANKI_MATERIAL_REGISTER_TRANSFORMS));
+SamplerState g_nearestClampSampler : register(ANKI_REG(s, ANKI_MATERIAL_REGISTER_NEAREST_CLAMP_SAMPLER));
+StructuredBuffer<U32> g_firstMeshlet : register(ANKI_REG(t, ANKI_MATERIAL_REGISTER_FIRST_MESHLET));
 
 #if ANKI_MESH_SHADER
 struct PushConsts
@@ -44,18 +47,20 @@ ANKI_PUSH_CONSTANTS(PushConsts, g_pushConsts)
 #if defined(FORWARD_SHADING)
 #	include <AnKi/Shaders/ClusteredShadingFunctions.hlsl>
 
-SamplerState g_linearAnyClampSampler : register(ANKI_MATERIAL_REGISTER_LINEAR_CLAMP_SAMPLER);
-Texture2D g_gbufferDepthTex : register(ANKI_MATERIAL_REGISTER_SCENE_DEPTH);
-Texture3D<RVec4> g_lightVol : register(ANKI_MATERIAL_REGISTER_LIGHT_VOLUME);
-SamplerComparisonState g_shadowSampler : register(ANKI_MATERIAL_REGISTER_SHADOW_SAMPLER);
+SamplerState g_linearAnyClampSampler : register(ANKI_REG(s, ANKI_MATERIAL_REGISTER_LINEAR_CLAMP_SAMPLER));
+Texture2D g_gbufferDepthTex : register(ANKI_REG(t, ANKI_MATERIAL_REGISTER_SCENE_DEPTH));
+Texture3D<RVec4> g_lightVol : register(ANKI_REG(t, ANKI_MATERIAL_REGISTER_LIGHT_VOLUME));
+SamplerComparisonState g_shadowSampler : register(ANKI_REG(s, ANKI_MATERIAL_REGISTER_SHADOW_SAMPLER));
 
-ConstantBuffer<GlobalRendererUniforms> g_globalRendererUniforms : register(ANKI_MATERIAL_REGISTER_CLUSTER_SHADING_UNIFORMS);
-StructuredBuffer<Cluster> g_clusters : register(ANKI_MATERIAL_REGISTER_CLUSTERS);
-StructuredBuffer<PointLight> g_pointLights : register(ANKI_MATERIAL_REGISTER_CLUSTER_SHADING_POINT_LIGHTS);
-StructuredBuffer<SpotLight> g_spotLights : register(ANKI_MATERIAL_REGISTER_CLUSTER_SHADING_SPOT_LIGHTS);
-Texture2D<Vec4> g_shadowAtlasTex : register(ANKI_MATERIAL_REGISTER_SHADOW_ATLAS);
+ConstantBuffer<GlobalRendererUniforms> g_globalRendererUniforms : register(ANKI_REG(b, ANKI_MATERIAL_REGISTER_CLUSTER_SHADING_UNIFORMS));
+StructuredBuffer<Cluster> g_clusters : register(ANKI_REG(t, ANKI_MATERIAL_REGISTER_CLUSTERS));
+StructuredBuffer<PointLight> g_pointLights : register(ANKI_REG(t, ANKI_MATERIAL_REGISTER_CLUSTER_SHADING_POINT_LIGHTS));
+StructuredBuffer<SpotLight> g_spotLights : register(ANKI_REG(t, ANKI_MATERIAL_REGISTER_CLUSTER_SHADING_SPOT_LIGHTS));
+Texture2D<Vec4> g_shadowAtlasTex : register(ANKI_REG(t, ANKI_MATERIAL_REGISTER_SHADOW_ATLAS));
 #endif
 
+#undef ANKI_REG
+
 UnpackedMeshVertex loadVertex(GpuSceneMeshLod mlod, U32 svVertexId, Bool bones)
 {
 	UnpackedMeshVertex v;

+ 2 - 3
AnKi/Ui/Canvas.cpp

@@ -288,9 +288,8 @@ void Canvas::appendToCommandBufferInternal(CommandBuffer& cmdb)
 					// Bindings
 					if(data && data->m_textureView.isValid())
 					{
-						cmdb.bindSampler(ANKI_REG(s0),
-										 (data->m_pointSampling) ? m_nearestNearestRepeatSampler.get() : m_linearLinearRepeatSampler.get());
-						cmdb.bindTexture(ANKI_REG(t0), data->m_textureView);
+						cmdb.bindSampler(0, 0, (data->m_pointSampling) ? m_nearestNearestRepeatSampler.get() : m_linearLinearRepeatSampler.get());
+						cmdb.bindSrv(0, 0, data->m_textureView);
 					}
 
 					// Push constants

+ 15 - 15
Tests/Gr/Gr.cpp

@@ -171,8 +171,8 @@ void main()
 
 		// Record
 		cmdb->bindShaderProgram(prog.get());
-		cmdb->bindStorageBuffer(ANKI_REG(t0), BufferView(readBuff.get()));
-		cmdb->bindStorageBuffer(ANKI_REG(u0), BufferView(writeBuff.get()));
+		cmdb->bindSrv(0, 0, BufferView(readBuff.get()));
+		cmdb->bindUav(0, 0, BufferView(writeBuff.get()));
 		cmdb->dispatchCompute(1, 1, 1);
 		cmdb->endRecording();
 
@@ -288,7 +288,7 @@ void main()
 		ShaderProgramPtr prog = GrManager::getSingleton().newShaderProgram(progInit);
 
 		const Vec4 kMagicVec(1.0f, 2.0f, 3.0f, 4.0f);
-		const Vec4 kInvalidVec(1.0f, 2.0f, 3.0f, 4.0f);
+		const Vec4 kInvalidVec(100.0f, 200.0f, 300.0f, 400.0f);
 
 		const Array<Vec4, 2> data = {kMagicVec, kMagicVec * 2.0f};
 		BufferPtr structured = createBuffer(BufferUsageBit::kAllUav | BufferUsageBit::kAllSrv, ConstWeakArray<Vec4>(data), "structured");
@@ -320,16 +320,16 @@ void main()
 		CommandBufferPtr cmdb = GrManager::getSingleton().newCommandBuffer(cmdbInit);
 
 		cmdb->bindShaderProgram(prog.get());
-		cmdb->bindStorageBuffer(ANKI_REG(t0), BufferView(structured.get()));
-		cmdb->bindTexture(ANKI_REG(t2), TextureView(tex.get(), TextureSubresourceDesc::all()));
-		cmdb->bindTexelBuffer(ANKI_REG(t3), BufferView(buff.get()), Format::kR32G32B32A32_Sfloat);
-		cmdb->bindStorageBuffer(ANKI_REG2(u0, space2), BufferView(rwstructured.get()));
-		cmdb->bindTexture(ANKI_REG(u2), TextureView(rwtex[0].get(), TextureSubresourceDesc::firstSurface()));
-		cmdb->bindTexture(ANKI_REG(u3), TextureView(rwtex[1].get(), TextureSubresourceDesc::firstSurface()));
-		cmdb->bindTexture(ANKI_REG(u4), TextureView(rwtex[2].get(), TextureSubresourceDesc::firstSurface()));
-		cmdb->bindTexelBuffer(ANKI_REG(u7), BufferView(rwbuff.get()), Format::kR32G32B32A32_Sfloat);
-		cmdb->bindUniformBuffer(ANKI_REG(b0), BufferView(consts.get()));
-		cmdb->bindSampler(ANKI_REG(s2), sampler.get());
+		cmdb->bindSrv(0, 0, BufferView(structured.get()));
+		cmdb->bindSrv(2, 0, TextureView(tex.get(), TextureSubresourceDesc::all()));
+		cmdb->bindSrv(3, 0, BufferView(buff.get()), Format::kR32G32B32A32_Sfloat);
+		cmdb->bindUav(0, 2, BufferView(rwstructured.get()));
+		cmdb->bindUav(2, 0, TextureView(rwtex[0].get(), TextureSubresourceDesc::firstSurface()));
+		cmdb->bindUav(3, 0, TextureView(rwtex[1].get(), TextureSubresourceDesc::firstSurface()));
+		cmdb->bindUav(4, 0, TextureView(rwtex[2].get(), TextureSubresourceDesc::firstSurface()));
+		cmdb->bindUav(7, 0, BufferView(rwbuff.get()), Format::kR32G32B32A32_Sfloat);
+		cmdb->bindConstantBuffer(0, 0, BufferView(consts.get()));
+		cmdb->bindSampler(2, 0, sampler.get());
 
 		const UVec4 pc(bindlessIdx);
 		cmdb->setPushConstants(&pc, sizeof(pc));
@@ -463,8 +463,8 @@ float4 main(float4 svPosition : SV_POSITION, float2 uv : TEXCOORDS, uint svPrimI
 			const Vec4 viewport(0.0f, 0.0f, F32(NativeWindow::getSingleton().getWidth()), F32(NativeWindow::getSingleton().getHeight()));
 			cmdb->setPushConstants(&viewport, sizeof(viewport));
 
-			cmdb->bindTexture(ANKI_REG(t0), TextureView(tex.get(), TextureSubresourceDesc::all()));
-			cmdb->bindSampler(ANKI_REG(s0), sampler.get());
+			cmdb->bindSrv(0, 0, TextureView(tex.get(), TextureSubresourceDesc::all()));
+			cmdb->bindSampler(0, 0, sampler.get());
 
 			cmdb->draw(PrimitiveTopology::kTriangles, 6);
 			cmdb->endRenderPass();

+ 4 - 4
Tests/Gr/GrMeshShaders.cpp

@@ -240,10 +240,10 @@ float3 main(VertOut input) : SV_TARGET0
 			rt.m_clearValue.m_colorf = {1.0f, 0.0f, 1.0f, 0.0f};
 			cmdb->beginRenderPass({rt});
 
-			cmdb->bindStorageBuffer(ANKI_REG(t0), BufferView(indexBuff.get()));
-			cmdb->bindStorageBuffer(ANKI_REG(t1), BufferView(positionsBuff.get()));
-			cmdb->bindStorageBuffer(ANKI_REG(t2), BufferView(colorsBuff.get()));
-			cmdb->bindStorageBuffer(ANKI_REG(t3), BufferView(meshletsBuff.get()));
+			cmdb->bindSrv(0, 0, BufferView(indexBuff.get()));
+			cmdb->bindSrv(1, 0, BufferView(positionsBuff.get()));
+			cmdb->bindSrv(2, 0, BufferView(colorsBuff.get()));
+			cmdb->bindSrv(3, 0, BufferView(meshletsBuff.get()));
 
 			cmdb->bindShaderProgram(prog.get());
 

+ 2 - 2
Tests/Gr/GrTextureBuffer.cpp

@@ -58,8 +58,8 @@ void main()
 		cmdbInit.m_flags = CommandBufferFlag::kSmallBatch | CommandBufferFlag::kGeneralWork;
 		CommandBufferPtr cmdb = GrManager::getSingleton().newCommandBuffer(cmdbInit);
 
-		cmdb->bindTexelBuffer(ANKI_REG(t0), BufferView(texBuff.get()), Format::kR8G8B8A8_Snorm);
-		cmdb->bindStorageBuffer(ANKI_REG(u0), BufferView(storageBuff.get()));
+		cmdb->bindSrv(0, 0, BufferView(texBuff.get()), Format::kR8G8B8A8_Snorm);
+		cmdb->bindUav(0, 0, BufferView(storageBuff.get()));
 		cmdb->bindShaderProgram(prog.get());
 		cmdb->dispatchCompute(1, 1, 1);
 		cmdb->endRecording();

+ 7 - 7
Tests/Gr/GrWorkGraphs.cpp

@@ -137,7 +137,7 @@ void thirdNode([MaxRecords(32)] GroupNodeInputRecords<ThirdNodeRecord> inp, uint
 
 		CommandBufferPtr cmdb = GrManager::getSingleton().newCommandBuffer(CommandBufferInitInfo(CommandBufferFlag::kSmallBatch));
 		cmdb->bindShaderProgram(prog.get());
-		cmdb->bindStorageBuffer(ANKI_REG(u0), BufferView(counterBuff.get()));
+		cmdb->bindUav(0, 0, BufferView(counterBuff.get()));
 		cmdb->dispatchGraph(BufferView(scratchBuff.get()), records.getBegin(), records.getSize(), sizeof(records[0]));
 		cmdb->endRecording();
 
@@ -410,18 +410,18 @@ void main(uint svDispatchThreadId : SV_DispatchThreadId, uint svGroupIndex : SV_
 				cmdb = GrManager::getSingleton().newCommandBuffer(
 					CommandBufferInitInfo(CommandBufferFlag::kSmallBatch | CommandBufferFlag::kGeneralWork));
 				cmdb->bindShaderProgram(prog.get());
-				cmdb->bindStorageBuffer(ANKI_REG(u0), BufferView(aabbsBuff.get()));
-				cmdb->bindStorageBuffer(ANKI_REG(t0), BufferView(objBuff.get()));
-				cmdb->bindStorageBuffer(ANKI_REG(t1), BufferView(posBuff.get()));
+				cmdb->bindUav(0, 0, BufferView(aabbsBuff.get()));
+				cmdb->bindSrv(0, 0, BufferView(objBuff.get()));
+				cmdb->bindSrv(1, 0, BufferView(posBuff.get()));
 				cmdb->dispatchGraph(BufferView(scratchBuff.get()), records.getBegin(), records.getSize(), sizeof(records[0]));
 			}
 			else
 			{
 				cmdb = GrManager::getSingleton().newCommandBuffer(CommandBufferInitInfo(CommandBufferFlag::kGeneralWork));
 				cmdb->bindShaderProgram(prog.get());
-				cmdb->bindStorageBuffer(ANKI_REG(u0), BufferView(aabbsBuff.get()));
-				cmdb->bindStorageBuffer(ANKI_REG(t0), BufferView(objBuff.get()));
-				cmdb->bindStorageBuffer(ANKI_REG(t1), BufferView(posBuff.get()));
+				cmdb->bindUav(0, 0, BufferView(aabbsBuff.get()));
+				cmdb->bindSrv(0, 0, BufferView(objBuff.get()));
+				cmdb->bindSrv(1, 0, BufferView(posBuff.get()));
 
 				for(U32 iobj = 0; iobj < kObjectCount; ++iobj)
 				{