From b21f54c63be0e81a26f505ea019049d4f663bf3b Mon Sep 17 00:00:00 2001 From: Egor Yusov Date: Sun, 3 Mar 2019 14:01:58 -0800 Subject: Implemented shader resource reflectio API in Vk backend --- .../GraphicsEngineVulkan/include/ShaderVkImpl.h | 11 ++--- Graphics/GraphicsEngineVulkan/src/ShaderVkImpl.cpp | 57 ++++++++++++++++++++++ 2 files changed, 60 insertions(+), 8 deletions(-) (limited to 'Graphics/GraphicsEngineVulkan') 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& 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; +} + } -- cgit v1.2.3