Skip to content

Commit 63f9f82

Browse files
Hydrogent: skip OIT passes if there are no translucent items
1 parent 3858645 commit 63f9f82

File tree

6 files changed

+44
-4
lines changed

6 files changed

+44
-4
lines changed

Hydrogent/interface/HnRenderPassState.hpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,17 @@ namespace Diligent
4747
namespace USD
4848
{
4949

50+
struct HnRenderPassStats
51+
{
52+
Uint32 NumDrawItems = 0;
53+
54+
HnRenderPassStats& operator+=(const HnRenderPassStats& Stats)
55+
{
56+
NumDrawItems += Stats.NumDrawItems;
57+
return *this;
58+
}
59+
};
60+
5061
/// Hydra render pass state implementation in Hydrogent.
5162
class HnRenderPassState final : public pxr::HdRenderPassState
5263
{
@@ -147,6 +158,14 @@ class HnRenderPassState final : public pxr::HdRenderPassState
147158
m_IsCommited = false;
148159
}
149160

161+
162+
const HnRenderPassStats& GetStats() const { return m_Stats; }
163+
164+
void UpdateStats(const HnRenderPassStats& Stats)
165+
{
166+
m_Stats += Stats;
167+
}
168+
150169
private:
151170
Uint32 m_NumRenderTargets = 0;
152171
std::array<TEXTURE_FORMAT, MAX_RENDER_TARGETS> m_RTVFormats = {};
@@ -163,6 +182,8 @@ class HnRenderPassState final : public pxr::HdRenderPassState
163182
bool m_IsCommited = false;
164183

165184
bool m_FrontFaceCCW = false;
185+
186+
HnRenderPassStats m_Stats;
166187
};
167188

168189
} // namespace USD

Hydrogent/interface/Tasks/HnBeginOITPassTask.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ class HnBeginOITPassTask final : public HnTask
8989
std::array<RefCntAutoPtr<IShaderResourceBinding>, 2> m_RWLayersSRBs;
9090

9191
Uint32 m_BoundOITResourcesVersion = ~0u;
92+
bool m_OITLayersCleared = false;
9293
};
9394

9495
} // namespace USD

Hydrogent/src/HnRenderPass.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@ struct HnRenderPass::RenderState
120120
const Uint32 ConstantBufferOffsetAlignment;
121121
const bool NativeMultiDrawSupported;
122122

123+
HnRenderPassStats Stats;
124+
123125
RenderState(const HnRenderPass& _RenderPass,
124126
const HnRenderPassState& _RPState) :
125127
RenderPass{_RenderPass},
@@ -778,6 +780,8 @@ HnRenderPass::EXECUTE_RESULT HnRenderPass::Execute(HnRenderPassState& RPState, c
778780
FlushPendingDraws();
779781
}
780782

783+
RPState.UpdateStats(State.Stats);
784+
781785
return m_UseFallbackPSO ? EXECUTE_RESULT_FALLBACK : EXECUTE_RESULT_OK;
782786
}
783787

@@ -1613,6 +1617,8 @@ void HnRenderPass::RenderPendingDrawItems(RenderState& State)
16131617
item_idx += PendingItem.DrawCount;
16141618
}
16151619

1620+
State.Stats.NumDrawItems += static_cast<Uint32>(m_PendingDrawItems.size());
1621+
16161622
m_PendingDrawItems.clear();
16171623
}
16181624

Hydrogent/src/HnRenderPassState.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,7 @@ void HnRenderPassState::Begin(Uint32 NumRenderTargets,
239239
m_ClearDepth = ClearDepth;
240240

241241
m_IsCommited = false;
242+
m_Stats = {};
242243
}
243244

244245
} // namespace USD

Hydrogent/src/Tasks/HnBeginOITPassTask.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,9 @@ void HnBeginOITPassTask::Prepare(pxr::HdTaskContext* TaskCtx,
103103
const USD_Renderer& Renderer = *RenderDelegate->GetUSDRenderer();
104104
VERIFY_EXPR(Renderer.GetSettings().OITLayerCount > 0);
105105

106+
// If no translucent draw items were rendered in the last frame, we can skip clearing the layers.
107+
m_OITLayersCleared = static_cast<bool>(FrameTargets->OIT) && m_RenderPassState.GetStats().NumDrawItems == 0;
108+
106109
if (!FrameTargets->OIT)
107110
{
108111
FrameTargets->OIT = Renderer.CreateOITResources(ColorTargetDesc.Width, ColorTargetDesc.Height);
@@ -229,13 +232,15 @@ void HnBeginOITPassTask::Execute(pxr::HdTaskContext* TaskCtx)
229232
}
230233
Renderer.CreateRWOITLayersSRB(m_FrameTargets->OIT.Layers, pDepthSRV, &RWLayersSRB);
231234
}
232-
const TextureDesc& OITTailDesc = m_FrameTargets->OIT.Tail->GetDesc();
233-
Renderer.ClearOITLayers(pCtx, m_ClearLayersSRB, OITTailDesc.Width, OITTailDesc.Height);
235+
if (!m_OITLayersCleared)
236+
{
237+
const TextureDesc& OITTailDesc = m_FrameTargets->OIT.Tail->GetDesc();
238+
Renderer.ClearOITLayers(pCtx, m_ClearLayersSRB, OITTailDesc.Width, OITTailDesc.Height);
239+
}
234240

235241
IShaderResourceBinding* pFrameAttribsSRB = RenderDelegate->GetFrameAttribsSRB(HnRenderDelegate::FrameAttribsSRBType::Opaque);
236242
m_RenderPassState.SetFrameAttribsSRB(pFrameAttribsSRB);
237243
m_RenderPassState.SetRWOITLayersSRB(RWLayersSRB);
238-
m_RenderPassState.Commit(pCtx);
239244
}
240245

241246
} // namespace USD

Hydrogent/src/Tasks/HnEndOITPassTask.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#include "HnTokens.hpp"
3131
#include "HnFrameRenderTargets.hpp"
3232
#include "HnRenderParam.hpp"
33+
#include "HnRenderPassState.hpp"
3334

3435
namespace Diligent
3536
{
@@ -164,7 +165,12 @@ void HnEndOITPassTask::Execute(pxr::HdTaskContext* TaskCtx)
164165
};
165166
pCtx->TransitionResourceStates(_countof(Barriers), Barriers);
166167

167-
Renderer.ApplyOITAttenuation(pCtx, m_ApplyOITAttenuationPSO, m_ApplyOITAttenuationSRB);
168+
HnRenderPassState* RenderPassState = GetRenderPassState(TaskCtx, HnRenderResourceTokens->renderPass_OITLayers);
169+
VERIFY_EXPR(RenderPassState != nullptr);
170+
if (RenderPassState != nullptr && RenderPassState->GetStats().NumDrawItems > 0)
171+
{
172+
Renderer.ApplyOITAttenuation(pCtx, m_ApplyOITAttenuationPSO, m_ApplyOITAttenuationSRB);
173+
}
168174
}
169175

170176
} // namespace USD

0 commit comments

Comments
 (0)