secondlife/viewer#1184: Stop making terrain textures undeletable

master
Cosmic Linden 2024-04-11 17:26:02 -07:00
parent b7b962affd
commit 47255bf44d
5 changed files with 64 additions and 60 deletions

View File

@ -95,7 +95,8 @@ void LLGLTexture::setBoostLevel(S32 level)
mBoostLevel = level ;
if(mBoostLevel != LLGLTexture::BOOST_NONE
&& mBoostLevel != LLGLTexture::BOOST_ICON
&& mBoostLevel != LLGLTexture::BOOST_THUMBNAIL)
&& mBoostLevel != LLGLTexture::BOOST_THUMBNAIL
&& mBoostLevel != LLGLTexture::BOOST_TERRAIN)
{
setNoDelete() ;
}

View File

@ -52,10 +52,11 @@ public:
BOOST_AVATAR ,
BOOST_AVATAR_BAKED ,
BOOST_SCULPTED ,
BOOST_TERRAIN , // Needed for minimap generation for now. Lower than BOOST_HIGH so the texture stats don't get forced, i.e. texture stats are manually managed by minimap/terrain instead.
BOOST_HIGH = 10,
BOOST_BUMP ,
BOOST_TERRAIN , // has to be high priority for minimap / low detail
BOOST_UNUSED_1 , // Placeholder to avoid disrupting habits around texture debug
BOOST_SELECTED ,
BOOST_AVATAR_BAKED_SELF ,
BOOST_AVATAR_SELF , // needed for baking avatar

View File

@ -115,41 +115,7 @@ void LLDrawPoolTerrain::boostTerrainDetailTextures()
// Hack! Get the region that this draw pool is rendering from!
LLViewerRegion *regionp = mDrawFace[0]->getDrawable()->getVObj()->getRegion();
LLVLComposition *compp = regionp->getComposition();
for (S32 i = 0; i < 4; i++)
{
constexpr LLGLTexture::EBoostLevel level = LLGLTexture::BOOST_TERRAIN;
constexpr float stats = 1024.f * 1024.f;
LLPointer<LLViewerFetchedTexture>& tex = compp->mDetailTextures[i];
llassert(tex.notNull());
tex->setBoostLevel(level);
tex->addTextureStats(stats);
LLPointer<LLFetchedGLTFMaterial>& fetched_material = compp->mDetailMaterials[i];
if (fetched_material)
{
if (fetched_material->mBaseColorTexture)
{
fetched_material->mBaseColorTexture->setBoostLevel(level);
fetched_material->mBaseColorTexture->addTextureStats(stats);
}
if (fetched_material->mNormalTexture)
{
fetched_material->mNormalTexture->setBoostLevel(level);
fetched_material->mNormalTexture->addTextureStats(stats);
}
if (fetched_material->mMetallicRoughnessTexture)
{
fetched_material->mMetallicRoughnessTexture->setBoostLevel(level);
fetched_material->mMetallicRoughnessTexture->addTextureStats(stats);
}
if (fetched_material->mEmissiveTexture)
{
fetched_material->mEmissiveTexture->setBoostLevel(level);
fetched_material->mEmissiveTexture->addTextureStats(stats);
}
}
}
compp->boost();
}
void LLDrawPoolTerrain::beginDeferredPass(S32 pass)

View File

