diff options
| author | assiduous <assiduous@diligentgraphics.com> | 2021-01-23 07:38:01 +0000 |
|---|---|---|
| committer | assiduous <assiduous@diligentgraphics.com> | 2021-01-23 07:38:01 +0000 |
| commit | b8caf2173c16d8ae4ac5fc5303a1e525ef56509c (patch) | |
| tree | c902c3f249a968da521e005610b789bf323f73a8 /Graphics/GraphicsEngineVulkan | |
| parent | Merge branch 'azhirnov-res_layout' into resource_signature (diff) | |
| download | DiligentCore-b8caf2173c16d8ae4ac5fc5303a1e525ef56509c.tar.gz DiligentCore-b8caf2173c16d8ae4ac5fc5303a1e525ef56509c.zip | |
Few updates to resource signature VK implementation
Diffstat (limited to 'Graphics/GraphicsEngineVulkan')
3 files changed, 19 insertions, 18 deletions
diff --git a/Graphics/GraphicsEngineVulkan/include/DeviceContextVkImpl.hpp b/Graphics/GraphicsEngineVulkan/include/DeviceContextVkImpl.hpp index 358cd3bc..2cb20f5c 100644 --- a/Graphics/GraphicsEngineVulkan/include/DeviceContextVkImpl.hpp +++ b/Graphics/GraphicsEngineVulkan/include/DeviceContextVkImpl.hpp @@ -481,7 +481,8 @@ private: struct DescriptorSetBindInfo { - using ShaderResourceArray = std::array<RefCntAutoPtr<ShaderResourceBindingVkImpl>, MAX_RESOURCE_SIGNATURES>; + // Do not use strong references! + using ShaderResourceArray = std::array<ShaderResourceBindingVkImpl*, MAX_RESOURCE_SIGNATURES>; using VkDescSetArray = std::array<VkDescriptorSet, MAX_RESOURCE_SIGNATURES * MAX_DESCR_SET_PER_SIGNATURE>; using BoolArray = std::bitset<MAX_RESOURCE_SIGNATURES>; diff --git a/Graphics/GraphicsEngineVulkan/include/PipelineLayoutVk.hpp b/Graphics/GraphicsEngineVulkan/include/PipelineLayoutVk.hpp index d1e8fb38..1658dd06 100644 --- a/Graphics/GraphicsEngineVulkan/include/PipelineLayoutVk.hpp +++ b/Graphics/GraphicsEngineVulkan/include/PipelineLayoutVk.hpp @@ -37,7 +37,6 @@ namespace Diligent { -class DeviceContextVkImpl; class ShaderResourceCacheVk; /// Implementation of the Diligent::PipelineLayoutVk class @@ -71,9 +70,10 @@ public: struct ResourceInfo { - SHADER_RESOURCE_TYPE Type = SHADER_RESOURCE_TYPE_UNKNOWN; - Uint16 DescrSetIndex = 0; - Uint16 BindingIndex = 0; + SHADER_RESOURCE_TYPE Type = SHADER_RESOURCE_TYPE_UNKNOWN; + + Uint32 DescrSetIndex = 0; + Uint32 BindingIndex = 0; }; bool GetResourceInfo(const char* Name, SHADER_TYPE Stage, ResourceInfo& Info) const; @@ -83,14 +83,14 @@ private: VulkanUtilities::PipelineLayoutWrapper m_VkPipelineLayout; - // Index of the first descriptor set, for every resource signature + // Index of the first descriptor set, for every resource signature. FirstDescrSetIndexArrayType m_FirstDescrSetIndex = {}; // The number of resource signatures used by this pipeline layout // (Maximum is MAX_RESOURCE_SIGNATURES) Uint8 m_SignatureCount = 0; - // The total number of descriptor sets used by this pipeline layout. + // The total number of descriptor sets used by this pipeline layout // (Maximum is MAX_RESOURCE_SIGNATURES * 2) Uint8 m_DescrSetCount = 0; diff --git a/Graphics/GraphicsEngineVulkan/src/PipelineLayoutVk.cpp b/Graphics/GraphicsEngineVulkan/src/PipelineLayoutVk.cpp index c4cefb88..f2245d34 100644 --- a/Graphics/GraphicsEngineVulkan/src/PipelineLayoutVk.cpp +++ b/Graphics/GraphicsEngineVulkan/src/PipelineLayoutVk.cpp @@ -57,13 +57,13 @@ void PipelineLayoutVk::Release(RenderDeviceVkImpl* pDeviceVk, Uint64 CommandQueu void PipelineLayoutVk::Create(RenderDeviceVkImpl* pDeviceVk, IPipelineResourceSignature** ppSignatures, Uint32 SignatureCount) { - VERIFY(m_SignatureCount == 0 && m_DescrSetCount == 0, + VERIFY(m_SignatureCount == 0 && m_DescrSetCount == 0 && !m_VkPipelineLayout, "This pipeline layout is already initialized"); for (Uint32 i = 0; i < SignatureCount; ++i) { auto* pSignature = ValidatedCast<PipelineResourceSignatureVkImpl>(ppSignatures[i]); - VERIFY(pSignature != nullptr, "Pipeline resource signature at index ", i, " is null. This error should've been caught by ValidatePipelineResourceSignatures."); + VERIFY(pSignature != nullptr, "Pipeline resource signature at index ", i, " is null. This error should've been caught by ValidatePipelineResourceSignatures."); const Uint8 Index = pSignature->GetDesc().BindingIndex; @@ -74,7 +74,7 @@ void PipelineLayoutVk::Create(RenderDeviceVkImpl* pDeviceVk, IPipelineResourceSi VERIFY(m_Signatures[Index] == nullptr, "Pipeline resource signature '", pSignature->GetDesc().Name, "' at index ", Uint32{Index}, " conflicts with another resource signature '", m_Signatures[Index]->GetDesc().Name, - "' that uses the same index. This error should've been caught by ValidatePipelineResourceSignatureDesc."); + "' that uses the same index. This error should've been caught by ValidatePipelineResourceSignatures."); m_SignatureCount = std::max<Uint8>(m_SignatureCount, Index + 1); m_Signatures[Index] = pSignature; @@ -88,7 +88,7 @@ void PipelineLayoutVk::Create(RenderDeviceVkImpl* pDeviceVk, IPipelineResourceSi m_Signatures[i] = pEmptySign; } - std::array<VkDescriptorSetLayout, MAX_RESOURCE_SIGNATURES * MAX_DESCR_SET_PER_SIGNATURE> DescSetLayouts; + std::array<VkDescriptorSetLayout, MAX_RESOURCE_SIGNATURES* MAX_DESCR_SET_PER_SIGNATURE> DescSetLayouts = {}; Uint32 DescSetLayoutCount = 0; Uint32 DynamicUniformBufferCount = 0; @@ -117,20 +117,20 @@ void PipelineLayoutVk::Create(RenderDeviceVkImpl* pDeviceVk, IPipelineResourceSi const auto& Limits = pDeviceVk->GetPhysicalDevice().GetProperties().limits; if (DescSetLayoutCount > Limits.maxBoundDescriptorSets) { - LOG_ERROR_AND_THROW("The total number of descriptor sets used by the pipeline layout (", DescSetLayoutCount, - ") exceeds device limit (", Limits.maxBoundDescriptorSets, ")"); + LOG_ERROR_AND_THROW("The total number of descriptor sets (", DescSetLayoutCount, + ") used by the pipeline layout exceeds device limit (", Limits.maxBoundDescriptorSets, ")"); } if (DynamicUniformBufferCount > Limits.maxDescriptorSetUniformBuffersDynamic) { - LOG_ERROR_AND_THROW("The number of dynamic uniform buffers (", DynamicUniformBufferCount, - ") exceeds device limit (", Limits.maxDescriptorSetUniformBuffersDynamic, ")"); + LOG_ERROR_AND_THROW("The number of dynamic uniform buffers (", DynamicUniformBufferCount, + ") used by the pipeline layout exceeds device limit (", Limits.maxDescriptorSetUniformBuffersDynamic, ")"); } if (DynamicStorageBufferCount > Limits.maxDescriptorSetStorageBuffersDynamic) { LOG_ERROR_AND_THROW("The number of dynamic storage buffers (", DynamicStorageBufferCount, - ") exceeds device limit (", Limits.maxDescriptorSetStorageBuffersDynamic, ")"); + ") used by the pipeline layout exceeds device limit (", Limits.maxDescriptorSetStorageBuffersDynamic, ")"); } VERIFY(m_DescrSetCount <= std::numeric_limits<decltype(m_DescrSetCount)>::max(), @@ -177,8 +177,8 @@ bool PipelineLayoutVk::GetResourceInfo(const char* Name, SHADER_TYPE Stage, Reso if ((Res.ShaderStages & Stage) && strcmp(Res.Name, Name) == 0) { Info.Type = Res.ResourceType; - Info.BindingIndex = static_cast<Uint16>(Attr.BindingIndex); - Info.DescrSetIndex = m_FirstDescrSetIndex[i] + static_cast<Uint16>(Attr.DescrSet); + Info.BindingIndex = Attr.BindingIndex; + Info.DescrSetIndex = m_FirstDescrSetIndex[i] + Attr.DescrSet; return true; } } |
