From 9b4936fc9e51459f436f586a807e65e7ca762214 Mon Sep 17 00:00:00 2001
From: Rye Mutt <rye@alchemyviewer.org>
Date: Mon, 2 Aug 2021 07:59:02 -0400
Subject: [PATCH] Fix hot spot in forward render on constant recreation of a
 vertex buffer

---
 indra/newview/pipeline.cpp | 49 ++++++++++++++++++++++----------------
 indra/newview/pipeline.h   |  3 +++
 2 files changed, 31 insertions(+), 21 deletions(-)

diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 3d09d032eb3..5f5f7878528 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -718,6 +718,10 @@ void LLPipeline::cleanup()
 
 	mInitialized = false;
 
+    mForwardVB = nullptr;
+    
+    mAuxScreenRectVB = NULL;
+    
 	mDeferredVB = NULL;
 
 	mCubeVB = NULL;
@@ -7494,6 +7498,8 @@ void LLPipeline::doResetVertexBuffers(bool forced)
 	LL_RECORD_BLOCK_TIME(FTM_RESET_VB);
 	mResetVertexBuffers = false;
 
+    mForwardVB = nullptr;
+    
 	mAuxScreenRectVB = NULL;
 
 	mDeferredVB = NULL;
@@ -8413,32 +8419,33 @@ void LLPipeline::renderFinalize()
 		}
 // [/RLVa:KB]
 
-        U32 mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_TEXCOORD1;
-        LLPointer<LLVertexBuffer> buff = new LLVertexBuffer(mask, 0);
-        buff->allocateBuffer(3, 0, TRUE);
+        const U32 mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_TEXCOORD1;
+        if(mForwardVB.isNull())
+        {
+            mForwardVB = new LLVertexBuffer(mask, 0);
+            mForwardVB->allocateBuffer(3, 0, TRUE);
 
-        LLStrider<LLVector3> v;
-        LLStrider<LLVector2> uv1;
-        LLStrider<LLVector2> uv2;
+            LLStrider<LLVector3> v;
+            LLStrider<LLVector2> uv1;
+
+            mForwardVB->getVertexStrider(v);
+            mForwardVB->getTexCoord0Strider(uv1);
 
-        buff->getVertexStrider(v);
-        buff->getTexCoord0Strider(uv1);
-        buff->getTexCoord1Strider(uv2);
+            uv1[0] = LLVector2(0, 0);
+            uv1[1] = LLVector2(0, 2);
+            uv1[2] = LLVector2(2, 0);
 
-        uv1[0] = LLVector2(0, 0);
-        uv1[1] = LLVector2(0, 2);
-        uv1[2] = LLVector2(2, 0);
+            v[0] = LLVector3(-1, -1, 0);
+            v[1] = LLVector3(-1, 3, 0);
+            v[2] = LLVector3(3, -1, 0);
+        }
 
+        LLStrider<LLVector2> uv2;
+        mForwardVB->getTexCoord1Strider(uv2);
         uv2[0] = LLVector2(0, 0);
         uv2[1] = LLVector2(0, tc2.mV[1] * 2.f);
         uv2[2] = LLVector2(tc2.mV[0] * 2.f, 0);
-
-        v[0] = LLVector3(-1, -1, 0);
-        v[1] = LLVector3(-1, 3, 0);
-        v[2] = LLVector3(3, -1, 0);
-
-        buff->flush();
-
+        
         LLGLDisable blend(GL_BLEND);
 
         if (LLGLSLShader::sNoFixedFunction)
@@ -8462,8 +8469,8 @@ void LLPipeline::renderFinalize()
 
 		LLGLEnable multisample(RenderFSAASamples > 0 ? GL_MULTISAMPLE : 0);
 
-        buff->setBuffer(mask);
-        buff->drawArrays(LLRender::TRIANGLE_STRIP, 0, 3);
+        mForwardVB->setBuffer(mask);
+        mForwardVB->drawArrays(LLRender::TRIANGLE_STRIP, 0, 3);
 
         if (LLGLSLShader::sNoFixedFunction)
         {
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index b5a4de09244..22fa0c48120 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -631,6 +631,9 @@ class LLPipeline
     LLCullResult            mReflectedObjects;
     LLCullResult            mRefractedObjects;
 
+    // buffer for forward
+    LLPointer<LLVertexBuffer> mForwardVB;
+    
 	//utility buffer for rendering post effects, gets abused by renderDeferredLighting
 	LLPointer<LLVertexBuffer> mDeferredVB;
 	LLPointer<LLVertexBuffer> mAuxScreenRectVB;
-- 
GitLab