From e75946daa07844c379573b0c5540e29694ebe402 Mon Sep 17 00:00:00 2001
From: Rye Mutt <rye@alchemyviewer.org>
Date: Fri, 25 Sep 2020 21:43:32 -0400
Subject: [PATCH] Revert "Abandon all hope. Make LLRender2D mostly static
 variables to reduce overhead caused by getInstance locking"

This reverts commit 778f41e61937aecf1f041309960be5677e8cf5e8.
---
 indra/llrender/llrender2dutils.cpp | 62 ++++++++++++------------------
 indra/llrender/llrender2dutils.h   | 20 +++++-----
 indra/llrender/lluiimage.cpp       |  8 ++--
 indra/llui/llui.h                  | 20 +++++-----
 4 files changed, 49 insertions(+), 61 deletions(-)

diff --git a/indra/llrender/llrender2dutils.cpp b/indra/llrender/llrender2dutils.cpp
index cfffd456d00..04fa76511d9 100644
--- a/indra/llrender/llrender2dutils.cpp
+++ b/indra/llrender/llrender2dutils.cpp
@@ -106,10 +106,11 @@ void gl_rect_2d_offset_local( S32 left, S32 top, S32 right, S32 bottom, S32 pixe
 	top += LLFontGL::sCurOrigin.mY;
 
 	gGL.loadUIIdentity();
-	gl_rect_2d(llfloor((F32)left * LLRender2D::sGLScaleFactor.mV[VX]) - pixel_offset,
-				llfloor((F32)top * LLRender2D::sGLScaleFactor.mV[VY]) + pixel_offset,
-				llfloor((F32)right * LLRender2D::sGLScaleFactor.mV[VX]) + pixel_offset,
-				llfloor((F32)bottom * LLRender2D::sGLScaleFactor.mV[VY]) - pixel_offset,
+	LLRender2D *r2d_inst = LLRender2D::getInstance();
+	gl_rect_2d(llfloor((F32)left * r2d_inst->mGLScaleFactor.mV[VX]) - pixel_offset,
+				llfloor((F32)top * r2d_inst->mGLScaleFactor.mV[VY]) + pixel_offset,
+				llfloor((F32)right * r2d_inst->mGLScaleFactor.mV[VX]) + pixel_offset,
+				llfloor((F32)bottom * r2d_inst->mGLScaleFactor.mV[VY]) - pixel_offset,
 				filled);
 	gGL.popUIMatrix();
 }
@@ -798,7 +799,7 @@ void gl_stippled_line_3d( const LLVector3& start, const LLVector3& end, const LL
 	}
 	gGL.end();
 
-	LLRender2D::setLineWidth(1.f);
+	LLRender2D::getInstance()->setLineWidth(1.f);
 }
 
 void gl_arc_2d(F32 center_x, F32 center_y, F32 radius, S32 steps, BOOL filled, F32 start_angle, F32 end_angle)
@@ -965,7 +966,7 @@ void gl_rect_2d_checkerboard(const LLRect& rect, GLfloat alpha)
 	}
 	else
 	{ //polygon stipple is deprecated, use "Checker" texture
-		LLPointer<LLUIImage> img = LLRender2D::getUIImage("Checker");
+		LLPointer<LLUIImage> img = LLRender2D::getInstance()->getUIImage("Checker");
 		gGL.getTexUnit(0)->bind(img->getImage());
 		gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_WRAP);
 		gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
@@ -1565,29 +1566,26 @@ void gl_segmented_rect_3d_tex(const LLRectf& clip_rect, const LLRectf& center_uv
 
 }
 
-LLVector2 LLRender2D::sGLScaleFactor = { 1.f, 1.f };
-LLImageProviderInterface* LLRender2D::sImageProvider = nullptr;
-
 LLRender2D::LLRender2D(LLImageProviderInterface* image_provider)
 {
-	sGLScaleFactor = LLVector2(1.f, 1.f);
-	sImageProvider = image_provider;
-	if(sImageProvider)
+	mGLScaleFactor = LLVector2(1.f, 1.f);
+	mImageProvider = image_provider;
+	if(mImageProvider)
 	{
-		sImageProvider->addOnRemovalCallback(resetProvider);
+		mImageProvider->addOnRemovalCallback(resetProvider);
 	}
 }
 
 LLRender2D::~LLRender2D()
 {
-	if(sImageProvider)
+	if(mImageProvider)
 	{
-		sImageProvider->cleanUp();
-		sImageProvider->deleteOnRemovalCallback(resetProvider);
+		mImageProvider->cleanUp();
+		mImageProvider->deleteOnRemovalCallback(resetProvider);
 	}
 }
 
