diff options
| author | assiduous <assiduous@diligentgraphics.com> | 2021-03-05 18:17:56 +0000 |
|---|---|---|
| committer | assiduous <assiduous@diligentgraphics.com> | 2021-03-19 00:38:15 +0000 |
| commit | 96e2faa4875e1e30bf8360bd37bfe350096b7433 (patch) | |
| tree | 4e1fbb3b3eaf9a1d8d3674487adf926c2b9a63c0 /Graphics | |
| parent | Unified CreateShaderResourceBinding in D3D12, Vk and GL signatures (diff) | |
| download | DiligentCore-96e2faa4875e1e30bf8360bd37bfe350096b7433.tar.gz DiligentCore-96e2faa4875e1e30bf8360bd37bfe350096b7433.zip | |
Enabled pipeline resource validation in release build
Diffstat (limited to 'Graphics')
4 files changed, 39 insertions, 39 deletions
diff --git a/Graphics/GraphicsEngineD3D12/include/PipelineStateD3D12Impl.hpp b/Graphics/GraphicsEngineD3D12/include/PipelineStateD3D12Impl.hpp index c9e938c3..84d9dccd 100644 --- a/Graphics/GraphicsEngineD3D12/include/PipelineStateD3D12Impl.hpp +++ b/Graphics/GraphicsEngineD3D12/include/PipelineStateD3D12Impl.hpp @@ -121,7 +121,6 @@ private: void Destruct(); -#ifdef DILIGENT_DEVELOPMENT struct ResourceAttribution { static constexpr Uint32 InvalidSignatureIndex = ~0u; @@ -160,8 +159,7 @@ private: }; ResourceAttribution GetResourceAttribution(const char* Name, SHADER_TYPE Stage) const; - void DvpValidateShaderResources(const ShaderD3D12Impl* pShader, const LocalRootSignatureD3D12* pLocalRootSig); -#endif + void ValidateShaderResources(const ShaderD3D12Impl* pShader, const LocalRootSignatureD3D12* pLocalRootSig); private: CComPtr<ID3D12DeviceChild> m_pd3d12PSO; diff --git a/Graphics/GraphicsEngineD3D12/src/PipelineStateD3D12Impl.cpp b/Graphics/GraphicsEngineD3D12/src/PipelineStateD3D12Impl.cpp index c240b4ab..fa70ddc6 100644 --- a/Graphics/GraphicsEngineD3D12/src/PipelineStateD3D12Impl.cpp +++ b/Graphics/GraphicsEngineD3D12/src/PipelineStateD3D12Impl.cpp @@ -635,10 +635,8 @@ void PipelineStateD3D12Impl::InitRootSignature(const PipelineStateCreateInfo& Cr "Compile the shader using SM5.1+ or change the resource layout to use only one space."); } -#ifdef DILIGENT_DEVELOPMENT // Validate resources before remapping - DvpValidateShaderResources(pShader, pLocalRootSig); -#endif + ValidateShaderResources(pShader, pLocalRootSig); CComPtr<ID3DBlob> pBlob; if (IsDXILBytecode(pBytecode->GetBufferPointer(), pBytecode->GetBufferSize())) @@ -663,7 +661,6 @@ void PipelineStateD3D12Impl::InitRootSignature(const PipelineStateCreateInfo& Cr } -#ifdef DILIGENT_DEVELOPMENT PipelineStateD3D12Impl::ResourceAttribution PipelineStateD3D12Impl::GetResourceAttribution(const char* Name, SHADER_TYPE Stage) const { const auto SignCount = GetResourceSignatureCount(); @@ -686,18 +683,25 @@ PipelineStateD3D12Impl::ResourceAttribution PipelineStateD3D12Impl::GetResourceA return ResourceAttribution{}; } -void PipelineStateD3D12Impl::DvpValidateShaderResources(const ShaderD3D12Impl* pShader, const LocalRootSignatureD3D12* pLocalRootSig) +void PipelineStateD3D12Impl::ValidateShaderResources(const ShaderD3D12Impl* pShader, const LocalRootSignatureD3D12* pLocalRootSig) { const auto& pShaderResources = pShader->GetShaderResources(); const auto ShaderType = pShader->GetDesc().ShaderType; +#ifdef DILIGENT_DEVELOPMENT m_ShaderResources.emplace_back(pShaderResources); +#endif // Check compatibility between shader resources and resource signature. pShaderResources->ProcessResources( [&](const D3DShaderResourceAttribs& Attribs, Uint32) // { +#ifdef DILIGENT_DEVELOPMENT m_ResourceAttibutions.emplace_back(); + auto& ResAttribution = m_ResourceAttibutions.back(); +#else + ResourceAttribution ResAttribution; +#endif if (pLocalRootSig != nullptr && pLocalRootSig->IsShaderRecord(Attribs)) return; @@ -706,8 +710,6 @@ void PipelineStateD3D12Impl::DvpValidateShaderResources(const ShaderD3D12Impl* p if (IsSampler && pShaderResources->IsUsingCombinedTextureSamplers()) return; - auto& ResAttribution = m_ResourceAttibutions.back(); - ResAttribution = GetResourceAttribution(Attribs.Name, ShaderType); if (!ResAttribution) { @@ -749,6 +751,7 @@ void PipelineStateD3D12Impl::DvpValidateShaderResources(const ShaderD3D12Impl* p ); } +#ifdef DILIGENT_DEVELOPMENT void PipelineStateD3D12Impl::DvpVerifySRBResources(ShaderResourceBindingD3D12Impl* pSRBs[], Uint32 NumSRBs) const { // Verify SRB compatibility with this pipeline diff --git a/Graphics/GraphicsEngineOpenGL/include/PipelineStateGLImpl.hpp b/Graphics/GraphicsEngineOpenGL/include/PipelineStateGLImpl.hpp index 2ba8fd21..8b4b1e57 100644 --- a/Graphics/GraphicsEngineOpenGL/include/PipelineStateGLImpl.hpp +++ b/Graphics/GraphicsEngineOpenGL/include/PipelineStateGLImpl.hpp @@ -108,7 +108,7 @@ private: SHADER_TYPE GetShaderStageType(Uint32 Index) const; Uint32 GetNumShaderStages() const { return m_NumPrograms; } -#ifdef DILIGENT_DEVELOPMENT + struct ResourceAttribution { static constexpr Uint32 InvalidSignatureIndex = ~0u; @@ -147,8 +147,7 @@ private: }; ResourceAttribution GetResourceAttribution(const char* Name, SHADER_TYPE Stage) const; - void DvpValidateShaderResources(const std::shared_ptr<const ShaderResourcesGL>& pShaderResources, const char* ShaderName, SHADER_TYPE ShaderStages); -#endif + void ValidateShaderResources(std::shared_ptr<const ShaderResourcesGL> pShaderResources, const char* ShaderName, SHADER_TYPE ShaderStages); private: // Linked GL programs for every shader stage. Every pipeline needs to have its own programs diff --git a/Graphics/GraphicsEngineOpenGL/src/PipelineStateGLImpl.cpp b/Graphics/GraphicsEngineOpenGL/src/PipelineStateGLImpl.cpp index 959653e0..4841ebb4 100644 --- a/Graphics/GraphicsEngineOpenGL/src/PipelineStateGLImpl.cpp +++ b/Graphics/GraphicsEngineOpenGL/src/PipelineStateGLImpl.cpp @@ -218,39 +218,35 @@ void PipelineStateGLImpl::InitResourceLayouts(const PipelineStateCreateInfo& Cre pSignature->AddBindings(Bindings); } -#ifdef DILIGENT_DEVELOPMENT const auto& Limits = GetDevice()->GetDeviceLimits(); - DEV_CHECK_ERR(Bindings[BINDING_RANGE_UNIFORM_BUFFER] <= static_cast<Uint32>(Limits.MaxUniformBlocks), - "Number of bindings in range '", GetBindingRangeName(BINDING_RANGE_UNIFORM_BUFFER), "' is greater than maximum allowed (", Limits.MaxUniformBlocks, ")."); - DEV_CHECK_ERR(Bindings[BINDING_RANGE_TEXTURE] <= static_cast<Uint32>(Limits.MaxTextureUnits), - "Number of bindings in range '", GetBindingRangeName(BINDING_RANGE_TEXTURE), "' is greater than maximum allowed (", Limits.MaxTextureUnits, ")."); - DEV_CHECK_ERR(Bindings[BINDING_RANGE_STORAGE_BUFFER] <= static_cast<Uint32>(Limits.MaxStorageBlock), - "Number of bindings in range '", GetBindingRangeName(BINDING_RANGE_STORAGE_BUFFER), "' is greater than maximum allowed (", Limits.MaxStorageBlock, ")."); - DEV_CHECK_ERR(Bindings[BINDING_RANGE_IMAGE] <= static_cast<Uint32>(Limits.MaxImagesUnits), - "Number of bindings in range '", GetBindingRangeName(BINDING_RANGE_IMAGE), "' is greater than maximum allowed (", Limits.MaxImagesUnits, ")."); + if (Bindings[BINDING_RANGE_UNIFORM_BUFFER] > static_cast<Uint32>(Limits.MaxUniformBlocks)) + LOG_ERROR_AND_THROW("The number of bindings in range '", GetBindingRangeName(BINDING_RANGE_UNIFORM_BUFFER), "' is greater than the maximum allowed (", Limits.MaxUniformBlocks, ")."); + if (Bindings[BINDING_RANGE_TEXTURE] > static_cast<Uint32>(Limits.MaxTextureUnits)) + LOG_ERROR_AND_THROW("The number of bindings in range '", GetBindingRangeName(BINDING_RANGE_TEXTURE), "' is greater than the maximum allowed (", Limits.MaxTextureUnits, ")."); + if (Bindings[BINDING_RANGE_STORAGE_BUFFER] > static_cast<Uint32>(Limits.MaxStorageBlock)) + LOG_ERROR_AND_THROW("The number of bindings in range '", GetBindingRangeName(BINDING_RANGE_STORAGE_BUFFER), "' is greater than the maximum allowed (", Limits.MaxStorageBlock, ")."); + if (Bindings[BINDING_RANGE_IMAGE] > static_cast<Uint32>(Limits.MaxImagesUnits)) + LOG_ERROR_AND_THROW("The number of bindings in range '", GetBindingRangeName(BINDING_RANGE_IMAGE), "' is greater than the maximum allowed (", Limits.MaxImagesUnits, ")."); if (m_IsProgramPipelineSupported) { for (size_t i = 0; i < ShaderStages.size(); ++i) { auto* pShaderGL = ShaderStages[i]; - DvpValidateShaderResources(pShaderGL->GetShaderResources(), pShaderGL->GetDesc().Name, pShaderGL->GetDesc().ShaderType); + ValidateShaderResources(pShaderGL->GetShaderResources(), pShaderGL->GetDesc().Name, pShaderGL->GetDesc().ShaderType); } } else { - auto pImmediateCtx = m_pDevice->GetImmediateContext(); - VERIFY_EXPR(pImmediateCtx); + auto* pImmediateCtx = m_pDevice->GetImmediateContext().RawPtr<DeviceContextGLImpl>(); + VERIFY_EXPR(pImmediateCtx != nullptr); VERIFY_EXPR(m_GLPrograms[0] != 0); - std::unique_ptr<ShaderResourcesGL> pResources{new ShaderResourcesGL{}}; - pResources->LoadUniforms(ActiveStages, m_GLPrograms[0], pImmediateCtx.RawPtr<DeviceContextGLImpl>()->GetContextState()); - - std::shared_ptr<const ShaderResourcesGL> pShaderResources{pResources.release()}; - DvpValidateShaderResources(pShaderResources, m_Desc.Name, ActiveStages); + std::shared_ptr<ShaderResourcesGL> pResources{new ShaderResourcesGL{}}; + pResources->LoadUniforms(ActiveStages, m_GLPrograms[0], pImmediateCtx->GetContextState()); + ValidateShaderResources(std::move(pResources), m_Desc.Name, ActiveStages); } -#endif } template <typename PSOCreateInfoType> @@ -473,7 +469,6 @@ GLObjectWrappers::GLPipelineObj& PipelineStateGLImpl::GetGLProgramPipeline(GLCon return ctx_pipeline.second; } -#ifdef DILIGENT_DEVELOPMENT PipelineStateGLImpl::ResourceAttribution PipelineStateGLImpl::GetResourceAttribution(const char* Name, SHADER_TYPE Stage) const { const auto SignCount = GetResourceSignatureCount(); @@ -496,17 +491,16 @@ PipelineStateGLImpl::ResourceAttribution PipelineStateGLImpl::GetResourceAttribu return ResourceAttribution{}; } -void PipelineStateGLImpl::DvpValidateShaderResources(const std::shared_ptr<const ShaderResourcesGL>& pShaderResources, const char* ShaderName, SHADER_TYPE ShaderStages) +void PipelineStateGLImpl::ValidateShaderResources(std::shared_ptr<const ShaderResourcesGL> pShaderResources, const char* ShaderName, SHADER_TYPE ShaderStages) { - m_ShaderResources.emplace_back(pShaderResources); - m_ShaderNames.emplace_back(ShaderName); - const auto HandleResource = [&](const ShaderResourcesGL::GLResourceAttribs& Attribs, SHADER_RESOURCE_TYPE AltResourceType, PIPELINE_RESOURCE_FLAGS Flags) // { - m_ResourceAttibutions.emplace_back(); - auto& ResAttribution = m_ResourceAttibutions.back(); + const auto ResAttribution = GetResourceAttribution(Attribs.Name, ShaderStages); + +#ifdef DILIGENT_DEVELOPMENT + m_ResourceAttibutions.emplace_back(ResAttribution); +#endif - ResAttribution = GetResourceAttribution(Attribs.Name, ShaderStages); if (!ResAttribution) { LOG_ERROR_AND_THROW("Shader '", ShaderName, "' contains resource '", Attribs.Name, @@ -556,8 +550,14 @@ void PipelineStateGLImpl::DvpValidateShaderResources(const std::shared_ptr<const }; pShaderResources->ProcessConstResources(HandleUB, HandleTexture, HandleImage, HandleSB); + +#ifdef DILIGENT_DEVELOPMENT + m_ShaderResources.emplace_back(std::move(pShaderResources)); + m_ShaderNames.emplace_back(ShaderName); +#endif } +#ifdef DILIGENT_DEVELOPMENT void PipelineStateGLImpl::DvpVerifySRBResources(ShaderResourceBindingGLImpl* pSRBs[], const TBindings BoundResOffsets[], Uint32 NumSRBs) const |
