@@ -68,8 +68,10 @@ FView::FView(FEngine& engine)
68
68
mFogEntity(engine.getEntityManager().create()),
69
69
mIsStereoSupported(engine.getDriverApi().isStereoSupported()),
70
70
mUniforms(engine.getDriverApi()),
71
- mColorPassDescriptorSet(engine, mUniforms ) {
72
-
71
+ mColorPassDescriptorSet{
72
+ { engine, false , mUniforms },
73
+ { engine, true , mUniforms } }
74
+ {
73
75
DriverApi& driver = engine.getDriverApi ();
74
76
75
77
FDebugRegistry& debugRegistry = engine.getDebugRegistry ();
@@ -125,11 +127,13 @@ FView::FView(FEngine& engine)
125
127
126
128
mDefaultColorGrading = mColorGrading = engine.getDefaultColorGrading ();
127
129
128
- mColorPassDescriptorSet .init (
129
- engine,
130
- mLightUbh ,
131
- mFroxelizer .getRecordBuffer (),
132
- mFroxelizer .getFroxelBuffer ());
130
+ for (auto && colorPassDescriptorSet : mColorPassDescriptorSet ) {
131
+ colorPassDescriptorSet.init (
132
+ engine,
133
+ mLightUbh ,
134
+ mFroxelizer .getRecordBuffer (),
135
+ mFroxelizer .getFroxelBuffer ());
136
+ }
133
137
}
134
138
135
139
FView::~FView () noexcept = default ;
@@ -146,7 +150,9 @@ void FView::terminate(FEngine& engine) {
146
150
147
151
ShadowMapManager::terminate (engine, mShadowMapManager );
148
152
mUniforms .terminate (driver);
149
- mColorPassDescriptorSet .terminate (engine.getDescriptorSetLayoutFactory (), driver);
153
+ for (auto && colorPassDescriptorSet : mColorPassDescriptorSet ) {
154
+ colorPassDescriptorSet.terminate (engine.getDescriptorSetLayoutFactory (), driver);
155
+ }
150
156
mFroxelizer .terminate (driver);
151
157
mCommonRenderableDescriptorSet .terminate (driver);
152
158
@@ -429,7 +435,7 @@ void FView::prepareLighting(FEngine& engine, CameraInfo const& cameraInfo) noexc
429
435
*/
430
436
431
437
const float exposure = Exposure::exposure (cameraInfo.ev100 );
432
- mColorPassDescriptorSet .prepareExposure (cameraInfo.ev100 );
438
+ getColorPassDescriptorSet () .prepareExposure (cameraInfo.ev100 );
433
439
434
440
/*
435
441
* Indirect light (IBL)
@@ -446,15 +452,15 @@ void FView::prepareLighting(FEngine& engine, CameraInfo const& cameraInfo) noexc
446
452
FSkybox const * const skybox = scene->getSkybox ();
447
453
intensity = skybox ? skybox->getIntensity () : FIndirectLight::DEFAULT_INTENSITY;
448
454
}
449
- mColorPassDescriptorSet .prepareAmbientLight (engine, *ibl, intensity, exposure);
455
+ getColorPassDescriptorSet () .prepareAmbientLight (engine, *ibl, intensity, exposure);
450
456
451
457
/*
452
458
* Directional light (always at index 0)
453
459
*/
454
460
455
461
FLightManager::Instance const directionalLight = lightData.elementAt <FScene::LIGHT_INSTANCE>(0 );
456
462
const float3 sceneSpaceDirection = lightData.elementAt <FScene::DIRECTION>(0 ); // guaranteed normalized
457
- mColorPassDescriptorSet .prepareDirectionalLight (engine, exposure, sceneSpaceDirection, directionalLight);
463
+ getColorPassDescriptorSet () .prepareDirectionalLight (engine, exposure, sceneSpaceDirection, directionalLight);
458
464
}
459
465
460
466
CameraInfo FView::computeCameraInfo (FEngine& engine) const noexcept {
@@ -606,7 +612,7 @@ void FView::prepare(FEngine& engine, DriverApi& driver, RootArenaScope& rootAren
606
612
cameraInfo.projection , cameraInfo.zn , cameraInfo.zf )) {
607
613
// TODO: might be more consistent to do this in prepareLighting(), but it's not
608
614
// strictly necessary
609
- mColorPassDescriptorSet .prepareDynamicLights (mFroxelizer );
615
+ getColorPassDescriptorSet () .prepareDynamicLights (mFroxelizer );
610
616
}
611
617
// We need to pass viewMatrix by value here because it extends the scope of this
612
618
// function.
@@ -797,12 +803,13 @@ void FView::prepare(FEngine& engine, DriverApi& driver, RootArenaScope& rootAren
797
803
auto const & tcm = engine.getTransformManager ();
798
804
auto const fogTransform = tcm.getWorldTransformAccurate (tcm.getInstance (mFogEntity ));
799
805
800
- mColorPassDescriptorSet .prepareTime (engine, userTime);
801
- mColorPassDescriptorSet .prepareFog (engine, cameraInfo, fogTransform, mFogOptions ,
806
+ auto & colorPassDescriptorSet = getColorPassDescriptorSet ();
807
+ colorPassDescriptorSet.prepareTime (engine, userTime);
808
+ colorPassDescriptorSet.prepareFog (engine, cameraInfo, fogTransform, mFogOptions ,
802
809
scene->getIndirectLight ());
803
- mColorPassDescriptorSet .prepareTemporalNoise (engine, mTemporalAntiAliasingOptions );
804
- mColorPassDescriptorSet .prepareBlending (needsAlphaChannel);
805
- mColorPassDescriptorSet .prepareMaterialGlobals (mMaterialGlobals );
810
+ colorPassDescriptorSet .prepareTemporalNoise (engine, mTemporalAntiAliasingOptions );
811
+ colorPassDescriptorSet .prepareBlending (needsAlphaChannel);
812
+ colorPassDescriptorSet .prepareMaterialGlobals (mMaterialGlobals );
806
813
}
807
814
808
815
void FView::computeVisibilityMasks (
@@ -863,12 +870,12 @@ void FView::prepareUpscaler(float2 const scale,
863
870
derivativesScale = 0 .5f ;
864
871
}
865
872
}
866
- mColorPassDescriptorSet .prepareLodBias (bias, derivativesScale);
873
+ getColorPassDescriptorSet () .prepareLodBias (bias, derivativesScale);
867
874
}
868
875
869
876
void FView::prepareCamera (FEngine& engine, const CameraInfo& cameraInfo) const noexcept {
870
877
SYSTRACE_CALL ();
871
- mColorPassDescriptorSet .prepareCamera (engine, cameraInfo);
878
+ getColorPassDescriptorSet () .prepareCamera (engine, cameraInfo);
872
879
}
873
880
874
881
void FView::prepareViewport (
@@ -877,23 +884,23 @@ void FView::prepareViewport(
877
884
SYSTRACE_CALL ();
878
885
// TODO: we should pass viewport.{left|bottom} to the backend, so it can offset the
879
886
// scissor properly.
880
- mColorPassDescriptorSet .prepareViewport (physicalViewport, logicalViewport);
887
+ getColorPassDescriptorSet () .prepareViewport (physicalViewport, logicalViewport);
881
888
}
882
889
883
890
void FView::prepareSSAO (Handle <HwTexture> ssao) const noexcept {
884
- mColorPassDescriptorSet .prepareSSAO (ssao, mAmbientOcclusionOptions );
891
+ getColorPassDescriptorSet () .prepareSSAO (ssao, mAmbientOcclusionOptions );
885
892
}
886
893
887
894
void FView::prepareSSR (Handle <HwTexture> ssr,
888
895
bool const disableSSR,
889
896
float const refractionLodOffset,
890
897
ScreenSpaceReflectionsOptions const & ssrOptions) const noexcept {
891
- mColorPassDescriptorSet .prepareSSR (ssr, disableSSR, refractionLodOffset, ssrOptions);
898
+ getColorPassDescriptorSet () .prepareSSR (ssr, disableSSR, refractionLodOffset, ssrOptions);
892
899
}
893
900
894
901
void FView::prepareStructure (Handle <HwTexture> structure) const noexcept {
895
902
// sampler must be NEAREST
896
- mColorPassDescriptorSet .prepareStructure (structure);
903
+ getColorPassDescriptorSet () .prepareStructure (structure);
897
904
}
898
905
899
906
void FView::prepareShadow (Handle <HwTexture> texture) const noexcept {
@@ -905,37 +912,37 @@ void FView::prepareShadow(Handle<HwTexture> texture) const noexcept {
905
912
}
906
913
switch (mShadowType ) {
907
914
case ShadowType::PCF:
908
- mColorPassDescriptorSet .prepareShadowPCF (texture, uniforms);
915
+ getColorPassDescriptorSet () .prepareShadowPCF (texture, uniforms);
909
916
break ;
910
917
case ShadowType::VSM:
911
- mColorPassDescriptorSet .prepareShadowVSM (texture, uniforms, mVsmShadowOptions );
918
+ getColorPassDescriptorSet () .prepareShadowVSM (texture, uniforms, mVsmShadowOptions );
912
919
break ;
913
920
case ShadowType::DPCF:
914
- mColorPassDescriptorSet .prepareShadowDPCF (texture, uniforms, mSoftShadowOptions );
921
+ getColorPassDescriptorSet () .prepareShadowDPCF (texture, uniforms, mSoftShadowOptions );
915
922
break ;
916
923
case ShadowType::PCSS:
917
- mColorPassDescriptorSet .prepareShadowPCSS (texture, uniforms, mSoftShadowOptions );
924
+ getColorPassDescriptorSet () .prepareShadowPCSS (texture, uniforms, mSoftShadowOptions );
918
925
break ;
919
926
case ShadowType::PCFd:
920
- mColorPassDescriptorSet .prepareShadowPCFDebug (texture, uniforms);
927
+ getColorPassDescriptorSet () .prepareShadowPCFDebug (texture, uniforms);
921
928
break ;
922
929
}
923
930
}
924
931
925
932
void FView::prepareShadowMapping (bool const highPrecision) const noexcept {
926
933
if (mHasShadowing ) {
927
934
assert_invariant (mShadowMapManager );
928
- mColorPassDescriptorSet .prepareShadowMapping (
935
+ getColorPassDescriptorSet () .prepareShadowMapping (
929
936
mShadowMapManager ->getShadowUniformsHandle (), highPrecision);
930
937
}
931
938
}
932
939
933
940
void FView::commitUniformsAndSamplers (DriverApi& driver) const noexcept {
934
- mColorPassDescriptorSet .commit (driver);
941
+ getColorPassDescriptorSet () .commit (driver);
935
942
}
936
943
937
944
void FView::unbindSamplers (DriverApi& driver) noexcept {
938
- mColorPassDescriptorSet .unbindSamplers (driver);
945
+ getColorPassDescriptorSet () .unbindSamplers (driver);
939
946
}
940
947
941
948
void FView::commitFroxels (DriverApi& driverApi) const noexcept {
0 commit comments