From b7ce1a52ee246a4c38c909cd7e8128e259b253f7 Mon Sep 17 00:00:00 2001 From: ruslantproductengine Date: Fri, 28 Aug 2015 19:20:55 +0300 Subject: MAINT-4483 (Mesh uploader allows Low LODs to have more triangles than High LODs) The fix in fllowing: LLTextureFetch has object LLTextureInfo which is has Recorder object. The recorder object activate (Recorder::handleStart()) self AccumulatorBufferGroup (Recorder::mBuffers into the current (LLTrace::get_thread_recorder()) ThreadRecorder object which created (as I understand) one per thread, and time to time send accumulated data to the master ThreadRecorder. The problem is that LLTextureFetch also can uses from the main thread. I decide add parameter to CTOR LLTextureInfo(bool postponeStartRecoreder) - if it false the recorder start immediatly in LLTextureInfo CTOR body, if true we need to start it manually. Also I add another one LLTextureInfo in LLTextureFetch::mTextureInfoMainThread which is intended for accumulate data from the main thread. The postponed Recorder started/stoped from LLTextureFetch::startThread()/endThread(). --HG-- branch : MAINT-4360 --- indra/newview/lltexturefetch.cpp | 10 +++++++--- indra/newview/lltexturefetch.h | 1 + indra/newview/lltextureinfo.cpp | 38 +++++++++++++++++++------------------- indra/newview/lltextureinfo.h | 4 +++- 4 files changed, 30 insertions(+), 23 deletions(-) diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index fab4203ec3..17b273f316 100755 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -2522,7 +2522,8 @@ LLTextureFetch::LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* image mFetchDebugger(NULL), mFetchSource(LLTextureFetch::FROM_ALL), mOriginFetchSource(LLTextureFetch::FROM_ALL), - mFetcherLocked(FALSE) + mFetcherLocked(FALSE), + mTextureInfoMainThread(false) { mMaxBandwidth = gSavedSettings.getF32("ThrottleBandwidthKBPS"); mTextureInfo.setUpLogging(gSavedSettings.getBOOL("LogTextureDownloadsToViewerLog"), gSavedSettings.getBOOL("LogTextureDownloadsToSimulator"), U32Bytes(gSavedSettings.getU32("TextureLoggingThreshold"))); @@ -3128,6 +3129,7 @@ void LLTextureFetch::shutDownImageDecodeThread() // Threads: Ttf void LLTextureFetch::startThread() { + mTextureInfo.startRecording(); } // Threads: Ttf @@ -3138,6 +3140,8 @@ void LLTextureFetch::endThread() << ", ResWaits: " << mTotalResourceWaitCount << ", TotalHTTPReq: " << getTotalNumHTTPRequests() << LL_ENDL; + + mTextureInfo.stopRecording(); } // Threads: Ttf @@ -3541,8 +3545,8 @@ bool LLTextureFetch::receiveImagePacket(const LLHost& host, const LLUUID& id, U1 if (log_to_viewer_log || log_to_sim) { U64Microseconds timeNow = LLTimer::getTotalTime(); - mTextureInfo.setRequestSize(id, worker->mFileSize); - mTextureInfo.setRequestCompleteTimeAndLog(id, timeNow); + mTextureInfoMainThread.setRequestSize(id, worker->mFileSize); + mTextureInfoMainThread.setRequestCompleteTimeAndLog(id, timeNow); } } worker->unlockWorkMutex(); // -Mw diff --git a/indra/newview/lltexturefetch.h b/indra/newview/lltexturefetch.h index 27779a31e0..a2658ecd85 100755 --- a/indra/newview/lltexturefetch.h +++ b/indra/newview/lltexturefetch.h @@ -332,6 +332,7 @@ private: F32 mTextureBandwidth; // F32 mMaxBandwidth; // Mfnq LLTextureInfo mTextureInfo; + LLTextureInfo mTextureInfoMainThread; // XXX possible delete U32Bits mHTTPTextureBits; // Mfnq diff --git a/indra/newview/lltextureinfo.cpp b/indra/newview/lltextureinfo.cpp index 59d692b287..fbe308595c 100755 --- a/indra/newview/lltextureinfo.cpp +++ b/indra/newview/lltextureinfo.cpp @@ -36,14 +36,14 @@ static LLTrace::CountStatHandle sTextureDownloadsCompleted("texture_downloa static LLTrace::CountStatHandle sTextureDataDownloaded("texture_data_downloaded", "amount of texture data downloaded"); static LLTrace::CountStatHandle sTexureDownloadTime("texture_download_time", "amount of time spent fetching textures"); -LLTextureInfo::LLTextureInfo() : +LLTextureInfo::LLTextureInfo(bool postponeStartRecoreder) : mLogTextureDownloadsToViewerLog(false), mLogTextureDownloadsToSimulator(false), mTextureDownloadProtocol("NONE"), mTextureLogThreshold(LLUnits::Kilobytes::fromValue(100)) { - mTextures.clear(); - mRecording.start(); + if (!postponeStartRecoreder) + mRecording.start(); } void LLTextureInfo::setUpLogging(bool writeToViewerLog, bool sendToSim, U32Bytes textureLogThreshold) @@ -78,15 +78,7 @@ U32 LLTextureInfo::getTextureInfoMapSize() bool LLTextureInfo::has(const LLUUID& id) { - std::map::iterator iterator = mTextures.find(id); - if (iterator == mTextures.end()) - { - return false; - } - else - { - return true; - } + return mTextures.end() != mTextures.find(id); } void LLTextureInfo::setRequestStartTime(const LLUUID& id, U64 startTime) @@ -192,15 +184,13 @@ void LLTextureInfo::setRequestCompleteTimeAndLog(const LLUUID& id, U64Microsecon LLSD LLTextureInfo::getAverages() { LLSD averagedTextureData; - S32 averageDownloadRate; + S32 averageDownloadRate = 0; U32Milliseconds download_time = mRecording.getSum(sTexureDownloadTime); - if(download_time == (U32Milliseconds)0) - { - averageDownloadRate = 0; - } - else + if(download_time != (U32Milliseconds)0) { - averageDownloadRate = mRecording.getSum(sTextureDataDownloaded).valueInUnits() / download_time.valueInUnits(); + if (0 != download_time.valueInUnits()) { + averageDownloadRate = mRecording.getSum(sTextureDataDownloaded).valueInUnits() / download_time.valueInUnits(); + } } averagedTextureData["bits_per_second"] = averageDownloadRate; @@ -212,6 +202,16 @@ LLSD LLTextureInfo::getAverages() return averagedTextureData; } +void LLTextureInfo::startRecording() +{ + mRecording.start(); +} + +void LLTextureInfo::stopRecording() +{ + mRecording.stop(); +} + void LLTextureInfo::resetTextureStatistics() { mRecording.restart(); diff --git a/indra/newview/lltextureinfo.h b/indra/newview/lltextureinfo.h index 176f2cbb74..03721bdd73 100755 --- a/indra/newview/lltextureinfo.h +++ b/indra/newview/lltextureinfo.h @@ -35,7 +35,7 @@ class LLTextureInfo { public: - LLTextureInfo(); + LLTextureInfo(bool postponeStartRecoreder = true); ~LLTextureInfo(); void setUpLogging(bool writeToViewerLog, bool sendToSim, U32Bytes textureLogThreshold); @@ -53,6 +53,8 @@ public: void resetTextureStatistics(); U32 getTextureInfoMapSize(); LLSD getAverages(); + void startRecording(); + void stopRecording(); private: void addRequest(const LLUUID& id); -- cgit v1.2.3 From 13284fa954e4edcca43eaf98f1a5b457264597b8 Mon Sep 17 00:00:00 2001 From: ruslantproductengine Date: Fri, 28 Aug 2015 19:27:09 +0300 Subject: MAINT-4360 (Setting LogTextureDownloadsToSimulator causes a viewer crash) The fix in fllowing: LLTextureFetch has object LLTextureInfo which is has Recorder object. The recorder object activate (Recorder::handleStart()) self AccumulatorBufferGroup (Recorder::mBuffers into the current (LLTrace::get_thread_recorder()) ThreadRecorder object which created (as I understand) one per thread, and time to time send accumulated data to the master ThreadRecorder. The problem is that LLTextureFetch also can uses from the main thread. I decide add parameter to CTOR LLTextureInfo(bool postponeStartRecoreder) - if it false the recorder start immediatly in LLTextureInfo CTOR body, if true we need to start it manually. Also I add another one LLTextureInfo in LLTextureFetch::mTextureInfoMainThread which is intended for accumulate data from the main thread. The postponed Recorder started/stoped from LLTextureFetch::startThread()/endThread(). --HG-- branch : MAINT-4360 --- indra/newview/lltexturefetch.cpp | 10 +++------- indra/newview/lltexturefetch.h | 1 - indra/newview/lltextureinfo.cpp | 38 +++++++++++++++++++------------------- indra/newview/lltextureinfo.h | 4 +--- 4 files changed, 23 insertions(+), 30 deletions(-) diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index 17b273f316..fab4203ec3 100755 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -2522,8 +2522,7 @@ LLTextureFetch::LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* image mFetchDebugger(NULL), mFetchSource(LLTextureFetch::FROM_ALL), mOriginFetchSource(LLTextureFetch::FROM_ALL), - mFetcherLocked(FALSE), - mTextureInfoMainThread(false) + mFetcherLocked(FALSE) { mMaxBandwidth = gSavedSettings.getF32("ThrottleBandwidthKBPS"); mTextureInfo.setUpLogging(gSavedSettings.getBOOL("LogTextureDownloadsToViewerLog"), gSavedSettings.getBOOL("LogTextureDownloadsToSimulator"), U32Bytes(gSavedSettings.getU32("TextureLoggingThreshold"))); @@ -3129,7 +3128,6 @@ void LLTextureFetch::shutDownImageDecodeThread() // Threads: Ttf void LLTextureFetch::startThread() { - mTextureInfo.startRecording(); } // Threads: Ttf @@ -3140,8 +3138,6 @@ void LLTextureFetch::endThread() << ", ResWaits: " << mTotalResourceWaitCount << ", TotalHTTPReq: " << getTotalNumHTTPRequests() << LL_ENDL; - - mTextureInfo.stopRecording(); } // Threads: Ttf @@ -3545,8 +3541,8 @@ bool LLTextureFetch::receiveImagePacket(const LLHost& host, const LLUUID& id, U1 if (log_to_viewer_log || log_to_sim) { U64Microseconds timeNow = LLTimer::getTotalTime(); - mTextureInfoMainThread.setRequestSize(id, worker->mFileSize); - mTextureInfoMainThread.setRequestCompleteTimeAndLog(id, timeNow); + mTextureInfo.setRequestSize(id, worker->mFileSize); + mTextureInfo.setRequestCompleteTimeAndLog(id, timeNow); } } worker->unlockWorkMutex(); // -Mw diff --git a/indra/newview/lltexturefetch.h b/indra/newview/lltexturefetch.h index a2658ecd85..27779a31e0 100755 --- a/indra/newview/lltexturefetch.h +++ b/indra/newview/lltexturefetch.h @@ -332,7 +332,6 @@ private: F32 mTextureBandwidth; // F32 mMaxBandwidth; // Mfnq LLTextureInfo mTextureInfo; - LLTextureInfo mTextureInfoMainThread; // XXX possible delete U32Bits mHTTPTextureBits; // Mfnq diff --git a/indra/newview/lltextureinfo.cpp b/indra/newview/lltextureinfo.cpp index fbe308595c..59d692b287 100755 --- a/indra/newview/lltextureinfo.cpp +++ b/indra/newview/lltextureinfo.cpp @@ -36,14 +36,14 @@ static LLTrace::CountStatHandle sTextureDownloadsCompleted("texture_downloa static LLTrace::CountStatHandle sTextureDataDownloaded("texture_data_downloaded", "amount of texture data downloaded"); static LLTrace::CountStatHandle sTexureDownloadTime("texture_download_time", "amount of time spent fetching textures"); -LLTextureInfo::LLTextureInfo(bool postponeStartRecoreder) : +LLTextureInfo::LLTextureInfo() : mLogTextureDownloadsToViewerLog(false), mLogTextureDownloadsToSimulator(false), mTextureDownloadProtocol("NONE"), mTextureLogThreshold(LLUnits::Kilobytes::fromValue(100)) { - if (!postponeStartRecoreder) - mRecording.start(); + mTextures.clear(); + mRecording.start(); } void LLTextureInfo::setUpLogging(bool writeToViewerLog, bool sendToSim, U32Bytes textureLogThreshold) @@ -78,7 +78,15 @@ U32 LLTextureInfo::getTextureInfoMapSize() bool LLTextureInfo::has(const LLUUID& id) { - return mTextures.end() != mTextures.find(id); + std::map::iterator iterator = mTextures.find(id); + if (iterator == mTextures.end()) + { + return false; + } + else + { + return true; + } } void LLTextureInfo::setRequestStartTime(const LLUUID& id, U64 startTime) @@ -184,13 +192,15 @@ void LLTextureInfo::setRequestCompleteTimeAndLog(const LLUUID& id, U64Microsecon LLSD LLTextureInfo::getAverages() { LLSD averagedTextureData; - S32 averageDownloadRate = 0; + S32 averageDownloadRate; U32Milliseconds download_time = mRecording.getSum(sTexureDownloadTime); - if(download_time != (U32Milliseconds)0) + if(download_time == (U32Milliseconds)0) { - if (0 != download_time.valueInUnits()) { - averageDownloadRate = mRecording.getSum(sTextureDataDownloaded).valueInUnits() / download_time.valueInUnits(); - } + averageDownloadRate = 0; + } + else + { + averageDownloadRate = mRecording.getSum(sTextureDataDownloaded).valueInUnits() / download_time.valueInUnits(); } averagedTextureData["bits_per_second"] = averageDownloadRate; @@ -202,16 +212,6 @@ LLSD LLTextureInfo::getAverages() return averagedTextureData; } -void LLTextureInfo::startRecording() -{ - mRecording.start(); -} - -void LLTextureInfo::stopRecording() -{ - mRecording.stop(); -} - void LLTextureInfo::resetTextureStatistics() { mRecording.restart(); diff --git a/indra/newview/lltextureinfo.h b/indra/newview/lltextureinfo.h index 03721bdd73..176f2cbb74 100755 --- a/indra/newview/lltextureinfo.h +++ b/indra/newview/lltextureinfo.h @@ -35,7 +35,7 @@ class LLTextureInfo { public: - LLTextureInfo(bool postponeStartRecoreder = true); + LLTextureInfo(); ~LLTextureInfo(); void setUpLogging(bool writeToViewerLog, bool sendToSim, U32Bytes textureLogThreshold); @@ -53,8 +53,6 @@ public: void resetTextureStatistics(); U32 getTextureInfoMapSize(); LLSD getAverages(); - void startRecording(); - void stopRecording(); private: void addRequest(const LLUUID& id); -- cgit v1.2.3 From 86d124d6c7db94ad07087941fc2118d9b31cafc1 Mon Sep 17 00:00:00 2001 From: ruslantproductengine Date: Sun, 30 Aug 2015 14:19:50 +0300 Subject: Backed out changeset: f471282aa065 --HG-- branch : MAINT-4360 --- indra/newview/lltexturefetch.cpp | 10 +++++++--- indra/newview/lltexturefetch.h | 1 + indra/newview/lltextureinfo.cpp | 38 +++++++++++++++++++------------------- indra/newview/lltextureinfo.h | 4 +++- 4 files changed, 30 insertions(+), 23 deletions(-) diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index fab4203ec3..17b273f316 100755 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -2522,7 +2522,8 @@ LLTextureFetch::LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* image mFetchDebugger(NULL), mFetchSource(LLTextureFetch::FROM_ALL), mOriginFetchSource(LLTextureFetch::FROM_ALL), - mFetcherLocked(FALSE) + mFetcherLocked(FALSE), + mTextureInfoMainThread(false) { mMaxBandwidth = gSavedSettings.getF32("ThrottleBandwidthKBPS"); mTextureInfo.setUpLogging(gSavedSettings.getBOOL("LogTextureDownloadsToViewerLog"), gSavedSettings.getBOOL("LogTextureDownloadsToSimulator"), U32Bytes(gSavedSettings.getU32("TextureLoggingThreshold"))); @@ -3128,6 +3129,7 @@ void LLTextureFetch::shutDownImageDecodeThread() // Threads: Ttf void LLTextureFetch::startThread() { + mTextureInfo.startRecording(); } // Threads: Ttf @@ -3138,6 +3140,8 @@ void LLTextureFetch::endThread() << ", ResWaits: " << mTotalResourceWaitCount << ", TotalHTTPReq: " << getTotalNumHTTPRequests() << LL_ENDL; + + mTextureInfo.stopRecording(); } // Threads: Ttf @@ -3541,8 +3545,8 @@ bool LLTextureFetch::receiveImagePacket(const LLHost& host, const LLUUID& id, U1 if (log_to_viewer_log || log_to_sim) { U64Microseconds timeNow = LLTimer::getTotalTime(); - mTextureInfo.setRequestSize(id, worker->mFileSize); - mTextureInfo.setRequestCompleteTimeAndLog(id, timeNow); + mTextureInfoMainThread.setRequestSize(id, worker->mFileSize); + mTextureInfoMainThread.setRequestCompleteTimeAndLog(id, timeNow); } } worker->unlockWorkMutex(); // -Mw diff --git a/indra/newview/lltexturefetch.h b/indra/newview/lltexturefetch.h index 27779a31e0..a2658ecd85 100755 --- a/indra/newview/lltexturefetch.h +++ b/indra/newview/lltexturefetch.h @@ -332,6 +332,7 @@ private: F32 mTextureBandwidth; // F32 mMaxBandwidth; // Mfnq LLTextureInfo mTextureInfo; + LLTextureInfo mTextureInfoMainThread; // XXX possible delete U32Bits mHTTPTextureBits; // Mfnq diff --git a/indra/newview/lltextureinfo.cpp b/indra/newview/lltextureinfo.cpp index 59d692b287..fbe308595c 100755 --- a/indra/newview/lltextureinfo.cpp +++ b/indra/newview/lltextureinfo.cpp @@ -36,14 +36,14 @@ static LLTrace::CountStatHandle sTextureDownloadsCompleted("texture_downloa static LLTrace::CountStatHandle sTextureDataDownloaded("texture_data_downloaded", "amount of texture data downloaded"); static LLTrace::CountStatHandle sTexureDownloadTime("texture_download_time", "amount of time spent fetching textures"); -LLTextureInfo::LLTextureInfo() : +LLTextureInfo::LLTextureInfo(bool postponeStartRecoreder) : mLogTextureDownloadsToViewerLog(false), mLogTextureDownloadsToSimulator(false), mTextureDownloadProtocol("NONE"), mTextureLogThreshold(LLUnits::Kilobytes::fromValue(100)) { - mTextures.clear(); - mRecording.start(); + if (!postponeStartRecoreder) + mRecording.start(); } void LLTextureInfo::setUpLogging(bool writeToViewerLog, bool sendToSim, U32Bytes textureLogThreshold) @@ -78,15 +78,7 @@ U32 LLTextureInfo::getTextureInfoMapSize() bool LLTextureInfo::has(const LLUUID& id) { - std::map::iterator iterator = mTextures.find(id); - if (iterator == mTextures.end()) - { - return false; - } - else - { - return true; - } + return mTextures.end() != mTextures.find(id); } void LLTextureInfo::setRequestStartTime(const LLUUID& id, U64 startTime) @@ -192,15 +184,13 @@ void LLTextureInfo::setRequestCompleteTimeAndLog(const LLUUID& id, U64Microsecon LLSD LLTextureInfo::getAverages() { LLSD averagedTextureData; - S32 averageDownloadRate; + S32 averageDownloadRate = 0; U32Milliseconds download_time = mRecording.getSum(sTexureDownloadTime); - if(download_time == (U32Milliseconds)0) - { - averageDownloadRate = 0; - } - else + if(download_time != (U32Milliseconds)0) { - averageDownloadRate = mRecording.getSum(sTextureDataDownloaded).valueInUnits() / download_time.valueInUnits(); + if (0 != download_time.valueInUnits()) { + averageDownloadRate = mRecording.getSum(sTextureDataDownloaded).valueInUnits() / download_time.valueInUnits(); + } } averagedTextureData["bits_per_second"] = averageDownloadRate; @@ -212,6 +202,16 @@ LLSD LLTextureInfo::getAverages() return averagedTextureData; } +void LLTextureInfo::startRecording() +{ + mRecording.start(); +} + +void LLTextureInfo::stopRecording() +{ + mRecording.stop(); +} + void LLTextureInfo::resetTextureStatistics() { mRecording.restart(); diff --git a/indra/newview/lltextureinfo.h b/indra/newview/lltextureinfo.h index 176f2cbb74..03721bdd73 100755 --- a/indra/newview/lltextureinfo.h +++ b/indra/newview/lltextureinfo.h @@ -35,7 +35,7 @@ class LLTextureInfo { public: - LLTextureInfo(); + LLTextureInfo(bool postponeStartRecoreder = true); ~LLTextureInfo(); void setUpLogging(bool writeToViewerLog, bool sendToSim, U32Bytes textureLogThreshold); @@ -53,6 +53,8 @@ public: void resetTextureStatistics(); U32 getTextureInfoMapSize(); LLSD getAverages(); + void startRecording(); + void stopRecording(); private: void addRequest(const LLUUID& id); -- cgit v1.2.3 -- cgit v1.2.3 -- cgit v1.2.3 From f282c31f0107f05ae9e943d2fdda516cdaf3f3fa Mon Sep 17 00:00:00 2001 From: andreykproductengine Date: Tue, 31 May 2016 16:56:45 +0300 Subject: MAINT-2129 One more Block button --- indra/newview/llinspectremoteobject.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llinspectremoteobject.cpp b/indra/newview/llinspectremoteobject.cpp index a12ec390af..b64df2bd47 100644 --- a/indra/newview/llinspectremoteobject.cpp +++ b/indra/newview/llinspectremoteobject.cpp @@ -181,7 +181,7 @@ void LLInspectRemoteObject::update() getChild("map_btn")->setEnabled(! mSLurl.empty()); // disable the Block button if we don't have the object ID (will this ever happen?) - getChild("block_btn")->setEnabled(! mObjectID.isNull()); + getChild("block_btn")->setEnabled(!mObjectID.isNull() && !LLMuteList::getInstance()->isMuted(mObjectID)); } ////////////////////////////////////////////////////////////////////////////// -- cgit v1.2.3 From aca2dab2d0ff7d66576b5d79f34eb9a706187de4 Mon Sep 17 00:00:00 2001 From: andreykproductengine Date: Fri, 3 Jun 2016 20:09:33 +0300 Subject: MAINT-6460 Crash calculating mesh complexity --- indra/newview/llmeshrepository.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 0aaed3e286..117507ef39 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -4034,6 +4034,11 @@ void LLMeshRepository::uploadError(LLSD& args) //static F32 LLMeshRepository::getStreamingCost(LLSD& header, F32 radius, S32* bytes, S32* bytes_visible, S32 lod, F32 *unscaled_value) { + if (header.size() == 0) + { + return 0.f; + } + F32 max_distance = 512.f; F32 dlowest = llmin(radius/0.03f, max_distance); -- cgit v1.2.3 From f9023371ba6b9bae9eef353ca8b42e4619b8ee01 Mon Sep 17 00:00:00 2001 From: AndreyL ProductEngine Date: Wed, 8 Jun 2016 03:49:55 +0300 Subject: MAINT-6461 Added a null check --- indra/llui/llview.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index 8f7cac1f61..62c3f401bf 100644 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -588,6 +588,11 @@ void LLView::onVisibilityChange ( BOOL new_visibility ) BOOL log_visibility_change = LLViewerEventRecorder::instance().getLoggingStatus(); BOOST_FOREACH(LLView* viewp, mChildList) { + if (!viewp) + { + continue; + } + // only views that are themselves visible will have their overall visibility affected by their ancestors old_visibility=viewp->getVisible(); -- cgit v1.2.3