diff options
| author | azhirnov <zh1dron@gmail.com> | 2021-02-26 19:02:04 +0000 |
|---|---|---|
| committer | assiduous <assiduous@diligentgraphics.com> | 2021-03-19 00:38:12 +0000 |
| commit | 3b019d0c699fbb224fd00cbfcfb1e0598a44b7ba (patch) | |
| tree | fd422fc3bdef87779e2639eca437947d90f8673c /Graphics/GraphicsEngineVulkan | |
| parent | Added ShaderResourceLayoutTest.MergedVarStages test (diff) | |
| download | DiligentCore-3b019d0c699fbb224fd00cbfcfb1e0598a44b7ba.tar.gz DiligentCore-3b019d0c699fbb224fd00cbfcfb1e0598a44b7ba.zip | |
Vulkan: added validation for DescriptorSetBaseInd, optimized field packing
Diffstat (limited to 'Graphics/GraphicsEngineVulkan')
| -rw-r--r-- | Graphics/GraphicsEngineVulkan/include/DeviceContextVkImpl.hpp | 12 | ||||
| -rw-r--r-- | Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp | 17 |
2 files changed, 23 insertions, 6 deletions
diff --git a/Graphics/GraphicsEngineVulkan/include/DeviceContextVkImpl.hpp b/Graphics/GraphicsEngineVulkan/include/DeviceContextVkImpl.hpp index eb298fb1..e32405a9 100644 --- a/Graphics/GraphicsEngineVulkan/include/DeviceContextVkImpl.hpp +++ b/Graphics/GraphicsEngineVulkan/include/DeviceContextVkImpl.hpp @@ -479,11 +479,11 @@ private: /// Flag indicating if currently committed index buffer is up to date bool CommittedIBUpToDate = false; + bool CommittedResourcesValidated = false; + Uint32 NumCommands = 0; VkPipelineBindPoint vkPipelineBindPoint = VK_PIPELINE_BIND_POINT_MAX_ENUM; - - bool CommittedResourcesValidated = false; } m_State; // Graphics/mesh, compute, ray tracing @@ -507,12 +507,18 @@ private: // The total number of descriptors with dynamic offset, given by pSignature->GetDynamicOffsetCount(). // Note that this is not the actual number of dynamic buffers in the resource cache. Uint32 DynamicOffsetCount = 0; + +#ifdef DILIGENT_DEVELOPMENT + // The DescriptorSetBaseInd that was used in the last BindDescriptorSets() call + Uint32 LastBoundDSBaseInd = ~0u; +#endif }; std::array<ResourceInfo, MAX_RESOURCE_SIGNATURES> Resources; +#ifdef DILIGENT_DEVELOPMENT // Do not use strong references! std::array<ShaderResourceBindingVkImpl*, MAX_RESOURCE_SIGNATURES> SRBs = {}; - +#endif using Bitfield = Uint8; static_assert(sizeof(Bitfield) * 8 >= MAX_RESOURCE_SIGNATURES, "not enought space to store MAX_RESOURCE_SIGNATURES bits"); diff --git a/Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp b/Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp index 27cdfbee..0e9610c6 100644 --- a/Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp +++ b/Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp @@ -445,6 +445,10 @@ void DeviceContextVkImpl::CommitDescriptorSets(DescriptorSetBindInfo& BindInfo) VERIFY_EXPR(m_State.vkPipelineBindPoint != VK_PIPELINE_BIND_POINT_MAX_ENUM); m_CommandBuffer.BindDescriptorSets(m_State.vkPipelineBindPoint, BindInfo.vkPipelineLayout, ResInfo.DescriptorSetBaseInd, SetCount, ResInfo.vkSets.data(), ResInfo.DynamicOffsetCount, m_DynamicBufferOffsets.data()); + +#ifdef DILIGENT_DEVELOPMENT + ResInfo.LastBoundDSBaseInd = ResInfo.DescriptorSetBaseInd; +#endif } VERIFY_EXPR((StaleSRBFlags & BindInfo.ActiveSRBMask) == 0); @@ -481,15 +485,15 @@ void DeviceContextVkImpl::DvpValidateCommittedShaderResources() } auto* pSRBSign = pSRB->GetSignature(); - VERIFY_EXPR(pSRBSign != nullptr); + DEV_CHECK_ERR(pSRBSign != nullptr, "SRB must not be null"); if (!pLayoutSign->IsCompatibleWith(*pSRBSign)) { - LOG_ERROR_MESSAGE("Shader resource binding at index ", i, " with signature '", pSRBSign->GetDesc().Name, + LOG_ERROR_MESSAGE("Shader resource binding at index (", i, ") with signature '", pSRBSign->GetDesc().Name, "' is not compatible with pipeline layout in current pipeline '", m_pPipelineState->GetDesc().Name, "'."); } - VERIFY((BindInfo.StaleSRBMask & BindInfo.ActiveSRBMask) == 0, "CommitDescriptorSets() must be called before validation."); + DEV_CHECK_ERR((BindInfo.StaleSRBMask & BindInfo.ActiveSRBMask) == 0, "CommitDescriptorSets() must be called before validation."); const auto& ResInfo = BindInfo.Resources[i]; const auto DSCount = pLayoutSign->GetNumDescriptorSets(); @@ -499,6 +503,11 @@ void DeviceContextVkImpl::DvpValidateCommittedShaderResources() "descriptor set with index ", s, " is not bound for resource signature '", pLayoutSign->GetDesc().Name, "', binding index ", i, "."); } + + DEV_CHECK_ERR(ResInfo.LastBoundDSBaseInd == ResInfo.DescriptorSetBaseInd, + "Shader resource binding at index ", i, " has descriptor set base offset ", ResInfo.DescriptorSetBaseInd, + ", but currently bound descriptor sets have base offset ", ResInfo.LastBoundDSBaseInd, + "; one of the resource signatures with lower binding index is not compatible."); } m_pPipelineState->DvpVerifySRBResources(BindInfo.SRBs); @@ -607,7 +616,9 @@ void DeviceContextVkImpl::CommitShaderResources(IShaderResourceBinding* pShaderR VERIFY_EXPR(DSIndex == ResourceCache.GetNumDescriptorSets()); +#ifdef DILIGENT_DEVELOPMENT BindInfo.SRBs[SRBIndex] = pResBindingVkImpl; +#endif m_DynamicBufferOffsets.resize(std::max<size_t>(m_DynamicBufferOffsets.size(), pSignature->GetDynamicOffsetCount())); |
