Skip to content

Commit a634d7f

Browse files
Hydrogent: split OpaqueUnselected_TransparentAll render pass state into two
1 parent da97dce commit a634d7f

File tree

10 files changed

+173
-120
lines changed

10 files changed

+173
-120
lines changed

Hydrogent/interface/HnRenderDelegate.hpp

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#include <string>
3333
#include <atomic>
3434
#include <mutex>
35+
#include <array>
3536

3637
#include "pxr/imaging/hd/renderDelegate.h"
3738

@@ -421,8 +422,18 @@ class HnRenderDelegate final : public pxr::HdRenderDelegate
421422
IBuffer* GetFrameAttribsCB() const { return m_FrameAttribsCB; }
422423
IBuffer* GetPrimitiveAttribsCB() const { return m_PrimitiveAttribsCB; }
423424

424-
IShaderResourceBinding* GetMainPassFrameAttribsSRB() const { return m_MainPassFrameAttribsSRB; }
425-
IShaderResourceBinding* GetOITPassFrameAttribsSRB() const { return m_OITPassFrameAttribsSRB; }
425+
enum class FrameAttribsSRBType : Uint32
426+
{
427+
Opaque,
428+
Transparent,
429+
OITLayers,
430+
Count
431+
};
432+
IShaderResourceBinding* GetFrameAttribsSRB(FrameAttribsSRBType Type) const
433+
{
434+
return m_FrameAttribsSRBs[static_cast<size_t>(Type)];
435+
}
436+
426437
IShaderResourceBinding* GetShadowPassFrameAttribsSRB(Uint32 LightId) const;
427438
Uint32 GetShadowPassFrameAttribsOffset(Uint32 LightId) const;
428439

@@ -442,6 +453,12 @@ class HnRenderDelegate final : public pxr::HdRenderDelegate
442453

443454
bool AllowPrimitiveRestart() const;
444455

456+
private:
457+
RefCntAutoPtr<IShaderResourceBinding>& _GetFrameAttribsSRB(FrameAttribsSRBType Type)
458+
{
459+
return m_FrameAttribsSRBs[static_cast<size_t>(Type)];
460+
}
461+
445462
private:
446463
static const pxr::TfTokenVector SupportedRPrimTypes;
447464
static const pxr::TfTokenVector SupportedSPrimTypes;
@@ -465,8 +482,7 @@ class HnRenderDelegate final : public pxr::HdRenderDelegate
465482
//
466483
RefCntAutoPtr<IBuffer> m_FrameAttribsCB;
467484

468-
RefCntAutoPtr<IShaderResourceBinding> m_MainPassFrameAttribsSRB;
469-
RefCntAutoPtr<IShaderResourceBinding> m_OITPassFrameAttribsSRB;
485+
std::array<RefCntAutoPtr<IShaderResourceBinding>, static_cast<size_t>(FrameAttribsSRBType::Count)> m_FrameAttribsSRBs;
470486

