Fix Nahida toon binding and test assets
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user