Skip to content

Commit 16066e2

Browse files
PBR renderer: switch cubemap precompute PSOs to inline constants
1 parent e8f8795 commit 16066e2

5 files changed

Lines changed: 59 additions & 58 deletions

File tree

PBR/interface/PBR_Renderer.hpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2019-2025 Diligent Graphics LLC
2+
* Copyright 2019-2026 Diligent Graphics LLC
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -491,7 +491,7 @@ class PBR_Renderer
491491
/// \remarks If NumDiffuseSamples or NumSpecularSamples is 0,
492492
/// the renderer will choose the optimal number of samples.
493493
void PrecomputeCubemaps(IDeviceContext* pCtx,
494-
ITextureView* pEnvironmentMap,
494+
ITextureView* pEnvMapSRV,
495495
Uint32 NumDiffuseSamples = 0,
496496
Uint32 NumSpecularSamples = 0,
497497
bool OptimizeSamples = true);
@@ -932,7 +932,6 @@ class PBR_Renderer
932932

933933
RefCntAutoPtr<IBuffer> m_PBRPrimitiveAttribsCB;
934934
RefCntAutoPtr<IBuffer> m_PBRMaterialAttribsCB;
935-
RefCntAutoPtr<IBuffer> m_PrecomputeEnvMapAttribsCB;
936935
RefCntAutoPtr<IBuffer> m_JointsBuffer;
937936

938937
std::unordered_set<std::string> m_GeneratedIncludes;

PBR/src/PBR_Renderer.cpp

Lines changed: 36 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2019-2025 Diligent Graphics LLC
2+
* Copyright 2019-2026 Diligent Graphics LLC
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -691,7 +691,7 @@ static Uint32 GetDefaultDiffuseSamplesCount(const GraphicsAdapterInfo& AdapterIn
691691
}
692692

693693
void PBR_Renderer::PrecomputeCubemaps(IDeviceContext* pCtx,
694-
ITextureView* pEnvironmentMap,
694+
ITextureView* pEnvMapSRV,
695695
Uint32 NumDiffuseSamples,
696696
Uint32 NumSpecularSamples,
697697
bool OptimizeSamples)
@@ -721,22 +721,27 @@ void PBR_Renderer::PrecomputeCubemaps(IDeviceContext* pCtx,
721721
float EnvMapMipCount;
722722

723723
uint NumSamples;
724-
uint Padding0;
725-
uint Padding1;
726-
uint Padding2;
724+
uint Padding0 = 0;
725+
uint Padding1 = 0;
726+
uint Padding2 = 0;
727+
728+
PrecomputeEnvMapAttribs(const TextureDesc& EnvMapDesc, const float4x4& _Rotation, uint _NumSamples) :
729+
Rotation{_Rotation},
730+
Roughness{0.0f},
731+
EnvMapWidth{static_cast<float>(EnvMapDesc.Width)},
732+
EnvMapHeight{static_cast<float>(EnvMapDesc.Height)},
733+
EnvMapMipCount{static_cast<float>(EnvMapDesc.MipLevels)},
734+
NumSamples{_NumSamples}
735+
{}
727736
};
728737

729-
if (!m_PrecomputeEnvMapAttribsCB)
730-
{
731-
CreateUniformBuffer(m_Device, sizeof(PrecomputeEnvMapAttribs), "Precompute env map attribs CB", &m_PrecomputeEnvMapAttribsCB);
732-
}
733-
734738
IBL_FEATURE_FLAGS FeatureFlags = IBL_FEATURE_FLAG_NONE;
735739

736740
if (OptimizeSamples)
737741
FeatureFlags |= IBL_FEATURE_FLAG_OPTIMIZE_SAMPLES;
738742