@ -45,6 +45,7 @@
extern LLColor4U MAX_WATER_COLOR;
static const U32 BASE_SIZE = 128;
static const F32 TERRAIN_DECODE_PRIORITY = 2048.f * 2048.f;
namespace
{
@ -64,25 +65,38 @@ namespace
return result;
}
void unboost_minimap_texture(LLPointer<LLViewerFetchedTexture>& tex)
void boost_minimap_texture(LLViewerFetchedTexture* tex, F32 virtual_size)
{
llassert(tex);
if (!tex) { return; }
tex->setBoostLevel(LLGLTexture::BOOST_TERRAIN); // in case the raw image is at low detail
tex->addTextureStats(virtual_size); // priority
}
void boost_minimap_material(LLFetchedGLTFMaterial* mat, F32 virtual_size)
{
if (!mat) { return; }
if (mat->mBaseColorTexture) { boost_minimap_texture(mat->mBaseColorTexture, virtual_size); }
if (mat->mNormalTexture) { boost_minimap_texture(mat->mNormalTexture, virtual_size); }
if (mat->mMetallicRoughnessTexture) { boost_minimap_texture(mat->mMetallicRoughnessTexture, virtual_size); }
if (mat->mEmissiveTexture) { boost_minimap_texture(mat->mEmissiveTexture, virtual_size); }
}
void unboost_minimap_texture(LLViewerFetchedTexture* tex)
{
if (!tex) { return; }
tex->setBoostLevel(LLGLTexture::BOOST_NONE);
tex->setMinDiscardLevel(MAX_DISCARD_LEVEL + 1);
if (tex->getTextureState() == LLGLTexture::NO_DELETE)
{
tex->forceActive();
}
}
void unboost_minimap_material(LLPointer<LLFetchedGLTFMaterial>& mat)
void unboost_minimap_material(LLFetchedGLTFMaterial* mat)
{
if (!mat) { return; }
unboost_minimap_texture(mat->mBaseColorTexture);
unboost_minimap_texture(mat->mNormalTexture);
unboost_minimap_texture(mat->mMetallicRoughnessTexture);
unboost_minimap_texture(mat->mEmissiveTexture);
if (mat->mBaseColorTexture) { unboost_minimap_texture(mat->mBaseColorTexture); }
if (mat->mNormalTexture) { unboost_minimap_texture(mat->mNormalTexture); }
if (mat->mMetallicRoughnessTexture) { unboost_minimap_texture(mat->mMetallicRoughnessTexture); }
if (mat->mEmissiveTexture) { unboost_minimap_texture(mat->mEmissiveTexture); }
}
};
@ -96,11 +110,7 @@ LLTerrainMaterials::LLTerrainMaterials()
LLTerrainMaterials::~LLTerrainMaterials()
{
for (S32 i = 0; i < ASSET_COUNT; ++i)
{
unboost_minimap_texture(mDetailTextures[i]);
unboost_minimap_material(mDetailMaterials[i]);
}
unboost();
}
BOOL LLTerrainMaterials::generateMaterials()
@ -118,6 +128,31 @@ BOOL LLTerrainMaterials::generateMaterials()
return FALSE;
}
void LLTerrainMaterials::boost()
{
for (S32 i = 0; i < ASSET_COUNT; ++i)
{
LLPointer<LLViewerFetchedTexture>& tex = mDetailTextures[i];
llassert(tex.notNull());
boost_minimap_texture(tex, TERRAIN_DECODE_PRIORITY);
LLPointer<LLFetchedGLTFMaterial>& mat = mDetailMaterials[i];
boost_minimap_material(mat, TERRAIN_DECODE_PRIORITY);
}
}
void LLTerrainMaterials::unboost()
{
for (S32 i = 0; i < ASSET_COUNT; ++i)
{
LLPointer<LLViewerFetchedTexture>& tex = mDetailTextures[i];
unboost_minimap_texture(tex);
LLPointer<LLFetchedGLTFMaterial>& mat = mDetailMaterials[i];
unboost_minimap_material(mat);
}
}
LLUUID LLTerrainMaterials::getDetailAssetID(S32 asset)
{
llassert(mDetailTextures[asset] && mDetailMaterials[asset]);
@ -135,7 +170,6 @@ LLPointer<LLViewerFetchedTexture> fetch_terrain_texture(const LLUUID& id)
}
LLPointer<LLViewerFetchedTexture> tex = LLViewerTextureManager::getFetchedTexture(id);
tex->setNoDelete();
return tex;
}
@ -240,8 +274,7 @@ bool LLTerrainMaterials::textureReady(LLPointer<LLViewerFetchedTexture>& tex, bo
{
if (boost)
{
tex->setBoostLevel(LLGLTexture::BOOST_TERRAIN); // in case we are at low detail
tex->addTextureStats(BASE_SIZE*BASE_SIZE);
boost_minimap_texture(tex, BASE_SIZE*BASE_SIZE);
}
return false;
}
@ -251,6 +284,8 @@ bool LLTerrainMaterials::textureReady(LLPointer<LLViewerFetchedTexture>& tex, bo
{
if (boost)
{
boost_minimap_texture(tex, BASE_SIZE*BASE_SIZE);
S32 width = tex->getFullWidth();
S32 height = tex->getFullHeight();
S32 min_dim = llmin(width, height);
@ -260,9 +295,7 @@ bool LLTerrainMaterials::textureReady(LLPointer<LLViewerFetchedTexture>& tex, bo
ddiscard++;
min_dim /= 2;
}
tex->setBoostLevel(LLGLTexture::BOOST_TERRAIN); // in case we are at low detail
tex->setMinDiscardLevel(ddiscard);
tex->addTextureStats(BASE_SIZE*BASE_SIZE); // priority
}
return false;
}
@ -589,7 +622,7 @@ BOOL LLVLComposition::generateMinimapTileLand(const F32 x, const F32 y,
// Raw image is not ready, will enter here again later.
if (tex->getFetchPriority() <= 0.0f && !tex->hasSavedRawImage())
{
tex->setBoostLevel(LLGLTexture::BOOST_TERRAIN);
boost_minimap_texture(tex, TERRAIN_DECODE_PRIORITY);
tex->forceToRefetchTexture(ddiscard);
}
@ -606,7 +639,7 @@ BOOL LLVLComposition::generateMinimapTileLand(const F32 x, const F32 y,
// Raw image is not ready, will enter here again later.
if (tex_emissive->getFetchPriority() <= 0.0f && !tex_emissive->hasSavedRawImage())
{
tex_emissive->setBoostLevel(LLGLTexture::BOOST_TERRAIN);
boost_minimap_texture(tex_emissive, TERRAIN_DECODE_PRIORITY);
tex_emissive->forceToRefetchTexture(ddiscard_emissive);
}

View File

@ -58,6 +58,8 @@ public:
BOOL generateMaterials();
void boost();
virtual LLUUID getDetailAssetID(S32 asset);
virtual void setDetailAssetID(S32 asset, const LLUUID& id);
Type getMaterialType();
@ -67,6 +69,7 @@ public:
bool materialsReady(bool boost, bool strict);
protected:
void unboost();
static bool textureReady(LLPointer<LLViewerFetchedTexture>& tex, bool boost);
// strict = true -> all materials must be sufficiently loaded
// strict = false -> at least one material must be loaded