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];