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
693693void 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
0 commit comments