From 65d69ce80dca112ea0bfd06f2749d4d6fcb366b4 Mon Sep 17 00:00:00 2001
From: Dave Parks <davep@lindenlab.com>
Date: Wed, 22 Feb 2023 11:01:18 -0600
Subject: [PATCH] DRTVWR-559 Fix for stall in probe occlusion culling and fix
 for culled neighbors getting sampled (badly).

---
 indra/newview/llreflectionmap.cpp        | 18 +++++++++++++++---
 indra/newview/llreflectionmap.h          |  2 ++
 indra/newview/llreflectionmapmanager.cpp |  2 +-
 3 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/indra/newview/llreflectionmap.cpp b/indra/newview/llreflectionmap.cpp
index fb934da02ed..37ad74e54dd 100644
--- a/indra/newview/llreflectionmap.cpp
+++ b/indra/newview/llreflectionmap.cpp
@@ -41,6 +41,14 @@ LLReflectionMap::LLReflectionMap()
 {
 }
 
+LLReflectionMap::~LLReflectionMap()
+{
+    if (mOcclusionQuery)
+    {
+        glDeleteQueries(1, &mOcclusionQuery);
+    }
+}
+
 void LLReflectionMap::update(U32 resolution, U32 face)
 {
     LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY;
@@ -276,18 +284,21 @@ void LLReflectionMap::doOcclusion(const LLVector4a& eye)
     
     if (mOcclusionQuery == 0)
     { // no query was previously issued, allocate one and issue
+        LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("rmdo - glGenQueries");
         glGenQueries(1, &mOcclusionQuery);
         do_query = true;
     }
     else
     { // query was previously issued, check it and only issue a new query
         // if previous query is available
-        GLuint result = (GLuint) 0xFFFFFFFF;
-        glGetQueryObjectuiv(mOcclusionQuery, GL_QUERY_RESULT_NO_WAIT, &result);
+        LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("rmdo - glGetQueryObject");
+        GLuint result = 0;
+        glGetQueryObjectuiv(mOcclusionQuery, GL_QUERY_RESULT_AVAILABLE, &result);
 
-        if (result != (GLuint) 0xFFFFFFFF)
+        if (result > 0)
         {
             do_query = true;
+            glGetQueryObjectuiv(mOcclusionQuery, GL_QUERY_RESULT, &result);
             mOccluded = result == 0;
             mOcclusionPendingFrames = 0;
         }
@@ -299,6 +310,7 @@ void LLReflectionMap::doOcclusion(const LLVector4a& eye)
 
     if (do_query)
     {
+        LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("rmdo - push query");
         glBeginQuery(GL_ANY_SAMPLES_PASSED, mOcclusionQuery);
 
         LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
diff --git a/indra/newview/llreflectionmap.h b/indra/newview/llreflectionmap.h
index 0405d06eb50..6eff607ea5f 100644
--- a/indra/newview/llreflectionmap.h
+++ b/indra/newview/llreflectionmap.h
@@ -39,6 +39,8 @@ class alignas(16) LLReflectionMap : public LLRefCount
     // allocate an environment map of the given resolution 
     LLReflectionMap();
 
+    ~LLReflectionMap();
+
     // update this environment map
     // resolution - size of cube map to generate
     void update(U32 resolution, U32 face);
diff --git a/indra/newview/llreflectionmapmanager.cpp b/indra/newview/llreflectionmapmanager.cpp
index bfc8b595c2c..608585acf51 100644
--- a/indra/newview/llreflectionmapmanager.cpp
+++ b/indra/newview/llreflectionmapmanager.cpp
@@ -862,7 +862,7 @@ void LLReflectionMapManager::updateUniforms()
                 }
 
                 GLint idx = neighbor->mProbeIndex;
-                if (idx == -1)
+                if (idx == -1 || neighbor->mOccluded)
                 {
                     continue;
                 }
-- 
GitLab