summaryrefslogtreecommitdiffstats
path: root/Graphics/GraphicsEngineOpenGL
diff options
context:
space:
mode:
authorassiduous <assiduous@diligentgraphics.com>2020-10-18 20:06:48 +0000
committerassiduous <assiduous@diligentgraphics.com>2020-10-18 20:06:48 +0000
commit645ef7e425d6ff4ee64b782d27767e0a5732be50 (patch)
tree8502aea9ba6100af3a0908c5975a75debc5fd7de /Graphics/GraphicsEngineOpenGL
parentRefactored LinearAllocator (diff)
downloadDiligentCore-645ef7e425d6ff4ee64b782d27767e0a5732be50.tar.gz
DiligentCore-645ef7e425d6ff4ee64b782d27767e0a5732be50.zip
A number of fixes for PSO creation refactoring (API240075)
Diffstat (limited to 'Graphics/GraphicsEngineOpenGL')
-rw-r--r--Graphics/GraphicsEngineOpenGL/include/PipelineStateGLImpl.hpp7
-rw-r--r--Graphics/GraphicsEngineOpenGL/include/RenderDeviceGLImpl.hpp3
-rw-r--r--Graphics/GraphicsEngineOpenGL/src/PipelineStateGLImpl.cpp62
-rw-r--r--Graphics/GraphicsEngineOpenGL/src/RenderDeviceGLImpl.cpp18
-rw-r--r--Graphics/GraphicsEngineOpenGL/src/TexRegionRender.cpp8
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);
}