diff --git a/indra/newview/llreflectionmapmanager.cpp b/indra/newview/llreflectionmapmanager.cpp
index 48ed22d79f4144e9c9b3c1c2cd70c161cfdb84a2..752427f0fa8f2e72913a49a279f9b675395d0819 100644
--- a/indra/newview/llreflectionmapmanager.cpp
+++ b/indra/newview/llreflectionmapmanager.cpp
@@ -38,11 +38,6 @@
 extern BOOL gCubeSnapshot;
 extern BOOL gTeleportDisplay;
 
-//#pragma optimize("", off)
-
-// experimental pipeline render target override, if this works, do something less hacky
-LLPipeline::RenderTargetPack gProbeRT;
-
 LLReflectionMapManager::LLReflectionMapManager()
 {
     for (int i = 0; i < LL_REFLECTION_PROBE_COUNT; ++i)
@@ -95,15 +90,6 @@ void LLReflectionMapManager::update()
         const bool use_stencil_buffer = true;
         U32 targetRes = LL_REFLECTION_PROBE_RESOLUTION * 2; // super sample
         mRenderTarget.allocate(targetRes, targetRes, color_fmt, use_depth_buffer, use_stencil_buffer, LLTexUnit::TT_RECT_TEXTURE);
-
-        // hack to allocate render targets using gPipeline code
-        gCubeSnapshot = TRUE;
-        auto* old_rt = gPipeline.mRT;
-        gPipeline.mRT = &gProbeRT;
-        gPipeline.allocateScreenBuffer(targetRes, targetRes);
-        gPipeline.allocateShadowBuffer(targetRes, targetRes);
-        gPipeline.mRT = old_rt;
-        gCubeSnapshot = FALSE;
     }
 
     if (mMipChain.empty())
@@ -404,10 +390,9 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)
 {
     mRenderTarget.bindTarget();
     // hacky hot-swap of camera specific render targets
-    auto* old_rt = gPipeline.mRT;
-    gPipeline.mRT = &gProbeRT;
+    gPipeline.mRT = &gPipeline.mAuxillaryRT;
     probe->update(mRenderTarget.getWidth(), face);
-    gPipeline.mRT = old_rt;
+    gPipeline.mRT = &gPipeline.mMainRT;
     mRenderTarget.flush();
 
     // generate mipmaps
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 8bac5131cf2b70eb7251808a04b59010ec73b9a2..028a0db95cb3c00d064f6b279545c5fb34fa784a 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -436,7 +436,7 @@ void LLPipeline::init()
 {
 	refreshCachedSettings();
 
-    mRT = new RenderTargetPack();
+    mRT = &mMainRT;
 
 	gOctreeMaxCapacity = gSavedSettings.getU32("OctreeMaxNodeCapacity");
 	gOctreeMinSize = gSavedSettings.getF32("OctreeMinimumNodeSize");
@@ -696,9 +696,6 @@ void LLPipeline::cleanup()
 	mDeferredVB = NULL;
 
 	mCubeVB = NULL;
-
-    delete mRT;
-    mRT = nullptr;
 }
 
 //============================================================================
@@ -840,6 +837,16 @@ LLPipeline::eFBOStatus LLPipeline::doAllocateScreenBuffer(U32 resX, U32 resY)
 bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
 {
     LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY;
+    if (mRT == &mMainRT)
+    { // hacky -- allocate auxillary buffer
+        gCubeSnapshot = TRUE;
+        mRT = &mAuxillaryRT;
+        U32 res = LL_REFLECTION_PROBE_RESOLUTION * 2;
+        allocateScreenBuffer(res, res, 0);
+        mRT = &mMainRT;
+        gCubeSnapshot = FALSE;
+    }
+
 	// remember these dimensions
 	mRT->width = resX;
 	mRT->height = resY;
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index f05b7aec8efb5f101629d0d6a8ddf2b42b7e6149..c83d7c16ebafae37cb9735f9a3040b4adb6abe37 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -666,6 +666,13 @@ class LLPipeline
         LLRenderTarget			shadowOcclusion[4];
     };
 
+    // main full resoltuion render target
+    RenderTargetPack mMainRT;
+
+    // auxillary 512x512 render target pack
+    RenderTargetPack mAuxillaryRT;
+
+    // currently used render target pack
     RenderTargetPack* mRT;
 
     LLRenderTarget          mSpotShadow[2];