Add Unity-style buffer shader resource support

This commit is contained in:
2026-04-08 18:29:16 +08:00
parent 4728b09ae8
commit bb0f4afe7d
8 changed files with 420 additions and 10 deletions

View File

@@ -369,7 +369,12 @@ inline RHI::DescriptorType ToBuiltinPassDescriptorType(Resources::ShaderResource
return RHI::DescriptorType::CBV;
case Resources::ShaderResourceType::Texture2D:
case Resources::ShaderResourceType::TextureCube:
case Resources::ShaderResourceType::StructuredBuffer:
case Resources::ShaderResourceType::RawBuffer:
return RHI::DescriptorType::SRV;
case Resources::ShaderResourceType::RWStructuredBuffer:
case Resources::ShaderResourceType::RWRawBuffer:
return RHI::DescriptorType::UAV;
case Resources::ShaderResourceType::Sampler:
return RHI::DescriptorType::Sampler;
default:
@@ -377,6 +382,23 @@ inline RHI::DescriptorType ToBuiltinPassDescriptorType(Resources::ShaderResource
}
}
inline RHI::ResourceViewDimension ToBuiltinPassResourceDimension(Resources::ShaderResourceType type) {
switch (type) {
case Resources::ShaderResourceType::Texture2D:
return RHI::ResourceViewDimension::Texture2D;
case Resources::ShaderResourceType::TextureCube:
return RHI::ResourceViewDimension::TextureCube;
case Resources::ShaderResourceType::StructuredBuffer:
case Resources::ShaderResourceType::RWStructuredBuffer:
return RHI::ResourceViewDimension::StructuredBuffer;
case Resources::ShaderResourceType::RawBuffer:
case Resources::ShaderResourceType::RWRawBuffer:
return RHI::ResourceViewDimension::RawBuffer;
default:
return RHI::ResourceViewDimension::Unknown;
}
}
inline RHI::DescriptorHeapType ResolveBuiltinPassDescriptorHeapType(Resources::ShaderResourceType type) {
return type == Resources::ShaderResourceType::Sampler
? RHI::DescriptorHeapType::Sampler
@@ -480,6 +502,7 @@ inline bool TryBuildBuiltinPassSetLayouts(
layoutBinding.binding = binding.location.binding;
layoutBinding.type = static_cast<Core::uint32>(descriptorType);
layoutBinding.count = 1;
layoutBinding.resourceDimension = ToBuiltinPassResourceDimension(binding.resourceType);
setLayout.bindings.push_back(layoutBinding);
switch (binding.semantic) {

View File

@@ -210,6 +210,14 @@ inline const char* ShaderResourceTypeToString(Resources::ShaderResourceType type
return "TextureCube";
case Resources::ShaderResourceType::Sampler:
return "Sampler";
case Resources::ShaderResourceType::StructuredBuffer:
return "StructuredBuffer";
case Resources::ShaderResourceType::RawBuffer:
return "RawBuffer";
case Resources::ShaderResourceType::RWStructuredBuffer:
return "RWStructuredBuffer";
case Resources::ShaderResourceType::RWRawBuffer:
return "RWRawBuffer";
default:
return "Unknown";
}

View File

@@ -45,7 +45,11 @@ enum class ShaderResourceType : Core::uint8 {
ConstantBuffer = 0,
Texture2D,
TextureCube,
Sampler
Sampler,
StructuredBuffer,
RawBuffer,
RWStructuredBuffer,
RWRawBuffer
};
struct ShaderUniform {