From 4ec8844f012f27ddd0ab9aa6a3098273c7bb0ac1 Mon Sep 17 00:00:00 2001
From: Dave Parks <davep@lindenlab.com>
Date: Mon, 27 Feb 2023 10:42:53 -0600
Subject: [PATCH] DRTVWR-559 Fix for occlusion culling going off the rails when
 settings change -- remove LLPipeline::resetVertexBuffers and add a sanity
 check to how long we wait for a query to be "available".

---
 indra/newview/llagent.cpp            |  3 -
 indra/newview/llspatialpartition.cpp |  2 +
 indra/newview/llviewercontrol.cpp    | 34 +----------
 indra/newview/llviewerdisplay.cpp    |  7 ---
 indra/newview/llviewermenu.cpp       |  3 -
 indra/newview/llviewermessage.cpp    |  2 -
 indra/newview/llvieweroctree.cpp     | 19 ++-----
 indra/newview/llvieweroctree.h       |  1 +
 indra/newview/llviewershadermgr.cpp  |  3 -
 indra/newview/pipeline.cpp           | 84 ----------------------------
 indra/newview/pipeline.h             |  4 +-
 11 files changed, 10 insertions(+), 152 deletions(-)

diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index af4c68e41f0..6113c30a84f 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -3960,8 +3960,6 @@ bool LLAgent::teleportCore(bool is_local)
 		LL_INFOS("Teleport") << "Non-local, setting teleport state to TELEPORT_START" << LL_ENDL;
 		gAgent.setTeleportState( LLAgent::TELEPORT_START );
 
-		//release geometry from old location
-		gPipeline.resetVertexBuffers();
 		LLSpatialPartition::sTeleportRequested = TRUE;
 	}
 	make_ui_sound("UISndTeleportOut");
@@ -4305,7 +4303,6 @@ void LLAgent::teleportCancel()
 	}
 	clearTeleportRequest();
 	gAgent.setTeleportState( LLAgent::TELEPORT_NONE );
-	gPipeline.resetVertexBuffers(); 
 }
 
 void LLAgent::restoreCanceledTeleportRequest()
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index 764131ab791..35e11b89918 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -3234,6 +3234,7 @@ class LLOctreeRenderNonOccluded : public OctreeTraveler
 				renderAgentTarget(avatar);
 			}
 			
+#if 0
 			if (gDebugGL)
 			{
 				for (U32 i = 0; i < drawable->getNumFaces(); ++i)
@@ -3259,6 +3260,7 @@ class LLOctreeRenderNonOccluded : public OctreeTraveler
 					}
 				}
 			}
+#endif
 		}
 		
 		for (LLSpatialGroup::draw_map_t::iterator i = group->mDrawMap.begin(); i != group->mDrawMap.end(); ++i)
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index ea53012b7a8..59b566efb6d 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -149,14 +149,7 @@ static bool handleSetShaderChanged(const LLSD& newvalue)
     if (gPipeline.isInit())
     {
         // ALM depends onto atmospheric shaders, state might have changed
-        bool old_state = LLPipeline::sRenderDeferred;
         LLPipeline::refreshCachedSettings();
-        if (old_state != LLPipeline::sRenderDeferred)
-        {
-            gPipeline.releaseGLBuffers();
-            gPipeline.createGLBuffers();
-            gPipeline.resetVertexBuffers();
-        }
     }
 
 	// else, leave terrain detail as is
@@ -206,7 +199,6 @@ bool handleRenderTransparentWaterChanged(const LLSD& newvalue)
 		gPipeline.updateRenderTransparentWater();
 		gPipeline.releaseGLBuffers();
 		gPipeline.createGLBuffers();
-		gPipeline.resetVertexBuffers();
 		LLViewerShaderMgr::instance()->setShaders();
 	}
 	LLWorld::getInstance()->updateWaterObjects();
@@ -397,15 +389,6 @@ static bool handleWLSkyDetailChanged(const LLSD&)
 	return true;
 }
 
-static bool handleResetVertexBuffersChanged(const LLSD&)
-{
-	if (gPipeline.isInit())
-	{
-		gPipeline.resetVertexBuffers();
-	}
-	return true;
-}
-
 static bool handleRepartition(const LLSD&)
 {
 	if (gPipeline.isInit())
@@ -436,7 +419,6 @@ static bool handleReflectionProbeDetailChanged(const LLSD& newvalue)
         LLPipeline::refreshCachedSettings();
         gPipeline.releaseGLBuffers();
         gPipeline.createGLBuffers();
-        gPipeline.resetVertexBuffers();
         LLViewerShaderMgr::instance()->setShaders();
     }
     return true;