739-
const IBL_PSOKey::ENV_MAP_TYPE EnvMapType = pEnvironmentMap->GetTexture()->GetDesc().IsCube() ?
743+
const TextureDesc& EnvMapDesc = pEnvMapSRV->GetTexture()->GetDesc();
744+
const IBL_PSOKey::ENV_MAP_TYPE EnvMapType = EnvMapDesc.IsCube() ?
740745
IBL_PSOKey::ENV_MAP_TYPE_CUBE :
741746
IBL_PSOKey::ENV_MAP_TYPE_SPHERE;
742747

@@ -794,14 +799,12 @@ void PBR_Renderer::PrecomputeCubemaps(IDeviceContext* pCtx,
794799

795800
PipelineResourceLayoutDescX ResourceLayout;
796801
ResourceLayout
797-
.SetDefaultVariableType(SHADER_RESOURCE_VARIABLE_TYPE_STATIC)
802+
.AddVariable(SHADER_TYPE_VS_PS, "cbConstants", SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE, SHADER_VARIABLE_FLAG_INLINE_CONSTANTS)
798803
.AddVariable(SHADER_TYPE_PIXEL, "g_EnvironmentMap", SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC)
799804
.AddImmutableSampler(SHADER_TYPE_PIXEL, "g_EnvironmentMap", Sam_LinearClamp);
800805
PSODesc.ResourceLayout = ResourceLayout;
801806

802807
PrecomputeIrradianceCubeTech.PSO = m_Device.CreateGraphicsPipelineState(PSOCreateInfo);
803-
PrecomputeIrradianceCubeTech.PSO->GetStaticVariableByName(SHADER_TYPE_VERTEX, "cbTransform")->Set(m_PrecomputeEnvMapAttribsCB);
804-
PrecomputeIrradianceCubeTech.PSO->GetStaticVariableByName(SHADER_TYPE_PIXEL, "FilterAttribs")->Set(m_PrecomputeEnvMapAttribsCB);
805808
PrecomputeIrradianceCubeTech.PSO->CreateShaderResourceBinding(&PrecomputeIrradianceCubeTech.SRB, true);
806809
}
807810

@@ -851,14 +854,12 @@ void PBR_Renderer::PrecomputeCubemaps(IDeviceContext* pCtx,
851854

852855
PipelineResourceLayoutDescX ResourceLayout;
853856
ResourceLayout
854-
.SetDefaultVariableType(SHADER_RESOURCE_VARIABLE_TYPE_STATIC)
857+
.AddVariable(SHADER_TYPE_VS_PS, "cbConstants", SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE, SHADER_VARIABLE_FLAG_INLINE_CONSTANTS)
855858
.AddVariable(SHADER_TYPE_PIXEL, "g_EnvironmentMap", SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC)
856859
.AddImmutableSampler(SHADER_TYPE_PIXEL, "g_EnvironmentMap", Sam_LinearClamp);
857860
PSODesc.ResourceLayout = ResourceLayout;
858861

859862
PrefilterEnvMapTech.PSO = m_Device.CreateGraphicsPipelineState(PSOCreateInfo);
860-
PrefilterEnvMapTech.PSO->GetStaticVariableByName(SHADER_TYPE_VERTEX, "cbTransform")->Set(m_PrecomputeEnvMapAttribsCB);
861-
PrefilterEnvMapTech.PSO->GetStaticVariableByName(SHADER_TYPE_PIXEL, "FilterAttribs")->Set(m_PrecomputeEnvMapAttribsCB);
862863
PrefilterEnvMapTech.PSO->CreateShaderResourceBinding(&PrefilterEnvMapTech.SRB, true);
863864
}
864865

