Fix Nahida toon binding and test assets

This commit is contained in:
2026-04-13 21:09:40 +08:00
parent e462f7d6f7
commit 48daaa1bd0
9 changed files with 531 additions and 686 deletions

View File

@@ -276,42 +276,97 @@ inline bool TryBuildRuntimeShaderBindings(
return false;
}
auto sortBindingIndices = [&outBindings](auto&& predicate) {
std::vector<size_t> indices;
indices.reserve(outBindings.Size());
for (size_t index = 0; index < outBindings.Size(); ++index) {
if (predicate(outBindings[index])) {
indices.push_back(index);
}
}
std::sort(
indices.begin(),
indices.end(),
[&outBindings](size_t leftIndex, size_t rightIndex) {
const Resources::ShaderResourceBindingDesc& left = outBindings[leftIndex];
const Resources::ShaderResourceBindingDesc& right = outBindings[rightIndex];
if (left.set != right.set) {
return left.set < right.set;
}
return left.binding < right.binding;
});
return indices;
};
Core::uint32 nextConstantBufferRegister = 0;
Core::uint32 nextTextureRegister = 0;
Core::uint32 nextSamplerRegister = 0;
Core::uint32 nextUnorderedAccessRegister = 0;
Core::uint32 nextStorageBufferRegister = 0;
for (Resources::ShaderResourceBindingDesc& binding : outBindings) {
binding.set = 0;
switch (binding.type) {
case Resources::ShaderResourceType::ConstantBuffer:
binding.binding = nextConstantBufferRegister++;
break;
case Resources::ShaderResourceType::Texture2D:
case Resources::ShaderResourceType::TextureCube:
binding.binding = nextTextureRegister++;
break;
case Resources::ShaderResourceType::StructuredBuffer:
case Resources::ShaderResourceType::RawBuffer:
binding.binding =
backend == Resources::ShaderBackend::OpenGL
? nextStorageBufferRegister++
: nextTextureRegister++;
break;
case Resources::ShaderResourceType::Sampler:
binding.binding = nextSamplerRegister++;
break;
case Resources::ShaderResourceType::RWStructuredBuffer:
case Resources::ShaderResourceType::RWRawBuffer:
binding.binding =
backend == Resources::ShaderBackend::OpenGL
? nextStorageBufferRegister++
: nextUnorderedAccessRegister++;
break;
default:
binding.binding = nextUnorderedAccessRegister++;
break;
}
const auto constantBufferIndices = sortBindingIndices([](const Resources::ShaderResourceBindingDesc& binding) {
return binding.type == Resources::ShaderResourceType::ConstantBuffer;
});
for (size_t index : constantBufferIndices) {
outBindings[index].set = 0;
outBindings[index].binding = nextConstantBufferRegister++;
}
const auto textureIndices = sortBindingIndices([](const Resources::ShaderResourceBindingDesc& binding) {
return binding.type == Resources::ShaderResourceType::Texture2D ||
binding.type == Resources::ShaderResourceType::TextureCube;
});
for (size_t index : textureIndices) {
outBindings[index].set = 0;
outBindings[index].binding = nextTextureRegister++;
}
const auto srvBufferIndices = sortBindingIndices([](const Resources::ShaderResourceBindingDesc& binding) {
return binding.type == Resources::ShaderResourceType::StructuredBuffer ||
binding.type == Resources::ShaderResourceType::RawBuffer;
});
for (size_t index : srvBufferIndices) {
outBindings[index].set = 0;
outBindings[index].binding =
backend == Resources::ShaderBackend::OpenGL
? nextStorageBufferRegister++
: nextTextureRegister++;
}
const auto samplerIndices = sortBindingIndices([](const Resources::ShaderResourceBindingDesc& binding) {
return binding.type == Resources::ShaderResourceType::Sampler;
});
for (size_t index : samplerIndices) {
outBindings[index].set = 0;
outBindings[index].binding = nextSamplerRegister++;
}
const auto uavIndices = sortBindingIndices([](const Resources::ShaderResourceBindingDesc& binding) {
return binding.type == Resources::ShaderResourceType::RWStructuredBuffer ||
binding.type == Resources::ShaderResourceType::RWRawBuffer;
});
for (size_t index : uavIndices) {
outBindings[index].set = 0;
outBindings[index].binding =
backend == Resources::ShaderBackend::OpenGL
? nextStorageBufferRegister++
: nextUnorderedAccessRegister++;
}
const auto fallbackUavIndices = sortBindingIndices([](const Resources::ShaderResourceBindingDesc& binding) {
return binding.type != Resources::ShaderResourceType::ConstantBuffer &&
binding.type != Resources::ShaderResourceType::Texture2D &&
binding.type != Resources::ShaderResourceType::TextureCube &&
binding.type != Resources::ShaderResourceType::StructuredBuffer &&
binding.type != Resources::ShaderResourceType::RawBuffer &&
binding.type != Resources::ShaderResourceType::Sampler &&
binding.type != Resources::ShaderResourceType::RWStructuredBuffer &&
binding.type != Resources::ShaderResourceType::RWRawBuffer;
});
for (size_t index : fallbackUavIndices) {
outBindings[index].set = 0;
outBindings[index].binding = nextUnorderedAccessRegister++;
}
return true;