@@ -654,7 +636,6 @@ void settings_setup_listeners()
 	setting_setup_signal_listener(gSavedSettings, "RenderGlow", handleReleaseGLBufferChanged);
 	setting_setup_signal_listener(gSavedSettings, "RenderGlow", handleSetShaderChanged);
 	setting_setup_signal_listener(gSavedSettings, "RenderGlowResolutionPow", handleReleaseGLBufferChanged);
-	// DEPRECATED -- setting_setup_signal_listener(gSavedSettings, "WindLightUseAtmosShaders", handleSetShaderChanged);
 	setting_setup_signal_listener(gSavedSettings, "RenderGammaFull", handleSetShaderChanged);
 	setting_setup_signal_listener(gSavedSettings, "RenderVolumeLODFactor", handleVolumeLODChanged);
 	setting_setup_signal_listener(gSavedSettings, "RenderAvatarLODFactor", handleAvatarLODChanged);
@@ -667,17 +648,11 @@ void settings_setup_listeners()
 	setting_setup_signal_listener(gSavedSettings, "RenderMaxPartCount", handleMaxPartCountChanged);
 	setting_setup_signal_listener(gSavedSettings, "RenderDynamicLOD", handleRenderDynamicLODChanged);
 	setting_setup_signal_listener(gSavedSettings, "RenderLocalLights", handleRenderLocalLightsChanged);
-	setting_setup_signal_listener(gSavedSettings, "RenderDebugTextureBind", handleResetVertexBuffersChanged);
-	setting_setup_signal_listener(gSavedSettings, "RenderAutoMaskAlphaDeferred", handleResetVertexBuffersChanged);
-	setting_setup_signal_listener(gSavedSettings, "RenderAutoMaskAlphaNonDeferred", handleResetVertexBuffersChanged);
-	// DEPRECATED - setting_setup_signal_listener(gSavedSettings, "RenderObjectBump", handleRenderBumpChanged);
-	setting_setup_signal_listener(gSavedSettings, "RenderMaxVBOSize", handleResetVertexBuffersChanged);
-    setting_setup_signal_listener(gSavedSettings, "RenderVSyncEnable", handleVSyncChanged);
+	setting_setup_signal_listener(gSavedSettings, "RenderVSyncEnable", handleVSyncChanged);
 	setting_setup_signal_listener(gSavedSettings, "RenderDeferredNoise", handleReleaseGLBufferChanged);
 	setting_setup_signal_listener(gSavedSettings, "RenderDebugPipeline", handleRenderDebugPipelineChanged);
 	setting_setup_signal_listener(gSavedSettings, "RenderResolutionDivisor", handleRenderResolutionDivisorChanged);
-	// DEPRECATED - setting_setup_signal_listener(gSavedSettings, "RenderDeferred", handleRenderDeferredChanged);
-    setting_setup_signal_listener(gSavedSettings, "RenderReflectionProbeDetail", handleReflectionProbeDetailChanged);
+	setting_setup_signal_listener(gSavedSettings, "RenderReflectionProbeDetail", handleReflectionProbeDetailChanged);
     setting_setup_signal_listener(gSavedSettings, "RenderReflectionsEnabled", handleReflectionProbeDetailChanged);
     setting_setup_signal_listener(gSavedSettings, "RenderScreenSpaceReflections", handleReflectionProbeDetailChanged);
 	setting_setup_signal_listener(gSavedSettings, "RenderShadowDetail", handleSetShaderChanged);
@@ -705,11 +680,6 @@ void settings_setup_listeners()
 	setting_setup_signal_listener(gSavedSettings, "MuteVoice", handleAudioVolumeChanged);
 	setting_setup_signal_listener(gSavedSettings, "MuteAmbient", handleAudioVolumeChanged);
 	setting_setup_signal_listener(gSavedSettings, "MuteUI", handleAudioVolumeChanged);
-	setting_setup_signal_listener(gSavedSettings, "RenderVBOEnable", handleResetVertexBuffersChanged);
-	setting_setup_signal_listener(gSavedSettings, "RenderUseVAO", handleResetVertexBuffersChanged);
-	setting_setup_signal_listener(gSavedSettings, "RenderVBOMappingDisable", handleResetVertexBuffersChanged);
-	setting_setup_signal_listener(gSavedSettings, "RenderUseStreamVBO", handleResetVertexBuffersChanged);
-	setting_setup_signal_listener(gSavedSettings, "RenderPreferStreamDraw", handleResetVertexBuffersChanged);
 	setting_setup_signal_listener(gSavedSettings, "WLSkyDetail", handleWLSkyDetailChanged);
 	setting_setup_signal_listener(gSavedSettings, "JoystickAxis0", handleJoystickChanged);
 	setting_setup_signal_listener(gSavedSettings, "JoystickAxis1", handleJoystickChanged);
diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp
index 62144b2d31b..59333b6ceea 100644
--- a/indra/newview/llviewerdisplay.cpp
+++ b/indra/newview/llviewerdisplay.cpp
@@ -279,14 +279,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
 
 	LLGLState::checkStates();
 	
-	stop_glerror();
-
 	gPipeline.disableLights();
-	
-	//reset vertex buffers if needed
-	gPipeline.doResetVertexBuffers();
-
-	stop_glerror();
 
 	// Don't draw if the window is hidden or minimized.
 	// In fact, must explicitly check the minimized state before drawing.
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 5a3f2f22b87..3a8206ad262 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -8540,7 +8540,6 @@ BOOL get_visibility(void* user_data)
 	return viewp->getVisible();
 }
 
-// TomY TODO: Get rid of these?
 class LLViewShowHoverTips : public view_listener_t
 {
 	bool handleEvent(const LLSD& userdata)
@@ -8559,13 +8558,11 @@ class LLViewCheckShowHoverTips : public view_listener_t
 	}
 };
 
-// TomY TODO: Get rid of these?
 class LLViewHighlightTransparent : public view_listener_t
 {
 	bool handleEvent(const LLSD& userdata)
 	{
 		LLDrawPoolAlpha::sShowDebugAlpha = !LLDrawPoolAlpha::sShowDebugAlpha;
-        gPipeline.resetVertexBuffers();
 		return true;
 	}
 };
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index e96047df143..4ecb54aa0fe 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -2938,8 +2938,6 @@ void process_teleport_finish(LLMessageSystem* msg, void**)
 	// Teleport is finished; it can't be cancelled now.
 	gViewerWindow->setProgressCancelButtonVisible(FALSE);
 
-	gPipeline.doResetVertexBuffers(true);
-
 	// Do teleport effect for where you're leaving
 	// VEFFECT: TeleportStart
 	LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINT, TRUE);