-// static
+
 void LLRender2D::translate(F32 x, F32 y, F32 z)
 {
 	gGL.translateUI(x,y,z);
@@ -1596,26 +1594,20 @@ void LLRender2D::translate(F32 x, F32 y, F32 z)
 	LLFontGL::sCurDepth += z;
 }
 
-// static
 void LLRender2D::pushMatrix()
 {
 	gGL.pushUIMatrix();
-	LLFontGL::sOriginStack.emplace_back(std::make_pair(LLFontGL::sCurOrigin, LLFontGL::sCurDepth));
+	LLFontGL::sOriginStack.push_back(std::make_pair(LLFontGL::sCurOrigin, LLFontGL::sCurDepth));
 }
 
-// static
 void LLRender2D::popMatrix()
 {
 	gGL.popUIMatrix();
-	{
-		const auto& origin_pair = LLFontGL::sOriginStack.back();
-		LLFontGL::sCurOrigin = origin_pair.first;
-		LLFontGL::sCurDepth = origin_pair.second;
-	}
+	LLFontGL::sCurOrigin = LLFontGL::sOriginStack.back().first;
+	LLFontGL::sCurDepth = LLFontGL::sOriginStack.back().second;
 	LLFontGL::sOriginStack.pop_back();
 }
 
-// static
 void LLRender2D::loadIdentity()
 {
 	gGL.loadUIIdentity(); 
@@ -1624,24 +1616,21 @@ void LLRender2D::loadIdentity()
 	LLFontGL::sCurDepth = 0.f;
 }
 
-// static
 void LLRender2D::setScaleFactor(const LLVector2 &scale_factor)
 {
-	sGLScaleFactor = scale_factor;
+	mGLScaleFactor = scale_factor;
 }
 
-// static
 void LLRender2D::setLineWidth(F32 width)
 {
-	gGL.setLineWidth(width * lerp(sGLScaleFactor.mV[VX], sGLScaleFactor.mV[VY], 0.5f));
+	gGL.setLineWidth(width * lerp(mGLScaleFactor.mV[VX], mGLScaleFactor.mV[VY], 0.5f));
 }
 
-// static
 LLPointer<LLUIImage> LLRender2D::getUIImageByID(const LLUUID& image_id, S32 priority)
 {
-	if (sImageProvider)
+	if (mImageProvider)
 	{
-		return sImageProvider->getUIImageByID(image_id, priority);
+		return mImageProvider->getUIImageByID(image_id, priority);
 	}
 	else
 	{
@@ -1649,11 +1638,10 @@ LLPointer<LLUIImage> LLRender2D::getUIImageByID(const LLUUID& image_id, S32 prio
 	}
 }
 
-// static
 LLPointer<LLUIImage> LLRender2D::getUIImage(const std::string& name, S32 priority)
 {
-	if (!name.empty() && sImageProvider)
-		return sImageProvider->getUIImage(name, priority);
+	if (!name.empty() && mImageProvider)
+		return mImageProvider->getUIImage(name, priority);
 	else
 		return NULL;
 }
@@ -1663,7 +1651,7 @@ void LLRender2D::resetProvider()
 {
     if (LLRender2D::instanceExists())
     {
-        LLRender2D::sImageProvider = NULL;
+        LLRender2D::getInstance()->mImageProvider = NULL;
     }
 }
 
diff --git a/indra/llrender/llrender2dutils.h b/indra/llrender/llrender2dutils.h
index dc5e66eb646..3428067e71f 100644
--- a/indra/llrender/llrender2dutils.h
+++ b/indra/llrender/llrender2dutils.h
@@ -127,18 +127,18 @@ class LLRender2D final : public LLParamSingleton<LLRender2D>
 	LOG_CLASS(LLRender2D);
 	~LLRender2D();
 public:
-	static void pushMatrix();
-	static void popMatrix();
-	static void loadIdentity();
-	static void translate(F32 x, F32 y, F32 z = 0.0f);
+	void pushMatrix();
+	void popMatrix();
+	void loadIdentity();
+	void translate(F32 x, F32 y, F32 z = 0.0f);
 
-	static void setLineWidth(F32 width);
-	static void setScaleFactor(const LLVector2& scale_factor);
+	void setLineWidth(F32 width);
+	void setScaleFactor(const LLVector2& scale_factor);
 
-	static LLPointer<LLUIImage> getUIImageByID(const LLUUID& image_id, S32 priority = 0);
-	static LLPointer<LLUIImage> getUIImage(const std::string& name, S32 priority = 0);
+	LLPointer<LLUIImage> getUIImageByID(const LLUUID& image_id, S32 priority = 0);
+	LLPointer<LLUIImage> getUIImage(const std::string& name, S32 priority = 0);
 
-	static LLVector2		sGLScaleFactor;
+	LLVector2		mGLScaleFactor;
 
 protected:
 	// since LLRender2D has no control of image provider's lifecycle
@@ -147,7 +147,7 @@ class LLRender2D final : public LLParamSingleton<LLRender2D>
 	static void resetProvider();
 
 private:
-	static LLImageProviderInterface* sImageProvider;
+	LLImageProviderInterface* mImageProvider;
 };
 
 class LLImageProviderInterface
