For SH-3121: collect time of reloading all textures from cache and through HTTP when all objects loading are done.

meow-7.2.2
Xiaohong Bao 2012-04-26 15:53:35 -06:00
parent 5ab4dadc70
commit e344b2afa2
8 changed files with 242 additions and 21 deletions

View File

@ -1219,15 +1219,7 @@ bool LLAppViewer::mainLoop()
if(mem_leak_instance)
{
mem_leak_instance->idle() ;
}
//texture fetching debugger
LLFloaterTextureFetchDebugger* tex_fetch_debugger_instance =
LLFloaterReg::findTypedInstance<LLFloaterTextureFetchDebugger>("tex_fetch_debugger");
if(tex_fetch_debugger_instance)
{
tex_fetch_debugger_instance->idle() ;
}
}
// canonical per-frame event
mainloop.post(newFrame);
@ -1412,6 +1404,14 @@ bool LLAppViewer::mainLoop()
LLLFSThread::sLocal->pause();
}
//texture fetching debugger
LLFloaterTextureFetchDebugger* tex_fetch_debugger_instance =
LLFloaterReg::findTypedInstance<LLFloaterTextureFetchDebugger>("tex_fetch_debugger");
if(tex_fetch_debugger_instance)
{
tex_fetch_debugger_instance->idle() ;
}
if ((LLStartUp::getStartupState() >= STATE_CLEANUP) &&
(frameTimer.getElapsedTimeF64() > FRAME_STALL_THRESHOLD))
{

View File

@ -58,6 +58,9 @@ LLFloaterTextureFetchDebugger::LLFloaterTextureFetchDebugger(const LLSD& key)
mCommitCallbackRegistrar.add("TexFetchDebugger.HTTPLoad", boost::bind(&LLFloaterTextureFetchDebugger::onClickHTTPLoad, this));
mCommitCallbackRegistrar.add("TexFetchDebugger.Decode", boost::bind(&LLFloaterTextureFetchDebugger::onClickDecode, this));
mCommitCallbackRegistrar.add("TexFetchDebugger.GLTexture", boost::bind(&LLFloaterTextureFetchDebugger::onClickGLTexture, this));
mCommitCallbackRegistrar.add("TexFetchDebugger.RefetchVisCache", boost::bind(&LLFloaterTextureFetchDebugger::onClickRefetchVisCache, this));
mCommitCallbackRegistrar.add("TexFetchDebugger.RefetchVisHTTP", boost::bind(&LLFloaterTextureFetchDebugger::onClickRefetchVisHTTP, this));
}
//----------------------------------------------
@ -74,6 +77,10 @@ BOOL LLFloaterTextureFetchDebugger::postBuild(void)
mButtonStateMap["http_btn"] = false;
mButtonStateMap["decode_btn"] = false;
mButtonStateMap["gl_btn"] = false;
mButtonStateMap["refetchviscache_btn"] = true;
mButtonStateMap["refetchvishttp_btn"] = true;
updateButtons();
return TRUE ;
@ -109,6 +116,8 @@ void LLFloaterTextureFetchDebugger::disableButtons()
childDisable("http_btn");
childDisable("decode_btn");
childDisable("gl_btn");
childDisable("refetchviscache_btn");
childDisable("refetchvishttp_btn");
}
void LLFloaterTextureFetchDebugger::idle()
@ -142,6 +151,11 @@ void LLFloaterTextureFetchDebugger::idle()
case LLTextureFetchDebugger::GL_TEX:
updateButtons();
break;
case LLTextureFetchDebugger::REFETCH_VIS_CACHE:
updateButtons();
case LLTextureFetchDebugger::REFETCH_VIS_HTTP:
updateButtons();
break;
default:
break;
}
@ -184,6 +198,8 @@ void LLFloaterTextureFetchDebugger::onClickClear()
mButtonStateMap["http_btn"] = false;
mButtonStateMap["decode_btn"] = false;
mButtonStateMap["gl_btn"] = false;
mButtonStateMap["refetchviscache_btn"] = true;
mButtonStateMap["refetchvishttp_btn"] = true;
updateButtons();
//stop everything
@ -226,6 +242,20 @@ void LLFloaterTextureFetchDebugger::onClickGLTexture()
mDebugger->debugGLTextureCreation();
}
void LLFloaterTextureFetchDebugger::onClickRefetchVisCache()
{
disableButtons();
mDebugger->debugRefetchVisibleFromCache();
}
void LLFloaterTextureFetchDebugger::onClickRefetchVisHTTP()
{
disableButtons();
mDebugger->debugRefetchVisibleFromHTTP();
}
void LLFloaterTextureFetchDebugger::draw()
{
//total number of fetched textures
@ -257,6 +287,7 @@ void LLFloaterTextureFetchDebugger::draw()
{
getChild<LLUICtrl>("total_fetched_data_label")->setTextArg("[SIZE1]", llformat("%d", mDebugger->getFetchedData() >> 10));
getChild<LLUICtrl>("total_fetched_data_label")->setTextArg("[SIZE2]", llformat("%d", mDebugger->getDecodedData() >> 10));
getChild<LLUICtrl>("total_fetched_data_label")->setTextArg("[PIXEL]", llformat("%.3f", mDebugger->getFetchedPixels() / 1000000.f));
}
//total number of visible fetched data
@ -269,6 +300,7 @@ void LLFloaterTextureFetchDebugger::draw()
{
getChild<LLUICtrl>("total_fetched_rendered_data_label")->setTextArg("[SIZE1]", llformat("%d", mDebugger->getRenderedData() >> 10));
getChild<LLUICtrl>("total_fetched_rendered_data_label")->setTextArg("[SIZE2]", llformat("%d", mDebugger->getRenderedDecodedData() >> 10));
getChild<LLUICtrl>("total_fetched_rendered_data_label")->setTextArg("[PIXEL]", llformat("%.3f", mDebugger->getRenderedPixels() / 1000000.f));
}
//total time on cache readings
@ -326,5 +358,33 @@ void LLFloaterTextureFetchDebugger::draw()
getChild<LLUICtrl>("total_time_fetch_label")->setTextArg("[TIME]", llformat("%.3f", mDebugger->getTotalFetchingTime()));
}
//total time on refetching visible textures from cache
if(mDebugger->getRefetchVisCacheTime() < 0.f)
{
getChild<LLUICtrl>("total_time_refetch_vis_cache_label")->setTextArg("[TIME]", std::string("----"));
getChild<LLUICtrl>("total_time_refetch_vis_cache_label")->setTextArg("[SIZE]", std::string("----"));
getChild<LLUICtrl>("total_time_refetch_vis_cache_label")->setTextArg("[PIXEL]", std::string("----"));
}
else
{
getChild<LLUICtrl>("total_time_refetch_vis_cache_label")->setTextArg("[TIME]", llformat("%.3f", mDebugger->getRefetchVisCacheTime()));
getChild<LLUICtrl>("total_time_refetch_vis_cache_label")->setTextArg("[SIZE]", llformat("%d", mDebugger->getRefetchedData() >> 10));
getChild<LLUICtrl>("total_time_refetch_vis_cache_label")->setTextArg("[PIXEL]", llformat("%.3f", mDebugger->getRefetchedPixels() / 1000000.f));
}
//total time on refetching visible textures from http
if(mDebugger->getRefetchVisHTTPTime() < 0.f)
{
getChild<LLUICtrl>("total_time_refetch_vis_http_label")->setTextArg("[TIME]", std::string("----"));
getChild<LLUICtrl>("total_time_refetch_vis_http_label")->setTextArg("[SIZE]", std::string("----"));
getChild<LLUICtrl>("total_time_refetch_vis_http_label")->setTextArg("[PIXEL]", std::string("----"));
}
else
{
getChild<LLUICtrl>("total_time_refetch_vis_http_label")->setTextArg("[TIME]", llformat("%.3f", mDebugger->getRefetchVisHTTPTime()));
getChild<LLUICtrl>("total_time_refetch_vis_http_label")->setTextArg("[SIZE]", llformat("%d", mDebugger->getRefetchedData() >> 10));
getChild<LLUICtrl>("total_time_refetch_vis_http_label")->setTextArg("[PIXEL]", llformat("%.3f", mDebugger->getRefetchedPixels() / 1000000.f));
}
LLFloater::draw();
}

