Graphics/ShaderReflection: Add support for texture arrays
This commit is contained in:
parent
ff39c10514
commit
ea3c363b58
|
|
@ -50,24 +50,39 @@ namespace Nz
|
||||||
UInt32 bindingSet = externalVar.bindingSet.GetResultingValue();
|
UInt32 bindingSet = externalVar.bindingSet.GetResultingValue();
|
||||||
|
|
||||||
ShaderBindingType bindingType;
|
ShaderBindingType bindingType;
|
||||||
const auto& varType = externalVar.type.GetResultingValue();
|
UInt32 arraySize = 1;
|
||||||
if (IsStorageType(varType))
|
const auto* varType = &externalVar.type.GetResultingValue();
|
||||||
|
|
||||||
|
if (IsStorageType(*varType))
|
||||||
bindingType = ShaderBindingType::StorageBuffer;
|
bindingType = ShaderBindingType::StorageBuffer;
|
||||||
else if (IsSamplerType(varType))
|
else if (IsSamplerType(*varType))
|
||||||
bindingType = ShaderBindingType::Texture;
|
bindingType = ShaderBindingType::Texture;
|
||||||
else if (IsUniformType(varType))
|
else if (IsUniformType(*varType))
|
||||||
bindingType = ShaderBindingType::UniformBuffer;
|
bindingType = ShaderBindingType::UniformBuffer;
|
||||||
|
else if (IsArrayType(*varType))
|
||||||
|
{
|
||||||
|
const auto& arrayType = std::get<nzsl::Ast::ArrayType>(*varType);
|
||||||
|
const auto& innerType = arrayType.containedType->type;
|
||||||
|
if (!IsSamplerType(innerType))
|
||||||
|
throw std::runtime_error("unexpected type " + ToString(innerType) + " in array " + ToString(arrayType));
|
||||||
|
|
||||||
|
arraySize = arrayType.length;
|
||||||
|
bindingType = ShaderBindingType::Texture;
|
||||||
|
varType = &innerType;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
throw std::runtime_error("unexpected type " + ToString(varType));
|
throw std::runtime_error("unexpected type " + ToString(varType));
|
||||||
|
|
||||||
// TODO: Get correct shader stage type
|
for (UInt32 i = 0; i < arraySize; ++i)
|
||||||
|
{
|
||||||
|
// TODO: Get more precise shader stage type
|
||||||
m_pipelineLayoutInfo.bindings.push_back({
|
m_pipelineLayoutInfo.bindings.push_back({
|
||||||
bindingSet, // setIndex
|
bindingSet, // setIndex
|
||||||
bindingIndex, // bindingIndex
|
bindingIndex + i, // bindingIndex
|
||||||
bindingType, // type
|
bindingType, // type
|
||||||
nzsl::ShaderStageType_All // shaderStageFlags
|
nzsl::ShaderStageType_All // shaderStageFlags
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
if (!externalVar.tag.empty() && externalBlock)
|
if (!externalVar.tag.empty() && externalBlock)
|
||||||
{
|
{
|
||||||
|
|
@ -81,7 +96,7 @@ namespace Nz
|
||||||
ExternalStorageBlock& storageBuffer = externalBlock->storageBlocks[externalVar.tag];
|
ExternalStorageBlock& storageBuffer = externalBlock->storageBlocks[externalVar.tag];
|
||||||
storageBuffer.bindingIndex = bindingIndex;
|
storageBuffer.bindingIndex = bindingIndex;
|
||||||
storageBuffer.bindingSet = bindingSet;
|
storageBuffer.bindingSet = bindingSet;
|
||||||
storageBuffer.structIndex = std::get<nzsl::Ast::StorageType>(varType).containedType.structIndex;
|
storageBuffer.structIndex = std::get<nzsl::Ast::StorageType>(*varType).containedType.structIndex;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -90,7 +105,7 @@ namespace Nz
|
||||||
if (externalBlock->samplers.find(externalVar.tag) != externalBlock->samplers.end())
|
if (externalBlock->samplers.find(externalVar.tag) != externalBlock->samplers.end())
|
||||||
throw std::runtime_error("duplicate textures tag " + externalVar.tag + " in external block " + node.tag);
|
throw std::runtime_error("duplicate textures tag " + externalVar.tag + " in external block " + node.tag);
|
||||||
|
|
||||||
const auto& samplerType = std::get<nzsl::Ast::SamplerType>(varType);
|
const auto& samplerType = std::get<nzsl::Ast::SamplerType>(*varType);
|
||||||
|
|
||||||
ExternalTexture& texture = externalBlock->samplers[externalVar.tag];
|
ExternalTexture& texture = externalBlock->samplers[externalVar.tag];
|
||||||
texture.bindingIndex = bindingIndex;
|
texture.bindingIndex = bindingIndex;
|
||||||
|
|
@ -108,7 +123,7 @@ namespace Nz
|
||||||
ExternalUniformBlock& uniformBuffer = externalBlock->uniformBlocks[externalVar.tag];
|
ExternalUniformBlock& uniformBuffer = externalBlock->uniformBlocks[externalVar.tag];
|
||||||
uniformBuffer.bindingIndex = bindingIndex;
|
uniformBuffer.bindingIndex = bindingIndex;
|
||||||
uniformBuffer.bindingSet = bindingSet;
|
uniformBuffer.bindingSet = bindingSet;
|
||||||
uniformBuffer.structIndex = std::get<nzsl::Ast::UniformType>(varType).containedType.structIndex;
|
uniformBuffer.structIndex = std::get<nzsl::Ast::UniformType>(*varType).containedType.structIndex;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue