summaryrefslogtreecommitdiffstats
path: root/Graphics
diff options
context:
space:
mode:
authorassiduous <assiduous@diligentgraphics.com>2021-03-05 18:17:56 +0000
committerassiduous <assiduous@diligentgraphics.com>2021-03-19 00:38:15 +0000
commit96e2faa4875e1e30bf8360bd37bfe350096b7433 (patch)
tree4e1fbb3b3eaf9a1d8d3674487adf926c2b9a63c0 /Graphics
parentUnified CreateShaderResourceBinding in D3D12, Vk and GL signatures (diff)
downloadDiligentCore-96e2faa4875e1e30bf8360bd37bfe350096b7433.tar.gz
DiligentCore-96e2faa4875e1e30bf8360bd37bfe350096b7433.zip
Enabled pipeline resource validation in release build
Diffstat (limited to 'Graphics')
-rw-r--r--Graphics/GraphicsEngineD3D12/include/PipelineStateD3D12Impl.hpp4
-rw-r--r--Graphics/GraphicsEngineD3D12/src/PipelineStateD3D12Impl.cpp17
-rw-r--r--Graphics/GraphicsEngineOpenGL/include/PipelineStateGLImpl.hpp5
-rw-r--r--Graphics/GraphicsEngineOpenGL/src/PipelineStateGLImpl.cpp52
4 files changed, 39 insertions, 39 deletions
diff --git a/Graphics/GraphicsEngineD3D12/include/PipelineStateD3D12Impl.hpp b/Graphics/GraphicsEngineD3D12/include/PipelineStateD3D12Impl.hpp
index c9e938c3..84d9dccd 100644
--- a/Graphics/GraphicsEngineD3D12/include/PipelineStateD3D12Impl.hpp
+++ b/Graphics/GraphicsEngineD3D12/include/PipelineStateD3D12Impl.hpp
@@ -121,7 +121,6 @@ private:
void Destruct();
-#ifdef DILIGENT_DEVELOPMENT
struct ResourceAttribution
{
static constexpr Uint32 InvalidSignatureIndex = ~0u;
@@ -160,8 +159,7 @@ private:
};
ResourceAttribution GetResourceAttribution(const char* Name, SHADER_TYPE Stage) const;
- void DvpValidateShaderResources(const ShaderD3D12Impl* pShader, const LocalRootSignatureD3D12* pLocalRootSig);
-#endif
+ void ValidateShaderResources(const ShaderD3D12Impl* pShader, const LocalRootSignatureD3D12* pLocalRootSig);
private:
CComPtr<ID3D12DeviceChild> m_pd3d12PSO;
diff --git a/Graphics/GraphicsEngineD3D12/src/PipelineStateD3D12Impl.cpp b/Graphics/GraphicsEngineD3D12/src/PipelineStateD3D12Impl.cpp
index c240b4ab..fa70ddc6 100644
--- a/Graphics/GraphicsEngineD3D12/src/PipelineStateD3D12Impl.cpp
+++ b/Graphics/GraphicsEngineD3D12/src/PipelineStateD3D12Impl.cpp
@@ -635,10 +635,8 @@ void PipelineStateD3D12Impl::InitRootSignature(const PipelineStateCreateInfo& Cr
"Compile the shader using SM5.1+ or change the resource layout to use only one space.");
}
-#ifdef DILIGENT_DEVELOPMENT
// Validate resources before remapping
- DvpValidateShaderResources(pShader, pLocalRootSig);
-#endif
+ ValidateShaderResources(pShader, pLocalRootSig);
CComPtr<ID3DBlob> pBlob;
if (IsDXILBytecode(pBytecode->GetBufferPointer(), pBytecode->GetBufferSize()))
@@ -663,7 +661,6 @@ void PipelineStateD3D12Impl::InitRootSignature(const PipelineStateCreateInfo& Cr
}
-#ifdef DILIGENT_DEVELOPMENT
PipelineStateD3D12Impl::ResourceAttribution PipelineStateD3D12Impl::GetResourceAttribution(const char* Name, SHADER_TYPE Stage) const
{
const auto SignCount = GetResourceSignatureCount();
@@ -686,18 +683,25 @@ PipelineStateD3D12Impl::ResourceAttribution PipelineStateD3D12Impl::GetResourceA
return ResourceAttribution{};
}
-void PipelineStateD3D12Impl::DvpValidateShaderResources(const ShaderD3D12Impl* pShader, const LocalRootSignatureD3D12* pLocalRootSig)
+void PipelineStateD3D12Impl::ValidateShaderResources(const ShaderD3D12Impl* pShader, const LocalRootSignatureD3D12* pLocalRootSig)
{
const auto& pShaderResources = pShader->GetShaderResources();
const auto ShaderType = pShader->GetDesc().ShaderType;
+#ifdef DILIGENT_DEVELOPMENT
m_ShaderResources.emplace_back(pShaderResources);
+#endif
// Check compatibility between shader resources and resource signature.
pShaderResources->ProcessResources(
[&](const D3DShaderResourceAttribs& Attribs, Uint32) //
{
+#ifdef DILIGENT_DEVELOPMENT
m_ResourceAttibutions.emplace_back();
+ auto& ResAttribution = m_ResourceAttibutions.back();
+#else
+ ResourceAttribution ResAttribution;
+#endif
if (pLocalRootSig != nullptr && pLocalRootSig->IsShaderRecord(Attribs))
return;
@@ -706,8 +710,6 @@ void PipelineStateD3D12Impl::DvpValidateShaderResources(const ShaderD3D12Impl* p
if (IsSampler && pShaderResources->IsUsingCombinedTextureSamplers())
return;
- auto& ResAttribution = m_ResourceAttibutions.back();
-
ResAttribution = GetResourceAttribution(Attribs.Name, ShaderType);
if (!ResAttribution)
{
@@ -749,6 +751,7 @@ void PipelineStateD3D12Impl::DvpValidateShaderResources(const ShaderD3D12Impl* p
);
}
+#ifdef DILIGENT_DEVELOPMENT
void PipelineStateD3D12Impl::DvpVerifySRBResources(ShaderResourceBindingD3D12Impl* pSRBs[], Uint32 NumSRBs) const
{
// Verify SRB compatibility with this pipeline
diff --git a/Graphics/GraphicsEngineOpenGL/include/PipelineStateGLImpl.hpp b/Graphics/GraphicsEngineOpenGL/include/PipelineStateGLImpl.hpp
index 2ba8fd21..8b4b1e57 100644
--- a/Graphics/GraphicsEngineOpenGL/include/PipelineStateGLImpl.hpp
+++ b/Graphics/GraphicsEngineOpenGL/include/PipelineStateGLImpl.hpp
@@ -108,7 +108,7 @@ private:
SHADER_TYPE GetShaderStageType(Uint32 Index) const;
Uint32 GetNumShaderStages() const { return m_NumPrograms; }
-#ifdef DILIGENT_DEVELOPMENT
+
struct ResourceAttribution
{
static constexpr Uint32 InvalidSignatureIndex = ~0u;
@@ -147,8 +147,7 @@ private:
};
ResourceAttribution GetResourceAttribution(const char* Name, SHADER_TYPE Stage) const;
- void DvpValidateShaderResources(const std::shared_ptr<const ShaderResourcesGL>& pShaderResources, const char* ShaderName, SHADER_TYPE ShaderStages);
-#endif
+ void ValidateShaderResources(std::shared_ptr<const ShaderResourcesGL> pShaderResources, const char* ShaderName, SHADER_TYPE ShaderStages);
private:
// Linked GL programs for every shader stage. Every pipeline needs to have its own programs
diff --git a/Graphics/GraphicsEngineOpenGL/src/PipelineStateGLImpl.cpp b/Graphics/GraphicsEngineOpenGL/src/PipelineStateGLImpl.cpp
index 959653e0..4841ebb4 100644
--- a/Graphics/GraphicsEngineOpenGL/src/PipelineStateGLImpl.cpp
+++ b/Graphics/GraphicsEngineOpenGL/src/PipelineStateGLImpl.cpp
@@ -218,39 +218,35 @@ void PipelineStateGLImpl::InitResourceLayouts(const PipelineStateCreateInfo& Cre
pSignature->AddBindings(Bindings);
}
-#ifdef DILIGENT_DEVELOPMENT
const auto& Limits = GetDevice()->GetDeviceLimits();
- DEV_CHECK_ERR(Bindings[BINDING_RANGE_UNIFORM_BUFFER] <= static_cast<Uint32>(Limits.MaxUniformBlocks),
- "Number of bindings in range '", GetBindingRangeName(BINDING_RANGE_UNIFORM_BUFFER), "' is greater than maximum allowed (", Limits.MaxUniformBlocks, ").");
- DEV_CHECK_ERR(Bindings[BINDING_RANGE_TEXTURE] <= static_cast<Uint32>(Limits.MaxTextureUnits),
- "Number of bindings in range '", GetBindingRangeName(BINDING_RANGE_TEXTURE), "' is greater than maximum allowed (", Limits.MaxTextureUnits, ").");
- DEV_CHECK_ERR(Bindings[BINDING_RANGE_STORAGE_BUFFER] <= static_cast<Uint32>(Limits.MaxStorageBlock),
- "Number of bindings in range '", GetBindingRangeName(BINDING_RANGE_STORAGE_BUFFER), "' is greater than maximum allowed (", Limits.MaxStorageBlock, ").");
- DEV_CHECK_ERR(Bindings[BINDING_RANGE_IMAGE] <= static_cast<Uint32>(Limits.MaxImagesUnits),
- "Number of bindings in range '", GetBindingRangeName(BINDING_RANGE_IMAGE), "' is greater than maximum allowed (", Limits.MaxImagesUnits, ").");
+ if (Bindings[BINDING_RANGE_UNIFORM_BUFFER] > static_cast<Uint32>(Limits.MaxUniformBlocks))
+ LOG_ERROR_AND_THROW("The number of bindings in range '", GetBindingRangeName(BINDING_RANGE_UNIFORM_BUFFER), "' is greater than the maximum allowed (", Limits.MaxUniformBlocks, ").");
+ if (Bindings[BINDING_RANGE_TEXTURE] > static_cast<Uint32>(Limits.MaxTextureUnits))
+ LOG_ERROR_AND_THROW("The number of bindings in range '", GetBindingRangeName(BINDING_RANGE_TEXTURE), "' is greater than the maximum allowed (", Limits.MaxTextureUnits, ").");
+ if (Bindings[BINDING_RANGE_STORAGE_BUFFER] > static_cast<Uint32>(Limits.MaxStorageBlock))
+ LOG_ERROR_AND_THROW("The number of bindings in range '", GetBindingRangeName(BINDING_RANGE_STORAGE_BUFFER), "' is greater than the maximum allowed (", Limits.MaxStorageBlock, ").");
+ if (Bindings[BINDING_RANGE_IMAGE] > static_cast<Uint32>(Limits.MaxImagesUnits))
+ LOG_ERROR_AND_THROW("The number of bindings in range '", GetBindingRangeName(BINDING_RANGE_IMAGE), "' is greater than the maximum allowed (", Limits.MaxImagesUnits, ").");
if (m_IsProgramPipelineSupported)
{
for (size_t i = 0; i < ShaderStages.size(); ++i)
{
auto* pShaderGL = ShaderStages[i];
- DvpValidateShaderResources(pShaderGL->GetShaderResources(), pShaderGL->GetDesc().Name, pShaderGL->GetDesc().ShaderType);
+ ValidateShaderResources(pShaderGL->GetShaderResources(), pShaderGL->GetDesc().Name, pShaderGL->GetDesc().ShaderType);
}
}
else
{
- auto pImmediateCtx = m_pDevice->GetImmediateContext();
- VERIFY_EXPR(pImmediateCtx);
+ auto* pImmediateCtx = m_pDevice->GetImmediateContext().RawPtr<DeviceContextGLImpl>();
+ VERIFY_EXPR(pImmediateCtx != nullptr);
VERIFY_EXPR(m_GLPrograms[0] != 0);
- std::unique_ptr<ShaderResourcesGL> pResources{new ShaderResourcesGL{}};
- pResources->LoadUniforms(ActiveStages, m_GLPrograms[0], pImmediateCtx.RawPtr<DeviceContextGLImpl>()->GetContextState());
-
- std::shared_ptr<const ShaderResourcesGL> pShaderResources{pResources.release()};
- DvpValidateShaderResources(pShaderResources, m_Desc.Name, ActiveStages);
+ std::shared_ptr<ShaderResourcesGL> pResources{new ShaderResourcesGL{}};
+ pResources->LoadUniforms(ActiveStages, m_GLPrograms[0], pImmediateCtx->GetContextState());
+ ValidateShaderResources(std::move(pResources), m_Desc.Name, ActiveStages);
}
-#endif
}
template <typename PSOCreateInfoType>
@@ -473,7 +469,6 @@ GLObjectWrappers::GLPipelineObj& PipelineStateGLImpl::GetGLProgramPipeline(GLCon
return ctx_pipeline.second;
}
-#ifdef DILIGENT_DEVELOPMENT
PipelineStateGLImpl::ResourceAttribution PipelineStateGLImpl::GetResourceAttribution(const char* Name, SHADER_TYPE Stage) const
{
const auto SignCount = GetResourceSignatureCount();
@@ -496,17 +491,16 @@ PipelineStateGLImpl::ResourceAttribution PipelineStateGLImpl::GetResourceAttribu
return ResourceAttribution{};
}
-void PipelineStateGLImpl::DvpValidateShaderResources(const std::shared_ptr<const ShaderResourcesGL>& pShaderResources, const char* ShaderName, SHADER_TYPE ShaderStages)
+void PipelineStateGLImpl::ValidateShaderResources(std::shared_ptr<const ShaderResourcesGL> pShaderResources, const char* ShaderName, SHADER_TYPE ShaderStages)
{
- m_ShaderResources.emplace_back(pShaderResources);
- m_ShaderNames.emplace_back(ShaderName);
-
const auto HandleResource = [&](const ShaderResourcesGL::GLResourceAttribs& Attribs, SHADER_RESOURCE_TYPE AltResourceType, PIPELINE_RESOURCE_FLAGS Flags) //
{
- m_ResourceAttibutions.emplace_back();
- auto& ResAttribution = m_ResourceAttibutions.back();
+ const auto ResAttribution = GetResourceAttribution(Attribs.Name, ShaderStages);
+
+#ifdef DILIGENT_DEVELOPMENT
+ m_ResourceAttibutions.emplace_back(ResAttribution);
+#endif
- ResAttribution = GetResourceAttribution(Attribs.Name, ShaderStages);
if (!ResAttribution)
{
LOG_ERROR_AND_THROW("Shader '", ShaderName, "' contains resource '", Attribs.Name,
@@ -556,8 +550,14 @@ void PipelineStateGLImpl::DvpValidateShaderResources(const std::shared_ptr<const
};
pShaderResources->ProcessConstResources(HandleUB, HandleTexture, HandleImage, HandleSB);
+
+#ifdef DILIGENT_DEVELOPMENT
+ m_ShaderResources.emplace_back(std::move(pShaderResources));
+ m_ShaderNames.emplace_back(ShaderName);
+#endif
}
+#ifdef DILIGENT_DEVELOPMENT
void PipelineStateGLImpl::DvpVerifySRBResources(ShaderResourceBindingGLImpl* pSRBs[],
const TBindings BoundResOffsets[],
Uint32 NumSRBs) const