diff --git a/indra/llrender/lluiimage.cpp b/indra/llrender/lluiimage.cpp
index 361b1b354f3..424672fe8ec 100644
--- a/indra/llrender/lluiimage.cpp
+++ b/indra/llrender/lluiimage.cpp
@@ -81,10 +81,10 @@ void LLUIImage::draw3D(const LLVector3& origin_agent, const LLVector3& x_axis, c
 		 }
 	}
 
-	LLRender2D::pushMatrix();
+	LLRender2D::getInstance()->pushMatrix();
 	{ 
 		LLVector3 rect_origin = origin_agent + (rect.mLeft * x_axis) + (rect.mBottom * y_axis); 
-		LLRender2D::translate(rect_origin.mV[VX],
+		LLRender2D::getInstance()->translate(rect_origin.mV[VX],
 											rect_origin.mV[VY], 
 											rect_origin.mV[VZ]);
 		gGL.getTexUnit(0)->bind(getImage());
@@ -103,7 +103,7 @@ void LLUIImage::draw3D(const LLVector3& origin_agent, const LLVector3& x_axis, c
 								rect.getWidth() * x_axis, 
 								rect.getHeight() * y_axis);
 		
-	}LLRender2D::popMatrix();
+	} LLRender2D::getInstance()->popMatrix();
 }
 
 //#include "lluiimage.inl"
@@ -138,7 +138,7 @@ namespace LLInitParam
 			return;
 		}
 
-		LLUIImage* imagep =  LLRender2D::getUIImage(name());
+		LLUIImage* imagep =  LLRender2D::getInstance()->getUIImage(name());
 		if (imagep)
 		{
 			updateValue(imagep);
diff --git a/indra/llui/llui.h b/indra/llui/llui.h
index 946136ff439..1ce436cad14 100644
--- a/indra/llui/llui.h
+++ b/indra/llui/llui.h
@@ -313,18 +313,18 @@ class LLUI final : public LLParamSingleton<LLUI>
 	void positionViewNearMouse(LLView* view,	S32 spawn_x = S32_MAX, S32 spawn_y = S32_MAX);
 
 	// LLRender2D wrappers
-	static void pushMatrix() { LLRender2D::pushMatrix(); }
-	static void popMatrix() { LLRender2D::popMatrix(); }
-	static void loadIdentity() { LLRender2D::loadIdentity(); }
-	static void translate(F32 x, F32 y, F32 z = 0.0f) { LLRender2D::translate(x, y, z); }
-
-	static LLVector2& getScaleFactor() { return LLRender2D::sGLScaleFactor; }
-	static void setScaleFactor(const LLVector2& scale_factor) { LLRender2D::setScaleFactor(scale_factor); }
-	static void setLineWidth(F32 width) { LLRender2D::setLineWidth(width); }
+	static void pushMatrix() { LLRender2D::getInstance()->pushMatrix(); }
+	static void popMatrix() { LLRender2D::getInstance()->popMatrix(); }
+	static void loadIdentity() { LLRender2D::getInstance()->loadIdentity(); }
+	static void translate(F32 x, F32 y, F32 z = 0.0f) { LLRender2D::getInstance()->translate(x, y, z); }
+
+	static LLVector2& getScaleFactor() { return LLRender2D::getInstance()->mGLScaleFactor; }
+	static void setScaleFactor(const LLVector2& scale_factor) { LLRender2D::getInstance()->setScaleFactor(scale_factor); }
+	static void setLineWidth(F32 width) { LLRender2D::getInstance()->setLineWidth(width); }
 	static LLPointer<LLUIImage> getUIImageByID(const LLUUID& image_id, S32 priority = 0)
-		{ return LLRender2D::getUIImageByID(image_id, priority); }
+		{ return LLRender2D::getInstance()->getUIImageByID(image_id, priority); }
 	static LLPointer<LLUIImage> getUIImage(const std::string& name, S32 priority = 0)
-		{ return LLRender2D::getUIImage(name, priority); }
+		{ return LLRender2D::getInstance()->getUIImage(name, priority); }
 
 	//
 	// Data
-- 
GitLab