Skip to content

Commit d35c766

Browse files
PBRRenderer: added render pass type to PSO key
1 parent 7284c42 commit d35c766

File tree

6 files changed

+95
-11
lines changed

6 files changed

+95
-11
lines changed

Hydrogent/interface/HnRenderPass.hpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,14 @@ struct HnRenderPassParams
6262
};
6363
SelectionType Selection = SelectionType::All;
6464

65-
USD_Renderer::USD_PSO_FLAGS UsdPsoFlags = USD_Renderer::USD_PSO_FLAG_NONE;
65+
USD_Renderer::RenderPassType Type = USD_Renderer::RenderPassType::Main;
66+
USD_Renderer::USD_PSO_FLAGS UsdPsoFlags = USD_Renderer::USD_PSO_FLAG_NONE;
6667

6768
constexpr bool operator==(const HnRenderPassParams& rhs) const
6869
{
69-
return Selection == rhs.Selection && UsdPsoFlags == rhs.UsdPsoFlags;
70+
return (Selection == rhs.Selection &&
71+
Type == rhs.Type &&
72+
UsdPsoFlags == rhs.UsdPsoFlags);
7073
}
7174

7275
static const char* GetSelectionTypeString(SelectionType Type);

Hydrogent/src/HnRenderPass.cpp

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1000,6 +1000,7 @@ void HnRenderPass::UpdateDrawListGPUResources(RenderState& State)
10001000
m_RenderMode == HN_RENDER_MODE_SOLID)
10011001
{
10021002
const PBR_Renderer::PSOKey FallbackPSOKey{
1003+
PBR_Renderer::RenderPassType::Main,
10031004
GetFallbackPSOFlags(),
10041005
PBR_Renderer::ALPHA_MODE_OPAQUE,
10051006
CULL_MODE_NONE,
@@ -1314,13 +1315,31 @@ void HnRenderPass::UpdateDrawListItemGPUResources(DrawListItem& ListItem, Render
13141315
PBR_Renderer::LoadingAnimationMode::Transitioning :
13151316
PBR_Renderer::LoadingAnimationMode::None;
13161317

1317-
ListItem.pPSO = PsoCache.Get({PSOFlags, static_cast<PBR_Renderer::ALPHA_MODE>(State.AlphaMode), CullMode, m_DebugView, LoadingAnimationMode, ShaderTextureIndexingId}, GetPSOFlags);
1318+
const PBR_Renderer::PSOKey PSOKey{
1319+
m_Params.Type,
1320+
PSOFlags,
1321+
static_cast<PBR_Renderer::ALPHA_MODE>(State.AlphaMode),
1322+
CullMode,
1323+
m_DebugView,
1324+
LoadingAnimationMode,
1325+
ShaderTextureIndexingId,
1326+
};
1327+
ListItem.pPSO = PsoCache.Get(PSOKey, GetPSOFlags);
13181328
}
13191329
else if (m_RenderMode == HN_RENDER_MODE_MESH_EDGES ||
13201330
m_RenderMode == HN_RENDER_MODE_POINTS)
13211331
{
1332+
VERIFY_EXPR(m_Params.Type == PBR_Renderer::RenderPassType::Main);
13221333
PSOFlags |= PBR_Renderer::PSO_FLAG_UNSHADED;
1323-
ListItem.pPSO = PsoCache.Get({PSOFlags, CullMode, PBR_Renderer::DebugViewType::None, PBR_Renderer::LoadingAnimationMode::None, ShaderTextureIndexingId}, GetPSOFlags);
1334+
const PBR_Renderer::PSOKey PSOKey{
1335+
m_Params.Type,
1336+
PSOFlags,
1337+
CullMode,
1338+
PBR_Renderer::DebugViewType::None,
1339+
PBR_Renderer::LoadingAnimationMode::None,
1340+
ShaderTextureIndexingId,
1341+
};
1342+
ListItem.pPSO = PsoCache.Get(PSOKey, GetPSOFlags);
13241343
}
13251344
else
13261345
{

Hydrogent/src/Tasks/HnTaskManager.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,13 +163,15 @@ HnTaskManager::HnTaskManager(pxr::HdRenderIndex& RenderIndex,
163163
{
164164
HnRenderResourceTokens->renderPass_OpaqueSelected,
165165
HnRenderPassParams::SelectionType::Selected,
166+
USD_Renderer::RenderPassType::Main,
166167
USD_Renderer::USD_PSO_FLAG_ENABLE_ALL_OUTPUTS,
167168
});
168169
CreateRenderRprimsTask(HnMaterialTagTokens->masked,
169170
TaskUID_RenderRprimsMaskedSelected,
170171
{
171172
HnRenderResourceTokens->renderPass_OpaqueSelected,
172173
HnRenderPassParams::SelectionType::Selected,
174+
USD_Renderer::RenderPassType::Main,
173175
USD_Renderer::USD_PSO_FLAG_ENABLE_ALL_OUTPUTS,
174176
});
175177

@@ -181,13 +183,15 @@ HnTaskManager::HnTaskManager(pxr::HdRenderIndex& RenderIndex,
181183
{
182184
HnRenderResourceTokens->renderPass_OpaqueUnselected_TransparentAll,
183185
HnRenderPassParams::SelectionType::Unselected,
186+
USD_Renderer::RenderPassType::Main,
184187
USD_Renderer::USD_PSO_FLAG_ENABLE_ALL_OUTPUTS,
185188
});
186189
CreateRenderRprimsTask(HnMaterialTagTokens->masked,
187190
TaskUID_RenderRprimsMaskedUnselected,
188191
{
189192
HnRenderResourceTokens->renderPass_OpaqueUnselected_TransparentAll,
190193
HnRenderPassParams::SelectionType::Unselected,
194+
USD_Renderer::RenderPassType::Main,
191195
USD_Renderer::USD_PSO_FLAG_ENABLE_ALL_OUTPUTS,
192196
});
193197
CreateRenderEnvMapTask(HnRenderResourceTokens->renderPass_OpaqueUnselected_TransparentAll);
@@ -201,13 +205,15 @@ HnTaskManager::HnTaskManager(pxr::HdRenderIndex& RenderIndex,
201205
{
202206
HnRenderResourceTokens->renderPass_OpaqueUnselected_TransparentAll,
203207
HnRenderPassParams::SelectionType::All,
208+
USD_Renderer::RenderPassType::Main,
204209
USD_Renderer::USD_PSO_FLAG_ENABLE_ALL_OUTPUTS,
205210
});
206211
CreateRenderRprimsTask(HnMaterialTagTokens->translucent,
207212
TaskUID_RenderRprimsTranslucent,
208213
{
209214
HnRenderResourceTokens->renderPass_OpaqueUnselected_TransparentAll,
210215
HnRenderPassParams::SelectionType::All,
216+
USD_Renderer::RenderPassType::Main,
211217
USD_Renderer::USD_PSO_FLAG_ENABLE_ALL_OUTPUTS,
212218
});
213219

@@ -217,13 +223,15 @@ HnTaskManager::HnTaskManager(pxr::HdRenderIndex& RenderIndex,
217223
{
218224
HnRenderResourceTokens->renderPass_TransparentSelected,
219225
HnRenderPassParams::SelectionType::Selected,
226+
USD_Renderer::RenderPassType::Main,
220227
USD_Renderer::USD_PSO_FLAG_NONE,
221228
});
222229
CreateRenderRprimsTask(HnMaterialTagTokens->translucent,
223230
TaskUID_RenderRprimsTranslucentSelected,
224231
{
225232
HnRenderResourceTokens->renderPass_TransparentSelected,
226233
HnRenderPassParams::SelectionType::Selected,
234+
USD_Renderer::RenderPassType::Main,
227235
USD_Renderer::USD_PSO_FLAG_NONE,
228236
});
229237

@@ -309,6 +317,7 @@ void HnTaskManager::CreateRenderShadowsTask(const HnShadowMapManager& ShadowMapM
309317
HnRenderPassParams RPParams{
310318
HnRenderResourceTokens->renderPass_Shadow,
311319
HnRenderPassParams::SelectionType::All,
320+
USD_Renderer::RenderPassType::Shadow,
312321
USD_Renderer::USD_PSO_FLAG_NONE,
313322
};
314323

@@ -446,6 +455,7 @@ void HnTaskManager::CreateBuildTransmittanceTask()
446455
HnRenderPassParams RPParams{
447456
HnRenderResourceTokens->renderPass_BuildTransmittance,
448457
HnRenderPassParams::SelectionType::All,
458+
USD_Renderer::RenderPassType::BuildTransmittance,
449459
USD_Renderer::USD_PSO_FLAG_NONE,
450460
};
451461

PBR/interface/PBR_Renderer.hpp

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -440,14 +440,22 @@ class PBR_Renderer
440440
NumDebugViews
441441
};
442442

443-
enum class LoadingAnimationMode
443+
enum class LoadingAnimationMode : Uint8
444444
{
445445
None,
446446
Always,
447447
Transitioning,
448448
Count
449449
};
450450

451+
enum class RenderPassType : Uint8
452+
{
453+
Main,
454+
Shadow,
455+
BuildTransmittance,
456+
Count
457+
};
458+
451459
/// Initializes the renderer
452460
PBR_Renderer(IRenderDevice* pDevice,
453461
IRenderStateCache* pStateCache,
@@ -571,26 +579,28 @@ class PBR_Renderer
571579
public:
572580
constexpr PSOKey() noexcept {};
573581

574-
PSOKey(PSO_FLAGS _Flags,
582+
PSOKey(RenderPassType _Type,
583+
PSO_FLAGS _Flags,
575584
ALPHA_MODE _AlphaMode,
576585
CULL_MODE _CullMode,
577586
DebugViewType _DebugView = DebugViewType::None,
578587
LoadingAnimationMode _LoadingAnimation = LoadingAnimationMode::None,
579588
Uint64 _UserValue = 0) noexcept;
580589

581-
PSOKey(PSO_FLAGS _Flags,
590+
PSOKey(RenderPassType _Type,
591+
PSO_FLAGS _Flags,
582592
CULL_MODE _CullMode,
583593
DebugViewType _DebugView = DebugViewType::None,
584594
LoadingAnimationMode _LoadingAnimation = LoadingAnimationMode::None,
585595
Uint64 _UserValue = 0) noexcept :
586-
PSOKey{_Flags, ALPHA_MODE_OPAQUE, _CullMode, _DebugView, _LoadingAnimation, _UserValue}
596+
PSOKey{_Type, _Flags, ALPHA_MODE_OPAQUE, _CullMode, _DebugView, _LoadingAnimation, _UserValue}
587597
{}
588598

589599
PSOKey(PSO_FLAGS _Flags,
590600
ALPHA_MODE _AlphaMode,
591601
CULL_MODE _CullMode,
592602
const PSOKey& Other) noexcept :
593-
PSOKey{_Flags, _AlphaMode, _CullMode, Other.GetDebugView(), Other.GetLoadingAnimation(), Other.GetUserValue()}
603+
PSOKey{Other.GetType(), _Flags, _AlphaMode, _CullMode, Other.GetDebugView(), Other.GetLoadingAnimation(), Other.GetUserValue()}
594604
{}
595605

596606
PSOKey(PSO_FLAGS _Flags,
@@ -602,6 +612,7 @@ class PBR_Renderer
602612
{
603613
// clang-format off
604614
return Hash == rhs.Hash &&
615+
Type == rhs.Type &&
605616
Flags == rhs.Flags &&
606617
CullMode == rhs.CullMode &&
607618
AlphaMode == rhs.AlphaMode &&
@@ -623,6 +634,7 @@ class PBR_Renderer
623634
}
624635
};
625636

637+
constexpr RenderPassType GetType() const noexcept { return Type; }
626638
constexpr PSO_FLAGS GetFlags() const noexcept { return Flags; }
627639
constexpr CULL_MODE GetCullMode() const noexcept { return CullMode; }
628640
constexpr ALPHA_MODE GetAlphaMode() const noexcept { return AlphaMode; }
@@ -631,6 +643,7 @@ class PBR_Renderer
631643
constexpr Uint64 GetUserValue() const noexcept { return UserValue; }
632644

633645
private:
646+
RenderPassType Type = RenderPassType::Main;
634647
PSO_FLAGS Flags = PSO_FLAG_NONE;
635648
ALPHA_MODE AlphaMode = ALPHA_MODE_OPAQUE;
636649
CULL_MODE CullMode = CULL_MODE_BACK;

PBR/src/GLTF_PBR_Renderer.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -575,7 +575,13 @@ void GLTF_PBR_Renderer::Render(IDeviceContext* pCtx,
575575
if (RenderParams.Wireframe)
576576
PSOFlags |= PSO_FLAG_UNSHADED;
577577

578-
const PSOKey NewKey{PSOFlags, GltfAlphaModeToAlphaMode(AlphaMode), material.DoubleSided ? CULL_MODE_NONE : CULL_MODE_BACK, RenderParams.DebugView};
578+
const PSOKey NewKey{
579+
RenderPassType::Main,
580+
PSOFlags,
581+
GltfAlphaModeToAlphaMode(AlphaMode),
582+
material.DoubleSided ? CULL_MODE_NONE : CULL_MODE_BACK,
583+
RenderParams.DebugView,
584+
};
579585
if (NewKey != CurrPsoKey)
580586
{
581587
CurrPsoKey = NewKey;

PBR/src/PBR_Renderer.cpp

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,19 +64,51 @@ namespace HLSL
6464

6565
} // namespace HLSL
6666

67-
PBR_Renderer::PSOKey::PSOKey(PSO_FLAGS _Flags,
67+
PBR_Renderer::PSOKey::PSOKey(RenderPassType _Type,
68+
PSO_FLAGS _Flags,
6869
ALPHA_MODE _AlphaMode,
6970
CULL_MODE _CullMode,
7071
DebugViewType _DebugView,
7172
LoadingAnimationMode _LoadingAnimation,
7273
Uint64 _UserValue) noexcept :
74+
Type{_Type},
7375
Flags{_Flags},
7476
AlphaMode{_AlphaMode},
7577
CullMode{_CullMode},
7678
DebugView{_DebugView},
7779
LoadingAnimation{_LoadingAnimation},
7880
UserValue{_UserValue}
7981
{
82+
static_assert(PSO_FLAG_LAST == Uint64{1} << Uint64{38}, "Please handle the new flag below, if necessary");
83+
if (Type == RenderPassType::Shadow)
84+
{
85+
static constexpr PSO_FLAGS ShadowPassFlags =
86+
PSO_FLAG_USE_COLOR_MAP |
87+
PSO_FLAG_USE_TEXCOORD0 |
88+
PSO_FLAG_USE_TEXCOORD1 |
89+
PSO_FLAG_USE_JOINTS |
90+
PSO_FLAG_USE_TEXTURE_ATLAS |
91+
PSO_FLAG_ENABLE_TEXCOORD_TRANSFORM |
92+
PSO_FLAG_ALL_USER_DEFINED;
93+
Flags &= ShadowPassFlags;
94+
DebugView = DebugViewType::None;
95+
}
96+
else if (Type == RenderPassType::BuildTransmittance)
97+
{
98+
static constexpr PSO_FLAGS BuildTransmittanceFlags =
99+
PSO_FLAG_USE_COLOR_MAP |
100+
PSO_FLAG_USE_TEXCOORD0 |
101+
PSO_FLAG_USE_TEXCOORD1 |
102+
PSO_FLAG_USE_JOINTS |
103+
PSO_FLAG_USE_TEXTURE_ATLAS |
104+
PSO_FLAG_ENABLE_TEXCOORD_TRANSFORM;
105+
Flags &= BuildTransmittanceFlags;
106+
107+
AlphaMode = ALPHA_MODE_OPAQUE;
108+
LoadingAnimation = LoadingAnimationMode::None;
109+
DebugView = DebugViewType::None;
110+
}
111+
80112
if (Flags & PSO_FLAG_UNSHADED)
81113
{
82114
AlphaMode = ALPHA_MODE_OPAQUE;
@@ -1748,6 +1780,7 @@ void PBR_Renderer::CreatePSO(PsoHashMapType& PsoHashMap,
17481780
(m_Settings.PackMatrixRowMajor ? SHADER_COMPILE_FLAG_PACK_MATRIX_ROW_MAJOR : SHADER_COMPILE_FLAG_NONE);
17491781

17501782
RefCntAutoPtr<IShader>& pVS = m_VertexShaders[{
1783+
RenderPassType::Main, // Vertex shaders are the same for all render passes
17511784
PSOFlags,
17521785
ALPHA_MODE_OPAQUE,
17531786
// Cull mode is irrelevant for the shader, but we need different keys when GL point size is used,

0 commit comments

Comments
 (0)