Drop reflection probes and mirrors to RGBA8 when hdr is disabled to minimize vram usage and chance of probe nans (#2558)

meow-7.2.2
Rye 2025-01-09 20:43:45 -05:00
parent 8d57388a9e
commit c883c7f2d9
5 changed files with 25 additions and 11 deletions

View File

@ -109,7 +109,7 @@ LLCubeMapArray::~LLCubeMapArray()
{
}
void LLCubeMapArray::allocate(U32 resolution, U32 components, U32 count, bool use_mips)
void LLCubeMapArray::allocate(U32 resolution, U32 components, U32 count, bool use_mips, bool hdr)
{
U32 texname = 0;
mWidth = resolution;
@ -128,6 +128,10 @@ void LLCubeMapArray::allocate(U32 resolution, U32 components, U32 count, bool us
free_cur_tex_image();
U32 format = components == 4 ? GL_RGBA16F : GL_RGB16F;
if (!hdr)
{
format = components == 4 ? GL_RGBA8 : GL_RGB8;
}
U32 mip = 0;
U32 mip_resolution = resolution;
while (mip_resolution >= 1)

View File

@ -52,7 +52,7 @@ public:
// components - number of components per pixel
// count - number of cube maps in the array
// use_mips - if true, mipmaps will be allocated for this cube map array and anisotropic filtering will be used
void allocate(U32 res, U32 components, U32 count, bool use_mips = true);
void allocate(U32 res, U32 components, U32 count, bool use_mips = true, bool hdr = true);
void bind(S32 stage);
void unbind();

View File

@ -89,9 +89,11 @@ void LLHeroProbeManager::update()
initReflectionMaps();
static LLCachedControl<bool> render_hdr(gSavedSettings, "RenderHDREnabled", true);
if (!mRenderTarget.isComplete())
{
U32 color_fmt = GL_RGBA16F;
U32 color_fmt = render_hdr ? GL_RGBA16F : GL_RGBA8;
mRenderTarget.allocate(mProbeResolution, mProbeResolution, color_fmt, true);
}
@ -103,7 +105,7 @@ void LLHeroProbeManager::update()
mMipChain.resize(count);
for (U32 i = 0; i < count; ++i)
{
mMipChain[i].allocate(res, res, GL_RGBA16F);
mMipChain[i].allocate(res, res, render_hdr ? GL_RGBA16F : GL_RGBA8);
res /= 2;
}
}
@ -537,8 +539,10 @@ void LLHeroProbeManager::initReflectionMaps()
mTexture = new LLCubeMapArray();
static LLCachedControl<bool> render_hdr(gSavedSettings, "RenderHDREnabled", true);
// store mReflectionProbeCount+2 cube maps, final two cube maps are used for render target and radiance map generation source)
mTexture->allocate(mProbeResolution, 3, mReflectionProbeCount + 2);
mTexture->allocate(mProbeResolution, 3, mReflectionProbeCount + 2, true, render_hdr);
if (mDefaultProbe.isNull())
{

View File

@ -223,9 +223,11 @@ void LLReflectionMapManager::update()
initReflectionMaps();
static LLCachedControl<bool> render_hdr(gSavedSettings, "RenderHDREnabled", true);
if (!mRenderTarget.isComplete())
{
U32 color_fmt = GL_RGB16F;
U32 color_fmt = render_hdr ? GL_RGBA16F : GL_RGBA8;
U32 targetRes = mProbeResolution * 4; // super sample
mRenderTarget.allocate(targetRes, targetRes, color_fmt, true);
}
@ -238,7 +240,7 @@ void LLReflectionMapManager::update()
mMipChain.resize(count);
for (U32 i = 0; i < count; ++i)
{
mMipChain[i].allocate(res, res, GL_RGB16F);
mMipChain[i].allocate(res, res, render_hdr ? GL_RGB16F : GL_RGB8);
res /= 2;
}
}
@ -1415,11 +1417,13 @@ void LLReflectionMapManager::initReflectionMaps()
{
mTexture = new LLCubeMapArray();
static LLCachedControl<bool> render_hdr(gSavedSettings, "RenderHDREnabled", true);
// store mReflectionProbeCount+2 cube maps, final two cube maps are used for render target and radiance map generation source)
mTexture->allocate(mProbeResolution, 3, mReflectionProbeCount + 2);
mTexture->allocate(mProbeResolution, 3, mReflectionProbeCount + 2, true, render_hdr);
mIrradianceMaps = new LLCubeMapArray();
mIrradianceMaps->allocate(LL_IRRADIANCE_MAP_RESOLUTION, 3, mReflectionProbeCount, false);
mIrradianceMaps->allocate(LL_IRRADIANCE_MAP_RESOLUTION, 3, mReflectionProbeCount, false, render_hdr);
}
// reset probe state

View File

@ -261,6 +261,8 @@ static bool handleDisableVintageMode(const LLSD& newvalue)
static bool handleEnableHDR(const LLSD& newvalue)
{
gPipeline.mReflectionMapManager.reset();
gPipeline.mHeroProbeManager.reset();
return handleReleaseGLBufferChanged(newvalue) && handleSetShaderChanged(newvalue);
}
@ -448,11 +450,11 @@ static bool handleReflectionProbeDetailChanged(const LLSD& newvalue)
if (gPipeline.isInit())
{
LLPipeline::refreshCachedSettings();
gPipeline.mReflectionMapManager.reset();
gPipeline.mHeroProbeManager.reset();
gPipeline.releaseGLBuffers();
gPipeline.createGLBuffers();
LLViewerShaderMgr::instance()->setShaders();
gPipeline.mReflectionMapManager.reset();
gPipeline.mHeroProbeManager.reset();
}
return true;
}