summaryrefslogtreecommitdiffstats
path: root/Graphics/GraphicsEngineD3D11
diff options
context:
space:
mode:
authorazhirnov <zh1dron@gmail.com>2020-10-08 18:45:01 +0000
committerazhirnov <zh1dron@gmail.com>2020-10-08 18:46:35 +0000
commit2b396d236ab33dfe9c0defbe401d354ed3fb34f9 (patch)
tree575243bb9aa6215725a8b16a7747c103c1eda852 /Graphics/GraphicsEngineD3D11
parentUpdated PipelineState[D3D11,D3D12,Vk]Impl to allocate single chunk of memory ... (diff)
downloadDiligentCore-2b396d236ab33dfe9c0defbe401d354ed3fb34f9.tar.gz
DiligentCore-2b396d236ab33dfe9c0defbe401d354ed3fb34f9.zip
removed strong references to shaders in PSO
Diffstat (limited to 'Graphics/GraphicsEngineD3D11')
-rw-r--r--Graphics/GraphicsEngineD3D11/include/PipelineStateD3D11Impl.hpp15
-rwxr-xr-xGraphics/GraphicsEngineD3D11/src/DeviceContextD3D11Impl.cpp10
-rw-r--r--Graphics/GraphicsEngineD3D11/src/PipelineStateD3D11Impl.cpp64
-rw-r--r--Graphics/GraphicsEngineD3D11/src/ShaderResourceBindingD3D11Impl.cpp9
4 files changed, 66 insertions, 32 deletions
diff --git a/Graphics/GraphicsEngineD3D11/include/PipelineStateD3D11Impl.hpp b/Graphics/GraphicsEngineD3D11/include/PipelineStateD3D11Impl.hpp
index 02f922a6..7acb15f0 100644
--- a/Graphics/GraphicsEngineD3D11/include/PipelineStateD3D11Impl.hpp
+++ b/Graphics/GraphicsEngineD3D11/include/PipelineStateD3D11Impl.hpp
@@ -36,6 +36,7 @@
#include "ShaderResourceLayoutD3D11.hpp"
#include "SRBMemoryAllocator.hpp"
#include "RenderDeviceD3D11Impl.hpp"
+#include "ShaderD3D11Impl.hpp"
namespace Diligent
{
@@ -117,16 +118,19 @@ public:
const ShaderResourceLayoutD3D11& GetStaticResourceLayout(Uint32 s) const
{
- VERIFY_EXPR(s < m_NumShaders);
+ VERIFY_EXPR(s < GetNumShaderTypes());
return m_pStaticResourceLayouts[s];
}
ShaderResourceCacheD3D11& GetStaticResourceCache(Uint32 s)
{
- VERIFY_EXPR(s < m_NumShaders);
+ VERIFY_EXPR(s < GetNumShaderTypes());
return m_pStaticResourceCaches[s];
}
+ const ShaderD3D11Impl* GetShaderByType(SHADER_TYPE ShaderType) const;
+ const ShaderD3D11Impl* GetShader(Uint32 Index) const;
+
void SetStaticSamplers(ShaderResourceCacheD3D11& ResourceCache, Uint32 ShaderInd) const;
private:
@@ -135,6 +139,13 @@ private:
CComPtr<ID3D11DepthStencilState> m_pd3d11DepthStencilState;
CComPtr<ID3D11InputLayout> m_pd3d11InputLayout;
+ RefCntAutoPtr<ShaderD3D11Impl> m_pVS;
+ RefCntAutoPtr<ShaderD3D11Impl> m_pPS;
+ RefCntAutoPtr<ShaderD3D11Impl> m_pGS;
+ RefCntAutoPtr<ShaderD3D11Impl> m_pDS;
+ RefCntAutoPtr<ShaderD3D11Impl> m_pHS;
+ RefCntAutoPtr<ShaderD3D11Impl> m_pCS;
+
// The caches are indexed by the shader order in the PSO, not shader index
ShaderResourceCacheD3D11* m_pStaticResourceCaches = nullptr;
ShaderResourceLayoutD3D11* m_pStaticResourceLayouts = nullptr;
diff --git a/Graphics/GraphicsEngineD3D11/src/DeviceContextD3D11Impl.cpp b/Graphics/GraphicsEngineD3D11/src/DeviceContextD3D11Impl.cpp
index 6af8b502..cd942aed 100755
--- a/Graphics/GraphicsEngineD3D11/src/DeviceContextD3D11Impl.cpp
+++ b/Graphics/GraphicsEngineD3D11/src/DeviceContextD3D11Impl.cpp
@@ -179,9 +179,9 @@ void DeviceContextD3D11Impl::TransitionAndCommitShaderResources(IPipelineState*
{
#ifdef DILIGENT_DEVELOPMENT
bool ResourcesPresent = false;
- for (Uint32 s = 0; s < pPipelineStateD3D11->GetNumShaders(); ++s)
+ for (Uint32 s = 0; s < pPipelineStateD3D11->GetNumShaderTypes(); ++s)
{
- auto* pShaderD3D11 = pPipelineStateD3D11->GetShader<ShaderD3D11Impl>(s);
+ auto* pShaderD3D11 = pPipelineStateD3D11->GetShader(s);
if (pShaderD3D11->GetD3D11Resources()->GetTotalResources() > 0)
ResourcesPresent = true;
}
@@ -206,7 +206,7 @@ void DeviceContextD3D11Impl::TransitionAndCommitShaderResources(IPipelineState*
#endif
auto NumShaders = pShaderResBindingD3D11->GetNumActiveShaders();
- VERIFY(NumShaders == pPipelineStateD3D11->GetNumShaders(), "Number of active shaders in shader resource binding is not consistent with the number of shaders in the pipeline state");
+ VERIFY(NumShaders == pPipelineStateD3D11->GetNumShaderTypes(), "Number of active shaders in shader resource binding is not consistent with the number of shaders in the pipeline state");
#ifdef DILIGENT_DEVELOPMENT
{
@@ -233,7 +233,7 @@ void DeviceContextD3D11Impl::TransitionAndCommitShaderResources(IPipelineState*
const auto ShaderTypeInd = GetShaderTypeIndex(ShaderType);
#ifdef DILIGENT_DEVELOPMENT
- auto* pShaderD3D11 = pPipelineStateD3D11->GetShader<ShaderD3D11Impl>(s);
+ auto* pShaderD3D11 = pPipelineStateD3D11->GetShader(s);
VERIFY_EXPR(ShaderType == pShaderD3D11->GetDesc().ShaderType);
#endif
@@ -380,7 +380,7 @@ void DeviceContextD3D11Impl::TransitionAndCommitShaderResources(IPipelineState*
const auto ShaderTypeInd = GetShaderTypeIndex(ShaderType);
#ifdef DILIGENT_DEVELOPMENT
- auto* pShaderD3D11 = pPipelineStateD3D11->GetShader<ShaderD3D11Impl>(s);
+ auto* pShaderD3D11 = pPipelineStateD3D11->GetShader(s);
VERIFY_EXPR(ShaderType == pShaderD3D11->GetDesc().ShaderType);
#endif
diff --git a/Graphics/GraphicsEngineD3D11/src/PipelineStateD3D11Impl.cpp b/Graphics/GraphicsEngineD3D11/src/PipelineStateD3D11Impl.cpp
index fb93f90d..0e312740 100644
--- a/Graphics/GraphicsEngineD3D11/src/PipelineStateD3D11Impl.cpp
+++ b/Graphics/GraphicsEngineD3D11/src/PipelineStateD3D11Impl.cpp
@@ -31,7 +31,6 @@
#include "RenderDeviceD3D11Impl.hpp"
#include "ShaderResourceBindingD3D11Impl.hpp"
#include "EngineMemory.h"
-#include "ShaderD3D11Impl.hpp"
namespace Diligent
{
@@ -136,24 +135,24 @@ PipelineStateD3D11Impl::PipelineStateD3D11Impl(IReferenceCounters* pR
static_assert((sizeof(ShaderResourceLayoutD3D11) % sizeof(void*)) == 0, "sizeof(ShaderResourceLayoutD3D11) is expected to be a multiple of sizeof(void*)");
static_assert((sizeof(ShaderResourceCacheD3D11) % sizeof(void*)) == 0, "sizeof(ShaderResourceCacheD3D11) is expected to be a multiple of sizeof(void*)");
// clang-format on
- const auto MemSize = (sizeof(ShaderResourceLayoutD3D11) + sizeof(ShaderResourceCacheD3D11)) * m_NumShaders;
+ const auto MemSize = (sizeof(ShaderResourceLayoutD3D11) + sizeof(ShaderResourceCacheD3D11)) * GetNumShaderTypes();
auto* const pRawMem =
ALLOCATE_RAW(GetRawAllocator(), "Raw memory for ShaderResourceLayoutD3D11 and ShaderResourceCacheD3D11 arrays", MemSize);
m_pStaticResourceLayouts = reinterpret_cast<ShaderResourceLayoutD3D11*>(pRawMem);
- m_pStaticResourceCaches = reinterpret_cast<ShaderResourceCacheD3D11*>(m_pStaticResourceLayouts + m_NumShaders);
+ m_pStaticResourceCaches = reinterpret_cast<ShaderResourceCacheD3D11*>(m_pStaticResourceLayouts + GetNumShaderTypes());
const auto& ResourceLayout = m_Desc.ResourceLayout;
#ifdef DILIGENT_DEVELOPMENT
{
const ShaderResources* pResources[MAX_SHADERS_IN_PIPELINE] = {};
- for (Uint32 s = 0; s < m_NumShaders; ++s)
+ for (Uint32 s = 0; s < GetNumShaderTypes(); ++s)
{
- auto* pShader = GetShader<const ShaderD3D11Impl>(s);
+ auto* pShader = GetShader(s);
pResources[s] = &(*pShader->GetD3D11Resources());
}
- ShaderResources::DvpVerifyResourceLayout(ResourceLayout, pResources, m_NumShaders,
+ ShaderResources::DvpVerifyResourceLayout(ResourceLayout, pResources, GetNumShaderTypes(),
(CreateInfo.Flags & PSO_CREATE_FLAG_IGNORE_MISSING_VARIABLES) == 0,
(CreateInfo.Flags & PSO_CREATE_FLAG_IGNORE_MISSING_STATIC_SAMPLERS) == 0);
}
@@ -162,9 +161,9 @@ PipelineStateD3D11Impl::PipelineStateD3D11Impl(IReferenceCounters* pR
decltype(m_StaticSamplers) StaticSamplers(STD_ALLOCATOR_RAW_MEM(StaticSamplerInfo, GetRawAllocator(), "Allocator for vector<StaticSamplerInfo>"));
std::array<size_t, MAX_SHADERS_IN_PIPELINE> ShaderResLayoutDataSizes = {};
std::array<size_t, MAX_SHADERS_IN_PIPELINE> ShaderResCacheDataSizes = {};
- for (Uint32 s = 0; s < m_NumShaders; ++s)
+ for (Uint32 s = 0; s < GetNumShaderTypes(); ++s)
{
- const auto* pShader = GetShader<const ShaderD3D11Impl>(s);
+ const auto* pShader = GetShader(s);
const auto& ShaderDesc = pShader->GetDesc();
const auto& ShaderResources = *pShader->GetD3D11Resources();
VERIFY_EXPR(ShaderDesc.ShaderType == ShaderResources.GetShaderType());
@@ -222,14 +221,14 @@ PipelineStateD3D11Impl::PipelineStateD3D11Impl(IReferenceCounters* pR
if (m_Desc.SRBAllocationGranularity > 1)
{
- m_SRBMemAllocator.Initialize(m_Desc.SRBAllocationGranularity, m_NumShaders, ShaderResLayoutDataSizes.data(), m_NumShaders, ShaderResCacheDataSizes.data());
+ m_SRBMemAllocator.Initialize(m_Desc.SRBAllocationGranularity, GetNumShaderTypes(), ShaderResLayoutDataSizes.data(), GetNumShaderTypes(), ShaderResCacheDataSizes.data());
}
m_StaticSamplers.reserve(StaticSamplers.size());
for (auto& Sam : StaticSamplers)
m_StaticSamplers.emplace_back(std::move(Sam));
- for (Uint32 s = 0; s < m_NumShaders; ++s)
+ for (Uint32 s = 0; s < GetNumShaderTypes(); ++s)
{
// Initialize static samplers in the static resource cache to avoid warning messages
SetStaticSamplers(m_pStaticResourceCaches[s], s);
@@ -239,13 +238,13 @@ PipelineStateD3D11Impl::PipelineStateD3D11Impl(IReferenceCounters* pR
PipelineStateD3D11Impl::~PipelineStateD3D11Impl()
{
- for (Uint32 s = 0; s < m_NumShaders; ++s)
+ for (Uint32 s = 0; s < GetNumShaderTypes(); ++s)
{
m_pStaticResourceCaches[s].Destroy(GetRawAllocator());
m_pStaticResourceCaches[s].~ShaderResourceCacheD3D11();
}
- for (Uint32 l = 0; l < m_NumShaders; ++l)
+ for (Uint32 l = 0; l < GetNumShaderTypes(); ++l)
{
m_pStaticResourceLayouts[l].~ShaderResourceLayoutD3D11();
}
@@ -298,13 +297,13 @@ bool PipelineStateD3D11Impl::IsCompatibleWith(const IPipelineState* pPSO) const
if (m_ShaderResourceLayoutHash != pPSOD3D11->m_ShaderResourceLayoutHash)
return false;
- if (m_NumShaders != pPSOD3D11->m_NumShaders)
+ if (GetNumShaderTypes() != pPSOD3D11->GetNumShaderTypes())
return false;
- for (Uint32 s = 0; s < m_NumShaders; ++s)
+ for (Uint32 s = 0; s < GetNumShaderTypes(); ++s)
{
- auto* pShader0 = GetShader<const ShaderD3D11Impl>(s);
- auto* pShader1 = pPSOD3D11->GetShader<const ShaderD3D11Impl>(s);
+ auto* pShader0 = GetShader(s);
+ auto* pShader1 = pPSOD3D11->GetShader(s);
if (pShader0->GetDesc().ShaderType != pShader1->GetDesc().ShaderType)
return false;
const auto& Res0 = *pShader0->GetD3D11Resources();
@@ -361,7 +360,7 @@ ID3D11ComputeShader* PipelineStateD3D11Impl::GetD3D11ComputeShader()
void PipelineStateD3D11Impl::BindStaticResources(Uint32 ShaderFlags, IResourceMapping* pResourceMapping, Uint32 Flags)
{
- for (Uint32 s = 0; s < m_NumShaders; ++s)
+ for (Uint32 s = 0; s < GetNumShaderTypes(); ++s)
{
auto& StaticResLayout = m_pStaticResourceLayouts[s];
if ((ShaderFlags & StaticResLayout.GetShaderType()) != 0)
@@ -375,7 +374,7 @@ Uint32 PipelineStateD3D11Impl::GetStaticVariableCount(SHADER_TYPE ShaderType) co
if (LayoutInd < 0)
return 0;
- VERIFY_EXPR(static_cast<Uint32>(LayoutInd) <= m_NumShaders);
+ VERIFY_EXPR(static_cast<Uint32>(LayoutInd) <= GetNumShaderTypes());
return m_pStaticResourceLayouts[LayoutInd].GetTotalResourceCount();
}
@@ -385,7 +384,7 @@ IShaderResourceVariable* PipelineStateD3D11Impl::GetStaticVariableByName(SHADER_
if (LayoutInd < 0)
return nullptr;
- VERIFY_EXPR(static_cast<Uint32>(LayoutInd) <= m_NumShaders);
+ VERIFY_EXPR(static_cast<Uint32>(LayoutInd) <= GetNumShaderTypes());
return m_pStaticResourceLayouts[LayoutInd].GetShaderVariable(Name);
}
@@ -395,7 +394,7 @@ IShaderResourceVariable* PipelineStateD3D11Impl::GetStaticVariableByIndex(SHADER
if (LayoutInd < 0)
return nullptr;
- VERIFY_EXPR(static_cast<Uint32>(LayoutInd) <= m_NumShaders);
+ VERIFY_EXPR(static_cast<Uint32>(LayoutInd) <= GetNumShaderTypes());
return m_pStaticResourceLayouts[LayoutInd].GetShaderVariable(Index);
}
@@ -414,4 +413,29 @@ void PipelineStateD3D11Impl::SetStaticSamplers(ShaderResourceCacheD3D11& Resourc
}
}
+const ShaderD3D11Impl* PipelineStateD3D11Impl::GetShaderByType(SHADER_TYPE ShaderType) const
+{
+ switch (ShaderType)
+ {
+ // clang-format off
+ case SHADER_TYPE_VERTEX: return m_pVS;
+ case SHADER_TYPE_PIXEL: return m_pPS;
+ case SHADER_TYPE_GEOMETRY: return m_pGS;
+ case SHADER_TYPE_HULL: return m_pHS;
+ case SHADER_TYPE_DOMAIN: return m_pDS;
+ case SHADER_TYPE_COMPUTE: return m_pCS;
+ default: UNEXPECTED("unsupported shader type"); return nullptr;
+ // clang-format on
+ }
+}
+
+const ShaderD3D11Impl* PipelineStateD3D11Impl::GetShader(Uint32 Index) const
+{
+ if (Index < GetNumShaderTypes())
+ return GetShaderByType(GetShaderTypes()[Index]);
+
+ UNEXPECTED("Shader index is out of range");
+ return nullptr;
+}
+
} // namespace Diligent
diff --git a/Graphics/GraphicsEngineD3D11/src/ShaderResourceBindingD3D11Impl.cpp b/Graphics/GraphicsEngineD3D11/src/ShaderResourceBindingD3D11Impl.cpp
index 62fd2df7..17083bbc 100644
--- a/Graphics/GraphicsEngineD3D11/src/ShaderResourceBindingD3D11Impl.cpp
+++ b/Graphics/GraphicsEngineD3D11/src/ShaderResourceBindingD3D11Impl.cpp
@@ -50,7 +50,7 @@ ShaderResourceBindingD3D11Impl::ShaderResourceBindingD3D11Impl(IReferenceCounter
// clang-format on
{
m_ResourceLayoutIndex.fill(-1);
- m_NumActiveShaders = static_cast<Uint8>(pPSO->GetNumShaders());
+ m_NumActiveShaders = static_cast<Uint8>(pPSO->GetNumShaderTypes());
// clang-format off
m_pResourceLayouts = ALLOCATE(GetRawAllocator(), "Raw memory for ShaderResourceLayoutD3D11", ShaderResourceLayoutD3D11, m_NumActiveShaders);
@@ -62,7 +62,7 @@ ShaderResourceBindingD3D11Impl::ShaderResourceBindingD3D11Impl(IReferenceCounter
// Reserve memory for resource layouts
for (Uint8 s = 0; s < m_NumActiveShaders; ++s)
{
- auto* pShaderD3D11 = pPSO->GetShader<ShaderD3D11Impl>(s);
+ auto* pShaderD3D11 = pPSO->GetShader(s);
auto& SRBMemAllocator = pPSO->GetSRBMemoryAllocator();
auto& ResCacheDataAllocator = SRBMemAllocator.GetResourceCacheDataAllocator(s);
@@ -151,14 +151,13 @@ void ShaderResourceBindingD3D11Impl::InitializeStaticResources(const IPipelineSt
}
const auto* pPSOD3D11 = ValidatedCast<const PipelineStateD3D11Impl>(pPipelineState);
- auto ppShaders = pPSOD3D11->GetShaders();
- auto NumShaders = pPSOD3D11->GetNumShaders();
+ auto NumShaders = pPSOD3D11->GetNumShaderTypes();
VERIFY_EXPR(NumShaders == m_NumActiveShaders);
for (Uint32 shader = 0; shader < NumShaders; ++shader)
{
const auto& StaticResLayout = pPSOD3D11->GetStaticResourceLayout(shader);
- auto* pShaderD3D11 = ValidatedCast<ShaderD3D11Impl>(ppShaders[shader]);
+ auto* pShaderD3D11 = pPSOD3D11->GetShader(shader);
#ifdef DILIGENT_DEVELOPMENT
if (!StaticResLayout.dvpVerifyBindings())
{