View File

@ -51,6 +51,8 @@ public:
void onClickDecode();
void onClickGLTexture();
void onClickRefetchVisCache();
void onClickRefetchVisHTTP();
public:
void idle() ;

View File

@ -3139,6 +3139,8 @@ void LLTextureFetchDebugger::init()
mHTTPTime = -1.f;
mGLCreationTime = -1.f;
mTotalFetchingTime = 0.f;
mRefetchVisCacheTime = -1.f;
mRefetchVisHTTPTime = -1.f;
mNumFetchedTextures = 0;
mNumCacheHits = 0;
@ -3150,12 +3152,19 @@ void LLTextureFetchDebugger::init()
mVisibleDecodedData = 0;
mRenderedData = 0;
mRenderedDecodedData = 0;
mFetchedPixels = 0;
mRenderedPixels = 0;
mRefetchedData = 0;
mRefetchedPixels = 0;
mFreezeHistory = FALSE;
}
void LLTextureFetchDebugger::startDebug()
{
//lock the fetcher
mFetcher->lockFetcher(true);
mFreezeHistory = TRUE;
//clear the current fetching queue
gTextureList.clearFetchingRequests();
@ -3203,6 +3212,7 @@ void LLTextureFetchDebugger::startDebug()
{
mRenderedData += mFetchingHistory[i].mFetchedSize;
mRenderedDecodedData += mFetchingHistory[i].mDecodedSize;
mRenderedPixels += tex->getWidth() * tex->getHeight();
}
}
}
@ -3254,6 +3264,8 @@ void LLTextureFetchDebugger::stopDebug()
//unlock the fetcher
mFetcher->lockFetcher(false);
mFreezeHistory = FALSE;
mTotalFetchingTime = gDebugTimers[0].getElapsedTimeF32(); //reset
}
//called in the main thread and when the fetching queue is empty
@ -3265,12 +3277,20 @@ void LLTextureFetchDebugger::clearHistory()
void LLTextureFetchDebugger::addHistoryEntry(LLTextureFetchWorker* worker)
{
if(mFreezeHistory)
{
mRefetchedPixels += worker->mRawImage->getWidth() * worker->mRawImage->getHeight();
mRefetchedData += worker->mFormattedImage->getDataSize();
return;
}
if(worker->mInCache)
{
mNumCacheHits++;
}
mFetchedData += worker->mFormattedImage->getDataSize();
mDecodedData += worker->mRawImage->getDataSize();
mFetchedPixels += worker->mRawImage->getWidth() * worker->mRawImage->getHeight();
mFetchingHistory.push_back(FetchEntry(worker->mID, worker->mDecodedDiscard, worker->mFormattedImage->getDataSize(), worker->mRawImage->getDataSize()));
//mFetchingHistory.push_back(FetchEntry(worker->mID, worker->mDesiredSize, worker->mHaveAllData ? 0 : worker->mLoadedDiscard, worker->mFormattedImage->getComponents(),
@ -3301,9 +3321,8 @@ void LLTextureFetchDebugger::debugCacheRead()
}
}
void LLTextureFetchDebugger::debugCacheWrite()
void LLTextureFetchDebugger::clearCache()
{
//remove from cache
S32 size = mFetchingHistory.size();
{
std::set<LLUUID> deleted_list;
@ -3316,12 +3335,19 @@ void LLTextureFetchDebugger::debugCacheWrite()
}
}
}
}
void LLTextureFetchDebugger::debugCacheWrite()
{
//remove from cache
clearCache();
lockCache();
llassert_always(mState == IDLE);
mTimer.reset();
mState = WRITE_CACHE;
S32 size = mFetchingHistory.size();
for(S32 i = 0 ; i < size ; i++)
{
mFetchingHistory[i].mCacheHandle = mTextureCache->writeToCache(mFetchingHistory[i].mID, LLWorkerThread::PRIORITY_NORMAL,
@ -3403,6 +3429,43 @@ void LLTextureFetchDebugger::debugGLTextureCreation()
return;
}
//clear fetching results of all textures.
void LLTextureFetchDebugger::clearTextures()
{
S32 size = mFetchingHistory.size();
for(S32 i = 0 ; i < size ; i++)
{
LLViewerFetchedTexture* tex = gTextureList.findImage(mFetchingHistory[i].mID) ;
if(tex)
{
tex->clearFetchedResults() ;
}
}
}
void LLTextureFetchDebugger::debugRefetchVisibleFromCache()
{
llassert_always(mState == IDLE);
mState = REFETCH_VIS_CACHE;
clearTextures();
mTimer.reset();
mFetcher->lockFetcher(false);
}
void LLTextureFetchDebugger::debugRefetchVisibleFromHTTP()
{
llassert_always(mState == IDLE);
mState = REFETCH_VIS_HTTP;
clearCache();
clearTextures();
mTimer.reset();
mFetcher->lockFetcher(false);
}
bool LLTextureFetchDebugger::update()
{
switch(mState)
@ -3437,6 +3500,22 @@ bool LLTextureFetchDebugger::update()
case GL_TEX:
mState = IDLE;
break;
case REFETCH_VIS_CACHE:
if (LLAppViewer::getTextureFetch()->getNumRequests() == 0)
{
mRefetchVisCacheTime = gDebugTimers[0].getElapsedTimeF32() - mTotalFetchingTime;
mState = IDLE;
mFetcher->lockFetcher(true);
}
break;
case REFETCH_VIS_HTTP:
if (LLAppViewer::getTextureFetch()->getNumRequests() == 0)
{
mRefetchVisHTTPTime = gDebugTimers[0].getElapsedTimeF32() - mTotalFetchingTime;
mState = IDLE;
mFetcher->lockFetcher(true);
}
break;
default:
mState = IDLE;
break;

View File

@ -243,6 +243,10 @@ public:
DECODING,
HTTP_FETCHING,
GL_TEX,
REFETCH_VIS_CACHE,
REFETCH_VIS_HTTP,
REFETCH_ALL_CACHE,
REFETCH_ALL_HTTP,
INVALID
};
@ -287,14 +291,17 @@ private:
F32 mHTTPTime;
F32 mGLCreationTime;
F32 mTotalFetchingTime;
F32 mRefetchVisCacheTime;
F32 mRefetchVisHTTPTime;
LLTimer mTimer;
LLTextureFetch* mFetcher;
LLTextureCache* mTextureCache;
LLImageDecodeThread* mImageDecodeThread;
LLCurlRequest* mCurlGetRequest;
F32 mTotalFetchingTime;
S32 mNumFetchedTextures;
S32 mNumCacheHits;
S32 mNumVisibleFetchedTextures;
@ -305,7 +312,12 @@ private:
U32 mVisibleDecodedData;
U32 mRenderedData;
U32 mRenderedDecodedData;
U32 mFetchedPixels;
U32 mRenderedPixels;
U32 mRefetchedData;
U32 mRefetchedPixels;
BOOL mFreezeHistory;
public:
bool update(); //called in the main thread once per frame
@ -322,6 +334,8 @@ public:
void debugHTTP();
void debugDecoder();
void debugGLTextureCreation();
void debugRefetchVisibleFromCache();
void debugRefetchVisibleFromHTTP();
void callbackCacheRead(S32 id, bool success, LLImageFormatted* image,
S32 imagesize, BOOL islocal);
@ -340,6 +354,10 @@ public:
U32 getVisibleDecodedData() {return mVisibleDecodedData;}
U32 getRenderedData() {return mRenderedData;}
U32 getRenderedDecodedData() {return mRenderedDecodedData;}
U32 getFetchedPixels() {return mFetchedPixels;}
U32 getRenderedPixels() {return mRenderedPixels;}
U32 getRefetchedData() {return mRefetchedData;}
U32 getRefetchedPixels() {return mRefetchedPixels;}
F32 getCacheReadTime() {return mCacheReadTime;}
F32 getCacheWriteTime() {return mCacheWriteTime;}
@ -347,9 +365,13 @@ public:
F32 getGLCreationTime() {return mGLCreationTime;}
F32 getHTTPTime() {return mHTTPTime;}
F32 getTotalFetchingTime() {return mTotalFetchingTime;}
F32 getRefetchVisCacheTime() {return mRefetchVisCacheTime;}
F32 getRefetchVisHTTPTime() {return mRefetchVisHTTPTime;}
private:
void init();
void clearTextures();//clear fetching results of all textures.
void clearCache();
void lockFetcher();
void unlockFetcher();

View File

@ -2144,6 +2144,14 @@ bool LLViewerFetchedTexture::updateFetch()
return mIsFetching ? true : false;
}
void LLViewerFetchedTexture::clearFetchedResults()
{
llassert_always(!mNeedsCreateTexture && !mIsFetching);
cleanup();
destroyGLTexture();
}
void LLViewerFetchedTexture::forceToDeleteRequest()
{
if (mHasFetcher)

View File

@ -433,6 +433,8 @@ public:
bool updateFetch();
void clearFetchedResults(); //clear all fetched results, for debug use.
// Override the computation of discard levels if we know the exact output
// size of the image. Used for UI textures to not decode, even if we have
// more data.

View File

@ -2,12 +2,12 @@
<floater
legacy_header_height="18"
can_minimize="false"
height="480"
height="550"
layout="topleft"
name="TexFetchDebugger"
help_topic="texfetchdebugger"
title="Texture Fetching Debugger"
width="500">
width="540">
<text
type="string"
length="1"
@ -77,8 +77,8 @@
left_delta="0"
name="total_fetched_data_label"
top_delta="25"
width="480">
6, Total number of fetched data/Decoded Data: [SIZE1]KB / [SIZE2]KB
width="530">
6, Total number of fetched data: [SIZE1]KB, Decoded Data: [SIZE2]KB, [PIXEL]MPixels
</text>
<text
type="string"
@ -90,7 +90,7 @@
name="total_fetched_vis_data_label"
top_delta="25"
width="480">
7, Total number of visible fetched data/Decoded Data: [SIZE1]KB / [SIZE2]KB
7, Total number of visible data: [SIZE1]KB, Decoded Data: [SIZE2]KB
</text>
<text
type="string"
@ -101,8 +101,8 @@
left_delta="0"
name="total_fetched_rendered_data_label"
top_delta="25"
width="480">
8, Total number of rendered fetched data/Decoded Data: [SIZE1]KB / [SIZE2]KB
width="530">
8, Total number of rendered data: [SIZE1]KB, Decoded Data: [SIZE2]KB, [PIXEL]MPixels
</text>
<text
type="string"
@ -176,13 +176,37 @@
width="400">
14, Total time on entire fetching: [TIME] seconds
</text>
<text
type="string"
length="1"
follows="left|top"
height="25"
layout="topleft"
left_delta="0"
name="total_time_refetch_vis_cache_label"
top_delta="25"
width="540">
15, Refetching visibles from cache, Time: [TIME] seconds, Fetched: [SIZE]KB, [PIXEL]MPixels
</text>
<text
type="string"
length="1"
follows="left|top"
height="25"
layout="topleft"
left_delta="0"
name="total_time_refetch_vis_http_label"
top_delta="25"
width="540">
16, Refetching visibles from HTTP, Time: [TIME] seconds, Fetched: [SIZE]KB, [PIXEL]MPixels
</text>
<spinner
decimal_digits="1"
follows="left|top"
height="20"
increment="0.1"
initial_value="1.0"
label="15, Ratio of Texel/Pixel:"
label="17, Ratio of Texel/Pixel:"
label_width="130"
layout="topleft"
left_delta="0"
@ -289,4 +313,28 @@
<button.commit_callback
function="TexFetchDebugger.GLTexture" />
</button>
<button
follows="left|top"
height="20"
label="Refetch Vis Cache"
layout="topleft"
left="10"
name="refetchviscache_btn"
top_delta="30"
width="120">
<button.commit_callback
function="TexFetchDebugger.RefetchVisCache" />
</button>
<button
follows="left|top"
height="20"
label="Refetch Vis HTTP"
layout="topleft"
left_pad="7"
name="refetchvishttp_btn"
top_delta="0"
width="120">
<button.commit_callback
function="TexFetchDebugger.RefetchVisHTTP" />
</button>
</floater>