diff options
| author | assiduous <assiduous@diligentgraphics.com> | 2020-10-18 20:06:48 +0000 |
|---|---|---|
| committer | assiduous <assiduous@diligentgraphics.com> | 2020-10-18 20:06:48 +0000 |
| commit | 645ef7e425d6ff4ee64b782d27767e0a5732be50 (patch) | |
| tree | 8502aea9ba6100af3a0908c5975a75debc5fd7de /Graphics/GraphicsEngineOpenGL | |
| parent | Refactored LinearAllocator (diff) | |
| download | DiligentCore-645ef7e425d6ff4ee64b782d27767e0a5732be50.tar.gz DiligentCore-645ef7e425d6ff4ee64b782d27767e0a5732be50.zip | |
A number of fixes for PSO creation refactoring (API240075)
Diffstat (limited to 'Graphics/GraphicsEngineOpenGL')
5 files changed, 48 insertions, 50 deletions
diff --git a/Graphics/GraphicsEngineOpenGL/include/PipelineStateGLImpl.hpp b/Graphics/GraphicsEngineOpenGL/include/PipelineStateGLImpl.hpp index 55c53c25..83f8bdad 100644 --- a/Graphics/GraphicsEngineOpenGL/include/PipelineStateGLImpl.hpp +++ b/Graphics/GraphicsEngineOpenGL/include/PipelineStateGLImpl.hpp @@ -107,8 +107,11 @@ private: pShader{_pShader} {} }; - void InitResourceLayouts(RenderDeviceGLImpl* pDeviceVk, - const std::vector<GLPipelineShaderStageInfo>& ShaderStages, + + template <typename PSOCreateInfoType> + void Initialize(const PSOCreateInfoType& CreateInfo, const std::vector<GLPipelineShaderStageInfo>& ShaderStages); + + void InitResourceLayouts(const std::vector<GLPipelineShaderStageInfo>& ShaderStages, LinearAllocator& MemPool); // Linked GL programs for every shader stage. Every pipeline needs to have its own programs diff --git a/Graphics/GraphicsEngineOpenGL/include/RenderDeviceGLImpl.hpp b/Graphics/GraphicsEngineOpenGL/include/RenderDeviceGLImpl.hpp index 5c8037c3..6b76feb9 100644 --- a/Graphics/GraphicsEngineOpenGL/include/RenderDeviceGLImpl.hpp +++ b/Graphics/GraphicsEngineOpenGL/include/RenderDeviceGLImpl.hpp @@ -175,6 +175,9 @@ protected: std::unique_ptr<TexRegionRender> m_pTexRegionRender; private: + template <typename PSOCreateInfoType> + void CreatePipelineState(const PSOCreateInfoType& PSOCreateInfo, IPipelineState** ppPipelineState, bool bIsDeviceInternal); + virtual void TestTextureFormat(TEXTURE_FORMAT TexFormat) override final; bool CheckExtension(const Char* ExtensionString); void FlagSupportedTexFormats(); diff --git a/Graphics/GraphicsEngineOpenGL/src/PipelineStateGLImpl.cpp b/Graphics/GraphicsEngineOpenGL/src/PipelineStateGLImpl.cpp index 4ac36396..7b7d4e21 100644 --- a/Graphics/GraphicsEngineOpenGL/src/PipelineStateGLImpl.cpp +++ b/Graphics/GraphicsEngineOpenGL/src/PipelineStateGLImpl.cpp @@ -36,6 +36,28 @@ namespace Diligent { + +template <typename PSOCreateInfoType> +void PipelineStateGLImpl::Initialize(const PSOCreateInfoType& CreateInfo, const std::vector<GLPipelineShaderStageInfo>& ShaderStages) +{ + // Memory must be released if an exception is thrown. + LinearAllocator MemPool{GetRawAllocator()}; + + MemPool.AddSpace<GLProgramObj>(GetNumShaderStages()); + MemPool.AddSpace<GLProgramResources>(GetNumShaderStages()); + MemPool.AddSpace<SamplerPtr>(m_Desc.ResourceLayout.NumStaticSamplers); + + ReserveSpaceForPipelineDesc(CreateInfo, MemPool); + + MemPool.Reserve(); + + InitResourceLayouts(ShaderStages, MemPool); + InitializePipelineDesc(CreateInfo, MemPool); + + void* Ptr = MemPool.Release(); + VERIFY_EXPR(Ptr == m_GLPrograms); +} + PipelineStateGLImpl::PipelineStateGLImpl(IReferenceCounters* pRefCounters, RenderDeviceGLImpl* pDeviceGL, const GraphicsPipelineStateCreateInfo& CreateInfo, @@ -71,22 +93,7 @@ PipelineStateGLImpl::PipelineStateGLImpl(IReferenceCounters* m_ShaderStageTypes[m_NumShaderStages++] = SHADER_TYPE_PIXEL; } - // Memory must be released if an exception is thrown. - LinearAllocator MemPool{GetRawAllocator()}; - - MemPool.AddRequiredSize<GLProgramObj>(GetNumShaderStages()); - MemPool.AddRequiredSize<GLProgramResources>(GetNumShaderStages()); - MemPool.AddRequiredSize<SamplerPtr>(m_Desc.ResourceLayout.NumStaticSamplers); - - ValidateAndReserveSpace(CreateInfo, MemPool); - - MemPool.Reserve(); - - InitResourceLayouts(pDeviceGL, ShaderStages, MemPool); - InitGraphicsPipeline(CreateInfo, MemPool); - - void* Ptr = MemPool.Release(); - VERIFY_EXPR(Ptr == m_GLPrograms); + Initialize(CreateInfo, ShaderStages); } PipelineStateGLImpl::PipelineStateGLImpl(IReferenceCounters* pRefCounters, @@ -108,22 +115,7 @@ PipelineStateGLImpl::PipelineStateGLImpl(IReferenceCounters* p std::vector<GLPipelineShaderStageInfo> ShaderStages; ExtractShaders<ShaderGLImpl>(CreateInfo, ShaderStages); - // Memory must be released if an exception is thrown. - LinearAllocator MemPool{GetRawAllocator()}; - - MemPool.AddRequiredSize<GLProgramObj>(GetNumShaderStages()); - MemPool.AddRequiredSize<GLProgramResources>(GetNumShaderStages()); - MemPool.AddRequiredSize<SamplerPtr>(m_Desc.ResourceLayout.NumStaticSamplers); - - ValidateAndReserveSpace(CreateInfo, MemPool); - - MemPool.Reserve(); - - InitResourceLayouts(pDeviceGL, ShaderStages, MemPool); - InitComputePipeline(CreateInfo, MemPool); - - void* Ptr = MemPool.Release(); - VERIFY_EXPR(Ptr == m_GLPrograms); + Initialize(CreateInfo, ShaderStages); } PipelineStateGLImpl::~PipelineStateGLImpl() @@ -149,11 +141,11 @@ PipelineStateGLImpl::~PipelineStateGLImpl() IMPLEMENT_QUERY_INTERFACE(PipelineStateGLImpl, IID_PipelineStateGL, TPipelineStateBase) -void PipelineStateGLImpl::InitResourceLayouts(RenderDeviceGLImpl* pDeviceGL, - const std::vector<GLPipelineShaderStageInfo>& ShaderStages, +void PipelineStateGLImpl::InitResourceLayouts(const std::vector<GLPipelineShaderStageInfo>& ShaderStages, LinearAllocator& MemPool) { - auto& DeviceCaps = pDeviceGL->GetDeviceCaps(); + auto* const pDeviceGL = GetDevice(); + const auto& DeviceCaps = pDeviceGL->GetDeviceCaps(); VERIFY(DeviceCaps.DevType != RENDER_DEVICE_TYPE_UNDEFINED, "Device caps are not initialized"); auto pImmediateCtx = m_pDevice->GetImmediateContext(); diff --git a/Graphics/GraphicsEngineOpenGL/src/RenderDeviceGLImpl.cpp b/Graphics/GraphicsEngineOpenGL/src/RenderDeviceGLImpl.cpp index 59b4bdfd..7911fa47 100644 --- a/Graphics/GraphicsEngineOpenGL/src/RenderDeviceGLImpl.cpp +++ b/Graphics/GraphicsEngineOpenGL/src/RenderDeviceGLImpl.cpp @@ -696,7 +696,8 @@ void RenderDeviceGLImpl::CreateSampler(const SamplerDesc& SamplerDesc, ISampler* CreateSampler(SamplerDesc, ppSampler, false); } -void RenderDeviceGLImpl::CreateGraphicsPipelineState(const GraphicsPipelineStateCreateInfo& PSOCreateInfo, IPipelineState** ppPipelineState, bool bIsDeviceInternal) +template <typename PSOCreateInfoType> +void RenderDeviceGLImpl::CreatePipelineState(const PSOCreateInfoType& PSOCreateInfo, IPipelineState** ppPipelineState, bool bIsDeviceInternal) { CreateDeviceObject( "Pipeline state", PSOCreateInfo.PSODesc, ppPipelineState, @@ -709,17 +710,14 @@ void RenderDeviceGLImpl::CreateGraphicsPipelineState(const GraphicsPipelineState ); } +void RenderDeviceGLImpl::CreateGraphicsPipelineState(const GraphicsPipelineStateCreateInfo& PSOCreateInfo, IPipelineState** ppPipelineState, bool bIsDeviceInternal) +{ + CreatePipelineState(PSOCreateInfo, ppPipelineState, bIsDeviceInternal); +} + void RenderDeviceGLImpl::CreateComputePipelineState(const ComputePipelineStateCreateInfo& PSOCreateInfo, IPipelineState** ppPipelineState, bool bIsDeviceInternal) { - CreateDeviceObject( - "Pipeline state", PSOCreateInfo.PSODesc, ppPipelineState, - [&]() // - { - PipelineStateGLImpl* pPipelineStateOGL(NEW_RC_OBJ(m_PSOAllocator, "PipelineStateGLImpl instance", PipelineStateGLImpl)(this, PSOCreateInfo, bIsDeviceInternal)); - pPipelineStateOGL->QueryInterface(IID_PipelineState, reinterpret_cast<IObject**>(ppPipelineState)); - OnCreateDeviceObject(pPipelineStateOGL); - } // - ); + CreatePipelineState(PSOCreateInfo, ppPipelineState, bIsDeviceInternal); } void RenderDeviceGLImpl::CreateGraphicsPipelineState(const GraphicsPipelineStateCreateInfo& PSOCreateInfo, IPipelineState** ppPipelineState) diff --git a/Graphics/GraphicsEngineOpenGL/src/TexRegionRender.cpp b/Graphics/GraphicsEngineOpenGL/src/TexRegionRender.cpp index 1a9c99c0..5861005e 100644 --- a/Graphics/GraphicsEngineOpenGL/src/TexRegionRender.cpp +++ b/Graphics/GraphicsEngineOpenGL/src/TexRegionRender.cpp @@ -151,13 +151,15 @@ TexRegionRender::TexRegionRender(class RenderDeviceGLImpl* pDeviceGL) pDeviceGL->CreateShader(ShaderAttrs, &FragmetShader, IsInternalDeviceObject); PSOCreateInfo.pPS = FragmetShader; - PSOCreateInfo.PSODesc.ResourceLayout.DefaultVariableType = SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC; + auto& ResourceLayout = PSOCreateInfo.PSODesc.ResourceLayout; + + ResourceLayout.DefaultVariableType = SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC; ShaderResourceVariableDesc Vars[] = { {SHADER_TYPE_PIXEL, "cbConstants", SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE} // }; - PSOCreateInfo.PSODesc.ResourceLayout.NumVariables = _countof(Vars); - PSOCreateInfo.PSODesc.ResourceLayout.Variables = Vars; + ResourceLayout.NumVariables = _countof(Vars); + ResourceLayout.Variables = Vars; pDeviceGL->CreateGraphicsPipelineState(PSOCreateInfo, &m_pPSO[Dim * 3 + Fmt], IsInternalDeviceObject); } |