@@ -875,46 +876,37 @@ void PBR_Renderer::PrecomputeCubemaps(IDeviceContext* pCtx,
875876
// clang-format on
876877

877878
pCtx->SetPipelineState(PrecomputeIrradianceCubeTech.PSO);
878-
ShaderResourceVariableX{PrecomputeIrradianceCubeTech.SRB, SHADER_TYPE_PIXEL, "g_EnvironmentMap"}.Set(pEnvironmentMap);
879+
ShaderResourceVariableX{PrecomputeIrradianceCubeTech.SRB, SHADER_TYPE_PIXEL, "g_EnvironmentMap"}.Set(pEnvMapSRV);
879880
pCtx->CommitShaderResources(PrecomputeIrradianceCubeTech.SRB, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
880-
ITexture* pIrradianceCube = m_pIrradianceCubeSRV->GetTexture();
881+
ITexture* pIrradianceCube = m_pIrradianceCubeSRV->GetTexture();
882+
ShaderResourceVariableX cbConstantsVar{PrecomputeIrradianceCubeTech.SRB, SHADER_TYPE_VERTEX, "cbConstants"};
883+
VERIFY_EXPR(cbConstantsVar);
881884
ProcessCubemapFaces(pCtx, pIrradianceCube, [&](ITextureView* pRTV, Uint32 mip, Uint32 face) {
882885
VERIFY_EXPR(mip == 0);
883-
{
884-
if (MapHelper<PrecomputeEnvMapAttribs> Attribs{pCtx, m_PrecomputeEnvMapAttribsCB, MAP_WRITE, MAP_FLAG_DISCARD})
885-
{
886-
Attribs->Rotation = Matrices[face];
887-
Attribs->EnvMapWidth = static_cast<float>(pEnvironmentMap->GetTexture()->GetDesc().Width);
888-
Attribs->EnvMapHeight = static_cast<float>(pEnvironmentMap->GetTexture()->GetDesc().Height);
889-
Attribs->EnvMapMipCount = static_cast<float>(pEnvironmentMap->GetTexture()->GetDesc().MipLevels);
890-
Attribs->NumSamples = NumDiffuseSamples;
891-
}
892-
}
893-
DrawAttribs drawAttrs(4, DRAW_FLAG_VERIFY_ALL);
886+
PrecomputeEnvMapAttribs Attribs{EnvMapDesc, Matrices[face], NumDiffuseSamples};
887+
cbConstantsVar.SetInlineConstants(&Attribs, 0, (sizeof(Attribs)) / sizeof(Uint32));
888+
889+
DrawAttribs drawAttrs{4, DRAW_FLAG_VERIFY_ALL};
894890
pCtx->Draw(drawAttrs);
895891
});
896892
// Release reference to the environment map
897893
ShaderResourceVariableX{PrecomputeIrradianceCubeTech.SRB, SHADER_TYPE_PIXEL, "g_EnvironmentMap"}.Set(nullptr);
898894

899895

900896
pCtx->SetPipelineState(PrefilterEnvMapTech.PSO);
901-
ShaderResourceVariableX{PrefilterEnvMapTech.SRB, SHADER_TYPE_PIXEL, "g_EnvironmentMap"}.Set(pEnvironmentMap);
897+
ShaderResourceVariableX{PrefilterEnvMapTech.SRB, SHADER_TYPE_PIXEL, "g_EnvironmentMap"}.Set(pEnvMapSRV);
902898
pCtx->CommitShaderResources(PrefilterEnvMapTech.SRB, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
903-
ITexture* pPrefilteredEnvMap = m_pPrefilteredEnvMapSRV->GetTexture();
899+
ITexture* pPrefilteredEnvMap = m_pPrefilteredEnvMapSRV->GetTexture();
900+
const Uint32 PrefilteredEnvMapMipLevels = pPrefilteredEnvMap->GetDesc().MipLevels;
901+
902+
cbConstantsVar = ShaderResourceVariableX{PrefilterEnvMapTech.SRB, SHADER_TYPE_VERTEX, "cbConstants"};
903+
VERIFY_EXPR(cbConstantsVar);
904904
ProcessCubemapFaces(pCtx, pPrefilteredEnvMap, [&](ITextureView* pRTV, Uint32 mip, Uint32 face) {
905-
{
906-
if (MapHelper<PrecomputeEnvMapAttribs> Attribs{pCtx, m_PrecomputeEnvMapAttribsCB, MAP_WRITE, MAP_FLAG_DISCARD})
907-
{
908-
Attribs->Rotation = Matrices[face];
909-
Attribs->Roughness = static_cast<float>(mip) / static_cast<float>(pPrefilteredEnvMap->GetDesc().MipLevels - 1);
910-
Attribs->EnvMapWidth = static_cast<float>(pEnvironmentMap->GetTexture()->GetDesc().Width);
911-
Attribs->EnvMapHeight = static_cast<float>(pEnvironmentMap->GetTexture()->GetDesc().Height);
912-
Attribs->EnvMapMipCount = static_cast<float>(pEnvironmentMap->GetTexture()->GetDesc().MipLevels);
913-
Attribs->NumSamples = NumSpecularSamples;
914-
}
915-
}
905+
PrecomputeEnvMapAttribs Attribs{EnvMapDesc, Matrices[face], NumSpecularSamples};
906+
Attribs.Roughness = static_cast<float>(mip) / static_cast<float>(PrefilteredEnvMapMipLevels - 1);
907+
cbConstantsVar.SetInlineConstants(&Attribs, 0, (sizeof(Attribs)) / sizeof(Uint32));
916908

917-
DrawAttribs drawAttrs(4, DRAW_FLAG_VERIFY_ALL);
909+
DrawAttribs drawAttrs{4, DRAW_FLAG_VERIFY_ALL};
918910
pCtx->Draw(drawAttrs);
919911
});
920912

Shaders/PBR/private/ComputeIrradianceMap.psh

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,19 @@ Texture2D g_EnvironmentMap;
1616

1717
SamplerState g_EnvironmentMap_sampler;
1818

19-
cbuffer FilterAttribs
19+
cbuffer cbConstants
2020
{
21-
float4x4 g_RotationUnused;
21+
float4x4 g_Rotation;
2222

2323
float g_Roughness;
2424
float g_EnvMapWidth;
2525
float g_EnvMapHeight;
2626
float g_EnvMipCount;
2727

2828
uint g_NumSamples;
29-
uint _Padding0;
30-
uint _Padding1;
31-
uint _Padding2;
29+
uint g_Padding0;
30+
uint g_Padding1;
31+
uint g_Padding2;
3232
}
3333

3434
float3 SampleEnvrionmentMap(float3 R, float MipLevel)

Shaders/PBR/private/CubemapFace.vsh

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,16 @@
1-
cbuffer cbTransform
1+
cbuffer cbConstants
22
{
33
float4x4 g_Rotation;
4+
5+
float g_Roughness;
6+
float g_EnvMapWidth;
7+
float g_EnvMapHeight;
8+
float g_EnvMipCount;
9+
10+
uint g_NumSamples;
11+
uint g_Padding0;
12+
uint g_Padding1;
13+
uint g_Padding2;
414
}
515

616
void main(in uint VertexId : SV_VertexID,

Shaders/PBR/private/PrefilterEnvMap.psh

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,19 @@ Texture2D g_EnvironmentMap;
1212
#endif
1313
SamplerState g_EnvironmentMap_sampler;
1414

15-
cbuffer FilterAttribs
15+
cbuffer cbConstants
1616
{
17-
float4x4 g_RotationUnused;
17+
float4x4 g_Rotation;
1818

1919
float g_Roughness;
2020
float g_EnvMapWidth;
2121
float g_EnvMapHeight;
2222
float g_EnvMipCount;
2323

2424
uint g_NumSamples;
25-
uint _Padding0;
26-
uint _Padding1;
27-
uint _Padding2;
25+
uint g_Padding0;
26+
uint g_Padding1;
27+
uint g_Padding2;
2828
}
2929

3030
float3 SampleEnvrionmentMap(float3 R, float MipLevel)

0 commit comments

Comments
 (0)