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/GraphicsEngineOpenGL | |
| 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/GraphicsEngineOpenGL')
| -rw-r--r-- | Graphics/GraphicsEngineOpenGL/include/PipelineStateGLImpl.hpp | 5 | ||||
| -rw-r--r-- | Graphics/GraphicsEngineOpenGL/src/PipelineStateGLImpl.cpp | 52 |
2 files changed, 28 insertions, 29 deletions
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 |