471487
struct ShadowPassFrameAttribs
472488
{

Hydrogent/interface/HnRenderPassState.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@ class HnRenderPassState final : public pxr::HdRenderPassState
5757

5858
void Commit(IDeviceContext* pContext);
5959

60+
void Init(const TEXTURE_FORMAT* RTVFormats,
61+
Uint32 NumRTVs,
62+
TEXTURE_FORMAT DSVFormat,
63+
bool UseReverseDepth);
64+
6065
void SetRenderTargetFormat(Uint32 rt, TEXTURE_FORMAT Fmt)
6166
{
6267
m_RTVFormats[rt] = Fmt;

Hydrogent/interface/HnTokens.hpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -132,11 +132,12 @@ namespace USD
132132
(cameraTransformDirty) \
133133
(renderPass_OpaqueSelected) \
134134
(renderPass_TransparentSelected) \
135-
(renderPass_OpaqueUnselected_TransparentAll) \
135+
(renderPass_OpaqueUnselected) \
136+
(renderPass_TransparentAll) \
136137
(renderPass_OITLayers) \
137-
(renderPass_Shadow) \
138-
(backgroundDepth) \
139-
(useReverseDepth) \
138+
(renderPass_Shadow) \
139+
(backgroundDepth) \
140+
(useReverseDepth) \
140141
(fallBackPsoInUse)
141142

142143

Hydrogent/interface/Tasks/HnTaskManager.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,10 +134,10 @@ class HnTaskManager
134134
/// | RenderRprimsMaskedUnselected | | V | V | V | V | | V |
135135
/// | RenderEnvMap | | | V | | | | |
136136
/// | RenderBoundBox | | | V | | | | |
137+
/// | RenderRprimsAdditive | V | V | V | V | V | | V |
137138
/// | BeginOITPass | | | | | | | |
138139
/// | RenderRprimsOITLayers | | | | | | | |
139140
/// | EndOITPass | | | | | | | |
140-
/// | RenderRprimsAdditive | V | V | V | V | V | | V |
141141
/// | RenderRprimsTranslucent | V | V | V | V | V | | V |
142142
/// | RenderRprimsAdditiveSelected | V | | | | | V | |
143143
/// | RenderRprimsTranslucentSelected | V | | | | | V | |

Hydrogent/src/HnRenderDelegate.cpp

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -759,7 +759,10 @@ void HnRenderDelegate::CommitResources(pxr::HdChangeTracker* tracker)
759759
if (m_ShadowAtlasVersion != ShadowAtlasVersion)
760760
{
761761
m_ShadowAtlasVersion = ShadowAtlasVersion;
762-
m_MainPassFrameAttribsSRB.Release();
762+
763+
static_assert(static_cast<size_t>(FrameAttribsSRBType::Count) == 3, "Did you add a new FrameAttribsSRBType? You may need to update this code.");
764+
for (FrameAttribsSRBType Type : {FrameAttribsSRBType::Opaque, FrameAttribsSRBType::Transparent})
765+
_GetFrameAttribsSRB(Type).Release();
763766
}
764767
}
765768

@@ -771,7 +774,7 @@ void HnRenderDelegate::CommitResources(pxr::HdChangeTracker* tracker)
771774
if (m_OITResourcesVersion != m_RenderParam->GetAttribVersion(HnRenderParam::GlobalAttrib::OITResources))
772775
{
773776
m_OITResourcesVersion = m_RenderParam->MakeAttribDirty(HnRenderParam::GlobalAttrib::OITResources);
774-
m_MainPassFrameAttribsSRB.Release();
777+
_GetFrameAttribsSRB(FrameAttribsSRBType::Transparent).Release();
775778
}
776779
}
777780

@@ -805,16 +808,47 @@ void HnRenderDelegate::CommitResources(pxr::HdChangeTracker* tracker)
805808
return SRB;
806809
};
807810

811+
ITextureView* pShadowSRV = m_ShadowMapManager ? m_ShadowMapManager->GetShadowSRV() : nullptr;
812+
808813
// FrameAttribs
809814
//
810815
// || Main Pass || Shadow Pass 1 || ... || Shadow Pass N ||
811816
// || Camera|PrevCamera|Renderer|Lights|ShadowMaps || Camera|PrevCamera|Renderer || ... || Camera|PrevCamera|Renderer ||
812817
// |<-------------------------------------------->||<-------------------------->||
813818
// m_USDRenderer->GetPRBFrameAttribsSize() USD_Renderer::GetPRBFrameAttribsSize(0, 0)
814-
if (!m_MainPassFrameAttribsSRB)
819+
RefCntAutoPtr<IShaderResourceBinding>& OpaquePassFrameAttribsSRB = _GetFrameAttribsSRB(FrameAttribsSRBType::Opaque);
820+
if (!OpaquePassFrameAttribsSRB)
815821
{
816-
m_MainPassFrameAttribsSRB = CreateFrameAttribsSRB(m_USDRenderer->GetPRBFrameAttribsSize(), m_ShadowMapManager ? m_ShadowMapManager->GetShadowSRV() : nullptr);
822+
OpaquePassFrameAttribsSRB = CreateFrameAttribsSRB(m_USDRenderer->GetPRBFrameAttribsSize(), pShadowSRV);
823+
if (EnableOIT)
824+
{
825+
// Opaque pass doesn't use OIT resources
826+
m_USDRenderer->SetOITResources(OpaquePassFrameAttribsSRB, m_DummyOITResources);
827+
}
817828
}
829+
830+
RefCntAutoPtr<IShaderResourceBinding>& TransparentPassFrameAttribsSRB = _GetFrameAttribsSRB(FrameAttribsSRBType::Transparent);
831+
if (EnableOIT)
832+
{
833+
if (!TransparentPassFrameAttribsSRB)
834+
{
835+
TransparentPassFrameAttribsSRB = CreateFrameAttribsSRB(m_USDRenderer->GetPRBFrameAttribsSize(), pShadowSRV);
836+
}
837+
838+
RefCntAutoPtr<IShaderResourceBinding>& OITPassFrameAttribsSRB = _GetFrameAttribsSRB(FrameAttribsSRBType::OITLayers);
839+
if (!OITPassFrameAttribsSRB)
840+
{
841+
OITPassFrameAttribsSRB = CreateFrameAttribsSRB(m_USDRenderer->GetPRBFrameAttribsSize(), m_pDummyShadowSRV);
842+
// OIT Layers pass updates the OIT layers, but we still need to have something bound in the SRB, so
843+
// we bind the dummy OIT resources.
844+
m_USDRenderer->SetOITResources(OITPassFrameAttribsSRB, m_DummyOITResources);
845+
}
846+
}
847+
else
848+
{
849+
TransparentPassFrameAttribsSRB = OpaquePassFrameAttribsSRB;
850+
}
851+
818852
if (m_ShadowMapManager && !m_ShadowPassFrameAttribs.SRB)
819853
{
820854
constexpr Uint32 LightCount = 0;
@@ -829,11 +863,6 @@ void HnRenderDelegate::CommitResources(pxr::HdChangeTracker* tracker)
829863
m_ShadowPassFrameAttribs.FrameAttribsVar = m_ShadowPassFrameAttribs.SRB->GetVariableByName(SHADER_TYPE_VERTEX, "cbFrameAttribs");
830864
VERIFY_EXPR(m_ShadowPassFrameAttribs.FrameAttribsVar != nullptr);
831865
}
832-
if (EnableOIT && !m_OITPassFrameAttribsSRB)
833-
{
834-
m_OITPassFrameAttribsSRB = CreateFrameAttribsSRB(m_USDRenderer->GetPRBFrameAttribsSize(), m_pDummyShadowSRV);
835-
m_USDRenderer->SetOITResources(m_OITPassFrameAttribsSRB, m_DummyOITResources);
836-
}
837866

