summaryrefslogtreecommitdiffstats
path: root/Graphics/GraphicsEngineVulkan
diff options
context:
space:
mode:
authorEgor Yusov <egor.yusov@gmail.com>2019-03-03 22:01:58 +0000
committerEgor Yusov <egor.yusov@gmail.com>2019-03-03 22:01:58 +0000
commitb21f54c63be0e81a26f505ea019049d4f663bf3b (patch)
tree0ad3e327aa0c932909c7dd503dadd855b59c4c10 /Graphics/GraphicsEngineVulkan
parentMinor change to DeviceContextVkImpl.h (diff)
downloadDiligentCore-b21f54c63be0e81a26f505ea019049d4f663bf3b.tar.gz
DiligentCore-b21f54c63be0e81a26f505ea019049d4f663bf3b.zip
Implemented shader resource reflectio API in Vk backend
Diffstat (limited to 'Graphics/GraphicsEngineVulkan')
-rw-r--r--Graphics/GraphicsEngineVulkan/include/ShaderVkImpl.h11
-rw-r--r--Graphics/GraphicsEngineVulkan/src/ShaderVkImpl.cpp57
2 files changed, 60 insertions, 8 deletions
diff --git a/Graphics/GraphicsEngineVulkan/include/ShaderVkImpl.h b/Graphics/GraphicsEngineVulkan/include/ShaderVkImpl.h
index 041c7011..03fc2189 100644
--- a/Graphics/GraphicsEngineVulkan/include/ShaderVkImpl.h
+++ b/Graphics/GraphicsEngineVulkan/include/ShaderVkImpl.h
@@ -49,17 +49,12 @@ public:
IMPLEMENT_QUERY_INTERFACE_IN_PLACE(IID_ShaderVk, TShaderBase);
- virtual Uint32 GetResourceCount()const
+ virtual Uint32 GetResourceCount()const override final
{
- UNSUPPORTED("Not yet implemented");
- return 0;
+ return m_pShaderResources->GetTotalResources();
}
- virtual const ShaderResourceDesc* GetResources()const
- {
- UNSUPPORTED("Not yet implemented");
- return nullptr;
- }
+ virtual ShaderResourceDesc GetResource(Uint32 Index)const override final;
virtual const std::vector<uint32_t>& GetSPIRV()const override final
{
diff --git a/Graphics/GraphicsEngineVulkan/src/ShaderVkImpl.cpp b/Graphics/GraphicsEngineVulkan/src/ShaderVkImpl.cpp
index 3cf4c3f0..9ec51af6 100644
--- a/Graphics/GraphicsEngineVulkan/src/ShaderVkImpl.cpp
+++ b/Graphics/GraphicsEngineVulkan/src/ShaderVkImpl.cpp
@@ -129,4 +129,61 @@ ShaderVkImpl::~ShaderVkImpl()
{
}
+ShaderResourceDesc ShaderVkImpl::GetResource(Uint32 Index)const
+{
+ auto ResCount = GetResourceCount();
+ DEV_CHECK_ERR(Index < ResCount, "Resource index (", Index, ") is out of range");
+ ShaderResourceDesc ResourceDesc;
+ if (Index < ResCount)
+ {
+ const auto& SPIRVResource = m_pShaderResources->GetResource(Index);
+ ResourceDesc.Name = SPIRVResource.Name;
+ ResourceDesc.ArraySize = SPIRVResource.ArraySize;
+ static_assert(SPIRVShaderResourceAttribs::ResourceType::NumResourceTypes == 9, "Please update switch statement below");
+ switch (SPIRVResource.Type)
+ {
+ case SPIRVShaderResourceAttribs::ResourceType::UniformBuffer:
+ ResourceDesc.Type = SHADER_RESOURCE_TYPE_CONSTANT_BUFFER;
+ break;
+
+ case SPIRVShaderResourceAttribs::ResourceType::StorageBuffer:
+ ResourceDesc.Type = SHADER_RESOURCE_TYPE_BUFFER_UAV;
+ break;
+
+ case SPIRVShaderResourceAttribs::ResourceType::UniformTexelBuffer:
+ ResourceDesc.Type = SHADER_RESOURCE_TYPE_BUFFER_SRV;
+ break;
+
+ case SPIRVShaderResourceAttribs::ResourceType::StorageTexelBuffer:
+ ResourceDesc.Type = SHADER_RESOURCE_TYPE_BUFFER_UAV;
+ break;
+
+ case SPIRVShaderResourceAttribs::ResourceType::StorageImage:
+ ResourceDesc.Type = SHADER_RESOURCE_TYPE_TEXTURE_UAV;
+ break;
+
+ case SPIRVShaderResourceAttribs::ResourceType::SampledImage:
+ ResourceDesc.Type = SHADER_RESOURCE_TYPE_TEXTURE_SRV;
+ break;
+
+ case SPIRVShaderResourceAttribs::ResourceType::AtomicCounter:
+ LOG_WARNING_MESSAGE("There is no appropriate shader resource type for atomic counter resource '", SPIRVResource.Name, "'");
+ ResourceDesc.Type = SHADER_RESOURCE_TYPE_BUFFER_UAV;
+ break;
+
+ case SPIRVShaderResourceAttribs::ResourceType::SeparateImage:
+ ResourceDesc.Type = SHADER_RESOURCE_TYPE_TEXTURE_SRV;
+ break;
+
+ case SPIRVShaderResourceAttribs::ResourceType::SeparateSampler:
+ ResourceDesc.Type = SHADER_RESOURCE_TYPE_SAMPLER;
+ break;
+
+ default:
+ UNEXPECTED("Unknown SPIRV resource type");
+ }
+ }
+ return ResourceDesc;
+}
+
}