diff options
| author | Egor Yusov <egor.yusov@gmail.com> | 2019-03-03 22:01:58 +0000 |
|---|---|---|
| committer | Egor Yusov <egor.yusov@gmail.com> | 2019-03-03 22:01:58 +0000 |
| commit | b21f54c63be0e81a26f505ea019049d4f663bf3b (patch) | |
| tree | 0ad3e327aa0c932909c7dd503dadd855b59c4c10 /Graphics/GraphicsEngineVulkan | |
| parent | Minor change to DeviceContextVkImpl.h (diff) | |
| download | DiligentCore-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.h | 11 | ||||
| -rw-r--r-- | Graphics/GraphicsEngineVulkan/src/ShaderVkImpl.cpp | 57 |
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; +} + } |