838867
{
839868
if (m_MaterialResourcesVersion != m_RenderParam->GetAttribVersion(HnRenderParam::GlobalAttrib::Material) + HnMaterial::GetResourceCacheVersion(*this))

Hydrogent/src/HnRenderPassState.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,50 @@ void HnRenderPassState::Commit(IDeviceContext* pContext)
8787
m_IsCommited = true;
8888
}
8989

90+
void HnRenderPassState::Init(const TEXTURE_FORMAT* RTVFormats,
91+
Uint32 NumRTVs,
92+
TEXTURE_FORMAT DSVFormat,
93+
bool UseReverseDepth)
94+
{
95+
SetNumRenderTargets(NumRTVs);
96+
for (Uint32 i = 0; i < NumRTVs; ++i)
97+
SetRenderTargetFormat(i, RTVFormats[i]);
98+
99+
SetDepthStencilFormat(DSVFormat);
100+
101+
bool FrontFaceCCW = true;
102+
103+
float DepthBias = 0;
104+
float SlopeScaledDepthBias = 0;
105+
pxr::HdCompareFunction DepthFunc = UseReverseDepth ? pxr::HdCmpFuncGreater : pxr::HdCmpFuncLess;
106+
bool DepthBiasEnabled = false;
107+
bool DepthTestEnabled = true;
108+
bool DepthClampEnabled = false;
109+
110+
pxr::HdCullStyle CullStyle = pxr::HdCullStyleBack;
111+
112+
pxr::HdCompareFunction StencilFunc = pxr::HdCmpFuncAlways;
113+
int StencilRef = 0;
114+
int StencilMask = 0xFF;
115+
pxr::HdStencilOp StencilFailOp = pxr::HdStencilOpKeep;
116+
pxr::HdStencilOp StencilZFailOp = pxr::HdStencilOpKeep;
117+
pxr::HdStencilOp StencilZPassOp = pxr::HdStencilOpKeep;
118+
bool StencilEnabled = false;
119+
120+
SetDepthFunc(DepthFunc);
121+
SetDepthBias(DepthBias, SlopeScaledDepthBias);
122+
SetDepthBiasEnabled(DepthBiasEnabled);
123+
SetEnableDepthTest(DepthTestEnabled);
124+
SetEnableDepthClamp(DepthClampEnabled);
125+
126+
SetCullStyle(CullStyle);
127+
128+
SetStencilEnabled(StencilEnabled);
129+
SetStencil(StencilFunc, StencilRef, StencilMask, StencilFailOp, StencilZFailOp, StencilZPassOp);
130+
131+
SetFrontFaceCCW(FrontFaceCCW);
132+
}
133+
90134
RasterizerStateDesc HnRenderPassState::GetRasterizerState() const
91135
{
92136
VERIFY(!_conservativeRasterizationEnabled, "Conservative rasterization is not supported");

Hydrogent/src/Tasks/HnBeginFrameTask.cpp

Lines changed: 32 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -109,51 +109,6 @@ HnBeginFrameTask::~HnBeginFrameTask()
109109
{
110110
}
111111

112-
static void UpdateRenderPassState(const HnBeginFrameTaskParams& Params,
113-
const TEXTURE_FORMAT* RTVFormats,
114-
Uint32 NumRTVs,
115-
TEXTURE_FORMAT DSVFormat,
116-
HnRenderPassState& RPState)
117-
{
118-
RPState.SetNumRenderTargets(NumRTVs);
119-
for (Uint32 i = 0; i < NumRTVs; ++i)
120-
RPState.SetRenderTargetFormat(i, RTVFormats[i]);
121-
122-
RPState.SetDepthStencilFormat(DSVFormat);
123-
124-
bool FrontFaceCCW = true;
125-
126-
float DepthBias = 0;
127-
float SlopeScaledDepthBias = 0;
128-
pxr::HdCompareFunction DepthFunc = Params.UseReverseDepth ? pxr::HdCmpFuncGreater : pxr::HdCmpFuncLess;
129-
bool DepthBiasEnabled = false;
130-
bool DepthTestEnabled = true;
131-
bool DepthClampEnabled = false;
132-
133-
pxr::HdCullStyle CullStyle = pxr::HdCullStyleBack;
134-
135-
pxr::HdCompareFunction StencilFunc = pxr::HdCmpFuncAlways;
136-
int StencilRef = 0;
137-
int StencilMask = 0xFF;
138-
pxr::HdStencilOp StencilFailOp = pxr::HdStencilOpKeep;
139-
pxr::HdStencilOp StencilZFailOp = pxr::HdStencilOpKeep;
140-
pxr::HdStencilOp StencilZPassOp = pxr::HdStencilOpKeep;
141-
bool StencilEnabled = false;
142-
143-
RPState.SetDepthFunc(DepthFunc);
144-
RPState.SetDepthBias(DepthBias, SlopeScaledDepthBias);
145-
RPState.SetDepthBiasEnabled(DepthBiasEnabled);
146-
RPState.SetEnableDepthTest(DepthTestEnabled);
147-
RPState.SetEnableDepthClamp(DepthClampEnabled);
148-
149-
RPState.SetCullStyle(CullStyle);
150-
151-
RPState.SetStencilEnabled(StencilEnabled);
152-
RPState.SetStencil(StencilFunc, StencilRef, StencilMask, StencilFailOp, StencilZFailOp, StencilZPassOp);
153-
154-
RPState.SetFrontFaceCCW(FrontFaceCCW);
155-
}
156-
157112
static TEXTURE_FORMAT GetFallbackTextureFormat(TEXTURE_FORMAT Format)
158113
{
159114
switch (Format)
@@ -173,30 +128,29 @@ void HnBeginFrameTask::Sync(pxr::HdSceneDelegate* Delegate,
173128
{
174129
if (GetTaskParams(Delegate, m_Params))
175130
{
176-
UpdateRenderPassState(m_Params,
177-
m_Params.Formats.GBuffer.data(),
178-
m_Params.Formats.GBuffer.size(),
179-
m_Params.Formats.Depth,
180-
m_RenderPassStates[HnRenderResourceTokens->renderPass_OpaqueSelected]);
181-
182-
UpdateRenderPassState(m_Params,
183-
m_Params.Formats.GBuffer.data(),
184-
m_Params.Formats.GBuffer.size(),
185-
m_Params.Formats.Depth,
186-
m_RenderPassStates[HnRenderResourceTokens->renderPass_OpaqueUnselected_TransparentAll]);
187-
188-
UpdateRenderPassState(m_Params,
189-
nullptr,
190-
0,
191-
m_Params.Formats.Depth,
192-
m_RenderPassStates[HnRenderResourceTokens->renderPass_TransparentSelected]);
131+
for (const pxr::TfToken& PassName : {HnRenderResourceTokens->renderPass_OpaqueSelected,
132+
HnRenderResourceTokens->renderPass_OpaqueUnselected,
133+
HnRenderResourceTokens->renderPass_TransparentAll})
134+
{
135+
m_RenderPassStates[PassName].Init(
136+
m_Params.Formats.GBuffer.data(),
137+
m_Params.Formats.GBuffer.size(),
138+
m_Params.Formats.Depth,
139+
m_Params.UseReverseDepth);
140+
}
141+
142+
m_RenderPassStates[HnRenderResourceTokens->renderPass_TransparentSelected].Init(
143+
nullptr,
144+
0,
145+
m_Params.Formats.Depth,
146+
m_Params.UseReverseDepth);
193147

194148
const TEXTURE_FORMAT OITRTVFormats[] = {USD_Renderer::OITTailFmt};
195-
UpdateRenderPassState(m_Params,
196-
OITRTVFormats,
197-
_countof(OITRTVFormats),
198-
m_Params.Formats.Depth,
199-
m_RenderPassStates[HnRenderResourceTokens->renderPass_OITLayers]);
149+
m_RenderPassStates[HnRenderResourceTokens->renderPass_OITLayers].Init(
150+
OITRTVFormats,
151+
_countof(OITRTVFormats),
152+
m_Params.Formats.Depth,
153+
m_Params.UseReverseDepth);
200154

201155
(*TaskCtx)[HnRenderResourceTokens->suspendSuperSampling] = pxr::VtValue{true};
202156
}
@@ -330,19 +284,24 @@ void HnBeginFrameTask::PrepareRenderTargets(pxr::HdRenderIndex* RenderIndex,
330284
float4{0};
331285
}
332286

333-
HnRenderPassState& RP_OpaqueSelected = m_RenderPassStates[HnRenderResourceTokens->renderPass_OpaqueSelected];
334-
HnRenderPassState& RP_OpaqueUnselected_TransparentAll = m_RenderPassStates[HnRenderResourceTokens->renderPass_OpaqueUnselected_TransparentAll];
335-
HnRenderPassState& RP_TransparentSelected = m_RenderPassStates[HnRenderResourceTokens->renderPass_TransparentSelected];
287+
HnRenderPassState& RP_OpaqueSelected = m_RenderPassStates[HnRenderResourceTokens->renderPass_OpaqueSelected];
288+
HnRenderPassState& RP_OpaqueUnselected = m_RenderPassStates[HnRenderResourceTokens->renderPass_OpaqueUnselected];
289+
HnRenderPassState& RP_TransparentAll = m_RenderPassStates[HnRenderResourceTokens->renderPass_TransparentAll];
290+
HnRenderPassState& RP_TransparentSelected = m_RenderPassStates[HnRenderResourceTokens->renderPass_TransparentSelected];
336291

337292
const float DepthClearValue = m_Params.UseReverseDepth ? 0.f : 1.f;
338293

339294
// We first render selected objects using the selection depth buffer.
340295
// Selection depth buffer is copied to the main depth buffer by the HnCopySelectionDepthTask.
341296
RP_OpaqueSelected.Begin(HnFrameRenderTargets::GBUFFER_TARGET_COUNT, m_FrameRenderTargets.GBufferRTVs.data(), m_FrameRenderTargets.SelectionDepthDSV, ClearValues.data(), DepthClearValue, ~0u);
342-
RP_OpaqueUnselected_TransparentAll.Begin(HnFrameRenderTargets::GBUFFER_TARGET_COUNT, m_FrameRenderTargets.GBufferRTVs.data(), m_FrameRenderTargets.DepthDSV);
297+
RP_OpaqueUnselected.Begin(HnFrameRenderTargets::GBUFFER_TARGET_COUNT, m_FrameRenderTargets.GBufferRTVs.data(), m_FrameRenderTargets.DepthDSV);
298+
RP_TransparentAll.Begin(HnFrameRenderTargets::GBUFFER_TARGET_COUNT, m_FrameRenderTargets.GBufferRTVs.data(), m_FrameRenderTargets.DepthDSV);
343299
RP_TransparentSelected.Begin(0, nullptr, m_FrameRenderTargets.SelectionDepthDSV);
344300

345-
for (HnRenderPassState* RPState : {&RP_OpaqueSelected, &RP_OpaqueUnselected_TransparentAll, &RP_TransparentSelected})
301+
for (HnRenderPassState* RPState : {&RP_OpaqueSelected,
302+
&RP_OpaqueUnselected,
303+
&RP_TransparentAll,
304+
&RP_TransparentSelected})
346305
{
347306
RPState->SetCamera(m_pCamera);
348307
}
@@ -774,7 +733,7 @@ void HnBeginFrameTask::BindOITResources(HnRenderDelegate* RenderDelegate)
774733
}
775734

776735
USD_Renderer& Renderer = *RenderDelegate->GetUSDRenderer();
777-
if (IShaderResourceBinding* pFrameAttribsSRB = RenderDelegate->GetMainPassFrameAttribsSRB())
736+
if (IShaderResourceBinding* pFrameAttribsSRB = RenderDelegate->GetFrameAttribsSRB(HnRenderDelegate::FrameAttribsSRBType::Transparent))
778737
{
779738
Renderer.SetOITResources(pFrameAttribsSRB, m_FrameRenderTargets.OIT);
780739
m_BoundOITResourcesVersion = RenderParam->GetAttribVersion(HnRenderParam::GlobalAttrib::OITResources);

0 commit comments

Comments
 (0)