From b5917fbd16022e4c4d2cf7ef41b21fdea4828c9e Mon Sep 17 00:00:00 2001
From: Dave Parks <davep@lindenlab.com>
Date: Thu, 30 Mar 2023 13:14:23 -0500
Subject: [PATCH] DRTVWR-559 Reduce probe flashing and exposure flickering.

---
 .../shaders/class1/deferred/exposureF.glsl      |  8 +++++---
 indra/newview/llreflectionmapmanager.cpp        | 17 +++++++++++++----
 2 files changed, 18 insertions(+), 7 deletions(-)

diff --git a/indra/newview/app_settings/shaders/class1/deferred/exposureF.glsl b/indra/newview/app_settings/shaders/class1/deferred/exposureF.glsl
index b325f555766..1c1984e8ee9 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/exposureF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/exposureF.glsl
@@ -55,13 +55,13 @@ void main()
 
     vec3 col;
 
-    vec2 nz = noiseVec * step * 0.5;
+    //vec2 nz = noiseVec * step * 0.5;
 
     for (float x = start; x <= end; x += step)
     {
         for (float y = start; y <= end; y += step)
         {
-            vec2 tc = vec2(x,y) + nz;
+            vec2 tc = vec2(x,y); // + nz;
             vec3 c = texture(diffuseRect, tc).rgb + texture(emissiveRect, tc).rgb;
             float L = max(lum(c), 0.25);
 
@@ -84,9 +84,11 @@ void main()
 
     float s = clamp(0.1/L, 0.5, 2.5);
 
+
     float prev = texture(exposureMap, vec2(0.5,0.5)).r;
-    s = mix(prev, s, min(dt*2.0, 0.04));
 
+    s = mix(prev, s, min(dt*2.0*abs(prev-s), 0.04));
+    
     frag_color = vec4(s, s, s, dt);
 }
 
diff --git a/indra/newview/llreflectionmapmanager.cpp b/indra/newview/llreflectionmapmanager.cpp
index 6828078f4fc..e9df67c724f 100644
--- a/indra/newview/llreflectionmapmanager.cpp
+++ b/indra/newview/llreflectionmapmanager.cpp
@@ -181,7 +181,11 @@ void LLReflectionMapManager::update()
 
         LLVector4a d;
 
-        if (probe->mOccluded)
+        if (probe->mComplete)
+        {
+            probe->mFadeIn = llmin((F32) (probe->mFadeIn + gFrameIntervalSeconds), 1.f);
+        }
+        if (probe->mOccluded && probe->mComplete)
         {
             if (oldestOccluded == nullptr)
             {
@@ -300,7 +304,7 @@ void LLReflectionMapManager::getReflectionMaps(std::vector<LLReflectionMap*>& ma
         mProbes[i]->mLastBindTime = gFrameTimeSeconds; // something wants to use this probe, indicate it's been requested
         if (mProbes[i]->mCubeIndex != -1)
         {
-            if (!mProbes[i]->mOccluded)
+            if (!mProbes[i]->mOccluded && mProbes[i]->mComplete)
             {
                 mProbes[i]->mProbeIndex = count;
                 maps[count++] = mProbes[i];
@@ -385,6 +389,7 @@ S32 LLReflectionMapManager::allocateCubeIndex()
             S32 ret = mProbes[i]->mCubeIndex;
             mProbes[i]->mCubeIndex = -1;
             mProbes[i]->mCubeArray = nullptr;
+            mProbes[i]->mComplete = false;
             return ret;
         }
     }
@@ -435,6 +440,7 @@ void LLReflectionMapManager::doProbeUpdate()
         mUpdatingFace = 0;
         if (isRadiancePass())
         {
+            mUpdatingProbe->mComplete = true;
             mUpdatingProbe = nullptr;
             mRadiancePass = false;
         }
@@ -768,7 +774,10 @@ void LLReflectionMapManager::updateUniforms()
         // for sphere probes, origin (xyz) and radius (w) of refmaps in clip space
         LLVector4 refSphere[LL_MAX_REFLECTION_PROBE_COUNT]; 
 
-        // extra parameters (currently only ambiance in .x)
+        // extra parameters 
+        //  x - irradiance scale
+        //  y - radiance scale
+        //  z - fade in
         LLVector4 refParams[LL_MAX_REFLECTION_PROBE_COUNT];
 
         // indices used by probe:
@@ -843,7 +852,7 @@ void LLReflectionMapManager::updateUniforms()
             rpd.refIndex[count][3] = -rpd.refIndex[count][3];
         }
 
-        rpd.refParams[count].set(llmax(minimum_ambiance, refmap->getAmbiance())*ambscale, radscale, 0.f, 0.f);
+        rpd.refParams[count].set(llmax(minimum_ambiance, refmap->getAmbiance())*ambscale, radscale, refmap->mFadeIn, 0.f);
 
         S32 ni = nc; // neighbor ("index") - index into refNeighbor to write indices for current reflection probe's neighbors
         {
-- 
GitLab