summaryrefslogtreecommitdiffstats
path: root/Graphics/GraphicsEngineOpenGL
diff options
context:
space:
mode:
authorassiduous <assiduous@diligentgraphics.com>2021-03-06 22:06:26 +0000
committerassiduous <assiduous@diligentgraphics.com>2021-03-19 00:38:16 +0000
commit30a65df99cfc678a431a89b0cff02a515416c78a (patch)
tree2d3ed68bf8ec028879e22ff6d1ec386df723677e /Graphics/GraphicsEngineOpenGL
parentMoved GetResourceAttribution() function to PipelineStateBase to eliminate dup... (diff)
downloadDiligentCore-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.hpp25
-rw-r--r--Graphics/GraphicsEngineOpenGL/src/PipelineStateGLImpl.cpp67
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)
{