diff --git a/indra/newview/llvieweroctree.cpp b/indra/newview/llvieweroctree.cpp
index 7d6c18ae67e..d1d23cfb8e4 100644
--- a/indra/newview/llvieweroctree.cpp
+++ b/indra/newview/llvieweroctree.cpp
@@ -870,6 +870,7 @@ LLOcclusionCullingGroup::LLOcclusionCullingGroup(OctreeNode* node, LLViewerOctre
 	for (U32 i = 0; i < LLViewerCamera::NUM_CAMERAS; i++)
 	{
 		mOcclusionQuery[i] = 0;
+        mOcclusionCheckCount[i] = 0;
 		mOcclusionIssued[i] = 0;
 		mOcclusionState[i] = parent ? SG_STATE_INHERIT_MASK & parent->mOcclusionState[i] : 0;
 		mVisible[i] = 0;
@@ -1127,10 +1128,12 @@ void LLOcclusionCullingGroup::checkOcclusion()
             {
                 LL_PROFILE_ZONE_NAMED_CATEGORY_OCTREE("co - query available");
                 glGetQueryObjectuiv(mOcclusionQuery[LLViewerCamera::sCurCameraID], GL_QUERY_RESULT_AVAILABLE, &available);
+                mOcclusionCheckCount[LLViewerCamera::sCurCameraID]++;
             }
 
-            if (available)
+            if (available || mOcclusionCheckCount[LLViewerCamera::sCurCameraID] > 4)
             {   
+                mOcclusionCheckCount[LLViewerCamera::sCurCameraID] = 0;
                 GLuint query_result;    // Will be # samples drawn, or a boolean depending on mHasOcclusionQuery2 (both are type GLuint)
                 {
                     LL_PROFILE_ZONE_NAMED_CATEGORY_OCTREE("co - query result");
@@ -1140,20 +1143,6 @@ void LLOcclusionCullingGroup::checkOcclusion()
                 sPendingQueries.erase(mOcclusionQuery[LLViewerCamera::sCurCameraID]);
 #endif
 
-#if 0   // (12/2021) occasional false-negative occlusion tests produce water reflection errors, SL-16461
-        // If/when water occlusion queries become 100% reliable, re-enable this optimization
-
-                if (LLPipeline::RENDER_TYPE_WATER == mSpatialPartition->mDrawableType)
-                {
-                    // Note any unoccluded water, for deciding on reflection/distortion passes
-                    // (If occlusion is disabled, these are set within LLDrawPoolWater::render)
-                    if (query_result > 0)
-                    {
-                        LLDrawPoolWater::sNeedsReflectionUpdate = TRUE;
-                        LLDrawPoolWater::sNeedsDistortionUpdate = TRUE;
-                    }
-                }
-#endif
                 if (query_result > 0)
                 {
                     clearOcclusionState(LLOcclusionCullingGroup::OCCLUDED, LLOcclusionCullingGroup::STATE_MODE_DIFF);
diff --git a/indra/newview/llvieweroctree.h b/indra/newview/llvieweroctree.h
index 7666062f990..353429d2542 100644
--- a/indra/newview/llvieweroctree.h
+++ b/indra/newview/llvieweroctree.h
@@ -336,6 +336,7 @@ class LLOcclusionCullingGroup : public LLViewerOctreeGroup
 
 	LLViewerOctreePartition* mSpatialPartition;
 	U32		                 mOcclusionQuery[LLViewerCamera::NUM_CAMERAS];
+    U32                      mOcclusionCheckCount[LLViewerCamera::NUM_CAMERAS];
 
 public:		
 	static std::set<U32> sPendingQueries;
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index 859df1277c5..f4f20ee7a64 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -378,9 +378,6 @@ void LLViewerShaderMgr::setShaders()
 
     LLPipeline::sRenderGlow = gSavedSettings.getBOOL("RenderGlow"); 
     
-    //hack to reset buffers that change behavior with shaders
-    gPipeline.resetVertexBuffers();
-
     if (gViewerWindow)
     {
         gViewerWindow->setCursor(UI_CURSOR_WAIT);
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 9522f804d6d..b5b5d9ef7fa 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -681,8 +681,6 @@ void LLPipeline::destroyGL()
 	
 	resetDrawOrders();
 
-	resetVertexBuffers();
-
 	releaseGLBuffers();
 
 	if (mMeshDirtyQueryObject)
@@ -6753,88 +6751,6 @@ void LLPipeline::resetVertexBuffers(LLDrawable* drawable)
 	}
 }
 
-void LLPipeline::resetVertexBuffers()
-{	
-	mResetVertexBuffers = true;
-}
-
-void LLPipeline::doResetVertexBuffers(bool forced)
-{
-	if (!mResetVertexBuffers)
-	{
-		return;
-	}
-	if(!forced && LLSpatialPartition::sTeleportRequested)
-	{
-		if(gAgent.getTeleportState() != LLAgent::TELEPORT_NONE)
-		{
-			return; //wait for teleporting to finish
-		}
-		else
-		{
-			//teleporting aborted
-			LLSpatialPartition::sTeleportRequested = FALSE;
-			mResetVertexBuffers = false;
-			return;
-		}
-	}
-
-    LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE;
-	mResetVertexBuffers = false;
-
-	mCubeVB = NULL;
-    mDeferredVB = NULL;
-
-	for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); 
-			iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
-	{
-		LLViewerRegion* region = *iter;
-		for (U32 i = 0; i < LLViewerRegion::NUM_PARTITIONS; i++)
-		{
-			LLSpatialPartition* part = region->getSpatialPartition(i);
-			if (part)
-			{
-				part->resetVertexBuffers();
-			}
-		}
-	}
-	if(LLSpatialPartition::sTeleportRequested)
-	{
-		LLSpatialPartition::sTeleportRequested = FALSE;
-
-		LLWorld::getInstance()->clearAllVisibleObjects();
-		clearRebuildDrawables();
-	}
-
-	resetDrawOrders();
-
-	gSky.resetVertexBuffers();
-
-	LLVOPartGroup::destroyGL();
-
-	if ( LLPathingLib::getInstance() )
-	{
-		LLPathingLib::getInstance()->cleanupVBOManager();
-	}
-	LLVOPartGroup::destroyGL();
-    gGL.resetVertexBuffer();
-
-	LLVertexBuffer::unbind();
-	
-	updateRenderBump();
-
-	sBakeSunlight = gSavedSettings.getBOOL("RenderBakeSunlight");
-	sNoAlpha = gSavedSettings.getBOOL("RenderNoAlpha");
-	LLPipeline::sTextureBindTest = gSavedSettings.getBOOL("RenderDebugTextureBind");
-
-    gGL.initVertexBuffer();
-
-    mDeferredVB = new LLVertexBuffer(DEFERRED_VB_MASK);
-    mDeferredVB->allocateBuffer(8, 0);
-
-	LLVOPartGroup::restoreGL();
-}
-
 void LLPipeline::renderObjects(U32 type, bool texture, bool batch_texture, bool rigged)
 {
 	assertInitialized();
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index 29dd42e4ec4..483fe085591 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -97,9 +97,7 @@ class LLPipeline
 
 	void destroyGL();
 	void restoreGL();
-	void resetVertexBuffers();
-	void doResetVertexBuffers(bool forced = false);
-    void requestResizeScreenTexture(); // set flag only, no work, safer for callbacks...
+	void requestResizeScreenTexture(); // set flag only, no work, safer for callbacks...
     void requestResizeShadowTexture(); // set flag only, no work, safer for callbacks...
 
 	void resizeScreenTexture();
-- 
GitLab