diff options
author | Ansariel <ansariel.hiller@phoenixviewer.com> | 2024-05-22 19:04:52 +0200 |
---|---|---|
committer | Ansariel <ansariel.hiller@phoenixviewer.com> | 2024-05-22 19:04:52 +0200 |
commit | 1b67dd855c41f5a0cda7ec2a68d98071986ca703 (patch) | |
tree | ab243607f74f78200787bba5b9b88f07ef1b966f /indra/newview/lltextureview.cpp | |
parent | 6d6eabca44d08d5b97bfe3e941d2b9687c2246ea (diff) | |
parent | e1623bb276f83a43ce7a197e388720c05bdefe61 (diff) |
Merge remote-tracking branch 'origin/main' into DRTVWR-600-maint-A
# Conflicts:
# autobuild.xml
# indra/cmake/CMakeLists.txt
# indra/cmake/GoogleMock.cmake
# indra/llaudio/llaudioengine_fmodstudio.cpp
# indra/llaudio/llaudioengine_fmodstudio.h
# indra/llaudio/lllistener_fmodstudio.cpp
# indra/llaudio/lllistener_fmodstudio.h
# indra/llaudio/llstreamingaudio_fmodstudio.cpp
# indra/llaudio/llstreamingaudio_fmodstudio.h
# indra/llcharacter/llmultigesture.cpp
# indra/llcharacter/llmultigesture.h
# indra/llimage/llimage.cpp
# indra/llimage/llimagepng.cpp
# indra/llimage/llimageworker.cpp
# indra/llimage/tests/llimageworker_test.cpp
# indra/llmessage/tests/llmockhttpclient.h
# indra/llprimitive/llgltfmaterial.h
# indra/llrender/llfontfreetype.cpp
# indra/llui/llcombobox.cpp
# indra/llui/llfolderview.cpp
# indra/llui/llfolderviewmodel.h
# indra/llui/lllineeditor.cpp
# indra/llui/lllineeditor.h
# indra/llui/lltextbase.cpp
# indra/llui/lltextbase.h
# indra/llui/lltexteditor.cpp
# indra/llui/lltextvalidate.cpp
# indra/llui/lltextvalidate.h
# indra/llui/lluictrl.h
# indra/llui/llview.cpp
# indra/llwindow/llwindowmacosx.cpp
# indra/newview/app_settings/settings.xml
# indra/newview/llappearancemgr.cpp
# indra/newview/llappearancemgr.h
# indra/newview/llavatarpropertiesprocessor.cpp
# indra/newview/llavatarpropertiesprocessor.h
# indra/newview/llbreadcrumbview.cpp
# indra/newview/llbreadcrumbview.h
# indra/newview/llbreastmotion.cpp
# indra/newview/llbreastmotion.h
# indra/newview/llconversationmodel.h
# indra/newview/lldensityctrl.cpp
# indra/newview/lldensityctrl.h
# indra/newview/llface.inl
# indra/newview/llfloatereditsky.cpp
# indra/newview/llfloatereditwater.cpp
# indra/newview/llfloateremojipicker.h
# indra/newview/llfloaterimsessiontab.cpp
# indra/newview/llfloaterprofiletexture.cpp
# indra/newview/llfloaterprofiletexture.h
# indra/newview/llgesturemgr.cpp
# indra/newview/llgesturemgr.h
# indra/newview/llimpanel.cpp
# indra/newview/llimpanel.h
# indra/newview/llinventorybridge.cpp
# indra/newview/llinventorybridge.h
# indra/newview/llinventoryclipboard.cpp
# indra/newview/llinventoryclipboard.h
# indra/newview/llinventoryfunctions.cpp
# indra/newview/llinventoryfunctions.h
# indra/newview/llinventorygallery.cpp
# indra/newview/lllistbrowser.cpp
# indra/newview/lllistbrowser.h
# indra/newview/llpanelobjectinventory.cpp
# indra/newview/llpanelprofile.cpp
# indra/newview/llpanelprofile.h
# indra/newview/llpreviewgesture.cpp
# indra/newview/llsavedsettingsglue.cpp
# indra/newview/llsavedsettingsglue.h
# indra/newview/lltooldraganddrop.cpp
# indra/newview/llurllineeditorctrl.cpp
# indra/newview/llvectorperfoptions.cpp
# indra/newview/llvectorperfoptions.h
# indra/newview/llviewerparceloverlay.cpp
# indra/newview/llviewertexlayer.cpp
# indra/newview/llviewertexturelist.cpp
# indra/newview/macmain.h
# indra/test/test.cpp
Diffstat (limited to 'indra/newview/lltextureview.cpp')
-rw-r--r-- | indra/newview/lltextureview.cpp | 2060 |
1 files changed, 1029 insertions, 1031 deletions
diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp index e1779ba976..a7da404105 100644 --- a/indra/newview/lltextureview.cpp +++ b/indra/newview/lltextureview.cpp @@ -1,1031 +1,1029 @@ -/** - * @file lltextureview.cpp - * @brief LLTextureView class implementation - * - * $LicenseInfo:firstyear=2001&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2012-2013, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -#include "llviewerprecompiledheaders.h" - -#include <set> - -#include "lltextureview.h" - -#include "llrect.h" -#include "llerror.h" -#include "lllfsthread.h" -#include "llui.h" -#include "llimageworker.h" -#include "llrender.h" - -#include "lltooltip.h" -#include "llappviewer.h" -#include "llmeshrepository.h" -#include "llselectmgr.h" -#include "llviewertexlayer.h" -#include "lltexturecache.h" -#include "lltexturefetch.h" -#include "llviewercontrol.h" -#include "llviewerobject.h" -#include "llviewerobjectlist.h" -#include "llviewertexture.h" -#include "llviewertexturelist.h" -#include "llviewerwindow.h" -#include "llwindow.h" -#include "llvovolume.h" -#include "llviewerstats.h" -#include "llworld.h" - -// For avatar texture view -#include "llvoavatarself.h" -#include "lltexlayer.h" - -extern F32 texmem_lower_bound_scale; - -LLTextureView *gTextureView = NULL; - -#define HIGH_PRIORITY 100000000.f - -//static -std::set<LLViewerFetchedTexture*> LLTextureView::sDebugImages; - -//////////////////////////////////////////////////////////////////////////// - -static std::string title_string1a("Tex UUID Area DDis(Req) DecodePri(Fetch) [download] pk/max"); -static std::string title_string1b("Tex UUID Area DDis(Req) Fetch(DecodePri) [download] pk/max"); -static std::string title_string2("State"); -static std::string title_string3("Pkt Bnd"); -static std::string title_string4(" W x H (Dis) Mem"); - -static S32 title_x1 = 0; -static S32 title_x2 = 460; -static S32 title_x3 = title_x2 + 40; -static S32 title_x4 = title_x3 + 46; -static S32 texture_bar_height = 8; - -//////////////////////////////////////////////////////////////////////////// - -class LLTextureBar : public LLView -{ -public: - LLPointer<LLViewerFetchedTexture> mImagep; - S32 mHilite; - -public: - struct Params : public LLInitParam::Block<Params, LLView::Params> - { - Mandatory<LLTextureView*> texture_view; - Params() - : texture_view("texture_view") - { - changeDefault(mouse_opaque, false); - } - }; - LLTextureBar(const Params& p) - : LLView(p), - mHilite(0), - mTextureView(p.texture_view) - {} - - virtual void draw(); - virtual bool handleMouseDown(S32 x, S32 y, MASK mask); - virtual LLRect getRequiredRect(); // Return the height of this object, given the set options. - -// Used for sorting - struct sort - { - bool operator()(const LLView* i1, const LLView* i2) - { - LLTextureBar* bar1p = (LLTextureBar*)i1; - LLTextureBar* bar2p = (LLTextureBar*)i2; - LLViewerFetchedTexture *i1p = bar1p->mImagep; - LLViewerFetchedTexture *i2p = bar2p->mImagep; - F32 pri1 = i1p->getMaxVirtualSize(); - F32 pri2 = i2p->getMaxVirtualSize(); - if (pri1 > pri2) - return true; - else if (pri2 > pri1) - return false; - else - return i1p->getID() < i2p->getID(); - } - }; - - struct sort_fetch - { - bool operator()(const LLView* i1, const LLView* i2) - { - LLTextureBar* bar1p = (LLTextureBar*)i1; - LLTextureBar* bar2p = (LLTextureBar*)i2; - LLViewerFetchedTexture *i1p = bar1p->mImagep; - LLViewerFetchedTexture *i2p = bar2p->mImagep; - U32 pri1 = i1p->getFetchPriority() ; - U32 pri2 = i2p->getFetchPriority() ; - if (pri1 > pri2) - return true; - else if (pri2 > pri1) - return false; - else - return i1p->getID() < i2p->getID(); - } - }; -private: - LLTextureView* mTextureView; -}; - -void LLTextureBar::draw() -{ - if (!mImagep) - { - return; - } - - LLColor4 color; - if (mImagep->getID() == LLAppViewer::getTextureFetch()->mDebugID) - { - color = LLColor4::cyan2; - } - else if (mHilite) - { - S32 idx = llclamp(mHilite,1,3); - if (idx==1) color = LLColor4::orange; - else if (idx==2) color = LLColor4::yellow; - else color = LLColor4::pink2; - } - else if (mImagep->mDontDiscard) - { - color = LLColor4::green4; - } - else if (mImagep->getMaxVirtualSize() <= 0.0f) - { - color = LLColor4::grey; color[VALPHA] = .7f; - } - else - { - color = LLColor4::white; color[VALPHA] = .7f; - } - - // We need to draw: - // The texture UUID or name - // The progress bar for the texture, highlighted if it's being download - // Various numerical stats. - std::string tex_str; - S32 left, right; - S32 top = 0; - S32 bottom = top + 6; - LLColor4 clr; - - LLGLSUIDefault gls_ui; - - // Name, pixel_area, requested pixel area, decode priority - std::string uuid_str; - mImagep->mID.toString(uuid_str); - uuid_str = uuid_str.substr(0,7); - - tex_str = llformat("%s %7.0f %d(%d)", - uuid_str.c_str(), - mImagep->mMaxVirtualSize, - mImagep->mDesiredDiscardLevel, - mImagep->mRequestedDiscardLevel); - - - LLFontGL::getFontMonospace()->renderUTF8(tex_str, 0, title_x1, getRect().getHeight(), - color, LLFontGL::LEFT, LLFontGL::TOP); - - // State - // Hack: mirrored from lltexturefetch.cpp - struct { const std::string desc; LLColor4 color; } fetch_state_desc[] = { - { "---", LLColor4::red }, // INVALID - { "INI", LLColor4::white }, // INIT - { "DSK", LLColor4::cyan }, // LOAD_FROM_TEXTURE_CACHE - { "DSK", LLColor4::blue }, // CACHE_POST - { "NET", LLColor4::green }, // LOAD_FROM_NETWORK - { "HTW", LLColor4::green }, // WAIT_HTTP_RESOURCE - { "HTW", LLColor4::green }, // WAIT_HTTP_RESOURCE2 - { "REQ", LLColor4::yellow },// SEND_HTTP_REQ - { "HTP", LLColor4::green }, // WAIT_HTTP_REQ - { "DEC", LLColor4::yellow },// DECODE_IMAGE - { "DEU", LLColor4::green }, // DECODE_IMAGE_UPDATE - { "WRT", LLColor4::purple },// WRITE_TO_CACHE - { "WWT", LLColor4::orange },// WAIT_ON_WRITE - { "END", LLColor4::red }, // DONE -#define LAST_STATE 14 - { "CRE", LLColor4::magenta }, // LAST_STATE+1 - { "FUL", LLColor4::green }, // LAST_STATE+2 - { "BAD", LLColor4::red }, // LAST_STATE+3 - { "MIS", LLColor4::red }, // LAST_STATE+4 - { "---", LLColor4::white }, // LAST_STATE+5 - }; - const S32 fetch_state_desc_size = (S32)LL_ARRAY_SIZE(fetch_state_desc); - S32 state = - mImagep->mNeedsCreateTexture ? LAST_STATE+1 : - mImagep->mFullyLoaded ? LAST_STATE+2 : - mImagep->mMinDiscardLevel > 0 ? LAST_STATE+3 : - mImagep->mIsMissingAsset ? LAST_STATE+4 : - !mImagep->mIsFetching ? LAST_STATE+5 : - mImagep->mFetchState; - state = llclamp(state,0,fetch_state_desc_size-1); - - LLFontGL::getFontMonospace()->renderUTF8(fetch_state_desc[state].desc, 0, title_x2, getRect().getHeight(), - fetch_state_desc[state].color, - LLFontGL::LEFT, LLFontGL::TOP); - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - - // Draw the progress bar. - S32 bar_width = 100; - S32 bar_left = 260; - left = bar_left; - right = left + bar_width; - - gGL.color4f(0.f, 0.f, 0.f, 0.75f); - gl_rect_2d(left, top, right, bottom); - - F32 data_progress = mImagep->mDownloadProgress; - - if (data_progress > 0.0f) - { - // Downloaded bytes - right = left + llfloor(data_progress * (F32)bar_width); - if (right > left) - { - gGL.color4f(0.f, 0.f, 1.f, 0.75f); - gl_rect_2d(left, top, right, bottom); - } - } - - S32 pip_width = 6; - S32 pip_space = 14; - S32 pip_x = title_x3 + pip_space/2; - - // Draw the packet pip - const F32 pip_max_time = 5.f; - F32 last_event = mImagep->mLastPacketTimer.getElapsedTimeF32(); - if (last_event < pip_max_time) - { - clr = LLColor4::white; - } - else - { - last_event = mImagep->mRequestDeltaTime; - if (last_event < pip_max_time) - { - clr = LLColor4::green; - } - else - { - last_event = mImagep->mFetchDeltaTime; - if (last_event < pip_max_time) - { - clr = LLColor4::yellow; - } - } - } - if (last_event < pip_max_time) - { - clr.setAlpha(1.f - last_event/pip_max_time); - gGL.color4fv(clr.mV); - gl_rect_2d(pip_x, top, pip_x + pip_width, bottom); - } - pip_x += pip_width + pip_space; - - // we don't want to show bind/resident pips for textures using the default texture - if (mImagep->hasGLTexture()) - { - // Draw the bound pip - last_event = mImagep->getTimePassedSinceLastBound(); - if (last_event < 1.f) - { - clr = mImagep->getMissed() ? LLColor4::red : LLColor4::magenta1; - clr.setAlpha(1.f - last_event); - gGL.color4fv(clr.mV); - gl_rect_2d(pip_x, top, pip_x + pip_width, bottom); - } - } - pip_x += pip_width + pip_space; - - - { - LLGLSUIDefault gls_ui; - // draw the packet data -// { -// std::string num_str = llformat("%3d/%3d", mImagep->mLastPacket+1, mImagep->mPackets); -// LLFontGL::getFontMonospace()->renderUTF8(num_str, 0, bar_left + 100, getRect().getHeight(), color, -// LLFontGL::LEFT, LLFontGL::TOP); -// } - - // draw the image size at the end - { - std::string num_str = llformat("%3dx%3d (%2d) %7d", mImagep->getWidth(), mImagep->getHeight(), - mImagep->getDiscardLevel(), mImagep->hasGLTexture() ? mImagep->getTextureMemory().value() : 0); - LLFontGL::getFontMonospace()->renderUTF8(num_str, 0, title_x4, getRect().getHeight(), color, - LLFontGL::LEFT, LLFontGL::TOP); - } - } - -} - -bool LLTextureBar::handleMouseDown(S32 x, S32 y, MASK mask) -{ - if ((mask & (MASK_CONTROL|MASK_SHIFT|MASK_ALT)) == MASK_ALT) - { - LLAppViewer::getTextureFetch()->mDebugID = mImagep->getID(); - return true; - } - return LLView::handleMouseDown(x,y,mask); -} - -LLRect LLTextureBar::getRequiredRect() -{ - LLRect rect; - - rect.mTop = texture_bar_height; - - return rect; -} - -//////////////////////////////////////////////////////////////////////////// - -class LLAvatarTexBar : public LLView -{ -public: - struct Params : public LLInitParam::Block<Params, LLView::Params> - { - Mandatory<LLTextureView*> texture_view; - Params() - : texture_view("texture_view") - { - S32 line_height = LLFontGL::getFontMonospace()->getLineHeight(); - changeDefault(rect, LLRect(0,0,100,line_height * 4)); - } - }; - - LLAvatarTexBar(const Params& p) - : LLView(p), - mTextureView(p.texture_view) - {} - - virtual void draw(); - virtual bool handleMouseDown(S32 x, S32 y, MASK mask); - virtual LLRect getRequiredRect(); // Return the height of this object, given the set options. - -private: - LLTextureView* mTextureView; -}; - -void LLAvatarTexBar::draw() -{ - if (!gSavedSettings.getBOOL("DebugAvatarRezTime")) return; - - LLVOAvatarSelf* avatarp = gAgentAvatarp; - if (!avatarp) return; - - const S32 line_height = LLFontGL::getFontMonospace()->getLineHeight(); - const S32 v_offset = 0; - const S32 l_offset = 3; - - //---------------------------------------------------------------------------- - LLGLSUIDefault gls_ui; - LLColor4 color; - - U32 line_num = 1; - for (LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::BakedTextures::const_iterator baked_iter = LLAvatarAppearance::getDictionary()->getBakedTextures().begin(); - baked_iter != LLAvatarAppearance::getDictionary()->getBakedTextures().end(); - ++baked_iter) - { - const LLAvatarAppearanceDefines::EBakedTextureIndex baked_index = baked_iter->first; - const LLViewerTexLayerSet *layerset = avatarp->debugGetLayerSet(baked_index); - if (!layerset) continue; - const LLViewerTexLayerSetBuffer *layerset_buffer = layerset->getViewerComposite(); - if (!layerset_buffer) continue; - - LLColor4 text_color = LLColor4::white; - - std::string text = layerset_buffer->dumpTextureInfo(); - LLFontGL::getFontMonospace()->renderUTF8(text, 0, l_offset, v_offset + line_height*line_num, - text_color, LLFontGL::LEFT, LLFontGL::TOP); //, LLFontGL::BOLD, LLFontGL::DROP_SHADOW_SOFT); - line_num++; - } - const U32 texture_timeout = gSavedSettings.getU32("AvatarBakedTextureUploadTimeout"); - const U32 override_tex_discard_level = gSavedSettings.getU32("TextureDiscardLevel"); - - LLColor4 header_color(1.f, 1.f, 1.f, 0.9f); - - const std::string texture_timeout_str = texture_timeout ? llformat("%d",texture_timeout) : "Disabled"; - const std::string override_tex_discard_level_str = override_tex_discard_level ? llformat("%d",override_tex_discard_level) : "Disabled"; - std::string header_text = llformat("[ Timeout('AvatarBakedTextureUploadTimeout'):%s ] [ LOD_Override('TextureDiscardLevel'):%s ]", texture_timeout_str.c_str(), override_tex_discard_level_str.c_str()); - LLFontGL::getFontMonospace()->renderUTF8(header_text, 0, l_offset, v_offset + line_height*line_num, - header_color, LLFontGL::LEFT, LLFontGL::TOP); //, LLFontGL::BOLD, LLFontGL::DROP_SHADOW_SOFT); - line_num++; - std::string section_text = "Avatar Textures Information:"; - LLFontGL::getFontMonospace()->renderUTF8(section_text, 0, 0, v_offset + line_height*line_num, - header_color, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::BOLD, LLFontGL::DROP_SHADOW_SOFT); -} - -bool LLAvatarTexBar::handleMouseDown(S32 x, S32 y, MASK mask) -{ - return false; -} - -LLRect LLAvatarTexBar::getRequiredRect() -{ - LLRect rect; - rect.mTop = 100; - if (!gSavedSettings.getBOOL("DebugAvatarRezTime")) rect.mTop = 0; - return rect; -} - -//////////////////////////////////////////////////////////////////////////// - -class LLGLTexMemBar : public LLView -{ -public: - struct Params : public LLInitParam::Block<Params, LLView::Params> - { - Mandatory<LLTextureView*> texture_view; - Params() - : texture_view("texture_view") - { - S32 line_height = LLFontGL::getFontMonospace()->getLineHeight(); - changeDefault(rect, LLRect(0,0,100,line_height * 4)); - } - }; - - LLGLTexMemBar(const Params& p) - : LLView(p), - mTextureView(p.texture_view) - {} - - virtual void draw(); - virtual bool handleMouseDown(S32 x, S32 y, MASK mask); - virtual LLRect getRequiredRect(); // Return the height of this object, given the set options. - -private: - LLTextureView* mTextureView; -}; - -void LLGLTexMemBar::draw() -{ - F32 discard_bias = LLViewerTexture::sDesiredDiscardBias; - F32 cache_usage = LLAppViewer::getTextureCache()->getUsage().valueInUnits<LLUnits::Megabytes>(); - F32 cache_max_usage = LLAppViewer::getTextureCache()->getMaxUsage().valueInUnits<LLUnits::Megabytes>(); - S32 line_height = LLFontGL::getFontMonospace()->getLineHeight(); - S32 v_offset = 0;//(S32)((texture_bar_height + 2.2f) * mTextureView->mNumTextureBars + 2.0f); - F32Bytes total_texture_downloaded = gTotalTextureData; - F32Bytes total_object_downloaded = gTotalObjectData; - U32 total_http_requests = LLAppViewer::getTextureFetch()->getTotalNumHTTPRequests(); - U32 total_active_cached_objects = LLWorld::getInstance()->getNumOfActiveCachedObjects(); - U32 total_objects = gObjectList.getNumObjects(); - F32 x_right = 0.0; - - //---------------------------------------------------------------------------- - LLGLSUIDefault gls_ui; - LLColor4 text_color(1.f, 1.f, 1.f, 0.75f); - LLColor4 color; - - // Gray background using completely magic numbers - gGL.color4f(0.f, 0.f, 0.f, 0.25f); - // const LLRect & rect(getRect()); - // gl_rect_2d(-4, v_offset, rect.mRight - rect.mLeft + 2, v_offset + line_height*4); - - std::string text = ""; - LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*6, - text_color, LLFontGL::LEFT, LLFontGL::TOP); - - LLTrace::Recording& recording = LLViewerStats::instance().getRecording(); - - F64 cacheHits = recording.getSampleCount(LLTextureFetch::sCacheHit); - F64 cacheAttempts = recording.getSampleCount(LLTextureFetch::sCacheAttempt); - - F32 cacheHitRate = (cacheAttempts > 0.0) ? F32((cacheHits / cacheAttempts) * 100.0f) : 0.0f; - - U32 cacheReadLatMin = U32(recording.getMin(LLTextureFetch::sCacheReadLatency).value() * 1000.0f); - U32 cacheReadLatMed = U32(recording.getMean(LLTextureFetch::sCacheReadLatency).value() * 1000.0f); - U32 cacheReadLatMax = U32(recording.getMax(LLTextureFetch::sCacheReadLatency).value() * 1000.0f); - - U32 texDecodeLatMin = U32(recording.getMin(LLTextureFetch::sTexDecodeLatency).value() * 1000.0f); - U32 texDecodeLatMed = U32(recording.getMean(LLTextureFetch::sTexDecodeLatency).value() * 1000.0f); - U32 texDecodeLatMax = U32(recording.getMax(LLTextureFetch::sTexDecodeLatency).value() * 1000.0f); - - U32 texFetchLatMin = U32(recording.getMin(LLTextureFetch::sTexFetchLatency).value() * 1000.0f); - U32 texFetchLatMed = U32(recording.getMean(LLTextureFetch::sTexFetchLatency).value() * 1000.0f); - U32 texFetchLatMax = U32(recording.getMax(LLTextureFetch::sTexFetchLatency).value() * 1000.0f); - - text = llformat("Est. Free: %d MB Sys Free: %d MB FBO: %d MB Bias: %.2f Cache: %.1f/%.1f MB", - (S32)LLViewerTexture::sFreeVRAMMegabytes, - LLMemory::getAvailableMemKB()/1024, - LLRenderTarget::sBytesAllocated/(1024*1024), - discard_bias, - cache_usage, - cache_max_usage); - //, cache_entries, cache_max_entries - - LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*6, - text_color, LLFontGL::LEFT, LLFontGL::TOP); - - U32 cache_read(0U), cache_write(0U), res_wait(0U); - LLAppViewer::getTextureFetch()->getStateStats(&cache_read, &cache_write, &res_wait); - - text = llformat("Net Tot Tex: %.1f MB Tot Obj: %.1f MB #Objs/#Cached: %d/%d Tot Htp: %d Cread: %u Cwrite: %u Rwait: %u", - total_texture_downloaded.valueInUnits<LLUnits::Megabytes>(), - total_object_downloaded.valueInUnits<LLUnits::Megabytes>(), - total_objects, - total_active_cached_objects, - total_http_requests, - cache_read, - cache_write, - res_wait); - - LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*5, - text_color, LLFontGL::LEFT, LLFontGL::TOP); - - text = llformat("CacheHitRate: %3.2f Read: %d/%d/%d Decode: %d/%d/%d Fetch: %d/%d/%d", - cacheHitRate, - cacheReadLatMin, - cacheReadLatMed, - cacheReadLatMax, - texDecodeLatMin, - texDecodeLatMed, - texDecodeLatMax, - texFetchLatMin, - texFetchLatMed, - texFetchLatMax); - - LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*4, - text_color, LLFontGL::LEFT, LLFontGL::TOP); - - //---------------------------------------------------------------------------- - - text = llformat("Textures: %d Fetch: %d(%d) Pkts:%d(%d) Cache R/W: %d/%d LFS:%d RAW:%d HTP:%d DEC:%d CRE:%d ", - gTextureList.getNumImages(), - LLAppViewer::getTextureFetch()->getNumRequests(), LLAppViewer::getTextureFetch()->getNumDeletes(), - LLAppViewer::getTextureFetch()->mPacketCount, LLAppViewer::getTextureFetch()->mBadPacketCount, - LLAppViewer::getTextureCache()->getNumReads(), LLAppViewer::getTextureCache()->getNumWrites(), - LLLFSThread::sLocal->getPending(), - LLImageRaw::sRawImageCount, - LLAppViewer::getTextureFetch()->getNumHTTPRequests(), - LLAppViewer::getImageDecodeThread()->getPending(), - gTextureList.mCreateTextureList.size()); - - x_right = 550.0; - LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*3, - text_color, LLFontGL::LEFT, LLFontGL::TOP, - LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, &x_right); - - F32Kilobits bandwidth(LLAppViewer::getTextureFetch()->getTextureBandwidth()); - F32Kilobits max_bandwidth(gSavedSettings.getF32("ThrottleBandwidthKBPS")); - color = bandwidth > max_bandwidth ? LLColor4::red : bandwidth > max_bandwidth*.75f ? LLColor4::yellow : text_color; - color[VALPHA] = text_color[VALPHA]; - text = llformat("BW:%.0f/%.0f",bandwidth.value(), max_bandwidth.value()); - LLFontGL::getFontMonospace()->renderUTF8(text, 0, x_right, v_offset + line_height*3, - color, LLFontGL::LEFT, LLFontGL::TOP); - - // Mesh status line - text = llformat("Mesh: Reqs(Tot/Htp/Big): %u/%u/%u Rtr/Err: %u/%u Cread/Cwrite: %u/%u Low/At/High: %d/%d/%d", - LLMeshRepository::sMeshRequestCount, LLMeshRepository::sHTTPRequestCount, LLMeshRepository::sHTTPLargeRequestCount, - LLMeshRepository::sHTTPRetryCount, LLMeshRepository::sHTTPErrorCount, - LLMeshRepository::sCacheReads, LLMeshRepository::sCacheWrites, - LLMeshRepoThread::sRequestLowWater, LLMeshRepoThread::sRequestWaterLevel, LLMeshRepoThread::sRequestHighWater); - LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*2, - text_color, LLFontGL::LEFT, LLFontGL::TOP); - - // Header for texture table columns - S32 dx1 = 0; - if (LLAppViewer::getTextureFetch()->mDebugPause) - { - LLFontGL::getFontMonospace()->renderUTF8(std::string("!"), 0, title_x1, v_offset + line_height, - text_color, LLFontGL::LEFT, LLFontGL::TOP); - dx1 += 8; - } - if (mTextureView->mFreezeView) - { - LLFontGL::getFontMonospace()->renderUTF8(std::string("*"), 0, title_x1, v_offset + line_height, - text_color, LLFontGL::LEFT, LLFontGL::TOP); - dx1 += 8; - } - if (mTextureView->mOrderFetch) - { - LLFontGL::getFontMonospace()->renderUTF8(title_string1b, 0, title_x1+dx1, v_offset + line_height, - text_color, LLFontGL::LEFT, LLFontGL::TOP); - } - else - { - LLFontGL::getFontMonospace()->renderUTF8(title_string1a, 0, title_x1+dx1, v_offset + line_height, - text_color, LLFontGL::LEFT, LLFontGL::TOP); - } - - LLFontGL::getFontMonospace()->renderUTF8(title_string2, 0, title_x2, v_offset + line_height, - text_color, LLFontGL::LEFT, LLFontGL::TOP); - - LLFontGL::getFontMonospace()->renderUTF8(title_string3, 0, title_x3, v_offset + line_height, - text_color, LLFontGL::LEFT, LLFontGL::TOP); - - LLFontGL::getFontMonospace()->renderUTF8(title_string4, 0, title_x4, v_offset + line_height, - text_color, LLFontGL::LEFT, LLFontGL::TOP); -} - -bool LLGLTexMemBar::handleMouseDown(S32 x, S32 y, MASK mask) -{ - return false; -} - -LLRect LLGLTexMemBar::getRequiredRect() -{ - LLRect rect; - rect.mTop = 78; //LLFontGL::getFontMonospace()->getLineHeight() * 6; - return rect; -} - -//////////////////////////////////////////////////////////////////////////// -class LLGLTexSizeBar -{ -public: - LLGLTexSizeBar(S32 index, S32 left, S32 bottom, S32 right, S32 line_height) - { - mIndex = index ; - mLeft = left ; - mBottom = bottom ; - mRight = right ; - mLineHeight = line_height ; - mTopLoaded = 0 ; - mTopBound = 0 ; - mScale = 1.0f ; - } - - void setTop(S32 loaded, S32 bound, F32 scale) {mTopLoaded = loaded ; mTopBound = bound; mScale = scale ;} - - void draw(); - bool handleHover(S32 x, S32 y, MASK mask, bool set_pick_size) ; - -private: - S32 mIndex ; - S32 mLeft ; - S32 mBottom ; - S32 mRight ; - S32 mTopLoaded ; - S32 mTopBound ; - S32 mLineHeight ; - F32 mScale ; -}; - -bool LLGLTexSizeBar::handleHover(S32 x, S32 y, MASK mask, bool set_pick_size) -{ - if(y > mBottom && (y < mBottom + (S32)(mTopLoaded * mScale) || y < mBottom + (S32)(mTopBound * mScale))) - { - LLImageGL::setCurTexSizebar(mIndex, set_pick_size); - } - return true ; -} -void LLGLTexSizeBar::draw() -{ - LLGLSUIDefault gls_ui; - - if(LLImageGL::sCurTexSizeBar == mIndex) - { - LLColor4 text_color(1.f, 1.f, 1.f, 0.75f); - std::string text; - - text = llformat("%d", mTopLoaded) ; - LLFontGL::getFontMonospace()->renderUTF8(text, 0, mLeft, mBottom + (S32)(mTopLoaded * mScale) + mLineHeight, - text_color, LLFontGL::LEFT, LLFontGL::TOP); - - text = llformat("%d", mTopBound) ; - LLFontGL::getFontMonospace()->renderUTF8(text, 0, (mLeft + mRight) / 2, mBottom + (S32)(mTopBound * mScale) + mLineHeight, - text_color, LLFontGL::LEFT, LLFontGL::TOP); - } - - LLColor4 loaded_color(1.0f, 0.0f, 0.0f, 0.75f); - LLColor4 bound_color(1.0f, 1.0f, 0.0f, 0.75f); - gl_rect_2d(mLeft, mBottom + (S32)(mTopLoaded * mScale), (mLeft + mRight) / 2, mBottom, loaded_color) ; - gl_rect_2d((mLeft + mRight) / 2, mBottom + (S32)(mTopBound * mScale), mRight, mBottom, bound_color) ; -} -//////////////////////////////////////////////////////////////////////////// - -LLTextureView::LLTextureView(const LLTextureView::Params& p) - : LLContainerView(p), - mFreezeView(false), - mOrderFetch(false), - mPrintList(false), - mNumTextureBars(0) -{ - setVisible(false); - - setDisplayChildren(true); - mGLTexMemBar = 0; - mAvatarTexBar = 0; -} - -LLTextureView::~LLTextureView() -{ - // Children all cleaned up by default view destructor. - delete mGLTexMemBar; - mGLTexMemBar = 0; - - delete mAvatarTexBar; - mAvatarTexBar = 0; -} - -typedef std::pair<F32,LLViewerFetchedTexture*> decode_pair_t; -struct compare_decode_pair -{ - bool operator()(const decode_pair_t& a, const decode_pair_t& b) const - { - return a.first > b.first; - } -}; - -struct KillView -{ - void operator()(LLView* viewp) - { - viewp->getParent()->removeChild(viewp); - viewp->die(); - } -}; - -void LLTextureView::draw() -{ - if (!mFreezeView) - { -// LLViewerObject *objectp; -// S32 te; - - for_each(mTextureBars.begin(), mTextureBars.end(), KillView()); - mTextureBars.clear(); - - if (mGLTexMemBar) - { - removeChild(mGLTexMemBar); - mGLTexMemBar->die(); - mGLTexMemBar = 0; - } - - if (mAvatarTexBar) - { - removeChild(mAvatarTexBar); - mAvatarTexBar->die(); - mAvatarTexBar = 0; - } - - typedef std::multiset<decode_pair_t, compare_decode_pair > display_list_t; - display_list_t display_image_list; - - if (mPrintList) - { - LL_INFOS() << "ID\tMEM\tBOOST\tPRI\tWIDTH\tHEIGHT\tDISCARD" << LL_ENDL; - } - - for (LLViewerTextureList::image_priority_list_t::iterator iter = gTextureList.mImageList.begin(); - iter != gTextureList.mImageList.end(); ) - { - LLPointer<LLViewerFetchedTexture> imagep = *iter++; - if(!imagep->hasFetcher()) - { - continue ; - } - - S32 cur_discard = imagep->getDiscardLevel(); - S32 desired_discard = imagep->mDesiredDiscardLevel; - - if (mPrintList) - { - S32 tex_mem = imagep->hasGLTexture() ? imagep->getTextureMemory().value() : 0 ; - LL_INFOS() << imagep->getID() - << "\t" << tex_mem - << "\t" << imagep->getBoostLevel() - << "\t" << imagep->getMaxVirtualSize() - << "\t" << imagep->getWidth() - << "\t" << imagep->getHeight() - << "\t" << cur_discard - << LL_ENDL; - } - - if (imagep->getID() == LLAppViewer::getTextureFetch()->mDebugID) - { -// static S32 debug_count = 0; -// ++debug_count; // for breakpoints - } - - F32 pri; - if (mOrderFetch) - { - pri = ((F32)imagep->mFetchPriority)/256.f; - } - else - { - pri = imagep->getMaxVirtualSize(); - } - pri = llclamp(pri, 0.0f, HIGH_PRIORITY-1.f); - - if (sDebugImages.find(imagep) != sDebugImages.end()) - { - pri += 4*HIGH_PRIORITY; - } - - if (!mOrderFetch) - { - if (pri < HIGH_PRIORITY && LLSelectMgr::getInstance()) - { - struct f : public LLSelectedTEFunctor - { - LLViewerFetchedTexture* mImage; - f(LLViewerFetchedTexture* image) : mImage(image) {} - virtual bool apply(LLViewerObject* object, S32 te) - { - return (mImage == object->getTEImage(te)); - } - } func(imagep); - const bool firstonly = true; - bool match = LLSelectMgr::getInstance()->getSelection()->applyToTEs(&func, firstonly); - if (match) - { - pri += 3*HIGH_PRIORITY; - } - } - - if (pri < HIGH_PRIORITY && (cur_discard< 0 || desired_discard < cur_discard)) - { - LLSelectNode* hover_node = LLSelectMgr::instance().getHoverNode(); - if (hover_node) - { - LLViewerObject *objectp = hover_node->getObject(); - if (objectp) - { - S32 tex_count = objectp->getNumTEs(); - for (S32 i = 0; i < tex_count; i++) - { - if (imagep == objectp->getTEImage(i)) - { - pri += 2*HIGH_PRIORITY; - break; - } - } - } - } - } - - if (pri > 0.f && pri < HIGH_PRIORITY) - { - if (imagep->mLastPacketTimer.getElapsedTimeF32() < 1.f || - imagep->mFetchDeltaTime < 0.25f) - { - pri += 1*HIGH_PRIORITY; - } - } - } - - if (pri > 0.0f) - { - display_image_list.insert(std::make_pair(pri, imagep)); - } - } - - if (mPrintList) - { - mPrintList = false; - } - - static S32 max_count = 50; - S32 count = 0; - mNumTextureBars = 0 ; - for (display_list_t::iterator iter = display_image_list.begin(); - iter != display_image_list.end(); iter++) - { - LLViewerFetchedTexture* imagep = iter->second; - S32 hilite = 0; - F32 pri = iter->first; - if (pri >= 1 * HIGH_PRIORITY) - { - hilite = (S32)((pri+1) / HIGH_PRIORITY) - 1; - } - if ((hilite || count < max_count-10) && (count < max_count)) - { - if (addBar(imagep, hilite)) - { - count++; - } - } - } - - if (mOrderFetch) - sortChildren(LLTextureBar::sort_fetch()); - else - sortChildren(LLTextureBar::sort()); - - LLGLTexMemBar::Params tmbp; - LLRect tmbr; - tmbp.name("gl texmem bar"); - tmbp.rect(tmbr); - tmbp.follows.flags = FOLLOWS_LEFT|FOLLOWS_TOP; - tmbp.texture_view(this); - mGLTexMemBar = LLUICtrlFactory::create<LLGLTexMemBar>(tmbp); - addChild(mGLTexMemBar); - sendChildToFront(mGLTexMemBar); - - LLAvatarTexBar::Params atbp; - LLRect atbr; - atbp.name("gl avatartex bar"); - atbp.texture_view(this); - atbp.rect(atbr); - mAvatarTexBar = LLUICtrlFactory::create<LLAvatarTexBar>(atbp); - addChild(mAvatarTexBar); - sendChildToFront(mAvatarTexBar); - - reshape(getRect().getWidth(), getRect().getHeight(), true); - - LLUI::popMatrix(); - LLUI::pushMatrix(); - LLUI::translate((F32)getRect().mLeft, (F32)getRect().mBottom); - - for (child_list_const_iter_t child_iter = getChildList()->begin(); - child_iter != getChildList()->end(); ++child_iter) - { - LLView *viewp = *child_iter; - if (viewp->getRect().mBottom < 0) - { - viewp->setVisible(false); - } - } - } - - LLContainerView::draw(); - -} - -bool LLTextureView::addBar(LLViewerFetchedTexture *imagep, S32 hilite) -{ - llassert(imagep); - - LLTextureBar *barp; - LLRect r; - - mNumTextureBars++; - - LLTextureBar::Params tbp; - tbp.name("texture bar"); - tbp.rect(r); - tbp.texture_view(this); - barp = LLUICtrlFactory::create<LLTextureBar>(tbp); - barp->mImagep = imagep; - barp->mHilite = hilite; - - addChild(barp); - mTextureBars.push_back(barp); - - return true; -} - -bool LLTextureView::handleMouseDown(S32 x, S32 y, MASK mask) -{ - if ((mask & (MASK_CONTROL|MASK_SHIFT|MASK_ALT)) == (MASK_ALT|MASK_SHIFT)) - { - mPrintList = true; - return true; - } - if ((mask & (MASK_CONTROL|MASK_SHIFT|MASK_ALT)) == (MASK_CONTROL|MASK_SHIFT)) - { - LLAppViewer::getTextureFetch()->mDebugPause = !LLAppViewer::getTextureFetch()->mDebugPause; - return true; - } - if (mask & MASK_SHIFT) - { - mFreezeView = !mFreezeView; - return true; - } - if (mask & MASK_CONTROL) - { - mOrderFetch = !mOrderFetch; - return true; - } - return LLView::handleMouseDown(x,y,mask); -} - -bool LLTextureView::handleMouseUp(S32 x, S32 y, MASK mask) -{ - return false; -} - -bool LLTextureView::handleKey(KEY key, MASK mask, bool called_from_parent) -{ - return false; -} - - +/**
+ * @file lltextureview.cpp
+ * @brief LLTextureView class implementation
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2012-2013, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include <set>
+
+#include "lltextureview.h"
+
+#include "llrect.h"
+#include "llerror.h"
+#include "lllfsthread.h"
+#include "llui.h"
+#include "llimageworker.h"
+#include "llrender.h"
+
+#include "lltooltip.h"
+#include "llappviewer.h"
+#include "llmeshrepository.h"
+#include "llselectmgr.h"
+#include "llviewertexlayer.h"
+#include "lltexturecache.h"
+#include "lltexturefetch.h"
+#include "llviewercontrol.h"
+#include "llviewerobject.h"
+#include "llviewerobjectlist.h"
+#include "llviewertexture.h"
+#include "llviewertexturelist.h"
+#include "llviewerwindow.h"
+#include "llwindow.h"
+#include "llvovolume.h"
+#include "llviewerstats.h"
+#include "llworld.h"
+
+// For avatar texture view
+#include "llvoavatarself.h"
+#include "lltexlayer.h"
+
+extern F32 texmem_lower_bound_scale;
+
+LLTextureView *gTextureView = NULL;
+
+#define HIGH_PRIORITY 100000000.f
+
+//static
+std::set<LLViewerFetchedTexture*> LLTextureView::sDebugImages;
+
+////////////////////////////////////////////////////////////////////////////
+
+static std::string title_string1a("Tex UUID Area DDis(Req) DecodePri(Fetch) [download] pk/max");
+static std::string title_string1b("Tex UUID Area DDis(Req) Fetch(DecodePri) [download] pk/max");
+static std::string title_string2("State");
+static std::string title_string3("Pkt Bnd");
+static std::string title_string4(" W x H (Dis) Mem");
+
+static S32 title_x1 = 0;
+static S32 title_x2 = 460;
+static S32 title_x3 = title_x2 + 40;
+static S32 title_x4 = title_x3 + 46;
+static S32 texture_bar_height = 8;
+
+////////////////////////////////////////////////////////////////////////////
+
+class LLTextureBar : public LLView
+{
+public:
+ LLPointer<LLViewerFetchedTexture> mImagep;
+ S32 mHilite;
+
+public:
+ struct Params : public LLInitParam::Block<Params, LLView::Params>
+ {
+ Mandatory<LLTextureView*> texture_view;
+ Params()
+ : texture_view("texture_view")
+ {
+ changeDefault(mouse_opaque, false);
+ }
+ };
+ LLTextureBar(const Params& p)
+ : LLView(p),
+ mHilite(0),
+ mTextureView(p.texture_view)
+ {}
+
+ virtual void draw();
+ virtual bool handleMouseDown(S32 x, S32 y, MASK mask);
+ virtual LLRect getRequiredRect(); // Return the height of this object, given the set options.
+
+// Used for sorting
+ struct sort
+ {
+ bool operator()(const LLView* i1, const LLView* i2)
+ {
+ LLTextureBar* bar1p = (LLTextureBar*)i1;
+ LLTextureBar* bar2p = (LLTextureBar*)i2;
+ LLViewerFetchedTexture *i1p = bar1p->mImagep;
+ LLViewerFetchedTexture *i2p = bar2p->mImagep;
+ F32 pri1 = i1p->getMaxVirtualSize();
+ F32 pri2 = i2p->getMaxVirtualSize();
+ if (pri1 > pri2)
+ return true;
+ else if (pri2 > pri1)
+ return false;
+ else
+ return i1p->getID() < i2p->getID();
+ }
+ };
+
+ struct sort_fetch
+ {
+ bool operator()(const LLView* i1, const LLView* i2)
+ {
+ LLTextureBar* bar1p = (LLTextureBar*)i1;
+ LLTextureBar* bar2p = (LLTextureBar*)i2;
+ LLViewerFetchedTexture *i1p = bar1p->mImagep;
+ LLViewerFetchedTexture *i2p = bar2p->mImagep;
+ U32 pri1 = i1p->getFetchPriority() ;
+ U32 pri2 = i2p->getFetchPriority() ;
+ if (pri1 > pri2)
+ return true;
+ else if (pri2 > pri1)
+ return false;
+ else
+ return i1p->getID() < i2p->getID();
+ }
+ };
+private:
+ LLTextureView* mTextureView;
+};
+
+void LLTextureBar::draw()
+{
+ if (!mImagep)
+ {
+ return;
+ }
+
+ LLColor4 color;
+ if (mImagep->getID() == LLAppViewer::getTextureFetch()->mDebugID)
+ {
+ color = LLColor4::cyan2;
+ }
+ else if (mHilite)
+ {
+ S32 idx = llclamp(mHilite,1,3);
+ if (idx==1) color = LLColor4::orange;
+ else if (idx==2) color = LLColor4::yellow;
+ else color = LLColor4::pink2;
+ }
+ else if (mImagep->mDontDiscard)
+ {
+ color = LLColor4::green4;
+ }
+ else if (mImagep->getMaxVirtualSize() <= 0.0f)
+ {
+ color = LLColor4::grey; color[VALPHA] = .7f;
+ }
+ else
+ {
+ color = LLColor4::white; color[VALPHA] = .7f;
+ }
+
+ // We need to draw:
+ // The texture UUID or name
+ // The progress bar for the texture, highlighted if it's being download
+ // Various numerical stats.
+ std::string tex_str;
+ S32 left, right;
+ S32 top = 0;
+ S32 bottom = top + 6;
+ LLColor4 clr;
+
+ LLGLSUIDefault gls_ui;
+
+ // Name, pixel_area, requested pixel area, decode priority
+ std::string uuid_str;
+ mImagep->mID.toString(uuid_str);
+ uuid_str = uuid_str.substr(0,7);
+
+ tex_str = llformat("%s %7.0f %d(%d)",
+ uuid_str.c_str(),
+ mImagep->mMaxVirtualSize,
+ mImagep->mDesiredDiscardLevel,
+ mImagep->mRequestedDiscardLevel);
+
+
+ LLFontGL::getFontMonospace()->renderUTF8(tex_str, 0, title_x1, getRect().getHeight(),
+ color, LLFontGL::LEFT, LLFontGL::TOP);
+
+ // State
+ // Hack: mirrored from lltexturefetch.cpp
+ struct { const std::string desc; LLColor4 color; } fetch_state_desc[] = {
+ { "---", LLColor4::red }, // INVALID
+ { "INI", LLColor4::white }, // INIT
+ { "DSK", LLColor4::cyan }, // LOAD_FROM_TEXTURE_CACHE
+ { "DSK", LLColor4::blue }, // CACHE_POST
+ { "NET", LLColor4::green }, // LOAD_FROM_NETWORK
+ { "HTW", LLColor4::green }, // WAIT_HTTP_RESOURCE
+ { "HTW", LLColor4::green }, // WAIT_HTTP_RESOURCE2
+ { "REQ", LLColor4::yellow },// SEND_HTTP_REQ
+ { "HTP", LLColor4::green }, // WAIT_HTTP_REQ
+ { "DEC", LLColor4::yellow },// DECODE_IMAGE
+ { "DEU", LLColor4::green }, // DECODE_IMAGE_UPDATE
+ { "WRT", LLColor4::purple },// WRITE_TO_CACHE
+ { "WWT", LLColor4::orange },// WAIT_ON_WRITE
+ { "END", LLColor4::red }, // DONE
+#define LAST_STATE 14
+ { "CRE", LLColor4::magenta }, // LAST_STATE+1
+ { "FUL", LLColor4::green }, // LAST_STATE+2
+ { "BAD", LLColor4::red }, // LAST_STATE+3
+ { "MIS", LLColor4::red }, // LAST_STATE+4
+ { "---", LLColor4::white }, // LAST_STATE+5
+ };
+ const S32 fetch_state_desc_size = (S32)LL_ARRAY_SIZE(fetch_state_desc);
+ S32 state =
+ mImagep->mNeedsCreateTexture ? LAST_STATE+1 :
+ mImagep->mFullyLoaded ? LAST_STATE+2 :
+ mImagep->mMinDiscardLevel > 0 ? LAST_STATE+3 :
+ mImagep->mIsMissingAsset ? LAST_STATE+4 :
+ !mImagep->mIsFetching ? LAST_STATE+5 :
+ mImagep->mFetchState;
+ state = llclamp(state,0,fetch_state_desc_size-1);
+
+ LLFontGL::getFontMonospace()->renderUTF8(fetch_state_desc[state].desc, 0, title_x2, getRect().getHeight(),
+ fetch_state_desc[state].color,
+ LLFontGL::LEFT, LLFontGL::TOP);
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+
+ // Draw the progress bar.
+ S32 bar_width = 100;
+ S32 bar_left = 260;
+ left = bar_left;
+ right = left + bar_width;
+
+ gGL.color4f(0.f, 0.f, 0.f, 0.75f);
+ gl_rect_2d(left, top, right, bottom);
+
+ F32 data_progress = mImagep->mDownloadProgress;
+
+ if (data_progress > 0.0f)
+ {
+ // Downloaded bytes
+ right = left + llfloor(data_progress * (F32)bar_width);
+ if (right > left)
+ {
+ gGL.color4f(0.f, 0.f, 1.f, 0.75f);
+ gl_rect_2d(left, top, right, bottom);
+ }
+ }
+
+ S32 pip_width = 6;
+ S32 pip_space = 14;
+ S32 pip_x = title_x3 + pip_space/2;
+
+ // Draw the packet pip
+ const F32 pip_max_time = 5.f;
+ F32 last_event = mImagep->mLastPacketTimer.getElapsedTimeF32();
+ if (last_event < pip_max_time)
+ {
+ clr = LLColor4::white;
+ }
+ else
+ {
+ last_event = mImagep->mRequestDeltaTime;
+ if (last_event < pip_max_time)
+ {
+ clr = LLColor4::green;
+ }
+ else
+ {
+ last_event = mImagep->mFetchDeltaTime;
+ if (last_event < pip_max_time)
+ {
+ clr = LLColor4::yellow;
+ }
+ }
+ }
+ if (last_event < pip_max_time)
+ {
+ clr.setAlpha(1.f - last_event/pip_max_time);
+ gGL.color4fv(clr.mV);
+ gl_rect_2d(pip_x, top, pip_x + pip_width, bottom);
+ }
+ pip_x += pip_width + pip_space;
+
+ // we don't want to show bind/resident pips for textures using the default texture
+ if (mImagep->hasGLTexture())
+ {
+ // Draw the bound pip
+ last_event = mImagep->getTimePassedSinceLastBound();
+ if (last_event < 1.f)
+ {
+ clr = mImagep->getMissed() ? LLColor4::red : LLColor4::magenta1;
+ clr.setAlpha(1.f - last_event);
+ gGL.color4fv(clr.mV);
+ gl_rect_2d(pip_x, top, pip_x + pip_width, bottom);
+ }
+ }
+ pip_x += pip_width + pip_space;
+
+
+ {
+ LLGLSUIDefault gls_ui;
+ // draw the packet data
+// {
+// std::string num_str = llformat("%3d/%3d", mImagep->mLastPacket+1, mImagep->mPackets);
+// LLFontGL::getFontMonospace()->renderUTF8(num_str, 0, bar_left + 100, getRect().getHeight(), color,
+// LLFontGL::LEFT, LLFontGL::TOP);
+// }
+
+ // draw the image size at the end
+ {
+ std::string num_str = llformat("%3dx%3d (%2d) %7d", mImagep->getWidth(), mImagep->getHeight(),
+ mImagep->getDiscardLevel(), mImagep->hasGLTexture() ? mImagep->getTextureMemory().value() : 0);
+ LLFontGL::getFontMonospace()->renderUTF8(num_str, 0, title_x4, getRect().getHeight(), color,
+ LLFontGL::LEFT, LLFontGL::TOP);
+ }
+ }
+
+}
+
+bool LLTextureBar::handleMouseDown(S32 x, S32 y, MASK mask)
+{
+ if ((mask & (MASK_CONTROL|MASK_SHIFT|MASK_ALT)) == MASK_ALT)
+ {
+ LLAppViewer::getTextureFetch()->mDebugID = mImagep->getID();
+ return true;
+ }
+ return LLView::handleMouseDown(x,y,mask);
+}
+
+LLRect LLTextureBar::getRequiredRect()
+{
+ LLRect rect;
+
+ rect.mTop = texture_bar_height;
+
+ return rect;
+}
+
+////////////////////////////////////////////////////////////////////////////
+
+class LLAvatarTexBar : public LLView
+{
+public:
+ struct Params : public LLInitParam::Block<Params, LLView::Params>
+ {
+ Mandatory<LLTextureView*> texture_view;
+ Params()
+ : texture_view("texture_view")
+ {
+ S32 line_height = LLFontGL::getFontMonospace()->getLineHeight();
+ changeDefault(rect, LLRect(0,0,100,line_height * 4));
+ }
+ };
+
+ LLAvatarTexBar(const Params& p)
+ : LLView(p),
+ mTextureView(p.texture_view)
+ {}
+
+ virtual void draw();
+ virtual bool handleMouseDown(S32 x, S32 y, MASK mask);
+ virtual LLRect getRequiredRect(); // Return the height of this object, given the set options.
+
+private:
+ LLTextureView* mTextureView;
+};
+
+void LLAvatarTexBar::draw()
+{
+ if (!gSavedSettings.getBOOL("DebugAvatarRezTime")) return;
+
+ LLVOAvatarSelf* avatarp = gAgentAvatarp;
+ if (!avatarp) return;
+
+ const S32 line_height = LLFontGL::getFontMonospace()->getLineHeight();
+ const S32 v_offset = 0;
+ const S32 l_offset = 3;
+
+ //----------------------------------------------------------------------------
+ LLGLSUIDefault gls_ui;
+ LLColor4 color;
+
+ U32 line_num = 1;
+ for (LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::BakedTextures::const_iterator baked_iter = LLAvatarAppearance::getDictionary()->getBakedTextures().begin();
+ baked_iter != LLAvatarAppearance::getDictionary()->getBakedTextures().end();
+ ++baked_iter)
+ {
+ const LLAvatarAppearanceDefines::EBakedTextureIndex baked_index = baked_iter->first;
+ const LLViewerTexLayerSet *layerset = avatarp->debugGetLayerSet(baked_index);
+ if (!layerset) continue;
+ const LLViewerTexLayerSetBuffer *layerset_buffer = layerset->getViewerComposite();
+ if (!layerset_buffer) continue;
+
+ LLColor4 text_color = LLColor4::white;
+
+ std::string text = layerset_buffer->dumpTextureInfo();
+ LLFontGL::getFontMonospace()->renderUTF8(text, 0, l_offset, v_offset + line_height*line_num,
+ text_color, LLFontGL::LEFT, LLFontGL::TOP); //, LLFontGL::BOLD, LLFontGL::DROP_SHADOW_SOFT);
+ line_num++;
+ }
+ const U32 override_tex_discard_level = gSavedSettings.getU32("TextureDiscardLevel");
+
+ LLColor4 header_color(1.f, 1.f, 1.f, 0.9f);
+
+ const std::string override_tex_discard_level_str = override_tex_discard_level ? llformat("%d",override_tex_discard_level) : "Disabled";
+ std::string header_text = llformat("[ Timeout:60 ] [ LOD_Override('TextureDiscardLevel'):%s ]", override_tex_discard_level_str.c_str());
+ LLFontGL::getFontMonospace()->renderUTF8(header_text, 0, l_offset, v_offset + line_height*line_num,
+ header_color, LLFontGL::LEFT, LLFontGL::TOP); //, LLFontGL::BOLD, LLFontGL::DROP_SHADOW_SOFT);
+ line_num++;
+ std::string section_text = "Avatar Textures Information:";
+ LLFontGL::getFontMonospace()->renderUTF8(section_text, 0, 0, v_offset + line_height*line_num,
+ header_color, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::BOLD, LLFontGL::DROP_SHADOW_SOFT);
+}
+
+bool LLAvatarTexBar::handleMouseDown(S32 x, S32 y, MASK mask)
+{
+ return false;
+}
+
+LLRect LLAvatarTexBar::getRequiredRect()
+{
+ LLRect rect;
+ rect.mTop = 100;
+ if (!gSavedSettings.getBOOL("DebugAvatarRezTime")) rect.mTop = 0;
+ return rect;
+}
+
+////////////////////////////////////////////////////////////////////////////
+
+class LLGLTexMemBar : public LLView
+{
+public:
+ struct Params : public LLInitParam::Block<Params, LLView::Params>
+ {
+ Mandatory<LLTextureView*> texture_view;
+ Params()
+ : texture_view("texture_view")
+ {
+ S32 line_height = LLFontGL::getFontMonospace()->getLineHeight();
+ changeDefault(rect, LLRect(0,0,100,line_height * 4));
+ }
+ };
+
+ LLGLTexMemBar(const Params& p)
+ : LLView(p),
+ mTextureView(p.texture_view)
+ {}
+
+ virtual void draw();
+ virtual bool handleMouseDown(S32 x, S32 y, MASK mask);
+ virtual LLRect getRequiredRect(); // Return the height of this object, given the set options.
+
+private:
+ LLTextureView* mTextureView;
+};
+
+void LLGLTexMemBar::draw()
+{
+ F32 discard_bias = LLViewerTexture::sDesiredDiscardBias;
+ F32 cache_usage = LLAppViewer::getTextureCache()->getUsage().valueInUnits<LLUnits::Megabytes>();
+ F32 cache_max_usage = LLAppViewer::getTextureCache()->getMaxUsage().valueInUnits<LLUnits::Megabytes>();
+ S32 line_height = LLFontGL::getFontMonospace()->getLineHeight();
+ S32 v_offset = 0;//(S32)((texture_bar_height + 2.2f) * mTextureView->mNumTextureBars + 2.0f);
+ F32Bytes total_texture_downloaded = gTotalTextureData;
+ F32Bytes total_object_downloaded = gTotalObjectData;
+ U32 total_http_requests = LLAppViewer::getTextureFetch()->getTotalNumHTTPRequests();
+ U32 total_active_cached_objects = LLWorld::getInstance()->getNumOfActiveCachedObjects();
+ U32 total_objects = gObjectList.getNumObjects();
+ F32 x_right = 0.0;
+
+ //----------------------------------------------------------------------------
+ LLGLSUIDefault gls_ui;
+ LLColor4 text_color(1.f, 1.f, 1.f, 0.75f);
+ LLColor4 color;
+
+ // Gray background using completely magic numbers
+ gGL.color4f(0.f, 0.f, 0.f, 0.25f);
+ // const LLRect & rect(getRect());
+ // gl_rect_2d(-4, v_offset, rect.mRight - rect.mLeft + 2, v_offset + line_height*4);
+
+ std::string text = "";
+ LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*6,
+ text_color, LLFontGL::LEFT, LLFontGL::TOP);
+
+ LLTrace::Recording& recording = LLViewerStats::instance().getRecording();
+
+ F64 cacheHits = recording.getSampleCount(LLTextureFetch::sCacheHit);
+ F64 cacheAttempts = recording.getSampleCount(LLTextureFetch::sCacheAttempt);
+
+ F32 cacheHitRate = (cacheAttempts > 0.0) ? F32((cacheHits / cacheAttempts) * 100.0f) : 0.0f;
+
+ U32 cacheReadLatMin = U32(recording.getMin(LLTextureFetch::sCacheReadLatency).value() * 1000.0f);
+ U32 cacheReadLatMed = U32(recording.getMean(LLTextureFetch::sCacheReadLatency).value() * 1000.0f);
+ U32 cacheReadLatMax = U32(recording.getMax(LLTextureFetch::sCacheReadLatency).value() * 1000.0f);
+
+ U32 texDecodeLatMin = U32(recording.getMin(LLTextureFetch::sTexDecodeLatency).value() * 1000.0f);
+ U32 texDecodeLatMed = U32(recording.getMean(LLTextureFetch::sTexDecodeLatency).value() * 1000.0f);
+ U32 texDecodeLatMax = U32(recording.getMax(LLTextureFetch::sTexDecodeLatency).value() * 1000.0f);
+
+ U32 texFetchLatMin = U32(recording.getMin(LLTextureFetch::sTexFetchLatency).value() * 1000.0f);
+ U32 texFetchLatMed = U32(recording.getMean(LLTextureFetch::sTexFetchLatency).value() * 1000.0f);
+ U32 texFetchLatMax = U32(recording.getMax(LLTextureFetch::sTexFetchLatency).value() * 1000.0f);
+
+ text = llformat("Est. Free: %d MB Sys Free: %d MB FBO: %d MB Bias: %.2f Cache: %.1f/%.1f MB",
+ (S32)LLViewerTexture::sFreeVRAMMegabytes,
+ LLMemory::getAvailableMemKB()/1024,
+ LLRenderTarget::sBytesAllocated/(1024*1024),
+ discard_bias,
+ cache_usage,
+ cache_max_usage);
+ //, cache_entries, cache_max_entries
+
+ LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*6,
+ text_color, LLFontGL::LEFT, LLFontGL::TOP);
+
+ U32 cache_read(0U), cache_write(0U), res_wait(0U);
+ LLAppViewer::getTextureFetch()->getStateStats(&cache_read, &cache_write, &res_wait);
+
+ text = llformat("Net Tot Tex: %.1f MB Tot Obj: %.1f MB #Objs/#Cached: %d/%d Tot Htp: %d Cread: %u Cwrite: %u Rwait: %u",
+ total_texture_downloaded.valueInUnits<LLUnits::Megabytes>(),
+ total_object_downloaded.valueInUnits<LLUnits::Megabytes>(),
+ total_objects,
+ total_active_cached_objects,
+ total_http_requests,
+ cache_read,
+ cache_write,
+ res_wait);
+
+ LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*5,
+ text_color, LLFontGL::LEFT, LLFontGL::TOP);
+
+ text = llformat("CacheHitRate: %3.2f Read: %d/%d/%d Decode: %d/%d/%d Fetch: %d/%d/%d",
+ cacheHitRate,
+ cacheReadLatMin,
+ cacheReadLatMed,
+ cacheReadLatMax,
+ texDecodeLatMin,
+ texDecodeLatMed,
+ texDecodeLatMax,
+ texFetchLatMin,
+ texFetchLatMed,
+ texFetchLatMax);
+
+ LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*4,
+ text_color, LLFontGL::LEFT, LLFontGL::TOP);
+
+ //----------------------------------------------------------------------------
+
+ text = llformat("Textures: %d Fetch: %d(%d) Pkts:%d(%d) Cache R/W: %d/%d LFS:%d RAW:%d HTP:%d DEC:%d CRE:%d ",
+ gTextureList.getNumImages(),
+ LLAppViewer::getTextureFetch()->getNumRequests(), LLAppViewer::getTextureFetch()->getNumDeletes(),
+ LLAppViewer::getTextureFetch()->mPacketCount, LLAppViewer::getTextureFetch()->mBadPacketCount,
+ LLAppViewer::getTextureCache()->getNumReads(), LLAppViewer::getTextureCache()->getNumWrites(),
+ LLLFSThread::sLocal->getPending(),
+ LLImageRaw::sRawImageCount,
+ LLAppViewer::getTextureFetch()->getNumHTTPRequests(),
+ LLAppViewer::getImageDecodeThread()->getPending(),
+ gTextureList.mCreateTextureList.size());
+
+ x_right = 550.0;
+ LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*3,
+ text_color, LLFontGL::LEFT, LLFontGL::TOP,
+ LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, &x_right);
+
+ F32Kilobits bandwidth(LLAppViewer::getTextureFetch()->getTextureBandwidth());
+ F32Kilobits max_bandwidth(gSavedSettings.getF32("ThrottleBandwidthKBPS"));
+ color = bandwidth > max_bandwidth ? LLColor4::red : bandwidth > max_bandwidth*.75f ? LLColor4::yellow : text_color;
+ color[VALPHA] = text_color[VALPHA];
+ text = llformat("BW:%.0f/%.0f",bandwidth.value(), max_bandwidth.value());
+ LLFontGL::getFontMonospace()->renderUTF8(text, 0, x_right, v_offset + line_height*3,
+ color, LLFontGL::LEFT, LLFontGL::TOP);
+
+ // Mesh status line
+ text = llformat("Mesh: Reqs(Tot/Htp/Big): %u/%u/%u Rtr/Err: %u/%u Cread/Cwrite: %u/%u Low/At/High: %d/%d/%d",
+ LLMeshRepository::sMeshRequestCount, LLMeshRepository::sHTTPRequestCount, LLMeshRepository::sHTTPLargeRequestCount,
+ LLMeshRepository::sHTTPRetryCount, LLMeshRepository::sHTTPErrorCount,
+ LLMeshRepository::sCacheReads, LLMeshRepository::sCacheWrites,
+ LLMeshRepoThread::sRequestLowWater, LLMeshRepoThread::sRequestWaterLevel, LLMeshRepoThread::sRequestHighWater);
+ LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*2,
+ text_color, LLFontGL::LEFT, LLFontGL::TOP);
+
+ // Header for texture table columns
+ S32 dx1 = 0;
+ if (LLAppViewer::getTextureFetch()->mDebugPause)
+ {
+ LLFontGL::getFontMonospace()->renderUTF8(std::string("!"), 0, title_x1, v_offset + line_height,
+ text_color, LLFontGL::LEFT, LLFontGL::TOP);
+ dx1 += 8;
+ }
+ if (mTextureView->mFreezeView)
+ {
+ LLFontGL::getFontMonospace()->renderUTF8(std::string("*"), 0, title_x1, v_offset + line_height,
+ text_color, LLFontGL::LEFT, LLFontGL::TOP);
+ dx1 += 8;
+ }
+ if (mTextureView->mOrderFetch)
+ {
+ LLFontGL::getFontMonospace()->renderUTF8(title_string1b, 0, title_x1+dx1, v_offset + line_height,
+ text_color, LLFontGL::LEFT, LLFontGL::TOP);
+ }
+ else
+ {
+ LLFontGL::getFontMonospace()->renderUTF8(title_string1a, 0, title_x1+dx1, v_offset + line_height,
+ text_color, LLFontGL::LEFT, LLFontGL::TOP);
+ }
+
+ LLFontGL::getFontMonospace()->renderUTF8(title_string2, 0, title_x2, v_offset + line_height,
+ text_color, LLFontGL::LEFT, LLFontGL::TOP);
+
+ LLFontGL::getFontMonospace()->renderUTF8(title_string3, 0, title_x3, v_offset + line_height,
+ text_color, LLFontGL::LEFT, LLFontGL::TOP);
+
+ LLFontGL::getFontMonospace()->renderUTF8(title_string4, 0, title_x4, v_offset + line_height,
+ text_color, LLFontGL::LEFT, LLFontGL::TOP);
+}
+
+bool LLGLTexMemBar::handleMouseDown(S32 x, S32 y, MASK mask)
+{
+ return false;
+}
+
+LLRect LLGLTexMemBar::getRequiredRect()
+{
+ LLRect rect;
+ rect.mTop = 78; //LLFontGL::getFontMonospace()->getLineHeight() * 6;
+ return rect;
+}
+
+////////////////////////////////////////////////////////////////////////////
+class LLGLTexSizeBar
+{
+public:
+ LLGLTexSizeBar(S32 index, S32 left, S32 bottom, S32 right, S32 line_height)
+ {
+ mIndex = index ;
+ mLeft = left ;
+ mBottom = bottom ;
+ mRight = right ;
+ mLineHeight = line_height ;
+ mTopLoaded = 0 ;
+ mTopBound = 0 ;
+ mScale = 1.0f ;
+ }
+
+ void setTop(S32 loaded, S32 bound, F32 scale) {mTopLoaded = loaded ; mTopBound = bound; mScale = scale ;}
+
+ void draw();
+ bool handleHover(S32 x, S32 y, MASK mask, bool set_pick_size) ;
+
+private:
+ S32 mIndex ;
+ S32 mLeft ;
+ S32 mBottom ;
+ S32 mRight ;
+ S32 mTopLoaded ;
+ S32 mTopBound ;
+ S32 mLineHeight ;
+ F32 mScale ;
+};
+
+bool LLGLTexSizeBar::handleHover(S32 x, S32 y, MASK mask, bool set_pick_size)
+{
+ if(y > mBottom && (y < mBottom + (S32)(mTopLoaded * mScale) || y < mBottom + (S32)(mTopBound * mScale)))
+ {
+ LLImageGL::setCurTexSizebar(mIndex, set_pick_size);
+ }
+ return true ;
+}
+void LLGLTexSizeBar::draw()
+{
+ LLGLSUIDefault gls_ui;
+
+ if(LLImageGL::sCurTexSizeBar == mIndex)
+ {
+ LLColor4 text_color(1.f, 1.f, 1.f, 0.75f);
+ std::string text;
+
+ text = llformat("%d", mTopLoaded) ;
+ LLFontGL::getFontMonospace()->renderUTF8(text, 0, mLeft, mBottom + (S32)(mTopLoaded * mScale) + mLineHeight,
+ text_color, LLFontGL::LEFT, LLFontGL::TOP);
+
+ text = llformat("%d", mTopBound) ;
+ LLFontGL::getFontMonospace()->renderUTF8(text, 0, (mLeft + mRight) / 2, mBottom + (S32)(mTopBound * mScale) + mLineHeight,
+ text_color, LLFontGL::LEFT, LLFontGL::TOP);
+ }
+
+ LLColor4 loaded_color(1.0f, 0.0f, 0.0f, 0.75f);
+ LLColor4 bound_color(1.0f, 1.0f, 0.0f, 0.75f);
+ gl_rect_2d(mLeft, mBottom + (S32)(mTopLoaded * mScale), (mLeft + mRight) / 2, mBottom, loaded_color) ;
+ gl_rect_2d((mLeft + mRight) / 2, mBottom + (S32)(mTopBound * mScale), mRight, mBottom, bound_color) ;
+}
+////////////////////////////////////////////////////////////////////////////
+
+LLTextureView::LLTextureView(const LLTextureView::Params& p)
+ : LLContainerView(p),
+ mFreezeView(false),
+ mOrderFetch(false),
+ mPrintList(false),
+ mNumTextureBars(0)
+{
+ setVisible(false);
+
+ setDisplayChildren(true);
+ mGLTexMemBar = 0;
+ mAvatarTexBar = 0;
+}
+
+LLTextureView::~LLTextureView()
+{
+ // Children all cleaned up by default view destructor.
+ delete mGLTexMemBar;
+ mGLTexMemBar = 0;
+
+ delete mAvatarTexBar;
+ mAvatarTexBar = 0;
+}
+
+typedef std::pair<F32,LLViewerFetchedTexture*> decode_pair_t;
+struct compare_decode_pair
+{
+ bool operator()(const decode_pair_t& a, const decode_pair_t& b) const
+ {
+ return a.first > b.first;
+ }
+};
+
+struct KillView
+{
+ void operator()(LLView* viewp)
+ {
+ viewp->getParent()->removeChild(viewp);
+ viewp->die();
+ }
+};
+
+void LLTextureView::draw()
+{
+ if (!mFreezeView)
+ {
+// LLViewerObject *objectp;
+// S32 te;
+
+ for_each(mTextureBars.begin(), mTextureBars.end(), KillView());
+ mTextureBars.clear();
+
+ if (mGLTexMemBar)
+ {
+ removeChild(mGLTexMemBar);
+ mGLTexMemBar->die();
+ mGLTexMemBar = 0;
+ }
+
+ if (mAvatarTexBar)
+ {
+ removeChild(mAvatarTexBar);
+ mAvatarTexBar->die();
+ mAvatarTexBar = 0;
+ }
+
+ typedef std::multiset<decode_pair_t, compare_decode_pair > display_list_t;
+ display_list_t display_image_list;
+
+ if (mPrintList)
+ {
+ LL_INFOS() << "ID\tMEM\tBOOST\tPRI\tWIDTH\tHEIGHT\tDISCARD" << LL_ENDL;
+ }
+
+ for (LLViewerTextureList::image_priority_list_t::iterator iter = gTextureList.mImageList.begin();
+ iter != gTextureList.mImageList.end(); )
+ {
+ LLPointer<LLViewerFetchedTexture> imagep = *iter++;
+ if(!imagep->hasFetcher())
+ {
+ continue ;
+ }
+
+ S32 cur_discard = imagep->getDiscardLevel();
+ S32 desired_discard = imagep->mDesiredDiscardLevel;
+
+ if (mPrintList)
+ {
+ S32 tex_mem = imagep->hasGLTexture() ? imagep->getTextureMemory().value() : 0 ;
+ LL_INFOS() << imagep->getID()
+ << "\t" << tex_mem
+ << "\t" << imagep->getBoostLevel()
+ << "\t" << imagep->getMaxVirtualSize()
+ << "\t" << imagep->getWidth()
+ << "\t" << imagep->getHeight()
+ << "\t" << cur_discard
+ << LL_ENDL;
+ }
+
+ if (imagep->getID() == LLAppViewer::getTextureFetch()->mDebugID)
+ {
+// static S32 debug_count = 0;
+// ++debug_count; // for breakpoints
+ }
+
+ F32 pri;
+ if (mOrderFetch)
+ {
+ pri = ((F32)imagep->mFetchPriority)/256.f;
+ }
+ else
+ {
+ pri = imagep->getMaxVirtualSize();
+ }
+ pri = llclamp(pri, 0.0f, HIGH_PRIORITY-1.f);
+
+ if (sDebugImages.find(imagep) != sDebugImages.end())
+ {
+ pri += 4*HIGH_PRIORITY;
+ }
+
+ if (!mOrderFetch)
+ {
+ if (pri < HIGH_PRIORITY && LLSelectMgr::getInstance())
+ {
+ struct f : public LLSelectedTEFunctor
+ {
+ LLViewerFetchedTexture* mImage;
+ f(LLViewerFetchedTexture* image) : mImage(image) {}
+ virtual bool apply(LLViewerObject* object, S32 te)
+ {
+ return (mImage == object->getTEImage(te));
+ }
+ } func(imagep);
+ const bool firstonly = true;
+ bool match = LLSelectMgr::getInstance()->getSelection()->applyToTEs(&func, firstonly);
+ if (match)
+ {
+ pri += 3*HIGH_PRIORITY;
+ }
+ }
+
+ if (pri < HIGH_PRIORITY && (cur_discard< 0 || desired_discard < cur_discard))
+ {
+ LLSelectNode* hover_node = LLSelectMgr::instance().getHoverNode();
+ if (hover_node)
+ {
+ LLViewerObject *objectp = hover_node->getObject();
+ if (objectp)
+ {
+ S32 tex_count = objectp->getNumTEs();
+ for (S32 i = 0; i < tex_count; i++)
+ {
+ if (imagep == objectp->getTEImage(i))
+ {
+ pri += 2*HIGH_PRIORITY;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ if (pri > 0.f && pri < HIGH_PRIORITY)
+ {
+ if (imagep->mLastPacketTimer.getElapsedTimeF32() < 1.f ||
+ imagep->mFetchDeltaTime < 0.25f)
+ {
+ pri += 1*HIGH_PRIORITY;
+ }
+ }
+ }
+
+ if (pri > 0.0f)
+ {
+ display_image_list.insert(std::make_pair(pri, imagep));
+ }
+ }
+
+ if (mPrintList)
+ {
+ mPrintList = false;
+ }
+
+ static S32 max_count = 50;
+ S32 count = 0;
+ mNumTextureBars = 0 ;
+ for (display_list_t::iterator iter = display_image_list.begin();
+ iter != display_image_list.end(); iter++)
+ {
+ LLViewerFetchedTexture* imagep = iter->second;
+ S32 hilite = 0;
+ F32 pri = iter->first;
+ if (pri >= 1 * HIGH_PRIORITY)
+ {
+ hilite = (S32)((pri+1) / HIGH_PRIORITY) - 1;
+ }
+ if ((hilite || count < max_count-10) && (count < max_count))
+ {
+ if (addBar(imagep, hilite))
+ {
+ count++;
+ }
+ }
+ }
+
+ if (mOrderFetch)
+ sortChildren(LLTextureBar::sort_fetch());
+ else
+ sortChildren(LLTextureBar::sort());
+
+ LLGLTexMemBar::Params tmbp;
+ LLRect tmbr;
+ tmbp.name("gl texmem bar");
+ tmbp.rect(tmbr);
+ tmbp.follows.flags = FOLLOWS_LEFT|FOLLOWS_TOP;
+ tmbp.texture_view(this);
+ mGLTexMemBar = LLUICtrlFactory::create<LLGLTexMemBar>(tmbp);
+ addChild(mGLTexMemBar);
+ sendChildToFront(mGLTexMemBar);
+
+ LLAvatarTexBar::Params atbp;
+ LLRect atbr;
+ atbp.name("gl avatartex bar");
+ atbp.texture_view(this);
+ atbp.rect(atbr);
+ mAvatarTexBar = LLUICtrlFactory::create<LLAvatarTexBar>(atbp);
+ addChild(mAvatarTexBar);
+ sendChildToFront(mAvatarTexBar);
+
+ reshape(getRect().getWidth(), getRect().getHeight(), true);
+
+ LLUI::popMatrix();
+ LLUI::pushMatrix();
+ LLUI::translate((F32)getRect().mLeft, (F32)getRect().mBottom);
+
+ for (child_list_const_iter_t child_iter = getChildList()->begin();
+ child_iter != getChildList()->end(); ++child_iter)
+ {
+ LLView *viewp = *child_iter;
+ if (viewp->getRect().mBottom < 0)
+ {
+ viewp->setVisible(false);
+ }
+ }
+ }
+
+ LLContainerView::draw();
+
+}
+
+bool LLTextureView::addBar(LLViewerFetchedTexture *imagep, S32 hilite)
+{
+ llassert(imagep);
+
+ LLTextureBar *barp;
+ LLRect r;
+
+ mNumTextureBars++;
+
+ LLTextureBar::Params tbp;
+ tbp.name("texture bar");
+ tbp.rect(r);
+ tbp.texture_view(this);
+ barp = LLUICtrlFactory::create<LLTextureBar>(tbp);
+ barp->mImagep = imagep;
+ barp->mHilite = hilite;
+
+ addChild(barp);
+ mTextureBars.push_back(barp);
+
+ return true;
+}
+
+bool LLTextureView::handleMouseDown(S32 x, S32 y, MASK mask)
+{
+ if ((mask & (MASK_CONTROL|MASK_SHIFT|MASK_ALT)) == (MASK_ALT|MASK_SHIFT))
+ {
+ mPrintList = true;
+ return true;
+ }
+ if ((mask & (MASK_CONTROL|MASK_SHIFT|MASK_ALT)) == (MASK_CONTROL|MASK_SHIFT))
+ {
+ LLAppViewer::getTextureFetch()->mDebugPause = !LLAppViewer::getTextureFetch()->mDebugPause;
+ return true;
+ }
+ if (mask & MASK_SHIFT)
+ {
+ mFreezeView = !mFreezeView;
+ return true;
+ }
+ if (mask & MASK_CONTROL)
+ {
+ mOrderFetch = !mOrderFetch;
+ return true;
+ }
+ return LLView::handleMouseDown(x,y,mask);
+}
+
+bool LLTextureView::handleMouseUp(S32 x, S32 y, MASK mask)
+{
+ return false;
+}
+
+bool LLTextureView::handleKey(KEY key, MASK mask, bool called_from_parent)
+{
+ return false;
+}
+
+
|