Skip to content

Commit 799fc52

Browse files
SetPipelineState: eliminated redundant calls to AddRef/Release
1 parent 1110556 commit 799fc52

File tree

5 files changed

+27
-27
lines changed

5 files changed

+27
-27
lines changed

Graphics/GraphicsEngine/include/DeviceContextBase.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -451,7 +451,7 @@ class DeviceContextBase : public ObjectBase<typename EngineImplTraits::DeviceCon
451451

452452
inline bool SetStencilRef(Uint32 StencilRef, int Dummy);
453453

454-
inline void SetPipelineState(PipelineStateImplType* pPipelineState, int /*Dummy*/);
454+
inline void SetPipelineState(RefCntAutoPtr<PipelineStateImplType> pPipelineState, int /*Dummy*/);
455455

456456
/// Clears all cached resources
457457
inline void ClearStateCache();
@@ -754,14 +754,14 @@ inline void DeviceContextBase<ImplementationTraits>::SetVertexBuffers(
754754

755755
template <typename ImplementationTraits>
756756
inline void DeviceContextBase<ImplementationTraits>::SetPipelineState(
757-
PipelineStateImplType* pPipelineState,
757+
RefCntAutoPtr<PipelineStateImplType> pPipelineState,
758758
int /*Dummy*/)
759759
{
760760
DVP_CHECK_QUEUE_TYPE_COMPATIBILITY(COMMAND_QUEUE_TYPE_COMPUTE, "SetPipelineState");
761761
DEV_CHECK_ERR((pPipelineState->GetDesc().ImmediateContextMask & (Uint64{1} << GetExecutionCtxId())) != 0,
762762
"PSO '", pPipelineState->GetDesc().Name, "' can't be used in device context '", m_Desc.Name, "'.");
763763

764-
m_pPipelineState = pPipelineState;
764+
m_pPipelineState = std::move(pPipelineState);
765765
}
766766

767767
template <typename ImplementationTraits>

Graphics/GraphicsEngineD3D11/src/DeviceContextD3D11Impl.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,11 @@ void DeviceContextD3D11Impl::SetPipelineState(IPipelineState* pPipelineState)
8383
if (PipelineStateD3D11Impl::IsSameObject(m_pPipelineState, pPipelineStateD3D11))
8484
return;
8585

86-
TDeviceContextBase::SetPipelineState(pPipelineStateD3D11, 0 /*Dummy*/);
87-
const auto& Desc = pPipelineStateD3D11->GetDesc();
86+
TDeviceContextBase::SetPipelineState(std::move(pPipelineStateD3D11), 0 /*Dummy*/);
87+
const auto& Desc = m_pPipelineState->GetDesc();
8888
if (Desc.PipelineType == PIPELINE_TYPE_COMPUTE)
8989
{
90-
auto* pd3d11CS = pPipelineStateD3D11->GetD3D11ComputeShader();
90+
auto* pd3d11CS = m_pPipelineState->GetD3D11ComputeShader();
9191
if (pd3d11CS == nullptr)
9292
{
9393
LOG_ERROR("Compute shader is not set in the pipeline");
@@ -97,7 +97,7 @@ void DeviceContextD3D11Impl::SetPipelineState(IPipelineState* pPipelineState)
9797
#define COMMIT_SHADER(SN, ShaderName) \
9898
do \
9999
{ \
100-
auto* pd3d11Shader = pPipelineStateD3D11->GetD3D11##ShaderName(); \
100+
auto* pd3d11Shader = m_pPipelineState->GetD3D11##ShaderName(); \
101101
if (m_CommittedD3DShaders[SN##Ind] != pd3d11Shader) \
102102
{ \
103103
m_CommittedD3DShaders[SN##Ind] = pd3d11Shader; \
@@ -116,13 +116,13 @@ void DeviceContextD3D11Impl::SetPipelineState(IPipelineState* pPipelineState)
116116
COMMIT_SHADER(DS, DomainShader);
117117
#undef COMMIT_SHADER
118118

119-
const auto& GraphicsPipeline = pPipelineStateD3D11->GetGraphicsPipelineDesc();
119+
const auto& GraphicsPipeline = m_pPipelineState->GetGraphicsPipelineDesc();
120120

121-
m_pd3d11DeviceContext->OMSetBlendState(pPipelineStateD3D11->GetD3D11BlendState(), m_BlendFactors, GraphicsPipeline.SampleMask);
122-
m_pd3d11DeviceContext->RSSetState(pPipelineStateD3D11->GetD3D11RasterizerState());
123-
m_pd3d11DeviceContext->OMSetDepthStencilState(pPipelineStateD3D11->GetD3D11DepthStencilState(), m_StencilRef);
121+
m_pd3d11DeviceContext->OMSetBlendState(m_pPipelineState->GetD3D11BlendState(), m_BlendFactors, GraphicsPipeline.SampleMask);
122+
m_pd3d11DeviceContext->RSSetState(m_pPipelineState->GetD3D11RasterizerState());
123+
m_pd3d11DeviceContext->OMSetDepthStencilState(m_pPipelineState->GetD3D11DepthStencilState(), m_StencilRef);
124124

125-
auto* pd3d11InputLayout = pPipelineStateD3D11->GetD3D11InputLayout();
125+
auto* pd3d11InputLayout = m_pPipelineState->GetD3D11InputLayout();
126126
// It is safe to perform raw pointer comparison as the device context
127127
// keeps bound input layout alive
128128
if (m_CommittedD3D11InputLayout != pd3d11InputLayout)

Graphics/GraphicsEngineD3D12/src/DeviceContextD3D12Impl.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -293,11 +293,11 @@ void DeviceContextD3D12Impl::SetPipelineState(IPipelineState* pPipelineState)
293293
CommitScissor = m_pPipelineState->GetGraphicsPipelineDesc().RasterizerDesc.ScissorEnable != pPipelineStateD3D12->GetGraphicsPipelineDesc().RasterizerDesc.ScissorEnable;
294294
}
295295

296-
TDeviceContextBase::SetPipelineState(pPipelineStateD3D12, 0 /*Dummy*/);
296+
TDeviceContextBase::SetPipelineState(std::move(pPipelineStateD3D12), 0 /*Dummy*/);
297297

298298
auto& CmdCtx = GetCmdContext();
299299
auto& RootInfo = GetRootTableInfo(PSODesc.PipelineType);
300-
auto* pd3d12RootSig = pPipelineStateD3D12->GetD3D12RootSignature();
300+
auto* pd3d12RootSig = m_pPipelineState->GetD3D12RootSignature();
301301

302302
if (RootInfo.pd3d12RootSig != pd3d12RootSig)
303303
{
@@ -316,9 +316,9 @@ void DeviceContextD3D12Impl::SetPipelineState(IPipelineState* pPipelineState)
316316
case PIPELINE_TYPE_GRAPHICS:
317317
case PIPELINE_TYPE_MESH:
318318
{
319-
auto& GraphicsPipeline = pPipelineStateD3D12->GetGraphicsPipelineDesc();
319+
auto& GraphicsPipeline = m_pPipelineState->GetGraphicsPipelineDesc();
320320
auto& GraphicsCtx = CmdCtx.AsGraphicsContext();
321-
auto* pd3d12PSO = pPipelineStateD3D12->GetD3D12PipelineState();
321+
auto* pd3d12PSO = m_pPipelineState->GetD3D12PipelineState();
322322
GraphicsCtx.SetPipelineState(pd3d12PSO);
323323
GraphicsCtx.SetGraphicsRootSignature(pd3d12RootSig);
324324

@@ -347,15 +347,15 @@ void DeviceContextD3D12Impl::SetPipelineState(IPipelineState* pPipelineState)
347347
}
348348
case PIPELINE_TYPE_COMPUTE:
349349
{
350-
auto* pd3d12PSO = pPipelineStateD3D12->GetD3D12PipelineState();
350+
auto* pd3d12PSO = m_pPipelineState->GetD3D12PipelineState();
351351
auto& CompCtx = CmdCtx.AsComputeContext();
352352
CompCtx.SetPipelineState(pd3d12PSO);
353353
CompCtx.SetComputeRootSignature(pd3d12RootSig);
354354
break;
355355
}
356356
case PIPELINE_TYPE_RAY_TRACING:
357357
{
358-
auto* pd3d12SO = pPipelineStateD3D12->GetD3D12StateObject();
358+
auto* pd3d12SO = m_pPipelineState->GetD3D12StateObject();
359359
auto& RTCtx = CmdCtx.AsGraphicsContext4();
360360
RTCtx.SetRayTracingPipelineState(pd3d12SO);
361361
RTCtx.SetComputeRootSignature(pd3d12RootSig);

Graphics/GraphicsEngineOpenGL/src/DeviceContextGLImpl.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,15 +94,15 @@ void DeviceContextGLImpl::SetPipelineState(IPipelineState* pPipelineState)
9494
if (PipelineStateGLImpl::IsSameObject(m_pPipelineState, pPipelineStateGLImpl))
9595
return;
9696

97-
TDeviceContextBase::SetPipelineState(pPipelineStateGLImpl, 0 /*Dummy*/);
97+
TDeviceContextBase::SetPipelineState(std::move(pPipelineStateGLImpl), 0 /*Dummy*/);
9898

99-
const auto& Desc = pPipelineStateGLImpl->GetDesc();
99+
const auto& Desc = m_pPipelineState->GetDesc();
100100
if (Desc.PipelineType == PIPELINE_TYPE_COMPUTE)
101101
{
102102
}
103103
else if (Desc.PipelineType == PIPELINE_TYPE_GRAPHICS)
104104
{
105-
const auto& GraphicsPipeline = pPipelineStateGLImpl->GetGraphicsPipelineDesc();
105+
const auto& GraphicsPipeline = m_pPipelineState->GetGraphicsPipelineDesc();
106106
// Set rasterizer state
107107
{
108108
const auto& RasterizerDesc = GraphicsPipeline.RasterizerDesc;

Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -303,18 +303,18 @@ void DeviceContextVkImpl::SetPipelineState(IPipelineState* pPipelineState)
303303
CommitScissor = !m_pPipelineState->GetGraphicsPipelineDesc().RasterizerDesc.ScissorEnable;
304304
}
305305

306-
TDeviceContextBase::SetPipelineState(pPipelineStateVk, 0 /*Dummy*/);
306+
TDeviceContextBase::SetPipelineState(std::move(pPipelineStateVk), 0 /*Dummy*/);
307307
EnsureVkCmdBuffer();
308308

309-
auto vkPipeline = pPipelineStateVk->GetVkPipeline();
309+
auto vkPipeline = m_pPipelineState->GetVkPipeline();
310310

311311
static_assert(PIPELINE_TYPE_LAST == 4, "Please update the switch below to handle the new pipeline type");
312312
switch (PSODesc.PipelineType)
313313
{
314314
case PIPELINE_TYPE_GRAPHICS:
315315
case PIPELINE_TYPE_MESH:
316316
{
317-
auto& GraphicsPipeline = pPipelineStateVk->GetGraphicsPipelineDesc();
317+
auto& GraphicsPipeline = m_pPipelineState->GetGraphicsPipelineDesc();
318318
m_CommandBuffer.BindGraphicsPipeline(vkPipeline);
319319

320320
if (CommitStates)
@@ -350,8 +350,8 @@ void DeviceContextVkImpl::SetPipelineState(IPipelineState* pPipelineState)
350350
UNEXPECTED("unknown pipeline type");
351351
}
352352

353-
const auto& Layout = pPipelineStateVk->GetPipelineLayout();
354-
const auto SignCount = pPipelineStateVk->GetResourceSignatureCount();
353+
const auto& Layout = m_pPipelineState->GetPipelineLayout();
354+
const auto SignCount = m_pPipelineState->GetResourceSignatureCount();
355355
auto& BindInfo = GetBindInfo(PSODesc.PipelineType);
356356

357357
Uint32 DvpCompatibleSRBCount = 0;
@@ -371,7 +371,7 @@ void DeviceContextVkImpl::SetPipelineState(IPipelineState* pPipelineState)
371371
{
372372
auto& SetInfo = BindInfo.SetInfo[i];
373373

374-
auto* pSignature = pPipelineStateVk->GetResourceSignature(i);
374+
auto* pSignature = m_pPipelineState->GetResourceSignature(i);
375375
if (pSignature == nullptr || pSignature->GetNumDescriptorSets() == 0)
376376
{
377377
SetInfo = {};

0 commit comments

Comments
 (0)