diff options
| author | assiduous <assiduous@diligentgraphics.com> | 2021-03-06 22:06:26 +0000 |
|---|---|---|
| committer | assiduous <assiduous@diligentgraphics.com> | 2021-03-19 00:38:16 +0000 |
| commit | 30a65df99cfc678a431a89b0cff02a515416c78a (patch) | |
| tree | 2d3ed68bf8ec028879e22ff6d1ec386df723677e /Graphics/GraphicsEngineOpenGL | |
| parent | Moved GetResourceAttribution() function to PipelineStateBase to eliminate dup... (diff) | |
| download | DiligentCore-30a65df99cfc678a431a89b0cff02a515416c78a.tar.gz DiligentCore-30a65df99cfc678a431a89b0cff02a515416c78a.zip | |
Unified resource signature handling by pipeline state in D3D12, Vk and GL
Diffstat (limited to 'Graphics/GraphicsEngineOpenGL')
| -rw-r--r-- | Graphics/GraphicsEngineOpenGL/include/PipelineStateGLImpl.hpp | 25 | ||||
| -rw-r--r-- | Graphics/GraphicsEngineOpenGL/src/PipelineStateGLImpl.cpp | 67 |
2 files changed, 22 insertions, 70 deletions
diff --git a/Graphics/GraphicsEngineOpenGL/include/PipelineStateGLImpl.hpp b/Graphics/GraphicsEngineOpenGL/include/PipelineStateGLImpl.hpp index 20f1965a..37fef0ba 100644 --- a/Graphics/GraphicsEngineOpenGL/include/PipelineStateGLImpl.hpp +++ b/Graphics/GraphicsEngineOpenGL/include/PipelineStateGLImpl.hpp @@ -60,19 +60,6 @@ public: /// Queries the specific interface, see IObject::QueryInterface() for details virtual void DILIGENT_CALL_TYPE QueryInterface(const INTERFACE_ID& IID, IObject** ppInterface) override; - /// Implementation of IPipelineState::GetResourceSignatureCount() in OpenGL backend. - virtual Uint32 DILIGENT_CALL_TYPE GetResourceSignatureCount() const override final { return m_SignatureCount; } - - /// Implementation of IPipelineState::GetResourceSignature() in OpenGL backend. - virtual PipelineResourceSignatureGLImpl* DILIGENT_CALL_TYPE GetResourceSignature(Uint32 Index) const override final - { - VERIFY_EXPR(Index < m_SignatureCount); - return m_Signatures[Index].RawPtr<PipelineResourceSignatureGLImpl>(); - } - - /// Implementation of IPipelineState::IsCompatibleWith() in OpenGL backend. - virtual bool DILIGENT_CALL_TYPE IsCompatibleWith(const IPipelineState* pPSO) const override final; - void CommitProgram(GLContextState& State); #ifdef DILIGENT_DEVELOPMENT @@ -92,10 +79,10 @@ private: const TShaderStages& ShaderStages, SHADER_TYPE ActiveStages); - void CreateDefaultSignature(const PipelineStateCreateInfo& CreateInfo, - const TShaderStages& ShaderStages, - SHADER_TYPE ActiveStages, - IPipelineResourceSignature** ppSignature); + RefCntAutoPtr<PipelineResourceSignatureGLImpl> CreateDefaultSignature( + const PipelineStateCreateInfo& CreateInfo, + const TShaderStages& ShaderStages, + SHADER_TYPE ActiveStages); void Destruct(); @@ -115,10 +102,6 @@ private: std::vector<std::pair<GLContext::NativeGLContextType, GLObjectWrappers::GLPipelineObj>> m_GLProgPipelines; - using SignatureArrayType = std::array<RefCntAutoPtr<PipelineResourceSignatureGLImpl>, MAX_RESOURCE_SIGNATURES>; - SignatureArrayType m_Signatures = {}; - Uint8 m_SignatureCount = 0; - Uint8 m_NumPrograms = 0; bool m_IsProgramPipelineSupported = false; std::array<SHADER_TYPE, 5> m_ShaderTypes = {}; diff --git a/Graphics/GraphicsEngineOpenGL/src/PipelineStateGLImpl.cpp b/Graphics/GraphicsEngineOpenGL/src/PipelineStateGLImpl.cpp index 693c0d1a..334b20d7 100644 --- a/Graphics/GraphicsEngineOpenGL/src/PipelineStateGLImpl.cpp +++ b/Graphics/GraphicsEngineOpenGL/src/PipelineStateGLImpl.cpp @@ -41,10 +41,10 @@ namespace Diligent { -void PipelineStateGLImpl::CreateDefaultSignature(const PipelineStateCreateInfo& CreateInfo, - const TShaderStages& ShaderStages, - SHADER_TYPE ActiveStages, - IPipelineResourceSignature** ppSignature) +RefCntAutoPtr<PipelineResourceSignatureGLImpl> PipelineStateGLImpl::CreateDefaultSignature( + const PipelineStateCreateInfo& CreateInfo, + const TShaderStages& ShaderStages, + SHADER_TYPE ActiveStages) { std::vector<PipelineResourceDesc> Resources; @@ -152,6 +152,7 @@ void PipelineStateGLImpl::CreateDefaultSignature(const PipelineStateCreateInfo& ProgramResources.ProcessConstResources(HandleUB, HandleTexture, HandleImage, HandleSB); } + RefCntAutoPtr<PipelineResourceSignatureGLImpl> pSignature; if (Resources.size()) { String SignName = String{"Implicit signature for PSO '"} + m_Desc.Name + '\''; @@ -167,37 +168,28 @@ void PipelineStateGLImpl::CreateDefaultSignature(const PipelineStateCreateInfo& ResSignDesc.SRBAllocationGranularity = CreateInfo.PSODesc.SRBAllocationGranularity; ResSignDesc.UseCombinedTextureSamplers = true; - GetDevice()->CreatePipelineResourceSignature(ResSignDesc, ppSignature, true); + // Always initialize default resource signature as internal device object. + // This is necessary to avoud cyclic references from TexRegionRenderer. + // This may never be a problem as the PSO keeps the reference to the device if necessary. + constexpr bool bIsDeviceInternal = true; + GetDevice()->CreatePipelineResourceSignature(ResSignDesc, pSignature.DblPtr<IPipelineResourceSignature>(), bIsDeviceInternal); - if (*ppSignature == nullptr) + if (!pSignature) LOG_ERROR_AND_THROW("Failed to create resource signature for pipeline state"); } + + return pSignature; } void PipelineStateGLImpl::InitResourceLayouts(const PipelineStateCreateInfo& CreateInfo, const TShaderStages& ShaderStages, SHADER_TYPE ActiveStages) { - const Uint32 SignatureCount = CreateInfo.ResourceSignaturesCount; - RefCntAutoPtr<IPipelineResourceSignature> pImplicitSignature; - - if (SignatureCount == 0 || CreateInfo.ppResourceSignatures == nullptr) - { - CreateDefaultSignature(CreateInfo, ShaderStages, ActiveStages, &pImplicitSignature); - if (pImplicitSignature != nullptr) - { - VERIFY_EXPR(pImplicitSignature->GetDesc().BindingIndex == 0); - m_Signatures[0] = ValidatedCast<PipelineResourceSignatureGLImpl>(pImplicitSignature.RawPtr()); - m_SignatureCount = 1; - } - } - else + if (m_UsingImplicitSignature) { - const auto MaxBindingIndex = - PipelineResourceSignatureGLImpl::CopyResourceSignatures(CreateInfo.PSODesc.PipelineType, SignatureCount, CreateInfo.ppResourceSignatures, - m_Signatures.data(), m_Signatures.size()); - m_SignatureCount = static_cast<decltype(m_SignatureCount)>(MaxBindingIndex + 1); - VERIFY_EXPR(m_SignatureCount == MaxBindingIndex + 1); + VERIFY_EXPR(m_SignatureCount == 1); + m_Signatures[0] = CreateDefaultSignature(CreateInfo, ShaderStages, ActiveStages); + VERIFY_EXPR(!m_Signatures[0] || m_Signatures[0]->GetDesc().BindingIndex == 0); } // Apply resource bindings to programs. @@ -393,10 +385,7 @@ void PipelineStateGLImpl::Destruct() m_GLPrograms = nullptr; } - m_Signatures.fill({}); - - m_SignatureCount = 0; - m_NumPrograms = 0; + m_NumPrograms = 0; TPipelineStateBase::Destruct(); } @@ -409,26 +398,6 @@ SHADER_TYPE PipelineStateGLImpl::GetShaderStageType(Uint32 Index) const return m_ShaderTypes[Index]; } -bool PipelineStateGLImpl::IsCompatibleWith(const IPipelineState* pPSO) const -{ - VERIFY_EXPR(pPSO != nullptr); - - if (pPSO == this) - return true; - - const auto& lhs = *this; - const auto& rhs = *ValidatedCast<const PipelineStateGLImpl>(pPSO); - - if (lhs.GetResourceSignatureCount() != rhs.GetResourceSignatureCount()) - return false; - - for (Uint32 s = 0, SigCount = lhs.GetResourceSignatureCount(); s < SigCount; ++s) - { - if (!lhs.GetResourceSignature(s)->IsCompatibleWith(*rhs.GetResourceSignature(s))) - return false; - } - return true; -} void PipelineStateGLImpl::CommitProgram(GLContextState& State) { |
