diff --git a/autobuild.xml b/autobuild.xml index 8a3f711a1f..d6dea39d6a 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -2823,51 +2823,37 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors platforms - darwin64 + windows archive hash - 49650353442698c3e05102676fe427d0ebe02f0b + fc67514183e7dbbb96bebb9970e1431c hash_algorithm - sha1 + md5 url - https://github.com/secondlife/3p-tracy/releases/download/v0.8.1-eecbf72/tracy-v0.8.1-eecbf72-darwin64-eecbf72.tar.zst + https://3p.firestormviewer.org/tracy-v0.10.241491433-windows-241491433.tar.bz2 name - darwin64 - - windows64 - - archive - - hash - 2b80e7407e4f3e82eff3879add0e9ad63e7fcace - hash_algorithm - sha1 - url - https://github.com/secondlife/3p-tracy/releases/download/v0.8.1-eecbf72/tracy-v0.8.1-eecbf72-windows64-eecbf72.tar.zst - - name - windows64 + windows license bsd license_file - LICENSES/tracy_license.txt + LICENSES/Tracy.txt copyright Copyright (c) 2017-2022, Bartosz Taudul (wolf@nereid.pl) version - v0.8.1-eecbf72 + v0.10.241491433 name tracy canonical_repo - https://bitbucket.org/lindenlab/3p-tracy + https://github.com/beqjanus/3p-tracy description Tracy Profiler Library source - https://bitbucket.org/lindenlab/3p-tracy + https://github.com/beqjanus/3p-tracy source_type git diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index f2730c0494..ec3e4a76a4 100644 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -117,7 +117,7 @@ if(WINDOWS) elseif (MSVC_VERSION GREATER_EQUAL 1920 AND MSVC_VERSION LESS 1930) # Visual Studio 2019 set(MSVC_VER 140) set(MSVC_TOOLSET_VER 142) - elseif (MSVC_VERSION GREATER_EQUAL 1930 AND MSVC_VERSION LESS 1940) # Visual Studio 2022 + elseif (MSVC_VERSION GREATER_EQUAL 1930 AND MSVC_VERSION LESS 1950) # Visual Studio 2022 set(MSVC_VER 140) set(MSVC_TOOLSET_VER 143) else (MSVC80) diff --git a/indra/cmake/Tracy.cmake b/indra/cmake/Tracy.cmake index 00b4844fca..5092e050f9 100644 --- a/indra/cmake/Tracy.cmake +++ b/indra/cmake/Tracy.cmake @@ -10,7 +10,7 @@ if (USE_TRACY) use_prebuilt_binary(tracy) target_include_directories( ll::tracy SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/tracy) - target_link_libraries( ll::tracy INTERFACE TracyClient ) + # target_link_libraries( ll::tracy INTERFACE TracyClient ) # See: indra/llcommon/llprofiler.h add_compile_definitions(LL_PROFILER_CONFIGURATION=3) diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index 43946ba62c..8c861f5faa 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -268,8 +268,12 @@ if (DARWIN) list(APPEND llcommon_SOURCE_FILES llsys_objc.mm) endif (DARWIN) -# Tracy Profiler support +# Tracy Profiler support list(APPEND llcommon_SOURCE_FILES llprofiler.cpp) +if (USE_TRACY) +list(APPEND llcommon_SOURCE_FILES fstracyclient.cpp) +endif() +# # Add all nd* files. memory pool, intrinsics, ... diff --git a/indra/llcommon/fstracyclient.cpp b/indra/llcommon/fstracyclient.cpp new file mode 100644 index 0000000000..c367657804 --- /dev/null +++ b/indra/llcommon/fstracyclient.cpp @@ -0,0 +1,8 @@ +// Just a simple wrapper to easily import the single tracy source file and save +// all the pain of cross platform libraries in the Tracy 3p build. +#include "linden_common.h" + +#if LL_PROFILER_CONFIGURATION == LL_PROFILER_CONFIG_TRACY || LL_PROFILER_CONFIGURATION == LL_PROFILER_CONFIG_TRACY_FAST_TIMER + #include "TracyClient.cpp" +#endif // LL_PROFILER_CONFIGURATION + diff --git a/indra/llcommon/llprofiler.h b/indra/llcommon/llprofiler.h index 428702e0e7..11721aa62e 100644 --- a/indra/llcommon/llprofiler.h +++ b/indra/llcommon/llprofiler.h @@ -91,12 +91,12 @@ namespace LLProfiler // #define TRACY_NO_BROADCAST 1 // #define TRACY_ONLY_LOCALHOST 1 #define TRACY_ONLY_IPV4 1 - #include "Tracy.hpp" + #include "tracy/Tracy.hpp" // Fixed mutual exclusion issues with RAM and GPU. NOTE: This might still break on Apple in which case we'll need to restrict that platform //// GPU Mutually exclusive with detailed memory tracing // #define LL_PROFILER_ENABLE_TRACY_OPENGL 0 #define LL_PROFILER_ENABLE_TRACY_MEMORY 0 - #define LL_PROFILER_ENABLE_TRACY_OPENGL 0 + #define LL_PROFILER_ENABLE_TRACY_OPENGL 1 // Enable RenderDoc labeling #define LL_PROFILER_ENABLE_RENDER_DOC 0 @@ -104,37 +104,37 @@ namespace LLProfiler #endif #if LL_PROFILER_CONFIGURATION == LL_PROFILER_CONFIG_TRACY - #define LL_PROFILER_FRAME_END FrameMark + #define LL_PROFILER_FRAME_END FrameMark; // Note: this threadlocal forces memory colelction enabled from the start. It conflicts with deferred profiling. #define LL_PROFILER_SET_THREAD_NAME( name ) tracy::SetThreadName( name ); gProfilerEnabled = true; // - #define LL_PROFILER_THREAD_BEGIN(name) FrameMarkStart( name ) // C string - #define LL_PROFILER_THREAD_END(name) FrameMarkEnd( name ) // C string + #define LL_PROFILER_THREAD_BEGIN(name) FrameMarkStart( name ); // C string + #define LL_PROFILER_THREAD_END(name) FrameMarkEnd( name ); // C string // revert change that obscures custom FTM zones. We may want to may FTM Zones unique in future. // #define LL_RECORD_BLOCK_TIME(name) ZoneScoped // Want descriptive names; was: ZoneNamedN( ___tracy_scoped_zone, #name, LLProfiler::active ); - #define LL_RECORD_BLOCK_TIME(name) ZoneNamedN( ___tracy_scoped_zone, #name, LLProfiler::active ) + #define LL_RECORD_BLOCK_TIME(name) ZoneNamedN( ___tracy_scoped_zone, #name, LLProfiler::active ); // // // #define LL_PROFILE_ZONE_NAMED(name) ZoneNamedN( ___tracy_scoped_zone, name, true ) // #define LL_PROFILE_ZONE_NAMED_COLOR(name,color) ZoneNamedNC( ___tracy_scopped_zone, name, color, true ) // RGB // #define LL_PROFILE_ZONE_SCOPED ZoneScoped - #define LL_PROFILE_ZONE_NAMED(name) ZoneNamedN( ___tracy_scoped_zone, name, LLProfiler::active ) - #define LL_PROFILE_ZONE_NAMED_COLOR(name,color) ZoneNamedNC( ___tracy_scopped_zone, name, color, LLProfiler::active ) // RGB - #define LL_PROFILE_ZONE_SCOPED ZoneNamed( ___tracy_scoped_zone, LLProfiler::active ) // Enable deferred collection through filters + #define LL_PROFILE_ZONE_NAMED(name) ZoneNamedN( ___tracy_scoped_zone, name, LLProfiler::active ); + #define LL_PROFILE_ZONE_NAMED_COLOR(name,color) ZoneNamedNC( ___tracy_scopped_zone, name, color, LLProfiler::active ); // RGB + #define LL_PROFILE_ZONE_SCOPED ZoneNamed( ___tracy_scoped_zone, LLProfiler::active ); // Enable deferred collection through filters // - #define LL_PROFILE_ZONE_NUM( val ) ZoneValue( val ) - #define LL_PROFILE_ZONE_TEXT( text, size ) ZoneText( text, size ) + #define LL_PROFILE_ZONE_NUM( val ) ZoneValue( val ); + #define LL_PROFILE_ZONE_TEXT( text, size ) ZoneText( text, size ); #define LL_PROFILE_ZONE_ERR(name) LL_PROFILE_ZONE_NAMED_COLOR( name, 0XFF0000 ) // RGB yellow #define LL_PROFILE_ZONE_INFO(name) LL_PROFILE_ZONE_NAMED_COLOR( name, 0X00FFFF ) // RGB cyan #define LL_PROFILE_ZONE_WARN(name) LL_PROFILE_ZONE_NAMED_COLOR( name, 0x0FFFF00 ) // RGB red // Additional FS Tracy macros - #define LL_PROFILE_ZONE_COLOR(color) ZoneNamedC( ___tracy_scoped_zone, color, LLProfiler::active ) // Additional Tracy macro - #define LL_PROFILE_PLOT( name, value ) TracyPlot( name, value) - #define LL_PROFILE_PLOT_SQ( name, prev, value ) TracyPlot(name,prev);TracyPlot( name, value) + #define LL_PROFILE_ZONE_COLOR(color) ZoneNamedC( ___tracy_scoped_zone, color, LLProfiler::active ); + #define LL_PROFILE_PLOT( name, value ) TracyPlot( name, value); + #define LL_PROFILE_PLOT_CONFIG_SQUARE(name) TracyPlotConfig(name, tracy::PlotFormatType::Number, true, false, 0); #define LL_PROFILE_IS_CONNECTED TracyIsConnected // #endif @@ -158,15 +158,15 @@ namespace LLProfiler // Additional FS Tracy macros #define LL_PROFILE_ZONE_COLOR(color) #define LL_PROFILE_PLOT( name, value ) - #define LL_PROFILE_PLOT_SQ( name, prev, value ) + #define LL_PROFILE_PLOT_CONFIG_SQUARE(name) #define LL_PROFILE_IS_CONNECTED // #endif #if LL_PROFILER_CONFIGURATION == LL_PROFILER_CONFIG_TRACY_FAST_TIMER - #define LL_PROFILER_FRAME_END FrameMark + #define LL_PROFILER_FRAME_END FrameMark; #define LL_PROFILER_SET_THREAD_NAME( name ) tracy::SetThreadName( name ); gProfilerEnabled = true; - #define LL_PROFILER_THREAD_BEGIN(name) FrameMarkStart( name ) // C string - #define LL_PROFILER_THREAD_END(name) FrameMarkEnd( name ) // C string + #define LL_PROFILER_THREAD_BEGIN(name) FrameMarkStart( name ); // C string + #define LL_PROFILER_THREAD_END(name) FrameMarkEnd( name ); // C string // revert change that obscures custom FTM zones. // #define LL_RECORD_BLOCK_TIME(name) ZoneScoped const LLTrace::BlockTimer& LL_GLUE_TOKENS(block_time_recorder, __LINE__)(LLTrace::timeThisBlock(name)); (void)LL_GLUE_TOKENS(block_time_recorder, __LINE__); @@ -177,20 +177,20 @@ namespace LLProfiler // #define LL_PROFILE_ZONE_NAMED_COLOR(name,color) ZoneNamedNC( ___tracy_scopped_zone, name, color, true ) // RGB // #define LL_PROFILE_ZONE_SCOPED ZoneScoped #define LL_PROFILE_ZONE_NAMED(name) ZoneNamedN( ___tracy_scoped_zone, name, LLProfiler::active ); - #define LL_PROFILE_ZONE_NAMED_COLOR(name,color) ZoneNamedNC( ___tracy_scopped_zone, name, color, LLProfiler::active ) // RGB - #define LL_PROFILE_ZONE_SCOPED ZoneNamed( ___tracy_scoped_zone, LLProfiler::active ) // Enable deferred collection through filters + #define LL_PROFILE_ZONE_NAMED_COLOR(name,color) ZoneNamedNC( ___tracy_scopped_zone, name, color, LLProfiler::active ); // RGB + #define LL_PROFILE_ZONE_SCOPED ZoneNamed( ___tracy_scoped_zone, LLProfiler::active ); // Enable deferred collection through filters // - #define LL_PROFILE_ZONE_NUM( val ) ZoneValue( val ) - #define LL_PROFILE_ZONE_TEXT( text, size ) ZoneText( text, size ) + #define LL_PROFILE_ZONE_NUM( val ) ZoneValue( val ); + #define LL_PROFILE_ZONE_TEXT( text, size ) ZoneText( text, size ); #define LL_PROFILE_ZONE_ERR(name) LL_PROFILE_ZONE_NAMED_COLOR( name, 0XFF0000 ) // RGB yellow #define LL_PROFILE_ZONE_INFO(name) LL_PROFILE_ZONE_NAMED_COLOR( name, 0X00FFFF ) // RGB cyan #define LL_PROFILE_ZONE_WARN(name) LL_PROFILE_ZONE_NAMED_COLOR( name, 0x0FFFF00 ) // RGB red // Additional FS Tracy macros - #define LL_PROFILE_ZONE_COLOR(color) ZoneNamedC( ___tracy_scoped_zone, color, LLProfiler::active ) - #define LL_PROFILE_PLOT( name, value ) TracyPlot( name, value) - #define LL_PROFILE_PLOT_SQ( name, prev, value ) TracyPlot( name, prev );TracyPlot( name, value ) + #define LL_PROFILE_ZONE_COLOR(color) ZoneNamedC( ___tracy_scoped_zone, color, LLProfiler::active ); + #define LL_PROFILE_PLOT( name, value ) TracyPlot( name, value); + #define LL_PROFILE_PLOT_CONFIG_SQUARE(name) TracyPlotConfig(name, tracy::PlotFormatType::Number, true, false, 0); #define LL_PROFILE_IS_CONNECTED TracyIsConnected // #endif @@ -215,16 +215,17 @@ namespace LLProfiler // Additional FS Tracy macros #define LL_PROFILE_ZONE_COLOR(color) #define LL_PROFILE_PLOT( name, value ) - #define LL_PROFILE_PLOT_SQ( name, prev, value ) + #define LL_PROFILE_PLOT_CONFIG_SQUARE(name) #define LL_PROFILE_IS_CONNECTED // #endif // LL_PROFILER #if LL_PROFILER_ENABLE_TRACY_OPENGL -#define LL_PROFILE_GPU_ZONE(name) TracyGpuZone(name) -#define LL_PROFILE_GPU_ZONEC(name,color) TracyGpuZoneC(name,color) -#define LL_PROFILER_GPU_COLLECT TracyGpuCollect -#define LL_PROFILER_GPU_CONTEXT TracyGpuContext +#define LL_PROFILE_GPU_ZONE(name) TracyGpuZone(name); +#define LL_PROFILE_GPU_ZONEC(name,color) TracyGpuZoneC(name,color); +#define LL_PROFILER_GPU_COLLECT TracyGpuCollect; +#define LL_PROFILER_GPU_CONTEXT TracyGpuContext; +#define LL_PROFILER_GPU_CONTEXT_NS(name, size) TracyGpuContext;TracyGpuContextName(name,size); // disable memory tracking (incompatible with GPU tracing #define LL_PROFILE_ALLOC(ptr, size) (void)(ptr); (void)(size); @@ -234,12 +235,13 @@ namespace LLProfiler #define LL_PROFILE_GPU_ZONEC(name,color) (void)name;(void)color; #define LL_PROFILER_GPU_COLLECT #define LL_PROFILER_GPU_CONTEXT +#define LL_PROFILER_GPU_CONTEXT_NS(name, size) (void)name;(void)size; #define LL_LABEL_OBJECT_GL(type, name, length, label) #if LL_PROFILER_CONFIGURATION > 1 -#define LL_PROFILE_ALLOC(ptr, size) TracyAlloc(ptr, size) -#define LL_PROFILE_FREE(ptr) TracyFree(ptr) +#define LL_PROFILE_ALLOC(ptr, size) TracyAlloc(ptr, size); +#define LL_PROFILE_FREE(ptr) TracyFree(ptr); #else #define LL_PROFILE_ALLOC(ptr, size) (void)(ptr); (void)(size); #define LL_PROFILE_FREE(ptr) (void)(ptr); @@ -248,7 +250,7 @@ namespace LLProfiler #endif #if LL_PROFILER_ENABLE_RENDER_DOC -#define LL_LABEL_OBJECT_GL(type, name, length, label) glObjectLabel(type, name, length, label) +#define LL_LABEL_OBJECT_GL(type, name, length, label) glObjectLabel(type, name, length, label); #else #define LL_LABEL_OBJECT_GL(type, name, length, label) #endif diff --git a/indra/llcommon/llsdserialize.cpp b/indra/llcommon/llsdserialize.cpp index c854e30060..389dc2c39e 100644 --- a/indra/llcommon/llsdserialize.cpp +++ b/indra/llcommon/llsdserialize.cpp @@ -122,6 +122,7 @@ void LLSDSerialize::serialize(const LLSD& sd, std::ostream& str, ELLSD_Serialize // static bool LLSDSerialize::deserialize(LLSD& sd, std::istream& str, llssize max_bytes) { + LL_PROFILE_ZONE_SCOPED_CATEGORY_LLSD; char hdr_buf[MAX_HDR_LEN + 1] = ""; /* Flawfinder: ignore */ bool fail_if_not_legacy = false; diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h index e87f8feddf..eb706aea21 100644 --- a/indra/llcommon/llstring.h +++ b/indra/llcommon/llstring.h @@ -456,6 +456,7 @@ template std::string LLStringUtilBase::sLocale; typedef LLStringUtilBase LLStringUtil; typedef LLStringUtilBase LLWStringUtil; typedef std::basic_string LLWString; +typedef std::basic_string_view LLWStringView; //@ Use this where we want to disallow input in the form of "foo" // This is used to catch places where english text is embedded in the code diff --git a/indra/llcommon/lltimer.cpp b/indra/llcommon/lltimer.cpp index 6f74bf3fc8..a34b8f1024 100644 --- a/indra/llcommon/lltimer.cpp +++ b/indra/llcommon/lltimer.cpp @@ -70,7 +70,7 @@ LLTimer* LLTimer::sTimer = NULL; #if 0 void ms_sleep(U32 ms) { - LL_PROFILE_ZONE_SCOPED; + // LL_PROFILE_ZONE_SCOPED; using TimePoint = std::chrono::steady_clock::time_point; auto resume_time = TimePoint::clock::now() + std::chrono::milliseconds(ms); while (TimePoint::clock::now() < resume_time) diff --git a/indra/llcorehttp/_httppolicy.cpp b/indra/llcorehttp/_httppolicy.cpp index 704c8abb93..03ac521b87 100644 --- a/indra/llcorehttp/_httppolicy.cpp +++ b/indra/llcorehttp/_httppolicy.cpp @@ -213,6 +213,7 @@ void HttpPolicy::retryOp(const HttpOpRequest::ptr_t &op) // HttpService::ELoopSpeed HttpPolicy::processReadyQueue() { + LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK;// missing http trace const HttpTime now(totalTime()); HttpService::ELoopSpeed result(HttpService::REQUEST_SLEEP); HttpLibcurl & transport(mService->getTransport()); diff --git a/indra/llmessage/llmessagetemplate.h b/indra/llmessage/llmessagetemplate.h index 85a765b085..e949d2b395 100644 --- a/indra/llmessage/llmessagetemplate.h +++ b/indra/llmessage/llmessagetemplate.h @@ -365,6 +365,7 @@ public: BOOL callHandlerFunc(LLMessageSystem *msgsystem) const { + LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK; if (mHandlerFunc) { diff --git a/indra/llmessage/lltemplatemessagereader.cpp b/indra/llmessage/lltemplatemessagereader.cpp index 0fd8ee875c..1eec975d46 100644 --- a/indra/llmessage/lltemplatemessagereader.cpp +++ b/indra/llmessage/lltemplatemessagereader.cpp @@ -541,6 +541,11 @@ BOOL LLTemplateMessageReader::decodeData(const U8* buffer, const LLHost& sender llassert( mCurrentRMessageTemplate); llassert( !mCurrentRMessageData ); delete mCurrentRMessageData; // just to make sure + // storage for Tracy tag + #ifdef TRACY_ENABLE + static char msgstr[36]; + #endif + // // The offset tells us how may bytes to skip after the end of the // message name. @@ -556,6 +561,7 @@ BOOL LLTemplateMessageReader::decodeData(const U8* buffer, const LLHost& sender iter != mCurrentRMessageTemplate->mMemberBlocks.end(); ++iter) { + LL_PROFILE_ZONE_NAMED_CATEGORY_NETWORK("BuildFromTemplate"); LLMessageBlock* mbci = *iter; U8 repeat_number; S32 i; @@ -598,6 +604,13 @@ BOOL LLTemplateMessageReader::decodeData(const U8* buffer, const LLHost& sender } LLMsgBlkData* cur_data_block = NULL; + // Tracy Message processing + LL_DEBUGS("LLMessage") << "Processing " << mbci->mName << " with " << repeat_number << " repetitions" << LL_ENDL; + #ifdef TRACY_ENABLE + strncpy(msgstr, mbci->mName, 35); + LL_PROFILE_ZONE_TEXT(msgstr, 35); + #endif + // // now loop through the block for (i = 0; i < repeat_number; i++) @@ -622,6 +635,7 @@ BOOL LLTemplateMessageReader::decodeData(const U8* buffer, const LLHost& sender mbci->mMemberVariables.begin(); iter != mbci->mMemberVariables.end(); iter++) { + LL_PROFILE_ZONE_NAMED_CATEGORY_NETWORK("AddVariables"); const LLMessageVariable& mvci = **iter; // ok, build out the variables @@ -704,6 +718,12 @@ BOOL LLTemplateMessageReader::decodeData(const U8* buffer, const LLHost& sender } { + // Tracy Message processing + LL_PROFILE_ZONE_NAMED_CATEGORY_NETWORK("ProcessMessage"); + #ifdef TRACY_ENABLE + LL_PROFILE_ZONE_TEXT(msgstr, 35); + #endif + // static LLTimer decode_timer; if(LLMessageReader::getTimeDecodes() || gMessageSystem->getTimingCallback()) @@ -742,7 +762,7 @@ BOOL LLTemplateMessageReader::decodeData(const U8* buffer, const LLHost& sender if(decode_time > LLMessageReader::getTimeDecodesSpamThreshold()) { - LL_DEBUGS() << "--------- Message " << mCurrentRMessageTemplate->mName << " decode took " << decode_time << " seconds. (" << + LL_DEBUGS("LLMessage") << "--------- Message " << mCurrentRMessageTemplate->mName << " decode took " << decode_time << " seconds. (" << mCurrentRMessageTemplate->mMaxDecodeTimePerMsg << " max, " << (mCurrentRMessageTemplate->mTotalDecodeTime / mCurrentRMessageTemplate->mTotalDecoded) << " avg)" << LL_ENDL; } diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp index 6d41a5a22d..5a83c6e68f 100644 --- a/indra/llrender/llimagegl.cpp +++ b/indra/llrender/llimagegl.cpp @@ -2547,6 +2547,7 @@ void LLImageGLThread::run() // WorkQueue, likewise cleanup afterwards. mWindow->makeContextCurrent(mContext); gGL.init(false); + LL_PROFILER_GPU_CONTEXT_NS("LLImageGL Context", 17); LL::ThreadPool::run(); gGL.shutdown(); mWindow->destroySharedContext(mContext); diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp index 78227a7207..548ce6c308 100644 --- a/indra/llrender/llvertexbuffer.cpp +++ b/indra/llrender/llvertexbuffer.cpp @@ -237,6 +237,7 @@ public: { mWindow->makeContextCurrent(mContext); gGL.init(false); + LL_PROFILER_GPU_CONTEXT_NS("LLGLWorker Context", 18); mQueue->runUntilClose(); gGL.shutdown(); mWindow->destroySharedContext(mContext); diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp index 9ae60ab301..052987b69f 100644 --- a/indra/llui/llnotifications.cpp +++ b/indra/llui/llnotifications.cpp @@ -1014,6 +1014,7 @@ LLBoundListener LLNotificationChannelBase::connectChangedImpl(const LLEventListe LLBoundListener LLNotificationChannelBase::connectAtFrontChangedImpl(const LLEventListener& slot) { + LLMutexLock lock(&mItemsMutex); // Guard against against unlocked access to mItems for (LLNotificationSet::iterator it = mItems.begin(); it != mItems.end(); ++it) { slot(LLSD().with("sigtype", "load").with("id", (*it)->id())); @@ -1052,10 +1053,17 @@ bool LLNotificationChannelBase::updateItem(const LLSD& payload) bool LLNotificationChannelBase::updateItem(const LLSD& payload, LLNotificationPtr pNotification) { std::string cmd = payload["sigtype"]; - LLNotificationSet::iterator foundItem = mItems.find(pNotification); - bool wasFound = (foundItem != mItems.end()); + // Guard against unlocked access to mItems + // LLNotificationSet::iterator foundItem = mItems.find(pNotification); + // bool wasFound = (foundItem != mItems.end()); + bool wasFound = false; + { + LLMutexLock lock(&mItemsMutex); + LLNotificationSet::iterator foundItem = mItems.find(pNotification); + wasFound = (foundItem != mItems.end()); + } + // bool passesFilter = mFilter ? mFilter(pNotification) : true; - // first, we offer the result of the filter test to the simple // signals for pass/fail. One of these is guaranteed to be called. // If either signal returns true, the change processing is NOT performed @@ -1084,6 +1092,7 @@ bool LLNotificationChannelBase::updateItem(const LLSD& payload, LLNotificationPt assert(!wasFound); if (passesFilter) { + LLMutexLock lock(&mItemsMutex); // Guard against unlocked access to mItems // not in our list, add it and say so mItems.insert(pNotification); onLoad(pNotification); @@ -1107,6 +1116,7 @@ bool LLNotificationChannelBase::updateItem(const LLSD& payload, LLNotificationPt } else { + LLMutexLock lock(&mItemsMutex); // Guard against unlocked access to mItems // not in our list, add it and say so mItems.insert(pNotification); onChange(pNotification); @@ -1120,6 +1130,7 @@ bool LLNotificationChannelBase::updateItem(const LLSD& payload, LLNotificationPt { if (wasFound) { + LLMutexLock lock(&mItemsMutex); // Guard against unlocked access to mItems // it already existed, so this is a delete mItems.erase(pNotification); onChange(pNotification); @@ -1138,6 +1149,7 @@ bool LLNotificationChannelBase::updateItem(const LLSD& payload, LLNotificationPt assert(!wasFound); if (passesFilter) { + LLMutexLock lock(&mItemsMutex); // Guard against unlocked access to mItems // not in our list, add it and say so mItems.insert(pNotification); onAdd(pNotification); @@ -1149,6 +1161,7 @@ bool LLNotificationChannelBase::updateItem(const LLSD& payload, LLNotificationPt // if we have it in our list, pass on the delete, then delete it, else do nothing if (wasFound) { + LLMutexLock lock(&mItemsMutex); // Guard against unlocked access to mItems onDelete(pNotification); abortProcessing = mChanged(payload); mItems.erase(pNotification); @@ -1714,6 +1727,7 @@ void LLNotifications::add(const LLNotificationPtr pNotif) if (pNotif == NULL) return; // first see if we already have it -- if so, that's a problem + LLMutexLock lock(&mItemsMutex); // Guard against unlocked acceess to mItems LLNotificationSet::iterator it=mItems.find(pNotif); if (it != mItems.end()) { diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index 2f2d2cca88..2573b8be5b 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -1686,6 +1686,7 @@ const S32 max_format = (S32)num_formats - 1; close(); return FALSE; } + //LL_PROFILER_GPU_CONTEXT; TODO(Beq) review this LL_PROFILER_GPU_CONTEXT @@ -1720,7 +1721,7 @@ const S32 max_format = (S32)num_formats - 1; swapBuffers(); } - LL_PROFILER_GPU_CONTEXT; + LL_PROFILER_GPU_CONTEXT_NS("MainGL Context", 14); return TRUE; } @@ -1890,7 +1891,7 @@ void* LLWindowWin32::createSharedContext() void LLWindowWin32::makeContextCurrent(void* contextPtr) { wglMakeCurrent(mhDC, (HGLRC) contextPtr); - LL_PROFILER_GPU_CONTEXT; + } void LLWindowWin32::destroySharedContext(void* contextPtr) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 5a561571d4..235bc3e8a8 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -138,6 +138,7 @@ set(viewer_SOURCE_FILES fsfloatervolumecontrols.cpp fsfloatervramusage.cpp fsfloaterwearablefavorites.cpp + fsfloaterwhitelisthelper.cpp fskeywords.cpp fslslbridge.cpp fslslbridgerequest.cpp @@ -166,6 +167,7 @@ set(viewer_SOURCE_FILES fsscriptlibrary.cpp fsscrolllistctrl.cpp fsslurlcommand.cpp + fsworldmapmessage.cpp groupchatlistener.cpp lggbeamcolormapfloater.cpp lggbeammapfloater.cpp @@ -178,8 +180,6 @@ set(viewer_SOURCE_FILES llpanelopenregionsettings.cpp # [Legacy Bake] llagentwearablesfetch.cpp - - # local mesh vjlocalmesh.cpp vjfloaterlocalmesh.cpp vjlocalmeshimportdae.cpp @@ -931,6 +931,7 @@ set(viewer_HEADER_FILES fsfloatervolumecontrols.h fsfloatervramusage.h fsfloaterwearablefavorites.h + fsfloaterwhitelisthelper.h fsgridhandler.h fskeywords.h fslslbridge.h @@ -961,6 +962,7 @@ set(viewer_HEADER_FILES fsscrolllistctrl.h fsslurl.h fsslurlcommand.h + fsworldmapmessage.h groupchatlistener.h llaccountingcost.h lggbeamcolormapfloater.h @@ -973,8 +975,6 @@ set(viewer_HEADER_FILES llfloaterflickr.h # [Legacy Bake] llagentwearablesfetch.h - - # local mesh vjlocalmesh.h vjfloaterlocalmesh.h vjlocalmeshimportdae.h diff --git a/indra/newview/app_settings/grids.xml b/indra/newview/app_settings/grids.xml index 2a2e599f07..5c37cb0767 100644 --- a/indra/newview/app_settings/grids.xml +++ b/indra/newview/app_settings/grids.xml @@ -1,942 +1,32 @@ - alternatemetaverse.com:8002 + localhost:9000 LastModified - 2020-06-02T11:41:00.95Z + 2024-05-28T12:00:00Z + grid_login_id + localhost:9000 gridname - Alternate Metaverse + localhost gridnick - AMV + localhost login_identifier_types agent account loginpage - https://alternatemetaverse.com/splash - loginuri - - http://alternatemetaverse.com:8002 - - name - alternatemetaverse.com:8002 - platform - OpenSim - slurl_base - hop://alternatemetaverse.com:8002/ - - astralia.eu:8002 - - LastModified - 2020-06-02T11:43:19.89Z - gatekeeper - astralia.eu:8002 - gridname - astralia - gridnick - astralia - helperuri - http://astralia.eu//currency/helper/landtool.php - login_identifier_types - - agent - account - - loginpage - http://astralia.eu - loginuri - - http://astralia.eu:8002/ - - name - astralia.eu:8002 - platform - OpenSim - slurl_base - hop://astralia.eu:8002/ - - cc.opensimulator.org:8002 - - LastModified - 2019-12-09T10:00:00Z - gatekeeper - cc.opensimulator.org:8002 - gridname - OpenSim Community Conference - gridnick - opensimcc - helperuri - http://cc.opensimulator.org/helper/ - login_identifier_types - - agent - account - - loginpage - http://cc.opensimulator.org:8005/wifi/welcome.html - loginuri - - http://cc.opensimulator.org:8002/ - - name - cc.opensimulator.org:8002 - password - http://cc.opensimulator.org:8005/wifi/forgotpassword - platform - OpenSim - register - http://cc.opensimulator.org:8005/wifi/user/account - slurl_base - hop://cc.opensimulator.org:8002/ - - craft-world.org:8002 - - LastModified - 2020-06-02T14:23:31.86Z - about - https://www.craft-world.org/ - gatekeeper - craft-world.org:8002 - gridname - Craft World - gridnick - craft - help - https://www.craft-world.org/page/en/support.php - helperuri - http://webapp.craft-world.org/economy/ - login_identifier_types - - agent - account - - loginpage - https://www.craft-world.org/loginscreen.php - loginuri - - http://craft-world.org:8002/ - - name - craft-world.org:8002 - password - https://www.craft-world.org/page/en/avatar-tools.php - platform - OpenSim - register - https://www.craft-world.org/page/en/register-an-avatar.php - slurl_base - hop://craft-world.org:8002/ - - discoverygrid.net:8002 - - LastModified - 2020-04-24T12:06:59.18Z - about - https://discoverygrid.net/about.php - gatekeeper - discoverygrid.net:8002 - gridname - DiscoveryGrid - gridnick - DiscoveryGrid - help - https://discoverygrid.net - helperuri - https://discoverygrid.net/apps/ - login_identifier_types - - agent - account - - loginpage - https://discoverygrid.net/viewersplash.php - loginuri - - http://discoverygrid.net:8002/ - - name - discoverygrid.net:8002 - password - https://discoverygrid.net/#needpw - platform - OpenSim - register - https://discoverygrid.net/index.php#create - slurl_base - hop://discoverygrid.net:8002/ - - fireandicegrid.net:8002 - - LastModified - 2020-06-02T11:41:59.83Z - about - http://fireandicegrid.net - gatekeeper - fireandicegrid.net:8002 - gridname - Fire And Ice Grid - gridnick - FireAndIceGrid - help - http://fireandicegrid.net - helperuri - http://fireandicegrid.net - login_identifier_types - - agent - account - - loginpage - http://fireandicegrid.net - loginuri - - http://fireandicegrid.net:8002/ - - name - fireandicegrid.net:8002 - password - http://fireandicegrid.net:8002/wifi - platform - OpenSim - register - http://fireandicegrid.net:8002/wifi - slurl_base - hop://fireandicegrid.net:8002/ - - gaynations.org:7002 - - DEPRECATED - TRUE - login_identifier_types - - agent - account - - LastModified - 2020-06-02T11:41:00.95Z - name - gaynations.org:7002 - - goto.theencoreescape.com:8002 - - DirectoryFee - 0 - LastModified - 2020-04-24T17:00:50.92Z - SendGridInfoToViewerOnLogin - true - about - http://theencoreescape.com/ - gatekeeper - goto.theencoreescape.com:8002 - gridname - The Encore Escape - gridnick - EncoreEscape - help - http://theencoreescape.com/ - helperuri - http://money.theencoreescape.com/ - login_identifier_types - - agent - account - - loginpage - http://splash.theencoreescape.com/ - loginuri - - http://goto.theencoreescape.com:8002/ - - name - goto.theencoreescape.com:8002 - password - http://theencoreescape.com/ - platform - OpenSim - register - http://theencoreescape.com/ - search - http://search.theencoreescape.com/query.php - slurl_base - hop://goto.theencoreescape.com:8002/ - - grid.3rdrockgrid.com:8002 - - LastModified - 2012-08-03T15:32:54.31Z - about - http://3rdrockgrid.com/ - gridname - 3RD Rock Grid - gridnick - 3RG - help - http://3rdrockgrid.com/ - helperuri - http://grid.3rdrockgrid.com/3rg_money/ - login_identifier_types - - agent - account - - loginpage - http://grid.3rdrockgrid.com/3rg_login/ - loginuri - - http://grid.3rdrockgrid.com:8002/ - - name - grid.3rdrockgrid.com:8002 - password - http://3rdrockgrid.com/ - register - http://3rdrockgrid.com/ - slurl_base - hop://grid.3rdrockgrid.com:8002/ - - - grid.avacon.org:8002 - - LastModified - 2020-06-02T12:01:35.02Z - gatekeeper - grid.avacon.org:8002 - gridname - AvaCon Grid - gridnick - avacon - helperuri - http://grid.avacon.org/helper/ - login_identifier_types - - agent - account - - loginpage - http://grid.avacon.org:8005/wifi/welcome.html - loginuri - - http://grid.avacon.org:8002/ - - name - grid.avacon.org:8002 - password - http://grid.avacon.org:8005/wifi/forgotpassword - platform - OpenSim - register - http://grid.avacon.org:8005/wifi/user/account - slurl_base - hop://grid.avacon.org:8002/ - - grid.kitely.com:8002 - - LastModified - 2014-03-20T12:30:00Z - gatekeeper - grid.kitely.com:8002 - gridname - Kitely - gridnick - kitely - helperuri - http://grid.kitely.com:8002/ - login_identifier_types - - agent - account - - loginpage - http://www.kitely.com/viewer_login - loginuri - - http://grid.kitely.com:8002/ - - name - grid.kitely.com:8002 - platform - OpenSim - slurl_base - hop://grid.kitely.com:8002/ - - grid.virtualife.cloud:8002 - - LastModified - 2019-12-04T10:50:32.55Z - about - http://www.virtualife.cloud - gatekeeper - grid.virtualife.cloud:8002 - gridname - virtualife world - gridnick - Virtualife world - login_identifier_types - - agent - account - - loginpage - http://www.virtualife.cloud/index.php?option=com_opensim - loginuri - - http://grid.virtualife.cloud:8002/ - - name - grid.virtualife.cloud:8002 - password - http://grid.virtualife.cloud:8002/wifi/forgotpassword - platform - OpenSim - register - http://grid.virtualife.cloud:8002/wifi/user/account - slurl_base - hop://grid.virtualife.cloud:8002/ - - grid01.from-ne.com:8002 - - DEPRECATED - TRUE - LastModified - 2020-06-02T11:41:00.95Z - login_identifier_types - - agent - account - - name - grid01.from-ne.com:8002 - - hypergrid.org:8002 - - LastModified - 2013-04-02T01:01:24.65Z - about - http://www.hypergrid.org/metropolis/wiki - gatekeeper - hypergrid.org:8002 - gridname - Metropolis Metaversum - gridnick - Metropolis - help - http://metropolis.hypergrid.org/forum - helperuri - http://metropolis.hypergrid.org/currency/helper/ - login_identifier_types - - agent - account - - loginpage - http://metropolis.hypergrid.org - loginuri - - http://hypergrid.org:8002/ - - name - hypergrid.org:8002 - password - http://metropolis.hypergrid.org/password.php - platform - OpenSim - register - http://www.hypergrid.org/metropolis/metro_rg.php - slurl_base - hop://hypergrid.org:8002/ - - islandoasisgrid.biz:8002 - - LastModified - 2013-01-21T20:10:35.17Z - about - http://www.islandoasis.biz/GridStats.aspx - gridname - Island Oasis - gridnick - Island_Oasis - help - http://www.islandoasis.biz/Support.aspx - helperuri - http://islandoasisgrid:8020/OsCurrency/ - login_identifier_types - - agent - account - - loginpage - http://www.islandoasis.biz/welcome.aspx - loginuri - - http://islandoasisgrid.biz:8002/ - - name - islandoasisgrid.biz:8002 - password - http://www.islandoasis.biz/Login.aspx - platform - OpenSim - register - http://www.islandoasis.biz/verification.aspx - slurl_base - hop://islandoasisgrid.biz:8002/ - - lfgrid.com:8002 - - LastModified - 2013-03-18T21:51:17.62Z - about - http://lfgrid.com/about/ - gatekeeper - lfgrid.com:8002 - gridname - Littlefield Grid - gridnick - LFgrid - help - http://lfgrid.com/help - helperuri - http://lfgrid.com/services/ - login_identifier_types - - agent - account - - loginpage - http://www.lfgrid.com/splash/index.php - loginuri - - http://lfgrid.com:8002/ - - name - lfgrid.com:8002 - password - http://lfgrid.com:8002/wifi/forgotpassword - platform - OpenSim - register - http://lfgrid.com:8002/wifi/user/account/ - slurl_base - hop://lfgrid.com:8002/ - - login.aviworlds.com:8002 - - DirectoryFee - 0 - LastModified - 2020-06-02T11:41:55.32Z - SendGridInfoToViewerOnLogin - true - about - http://aviworlds.com - gatekeeper - login.aviworlds.com:8002 - gridname - AviWorlds - gridnick - Avi - help - http://aviworlds.com - helperuri - http://login.aviworlds.com/helper_scripts/helper/ - login_identifier_types - - agent - account - - loginpage - http://login.aviworlds.com/splash - loginuri - - http://login.aviworlds.com:8002/ - - name - login.aviworlds.com:8002 - password - http://login.aviworlds.com:8002/wifi/forgotpassword - platform - OpenSim - register - http://login.aviworlds.com:8002/wifi/user/account/ - search - http://login.aviworlds.com/ossearch/query.php - slurl_base - hop://login.aviworlds.com:8002/ - - login.digiworldz.com:8002 - - DirectoryFee - 0 - LastModified - 2015-07-24T13:19:44.27Z - SendGridInfoToViewerOnLogin - true - about - http://digiworldz.com/ - gatekeeper - login.digiworldz.com:8002 - gridname - DigiWorldZ Grid - gridnick - DWG - help - http://digiworldz.com/ - helperuri - http://money.digiworldz.com/ - login_identifier_types - - agent - account - - loginpage - http://splash.digiworldz.com/ - loginuri - - http://login.digiworldz.com:8002/ - - name - login.digiworldz.com:8002 - password - http://digiworldz.com/ - platform - OpenSim - register - http://digiworldz.com/ - search - http://search.digiworldz.com/query.php - slurl_base - hop://login.digiworldz.com:8002/ - - login.francogrid.org:80 - - LastModified - 2013-02-14T02:00:46.10Z - about - http://francogrid.org/ - gridname - FrancoGrid - gridnick - francogrid - help - http://francogrid.org/aide - helperuri - http://helper.main.francogrid.org/ - login_identifier_types - - agent - account - - loginpage - http://viewer.francogrid.org/ - loginuri - - http://login.francogrid.org/ - - name - login.francogrid.org:80 - password - http://francogrid.org/user/password - platform - OpenSim - register - http://francogrid.org/user/register - slurl_base - hop://login.francogrid.org:80/ - - login.greatcanadiangrid.ca:8002 - - DEPRECATED - TRUE - login_identifier_types - - agent - account - - LastModified - 2020-06-02T11:41:00.95Z - name - login.greatcanadiangrid.ca:8002 - - login.osgrid.org - - LastModified - 2019-04-19T21:15:00Z - about - http://www.osgrid.org/ - gatekeeper - hg.osgrid.org:80 - gridname - OSGrid - gridnick - osgrid - help - http://www.osgrid.org/ - helperuri - http://helper.osgrid.org/ - login_identifier_types - - agent - account - - loginpage - http://www.osgrid.org/splash/ - loginuri - - http://login.osgrid.org/ - - name - login.osgrid.org - password - http://www.osgrid.org/ - platform - register - http://www.osgrid.org/ - slurl_base - hop://login.osgrid.org/ - web_profile_url - http://my.osgrid.org/?name=[AGENT_NAME] - - login.ufsgrid.com:8002 - - DEPRECATED - TRUE - LastModified - 2020-06-02T11:41:00.95Z - login_identifier_types - - agent - account - - name - login.ufsgrid.com:8002 - - login.zetaworlds.com - - LastModified - 2020-06-02T12:39:31.19Z - about - https://zetaworlds.com/ - gridname - ZetaWorlds - gridnick - ZetaWorlds - helperuri - http://money.zetaworlds.com/ - login_identifier_types - - agent - account - - loginpage - http://zetaworlds.com/splash loginuri - https://login.zetaworlds.com/ + http://localhost:9000 name - login.zetaworlds.com - password - https://zetaworlds.com/user/forgot - platform - OpenSim - register - http://zetaworlds.com/user/register + localhost:9000 slurl_base - hop://login.zetaworlds.com/ - - login.zonenations.com:8002 - - LastModified - 2019-12-04T10:43:24.96Z - about - https://www.zonenations.com/ - gatekeeper - login.zonenations.com:8002 - gridname - Zone Nations - gridnick - ZoneNations - help - https://www.zonenations.com/supporto.html - helperuri - https://www.zonenations.com/components/com_opensim/ - login_identifier_types - - agent - account - - loginpage - https://www.zonenations.com/index.php?option=com_opensim - loginuri - - http://login.zonenations.com:8002/ - - name - login.zonenations.com:8002 - password - https://www.zonenations.com/password-smarrita.html - platform - OpenSim - register - https://www.zonenations.com/iscriviti.html - slurl_base - hop://login.zonenations.com:8002/ - - login.main.mobiusgrid.us:8002 - - LastModified - 2020-06-02T11:41:00.95Z - DEPRECATED - TRUE - name - login.main.mobiusgrid.us:8002 - - main.mobiusgrid.us - - LastModified - 2020-06-02T13:19:55.40Z - about - https://mobiusgrid.us/about - gridname - Mobius Grid - gridnick - Mobius - help - https://mobiusgrid.us/help - login_identifier_types - - agent - account - - loginpage - https://mobiusgrid.us/splash - loginuri - - http://login.main.mobiusgrid.us - - name - main.mobiusgrid.us - password - https://mobiusgrid.us/forgot - platform - OpenSim - register - https://mobiusgrid.us/join - slurl_base - hop://main.mobiusgrid.us/ - - partydestinationgrid.com:8002 - - LastModified - 2019-12-04T10:48:17.58Z - about - https://partydestinationgrid.com/ - gatekeeper - partydestinationgrid.com:8002 - gridname - Party Destination Grid - gridnick - partydestinationgrid - help - https://partydestinationgrid.com/index.php/help/help - helperuri - http://partydestinationgrid.com/components/com_opensim/ - login_identifier_types - - agent - account - - loginpage - http://module.partydestinationgrid.com/login - loginuri - - http://partydestinationgrid.com:8002/ - - name - partydestinationgrid.com:8002 - platform - OpenSim - register - https://partydestinationgrid.com/index.php/component/users/?view=registration - slurl_base - hop://partydestinationgrid.com:8002/ - - tanglegrid.net:8002 - - LastModified - 2019-12-04T10:49:43.20Z - about - http://tanglegrid.com/ - gatekeeper - tanglegrid.net:8002 - gridname - TanGLe Grid - gridnick - TanGLe - help - http://tanglegrid.com/contact.php - helperuri - http://tanglegrid.net/scripts/helper/ - login_identifier_types - - agent - account - - loginpage - http://tanglegrid.net/web_interface/loginscreen.php - loginuri - - http://tanglegrid.net:8002/ - - name - tanglegrid.net:8002 - password - http://www.tanglegrid.net/web_interface/index.php?page=forgotpass - platform - OpenSim - register - http://www.tanglegrid.net/web_interface/avatar.php - search - http://www.tanglegrid.net/helper/query.php - slurl_base - hop://tanglegrid.net:8002/ - - thekazgrid.com:8002 - - LastModified - 2019-12-04T10:47:15.79Z - about - https://www.thekazgrid.com/index.php/11-about/6-about - gridname - TheKaz Grid - gridnick - TheKaz - helperuri - https://www.thekazgrid.com/currency/helper/ - login_identifier_types - - agent - account - - loginpage - https://www.thekazgrid.com/index.php?option=com_opensim - loginuri - - http://thekazgrid.com:8002/ - - name - thekazgrid.com:8002 - platform - OpenSim - register - https://www.thekazgrid.com/index.php/join - slurl_base - hop://thekazgrid.com:8002/ - - util.aditi.lindenlab.com + hop://localhost:9000/ + + util.aditi.lindenlab.com LastModified 2018-09-26T20:15:00Z @@ -953,7 +43,7 @@ agent loginpage - https://phoenixviewer.com/app/loginV3/ + http://phoenixviewer.com/app/loginV3/ loginuri https://login.aditi.lindenlab.com/cgi-bin/login.cgi @@ -986,7 +76,7 @@ agent loginpage - https://phoenixviewer.com/app/loginV3/ + http://phoenixviewer.com/app/loginV3/ loginuri https://login.agni.lindenlab.com/cgi-bin/login.cgi @@ -999,156 +89,6 @@ 1 web_profile_url https://my.secondlife.com/ - - grid.alifevirtual.com:8002 - - DEPRECATED - TRUE - LastModified - 2020-04-04T10:42:24.54Z - name - grid.alifevirtual.com:8002 - - www.alifevirtual.com:8002 - - LastModified - 2020-05-30T09:41:01.73Z - about - http://www.alifevirtual.com/ - gridname - Alife Virtual - gridnick - AV - help - http://www.alifevirtual.com/ - helperuri - http://www.alifevirtual.com/helper/ - login_identifier_types - - agent - account - - loginpage - http://www.alifevirtual.com/welcome.php - loginuri - - http://www.alifevirtual.com:8002/ - - name - www.alifevirtual.com:8002 - password - http://www.alifevirtual.com/ - platform - OpenSim - register - http://www.alifevirtual.com/ - slurl_base - hop://www.alifevirtual.com:8002/ - - grid.avatarconnection.com:8002/ - - DEPRECATED - TRUE - LastModified - 2020-06-02T11:41:00.95Z - name - grid.avatarconnection.com:8002/ - - grid.roleplayworlds.net:8002 - - DEPRECATED - TRUE - LastModified - 2020-06-02T11:41:00.95Z - name - grid.roleplayworlds.net:8002 - - inworldz.com:8002 - - LastModified - 2018-08-23T21:00:00.00Z - DEPRECATED - TRUE - name - inworldz.com:8002 - - login.avination.com/ - - DEPRECATED - TRUE - name - login.avination.com/ - LastModified - 2018-02-28T15:36:26.43Z - - login.danger.osgrid.org - - DEPRECATED - TRUE - LastModified - 2020-06-02T11:41:00.95Z - name - login.danger.osgrid.org - - reactiongrid.com:8008 - - DEPRECATED - TRUE - LastModified - 2020-06-02T11:41:00.95Z - name - reactiongrid.com:8008 - - login.aurorascape.com:8002 - - DEPRECATED - TRUE - LastModified - 2020-06-02T11:41:00.95Z - name - login.aurorascape.com:8002 - - vidadupla.com.br:8002 - - DirectoryFee - 0 - LastModified - 2020-11-06T14:42:01.07Z - SendGridInfoToViewerOnLogin - true - about - http://vidadupla.com.br - gatekeeper - vidadupla.com.br:8002 - gridname - Vida Dupla - gridnick - VD - helperuri - http://vidadupla.com.br/helper_scripts/helper/ - login_identifier_types - - agent - account - - loginpage - http://vidadupla.com.br/splash - loginuri - - http://vidadupla.com.br:8002/ - - name - vidadupla.com.br:8002 - password - http://vidadupla.com.br:8002/wifi/forgotpassword - platform - OpenSim - register - http://vidadupla.com.br:8002/wifi/user/account/ - search - http://vidadupla.com.br/ossearch/query.php - slurl_base - hop://vidadupla.com.br:8002/ diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 9f7336a155..a606cc5f28 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -153,6 +153,17 @@ Value http://phoenixviewer.com/app/fsdata/grids.xml + FSGridBuilderURL + + Comment + Fetch an html page of grids from this URL. + Persist + 1 + Type + String + Value + https://phoenixviewer.com/app/fsdata/fs_grid_builder.html + LastConnectedGrid Comment @@ -13750,6 +13761,17 @@ Change of this parameter will affect the layout of buttons in notification toast Value 1 + FSUseLegacyUnsupportedHardwareChecks + + Comment + If enabled, Firestorm will perform utterly pointless checks that probably made sense in 2004. + Persist + 1 + Type + Boolean + Value + 0 + FSUseStandaloneGroupFloater Comment diff --git a/indra/newview/fscommon.cpp b/indra/newview/fscommon.cpp index 4f0d4a2487..cd81ad04e3 100644 --- a/indra/newview/fscommon.cpp +++ b/indra/newview/fscommon.cpp @@ -505,7 +505,7 @@ bool FSCommon::isFilterEditorKeyCombo(KEY key, MASK mask) LLUUID FSCommon::getGroupForRezzing() { - LLUUID group_id = gAgent.getGroupID(); + LLUUID group_id{ gAgent.getGroupID() }; LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); if (parcel && gSavedSettings.getBOOL("RezUnderLandGroup")) @@ -523,12 +523,12 @@ LLUUID FSCommon::getGroupForRezzing() return group_id; } -void FSCommon::updateUsedEmojis(LLWString text) +void FSCommon::updateUsedEmojis(LLWStringView text) { LLEmojiDictionary* dictionary = LLEmojiDictionary::getInstance(); - bool emojiSent = false; - for (llwchar& c : text) + bool emojiSent{ false }; + for (const llwchar& c : text) { if (dictionary->isEmoji(c)) { diff --git a/indra/newview/fscommon.h b/indra/newview/fscommon.h index 2cd77627a9..2e7946b0e5 100644 --- a/indra/newview/fscommon.h +++ b/indra/newview/fscommon.h @@ -94,7 +94,7 @@ namespace FSCommon LLUUID getGroupForRezzing(); - void updateUsedEmojis(LLWString text); + void updateUsedEmojis(LLWStringView text); }; #endif // FS_COMMON_H diff --git a/indra/newview/fsfloaterwearablefavorites.cpp b/indra/newview/fsfloaterwearablefavorites.cpp index e0d7c3984a..0e3a79e748 100644 --- a/indra/newview/fsfloaterwearablefavorites.cpp +++ b/indra/newview/fsfloaterwearablefavorites.cpp @@ -313,6 +313,7 @@ void FSFloaterWearableFavorites::onFilterEdit(const std::string& search_string) { mItemsList->setFilterSubString(search_string, true); mItemsList->setNoItemsCommentText(getString("empty_list")); + mItemsList->rearrange(); } void FSFloaterWearableFavorites::onOptionsMenuItemClicked(const LLSD& userdata) diff --git a/indra/newview/fsfloaterwearablefavorites.h b/indra/newview/fsfloaterwearablefavorites.h index ee13a7e9f5..21431c7635 100644 --- a/indra/newview/fsfloaterwearablefavorites.h +++ b/indra/newview/fsfloaterwearablefavorites.h @@ -61,6 +61,11 @@ public: return mDADSignal.connect(cb); } + void rearrange() + { + rearrangeItems(); + } + protected: friend class LLUICtrlFactory; FSWearableFavoritesItemsList(const Params&); diff --git a/indra/newview/fsfloaterwhitelisthelper.cpp b/indra/newview/fsfloaterwhitelisthelper.cpp new file mode 100644 index 0000000000..09b82b068c --- /dev/null +++ b/indra/newview/fsfloaterwhitelisthelper.cpp @@ -0,0 +1,87 @@ +/** + * @file fsfloaterwhitelisthelper.cpp + * @brief Helper tool implementation to display paths to whitelist in antivirus tools + * + * $LicenseInfo:firstyear=2024&license=fsviewerlgpl$ + * Phoenix Firestorm Viewer Source Code + * Copyright (C) 2024, The Phoenix Firestorm Project, 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 + * + * The Phoenix Firestorm Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA + * http://www.firestormviewer.org + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "fsfloaterwhitelisthelper.h" +#include "lltexteditor.h" +#include "llviewercontrol.h" +#include "lldir.h" + + +FSFloaterWhiteListHelper::FSFloaterWhiteListHelper(const LLSD& key) : LLFloater(key) +{ +} + +BOOL FSFloaterWhiteListHelper::postBuild() +{ + populateWhitelistInfo(); + return TRUE; +} + +void FSFloaterWhiteListHelper::populateWhitelistInfo() +{ +// Hopefully we can trash this bit soon in favor of webRTC +#if LL_WINDOWS + // On windows use exe (not work or RO) directory + std::string voiceexe_path = gDirUtilp->getExecutableDir(); + gDirUtilp->append(voiceexe_path, "SLVoice.exe"); +#elif LL_DARWIN + // On MAC use resource directory + std::string voiceexe_path = gDirUtilp->getAppRODataDir(); + gDirUtilp->append(voiceexe_path, "SLVoice"); +#else + std::string voiceexe_path = gDirUtilp->getExecutableDir(); + bool usingWine = gSavedSettings.getBOOL("FSLinuxEnableWin64VoiceProxy"); + if (!usingWine) + { + gDirUtilp->append(voiceexe_path, "SLVoice"); // native version + } + else + { + gDirUtilp->append(voiceexe_path, "win64/SLVoice.exe"); // use bundled win64 version + } +#endif + + const std::string slpluginexe_path = gDirUtilp->getLLPluginLauncher(); + + std::string whitelist_folder_info = + gDirUtilp->getExecutableDir() + "\n" // Executable Dir + + gDirUtilp->getOSUserAppDir() + "\n" // Top-level User Data Dir + + gDirUtilp->getCacheDir(); // "Cache Dir + + std::string whitelist_exe_info = + gDirUtilp->getExecutableFilename() + "\n" // Viewer Binary + + gDirUtilp->getExecutablePathAndName() + "\n" // Viewer Binary full path + + gDirUtilp->getBaseFileName(voiceexe_path, false) + "\n" // " Voice Binary" + + voiceexe_path + "\n" // slvoice full path + + gDirUtilp->getBaseFileName(slpluginexe_path, false) + "\n" // SLPlugin Launcher Binary + + slpluginexe_path + "\n"; // SLPlugin Launcher full path + + getChild("whitelist_folders_editor")->setText(whitelist_folder_info); + getChild("whitelist_exes_editor")->setText(whitelist_exe_info); +} diff --git a/indra/newview/fsfloaterwhitelisthelper.h b/indra/newview/fsfloaterwhitelisthelper.h new file mode 100644 index 0000000000..6fe4f976e7 --- /dev/null +++ b/indra/newview/fsfloaterwhitelisthelper.h @@ -0,0 +1,44 @@ +/** + * @file fsfloaterwhitelisthelper.h + * @brief Helper tool header file to display paths to whitelist in antivirus tools + * + * $LicenseInfo:firstyear=2024&license=fsviewerlgpl$ + * Phoenix Firestorm Viewer Source Code + * Copyright (C) 2024, The Phoenix Firestorm Project, 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 + * + * The Phoenix Firestorm Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA + * http://www.firestormviewer.org + * $/LicenseInfo$ + */ + +#ifndef FSFLOATERWHITELISTHELPER_H +#define FSFLOATERWHITELISTHELPER_H + +#include "llfloater.h" + +class FSFloaterWhiteListHelper : public LLFloater +{ +public: + explicit FSFloaterWhiteListHelper(const LLSD& key); + ~FSFloaterWhiteListHelper() final = default; + + BOOL postBuild() override final; + +private: + void populateWhitelistInfo(); +}; +#endif // FSFLOATERWHITELISTHELPER_H diff --git a/indra/newview/fspanellogin.cpp b/indra/newview/fspanellogin.cpp index 1e5e8c5019..b645b3430d 100644 --- a/indra/newview/fspanellogin.cpp +++ b/indra/newview/fspanellogin.cpp @@ -250,6 +250,12 @@ FSPanelLogin::FSPanelLogin(const LLRect &rect, LLTextBox* grid_mgr_help_text = getChild("grid_login_text"); grid_mgr_help_text->setClickedCallback(onClickGridMgrHelp, NULL); +#ifdef OPENSIM + LLTextBox* grid_builder_text = getChild("grid_builder_text"); + grid_builder_text->setClickedCallback(onClickGridBuilder, NULL); + grid_builder_text->setVisible(true); +#endif + LLSLURL start_slurl(LLStartUp::getStartSLURL()); // The StartSLURL might have been set either by an explicit command-line // argument (CmdLineLoginLocation) or by default. @@ -1356,6 +1362,12 @@ void FSPanelLogin::onClickGridMgrHelp(void*) } } +//static +void FSPanelLogin::onClickGridBuilder(void*) +{ + LLWeb::loadURLInternal(gSavedSettings.getString("FSGridBuilderURL")); +} + void FSPanelLogin::onSelectUser() { LL_INFOS("AppInit") << "onSelectUser()" << LL_ENDL; diff --git a/indra/newview/fspanellogin.h b/indra/newview/fspanellogin.h index be348ac25c..5963972abd 100644 --- a/indra/newview/fspanellogin.h +++ b/indra/newview/fspanellogin.h @@ -111,6 +111,7 @@ private: static void onClickRemove(void*); static void onRemoveCallback(const LLSD& notification, const LLSD& response); static void onClickGridMgrHelp(void*); + static void onClickGridBuilder(void*); static std::string credentialName(); private: diff --git a/indra/newview/fsradar.cpp b/indra/newview/fsradar.cpp index 674d2a4339..7da19a4eb2 100644 --- a/indra/newview/fsradar.cpp +++ b/indra/newview/fsradar.cpp @@ -90,13 +90,15 @@ public: //============================================================================= FSRadar::FSRadar() : - mRadarAlertRequest(false), - mRadarFrameCount(0), - mRadarLastBulkOffsetRequestTime(0), - mRadarLastRequestTime(0.f), - mShowUsernamesCallbackConnection(), - mNameFormatCallbackConnection(), - mAgeAlertCallbackConnection() + mRadarAlertRequest(false), + mRadarFrameCount(0), + mRadarLastBulkOffsetRequestTime(0), + mRadarLastRequestTime(0.f), + mShowUsernamesCallbackConnection(), + mNameFormatCallbackConnection(), + mAgeAlertCallbackConnection(), + mRegionCapabilitiesReceivedCallbackConnection(), + mRegionChangedCallbackConnection() { // Use the callback from LLAvatarNameCache here or we might update the names too early! LLAvatarNameCache::getInstance()->addUseDisplayNamesCallback(boost::bind(&FSRadar::updateNames, this)); @@ -104,10 +106,18 @@ FSRadar::FSRadar() : mNameFormatCallbackConnection = gSavedSettings.getControl("RadarNameFormat")->getSignal()->connect(boost::bind(&FSRadar::updateNames, this)); mAgeAlertCallbackConnection = gSavedSettings.getControl("RadarAvatarAgeAlertValue")->getSignal()->connect(boost::bind(&FSRadar::updateAgeAlertCheck, this)); + + mRegionChangedCallbackConnection = gAgent.addRegionChangedCallback([this]() { onRegionChanged(); }); } FSRadar::~FSRadar() { + gAgent.removeRegionChangedCallback(mRegionChangedCallbackConnection); + if (mRegionCapabilitiesReceivedCallbackConnection.connected()) + { + mRegionCapabilitiesReceivedCallbackConnection.disconnect(); + } + if (mShowUsernamesCallbackConnection.connected()) { mShowUsernamesCallbackConnection.disconnect(); @@ -1040,8 +1050,35 @@ void FSRadar::updateAgeAlertCheck() void FSRadar::updateNotes(const LLUUID& avatar_id, std::string_view notes) { - if (auto entry = getEntry(avatar_id); entry) + if (auto entry = getEntry(avatar_id)) { entry->setNotes(notes); } } + +void FSRadar::onRegionChanged() +{ + if (mRegionCapabilitiesReceivedCallbackConnection.connected()) + { + mRegionCapabilitiesReceivedCallbackConnection.disconnect(); + } + + if (auto region = gAgent.getRegion()) + { + if (region->capabilitiesReceived()) + { + for (auto& [id, entry] : mEntryList) + entry->requestProperties(); + } + else + { + mRegionCapabilitiesReceivedCallbackConnection = region->setCapabilitiesReceivedCallback( + [this](const LLUUID&, LLViewerRegion*) + { + mRegionCapabilitiesReceivedCallbackConnection.disconnect(); + for (auto& [id, entry] : mEntryList) + entry->requestProperties(); + }); + } + } +} diff --git a/indra/newview/fsradar.h b/indra/newview/fsradar.h index 35286c1e31..a3069839db 100644 --- a/indra/newview/fsradar.h +++ b/indra/newview/fsradar.h @@ -119,6 +119,8 @@ private: void radarAlertMsg(const LLUUID& agent_id, const LLAvatarName& av_name, std::string_view postMsg); void updateAgeAlertCheck(); + void onRegionChanged(); + std::unique_ptr mRadarListUpdater; struct RadarFields @@ -150,6 +152,9 @@ private: boost::signals2::connection mShowUsernamesCallbackConnection; boost::signals2::connection mNameFormatCallbackConnection; boost::signals2::connection mAgeAlertCallbackConnection; + + boost::signals2::connection mRegionCapabilitiesReceivedCallbackConnection; + boost::signals2::connection mRegionChangedCallbackConnection; }; #endif // FS_RADAR_H diff --git a/indra/newview/fsradarentry.cpp b/indra/newview/fsradarentry.cpp index 5bcd028769..d4fe667f8e 100644 --- a/indra/newview/fsradarentry.cpp +++ b/indra/newview/fsradarentry.cpp @@ -55,85 +55,10 @@ FSRadarEntry::FSRadarEntry(const LLUUID& avid) mNotes(LLStringUtil::null), mAlertAge(false), mAgeAlertPerformed(false), - mAvatarNameCallbackConnection(), - mRegionCapabilitiesReceivedCallbackConnection(), - mRegionChangedCallbackConnection() + mPropertiesRequested(false), + mAvatarNameCallbackConnection() { - if (mID.notNull()) - { - // NOTE: typically we request these once on creation to avoid excess traffic/processing. - //This means updates to these properties won't typically be seen while target is in nearby range. - LLAvatarPropertiesProcessor* processor = LLAvatarPropertiesProcessor::getInstance(); - processor->addObserver(mID, this); - - if (auto region = gAgent.getRegion(); region) - { - if (region->capabilitiesReceived()) - { - if (LLGridManager::instance().isInSecondLife() || region->isCapabilityAvailable(CAPNAME)) - { - processor->sendAvatarPropertiesRequest(mID); - } - else - { - processor->sendAvatarLegacyPropertiesRequest(mID); - processor->sendAvatarNotesRequest(mID); - } - } - else - { - auto capsReceivedCb = [this](const LLUUID&, LLViewerRegion* reg) - { - if (mRegionCapabilitiesReceivedCallbackConnection.connected()) - { - mRegionCapabilitiesReceivedCallbackConnection.disconnect(); - } - gAgent.removeRegionChangedCallback(mRegionChangedCallbackConnection); - if (LLGridManager::instance().isInSecondLife() || (reg && reg->isCapabilityAvailable(CAPNAME))) - { - LLAvatarPropertiesProcessor::getInstance()->sendAvatarPropertiesRequest(mID); - } - else - { - LLAvatarPropertiesProcessor::getInstance()->sendAvatarLegacyPropertiesRequest(mID); - LLAvatarPropertiesProcessor::getInstance()->sendAvatarNotesRequest(mID); - } - }; - - mRegionChangedCallbackConnection = gAgent.addRegionChangedCallback([this, capsReceivedCb]() - { - if (mRegionCapabilitiesReceivedCallbackConnection.connected()) - { - mRegionCapabilitiesReceivedCallbackConnection.disconnect(); - } - - if (auto newregion = gAgent.getRegion(); newregion) - { - if (newregion->capabilitiesReceived()) - { - gAgent.removeRegionChangedCallback(mRegionChangedCallbackConnection); - if (LLGridManager::instance().isInSecondLife() || newregion->isCapabilityAvailable(CAPNAME)) - { - LLAvatarPropertiesProcessor::getInstance()->sendAvatarPropertiesRequest(mID); - } - else - { - LLAvatarPropertiesProcessor::getInstance()->sendAvatarLegacyPropertiesRequest(mID); - LLAvatarPropertiesProcessor::getInstance()->sendAvatarNotesRequest(mID); - } - } - else - { - mRegionCapabilitiesReceivedCallbackConnection = newregion->setCapabilitiesReceivedCallback(capsReceivedCb); - } - } - }); - - mRegionCapabilitiesReceivedCallbackConnection = region->setCapabilitiesReceivedCallback(capsReceivedCb); - } - } - } - + requestProperties(); updateName(); } @@ -147,11 +72,34 @@ FSRadarEntry::~FSRadarEntry() { mAvatarNameCallbackConnection.disconnect(); } - if (mRegionCapabilitiesReceivedCallbackConnection.connected()) +} + +void FSRadarEntry::requestProperties() +{ + if (!mPropertiesRequested && mID.notNull()) { - mRegionCapabilitiesReceivedCallbackConnection.disconnect(); + // NOTE: typically we request these once on creation to avoid excess traffic/processing. + //This means updates to these properties won't typically be seen while target is in nearby range. + LLAvatarPropertiesProcessor* processor = LLAvatarPropertiesProcessor::getInstance(); + processor->addObserver(mID, this); + + if (auto region = gAgent.getRegion()) + { + if (region->capabilitiesReceived()) + { + if (LLGridManager::instance().isInSecondLife() || region->isCapabilityAvailable(CAPNAME)) + { + processor->sendAvatarPropertiesRequest(mID); + } + else + { + processor->sendAvatarLegacyPropertiesRequest(mID); + processor->sendAvatarNotesRequest(mID); + } + mPropertiesRequested = true; + } + } } - gAgent.removeRegionChangedCallback(mRegionChangedCallbackConnection); } void FSRadarEntry::updateName() diff --git a/indra/newview/fsradarentry.h b/indra/newview/fsradarentry.h index 7c801d4b35..0cd9937a4d 100644 --- a/indra/newview/fsradarentry.h +++ b/indra/newview/fsradarentry.h @@ -68,6 +68,7 @@ public: private: void updateName(); void onAvatarNameCache(const LLUUID& av_id, const LLAvatarName& av_name); + void requestProperties(); void processProperties(void* data, EAvatarProcessorType type); LLUUID mID; @@ -87,10 +88,9 @@ private: bool mIgnore; bool mAlertAge; bool mAgeAlertPerformed; + bool mPropertiesRequested; LLAvatarNameCache::callback_connection_t mAvatarNameCallbackConnection; - boost::signals2::connection mRegionCapabilitiesReceivedCallbackConnection; - boost::signals2::connection mRegionChangedCallbackConnection; }; #endif // FS_RADARENTRY_H diff --git a/indra/newview/fsworldmapmessage.cpp b/indra/newview/fsworldmapmessage.cpp new file mode 100644 index 0000000000..9d53bbf74c --- /dev/null +++ b/indra/newview/fsworldmapmessage.cpp @@ -0,0 +1,214 @@ +/** + * @file fsworldmapmessage.cpp + * @brief FS specific extensions to world map handling for OpenSim + * + * $LicenseInfo:firstyear=2024&license=fsviewerlgpl$ + * Phoenix Firestorm Viewer Source Code + * Copyright (C) 2024, The Phoenix Firestorm Project, 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 + * + * The Phoenix Firestorm Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA + * http://www.firestormviewer.org + * $/LicenseInfo$ + * + */ +// potential workaround for hop://grid:port/Partial/x/y/z resolution +// 2024.04.30 humbletim + +// notes: +// - exact MapNameRequests are sent flagless here (not using LAYER_FLAG) +// - this is to avoid triggering OpenSim code paths that modify result names +// - only affects LLWorldMapMessage->sendNamedRegionRequest(name, callback, ...) +// - in particular where a grid hosts overlapping names, hop Region matching may work better + +#include "llviewerprecompiledheaders.h" + +#ifdef OPENSIM +#include "fsworldmapmessage.h" + +#include "llagent.h" +#include "llworldmap.h" // grid_to_region_handle +#include "fsgridhandler.h" +#include "llworldmapmessage.h" +#include "message.h" +#include + +#define htxhop_log(format, ...) LL_DEBUGS("GridManager") << llformat(format, __VA_ARGS__) << LL_ENDL; + +namespace hypergrid +{ + static inline std::string extract_region(const std::string& s) + { + static auto const& patterns = { + std::regex { R"(/ ([^/:=]+)$)" }, // TODO: figure out where the spec lives for hop "slash space" embedding... + std::regex { R"(([^/:=]+)$)" }, // TODO: figure out where the spec lives for hop "grid:port:region" embedding... + }; + std::smatch match_results; + std::string ls{ s }; + LLStringUtil::toLower(ls); + for (const auto& pattern : patterns) + { + if (std::regex_search(ls, match_results, pattern)) + { + return match_results[1].str(); + } + } + return {}; + } + + // helper to encapsulate Region Map Block responses + struct MapBlock + { + S32 index{}; + U16 x_regions{}, y_regions{}, x_size{ REGION_WIDTH_UNITS }, y_size{ REGION_WIDTH_UNITS }; + std::string name{}; + U8 accesscode{}; + U32 region_flags{}; + LLUUID image_id{}; + + inline U32 x_world() const { return (U32)(x_regions)*REGION_WIDTH_UNITS; } + inline U32 y_world() const { return (U32)(y_regions)*REGION_WIDTH_UNITS; } + inline U64 region_handle() const { return grid_to_region_handle(x_regions, y_regions); } + + // see: LLWorldMapMessage::processMapBlockReply + MapBlock(LLMessageSystem* msg, S32 block) + : index(block) + { + msg->getU16Fast(_PREHASH_Data, _PREHASH_X, x_regions, block); + msg->getU16Fast(_PREHASH_Data, _PREHASH_Y, y_regions, block); + msg->getStringFast(_PREHASH_Data, _PREHASH_Name, name, block); + msg->getU8Fast(_PREHASH_Data, _PREHASH_Access, accesscode, block); + msg->getU32Fast(_PREHASH_Data, _PREHASH_RegionFlags, region_flags, block); + // msg->getU8Fast(_PREHASH_Data, _PREHASH_WaterHeight, water_height, block); + // msg->getU8Fast(_PREHASH_Data, _PREHASH_Agents, agents, block); + msg->getUUIDFast(_PREHASH_Data, _PREHASH_MapImageID, image_id, block); + // Aurora Sim + if (msg->getNumberOfBlocksFast(_PREHASH_Size) > 0) + { + msg->getU16Fast(_PREHASH_Size, _PREHASH_SizeX, x_size, block); + msg->getU16Fast(_PREHASH_Size, _PREHASH_SizeY, y_size, block); + } + if (x_size == 0 || (x_size % 16) != 0 || (y_size % 16) != 0) + { + x_size = 256; + y_size = 256; + } + // Aurora Sim + } + }; + + constexpr U32 EXACT_FLAG = 0x00000000; + constexpr U32 LAYER_FLAG = 0x00000002; + + // see: LLWorldMapMessage::sendNamedRegionRequest + static void sendMapNameRequest(const std::string& region_name, U32 flags) + { + LLMessageSystem* msg = gMessageSystem; + msg->newMessageFast(_PREHASH_MapNameRequest); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgentID); + msg->addUUIDFast(_PREHASH_SessionID, gAgentSessionID); + msg->addU32Fast(_PREHASH_Flags, flags); + msg->addU32Fast(_PREHASH_EstateID, 0); // Filled in on sim + msg->addBOOLFast(_PREHASH_Godlike, false); // Filled in on sim + msg->nextBlockFast(_PREHASH_NameData); + msg->addStringFast(_PREHASH_Name, region_name); + gAgent.sendReliableMessage(); + } + + struct AdoptedRegionNameQuery + { + std::string key{}; + std::string region_name{}; + hypergrid::url_callback_t arbitrary_callback; + std::string arbitrary_slurl{}; + bool arbitrary_teleport{ false }; + }; + + // map extracted region names => pending query entries + static std::map region_name_queries; +} + +bool hypergrid::sendExactNamedRegionRequest(const std::string& region_name, const url_callback_t& callback, const std::string& callback_url, bool teleport) +{ + if (!LLGridManager::instance().isInOpenSim() || !callback) + { + return false; + } + + auto key = extract_region(region_name); + if (key.empty()) + { + return false; + } + region_name_queries.try_emplace(key, AdoptedRegionNameQuery{ key, region_name, callback, callback_url, teleport }); + htxhop_log("Send Region Name '%s' (key: %s)", region_name.c_str(), key.c_str()); + sendMapNameRequest(region_name, EXACT_FLAG); + return true; +} + +bool hypergrid::processExactNamedRegionResponse(LLMessageSystem* msg, U32 agent_flags) +{ + if (!LLGridManager::instance().isInOpenSim() || !msg || agent_flags & LAYER_FLAG) + { + return false; + } + // NOTE: we assume only agent_flags have been read from msg so far + S32 num_blocks = msg->getNumberOfBlocksFast(_PREHASH_Data); + + std::vector blocks; + blocks.reserve(num_blocks); + for (S32 b = 0; b < num_blocks; b++) + { + blocks.emplace_back(msg, b); + } + for (const auto& block : blocks) + { + htxhop_log("#%02d key='%s' block.name='%s' block.region_handle=%llu", block.index, extract_region(block.name).c_str(), block.name.c_str(), block.region_handle()); + } + // special case: handle singular result w/empty name tho valid region handle AND singular pending query as a match + // (might be that a landing area / redirect hop URL is coming back: "^hop://grid:port/$", which extract_region's into "") + bool solo_result = blocks.size() == 2 && blocks[0].region_handle() && extract_region(blocks[0].name).empty() && !blocks[1].region_handle(); + if (solo_result && region_name_queries.size() == 1) + { + htxhop_log("applying first block as redirect; region_handle: %llu", blocks[0].region_handle()); + blocks[0].name = region_name_queries.begin()->second.region_name; + } + + for (const auto& block : blocks) + { + auto key = extract_region(block.name); + if (key.empty()) + { + continue; + } + + auto idx = region_name_queries.find(key); + if (idx == region_name_queries.end()) + { + continue; + } + + auto pending{ idx->second }; + htxhop_log("Recv Region Name '%s' (key: %s) block.name='%s' block.region_handle=%llu)", pending.region_name.c_str(), + pending.key.c_str(), block.name.c_str(), block.region_handle()); + region_name_queries.erase(idx); + pending.arbitrary_callback(block.region_handle(), pending.arbitrary_slurl, block.image_id, pending.arbitrary_teleport); + return true; + } + return false; +} +#endif diff --git a/indra/newview/fsworldmapmessage.h b/indra/newview/fsworldmapmessage.h new file mode 100644 index 0000000000..3e4cca01e7 --- /dev/null +++ b/indra/newview/fsworldmapmessage.h @@ -0,0 +1,49 @@ +/** + * @file fsworldmapmessage.h + * @brief FS specific extensions to world map handling for OpenSim + * + * $LicenseInfo:firstyear=2024&license=fsviewerlgpl$ + * Phoenix Firestorm Viewer Source Code + * Copyright (C) 2024, The Phoenix Firestorm Project, 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 + * + * The Phoenix Firestorm Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA + * http://www.firestormviewer.org + * $/LicenseInfo$ + */ + +#ifndef FS_WORLDMAPMESSAGE_H +#define FS_WORLDMAPMESSAGE_H + +#ifdef OPENSIM + +#include +#include +#include + +class LLMessageSystem; +class LLUUID; + +namespace hypergrid +{ + // Needs to be identical to url_callback_t defined in llworldmapmessage.h + using url_callback_t = std::function; + + bool sendExactNamedRegionRequest(const std::string& region_name, const url_callback_t& callback, const std::string& callback_url, bool teleport); + bool processExactNamedRegionResponse(LLMessageSystem* msg, U32 agent_flags); +} +#endif +#endif // FS_WORLDMAPMESSAGE_H diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 7f4f32196f..d9b510d66e 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -1163,7 +1163,7 @@ bool LLAppViewer::init() } // alert the user if they are using unsupported hardware - if(!gSavedSettings.getBOOL("AlertedUnsupportedHardware")) + if(gSavedSettings.getBOOL("FSUseLegacyUnsupportedHardwareChecks") && !gSavedSettings.getBOOL("AlertedUnsupportedHardware")) { bool unsupported = false; LLSD args; diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index 61bfcc86e8..7dd70c8644 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -3375,7 +3375,7 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root for (LLInventoryModel::item_array_t::value_type& item : items) { - if (get_is_item_worn(item)) + if (!item->getIsLinkType() && get_is_item_worn(item)) { has_worn = true; LLWearableType::EType type = item->getWearableType(); @@ -3395,7 +3395,7 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root } } LLViewerInventoryItem* item = gInventory.getItem(obj_id); - if (item && get_is_item_worn(item)) + if (item && !item->getIsLinkType() && get_is_item_worn(item)) { has_worn = true; LLWearableType::EType type = item->getWearableType(); diff --git a/indra/newview/llinventorygallery.cpp b/indra/newview/llinventorygallery.cpp index 6b25857068..b873c6f702 100644 --- a/indra/newview/llinventorygallery.cpp +++ b/indra/newview/llinventorygallery.cpp @@ -1988,7 +1988,7 @@ void LLInventoryGallery::deleteSelection() for (LLInventoryModel::item_array_t::value_type& item : items) { - if (get_is_item_worn(item)) + if (!item->getIsLinkType() && get_is_item_worn(item)) { has_worn = true; LLWearableType::EType type = item->getWearableType(); @@ -2009,7 +2009,7 @@ void LLInventoryGallery::deleteSelection() } LLViewerInventoryItem* item = gInventory.getItem(id); - if (item && get_is_item_worn(item)) + if (item && !item->getIsLinkType() && get_is_item_worn(item)) { has_worn = true; LLWearableType::EType type = item->getWearableType(); diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp index f63ae61e88..6729fa350f 100644 --- a/indra/newview/llpanelgroup.cpp +++ b/indra/newview/llpanelgroup.cpp @@ -232,6 +232,11 @@ BOOL LLPanelGroup::postBuild() button = getChild("btn_refresh"); button->setClickedCallback(onBtnRefresh, this); + // FIRE-33939: Activate button + button = getChild("btn_activate"); + button->setClickedCallback(onBtnActivateClicked, this); + // + childSetCommitCallback("back",boost::bind(&LLPanelGroup::onBackBtnClick,this),NULL); LLPanelGroupTab* panel_general = findChild("group_general_tab_panel"); @@ -296,6 +301,7 @@ void LLPanelGroup::reposButtons() reposButton("btn_cancel"); reposButton("btn_chat"); reposButton("btn_call"); + reposButton("btn_activate"); // FIRE-33939: Activate button } void LLPanelGroup::reshape(S32 width, S32 height, BOOL called_from_parent ) @@ -347,6 +353,15 @@ void LLPanelGroup::onBtnGroupChatClicked(void* user_data) self->chatGroup(); } +// FIRE-33939: Activate button +void LLPanelGroup::onBtnActivateClicked(void* user_data) +{ + LLPanelGroup* self = static_cast(user_data); + self->activateGroup(); + self->refreshData(); +} +// + void LLPanelGroup::onBtnJoin() { if (LLGroupActions::isInGroup(mID)) @@ -486,6 +501,15 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id) if(button_chat) button_chat->setVisible(!is_null_group_id); + // FIRE-33939: Activate button + LLButton* button_activate = findChild("btn_activate"); + if (button_activate) + { + button_activate->setVisible(!is_null_group_id); + button_activate->setEnabled(group_id != gAgent.getGroupID()); + } + // + getChild("prepend_founded_by")->setVisible(!is_null_group_id); // TabContainer switch @@ -566,6 +590,10 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id) button_call->setVisible(false); if(button_chat) button_chat->setVisible(false); + // FIRE-33939: Activate button + if(button_activate) + button_activate->setVisible(false); + // } else { @@ -625,6 +653,10 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id) button_call->setVisible(is_member); if(button_chat) button_chat->setVisible(is_member); + // FIRE-33939: Activate button + if(button_activate) + button_activate->setVisible(is_member); + // } // TabContainer switch @@ -710,6 +742,12 @@ void LLPanelGroup::draw() mRefreshTimer.stop(); childEnable("btn_refresh"); childEnable("groups_accordion"); + // FIRE-33939: Activate button + if (gAgent.getGroupID() != getID()) + { + childEnable("btn_activate"); + } + // } LLButton* button_apply = findChild("btn_apply"); @@ -741,6 +779,7 @@ void LLPanelGroup::refreshData() // 5 second timeout childDisable("btn_refresh"); childDisable("groups_accordion"); + childDisable("btn_activate"); // FIRE-33939: Activate button mRefreshTimer.start(); mRefreshTimer.setTimerExpirySec(5); @@ -756,6 +795,17 @@ void LLPanelGroup::chatGroup() LLGroupActions::startIM(getID()); } +// FIRE-33939: Activate button +void LLPanelGroup::activateGroup() +{ + LLUUID group_id = getID(); + if (gAgent.getGroupID() != group_id) + { + LLGroupActions::activate(group_id); + } +} +// + void LLPanelGroup::showNotice(const std::string& subject, const std::string& message, const bool& has_inventory, diff --git a/indra/newview/llpanelgroup.h b/indra/newview/llpanelgroup.h index 7e7e45d980..dd4d96c7cf 100644 --- a/indra/newview/llpanelgroup.h +++ b/indra/newview/llpanelgroup.h @@ -76,6 +76,7 @@ public: void refreshData(); void callGroup(); void chatGroup(); + void activateGroup(); // FIRE-33939: Activate button virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); @@ -102,6 +103,7 @@ protected: static void onBtnRefresh(void*); static void onBtnGroupCallClicked(void*); static void onBtnGroupChatClicked(void*); + static void onBtnActivateClicked(void*); // FIRE-33939: Activate button void reposButton(const std::string& name); void reposButtons(); diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index ac2459be80..459a33d111 100644 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -627,13 +627,12 @@ void LLTaskInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags) // [/RLVa:KB] } items.push_back(std::string("Task Properties")); - // Legacy object properties + // Improved object properties //if ((flags & FIRST_SELECTED_ITEM) == 0) - if (!gSavedSettings.getBOOL("FSUseLegacyObjectProperties") && (flags & FIRST_SELECTED_ITEM) == 0) + //{ + // disabled_items.push_back(std::string("Task Properties")); + //} // - { - disabled_items.push_back(std::string("Task Properties")); - } // [RLVa:KB] - Checked: 2010-09-28 (RLVa-1.2.1f) | Added: RLVa-1.2.1f items.push_back(std::string("Task Rename")); if ( (!isItemRenameable()) || ((flags & FIRST_SELECTED_ITEM) == 0) ) @@ -1007,13 +1006,12 @@ void LLTaskSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags) } } items.push_back(std::string("Task Properties")); - // Legacy object properties + // Improved object properties //if ((flags & FIRST_SELECTED_ITEM) == 0) - if (!gSavedSettings.getBOOL("FSUseLegacyObjectProperties") && (flags & FIRST_SELECTED_ITEM) == 0) + //{ + // disabled_items.push_back(std::string("Task Properties")); + //} // - { - disabled_items.push_back(std::string("Task Properties")); - } if(isItemRenameable()) { items.push_back(std::string("Task Rename")); diff --git a/indra/newview/llperfstats.h b/indra/newview/llperfstats.h index 0038d160fb..1e99fa343a 100644 --- a/indra/newview/llperfstats.h +++ b/indra/newview/llperfstats.h @@ -279,13 +279,16 @@ namespace LLPerfStats auto ot{upd.objType}; auto& key{upd.objID}; + auto& avKey{upd.avID}; auto type {upd.statType}; auto val {upd.time}; // markup to support coverage testing on stats collection #ifdef TRACY_ENABLE - //LL_PROFILE_ZONE_TEXT(key.toStringFast(obstr), 36); - //LL_PROFILE_ZONE_TEXT(avKey.toStringFast(avstr), 36); - //LL_PROFILE_ZONE_NUM(val); + static char obstr[36]; + static char avstr[36]; + LL_PROFILE_ZONE_TEXT(key.toStringFast(obstr), 36); + LL_PROFILE_ZONE_TEXT(avKey.toStringFast(avstr), 36); + LL_PROFILE_ZONE_NUM(val); #endif // @@ -295,6 +298,14 @@ namespace LLPerfStats doUpd(key, ot, type,val); return; } + + + if (ot == ObjType_t::OT_AVATAR) + { + // LL_INFOS("perfstats") << "Avatar update:" << LL_ENDL; + doUpd(avKey, ot, type, val); + return; + } } static inline void doUpd(const LLUUID& key, ObjType_t ot, StatType_t type, uint64_t val) @@ -429,13 +440,13 @@ namespace LLPerfStats // stat.time = LLTrace::BlockTimer::getCPUClockCount64() - start; // extra profiling coverage tracking - #ifdef ATTACHMENT_TRACKING - static char obstr[36]; - static char avstr[36]; - LL_PROFILE_ZONE_NUM(static_cast(stat.objType)); - LL_PROFILE_ZONE_TEXT(stat.avID.toStringFast(avstr), 36); - LL_PROFILE_ZONE_TEXT(stat.objID.toStringFast(obstr), 36); - LL_PROFILE_ZONE_NUM(stat.time); + #if TRACY_ENABLE && defined(ATTACHMENT_TRACKING) + // static char obstr[36]; + // static char avstr[36]; + // LL_PROFILE_ZONE_NUM(static_cast(stat.objType)); + // LL_PROFILE_ZONE_TEXT(stat.avID.toStringFast(avstr), 36); + // LL_PROFILE_ZONE_TEXT(stat.objID.toStringFast(obstr), 36); + // LL_PROFILE_ZONE_NUM(stat.time); #endif // StatsRecorder::send(std::move(stat)); diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index bdbd53b7df..0674ba4f9c 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -229,6 +229,7 @@ #include "particleeditor.h" #include "quickprefs.h" #include "vjfloaterlocalmesh.h" // local mesh +#include "fsfloaterwhitelisthelper.h" // fs whitelist helper // handle secondlife:///app/openfloater/{NAME} URLs @@ -649,6 +650,8 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("sound_explorer", "floater_NACL_explore_sounds.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("vram_usage", "floater_fs_vram_usage.xml", static_cast(&LLFloaterReg::build)); LLFloaterReg::add("local_mesh_floater", "floater_vj_local_mesh.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); // local mesh + LLFloaterReg::add("fs_whitelist_floater", "floater_whitelist.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); // white list advisor + LLFloaterReg::registerControlVariables(); // Make sure visibility and rect controls get preserved when saving } diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index e1d59fca20..2374e94cb4 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -9115,13 +9115,10 @@ class LLAttachmentDetach : public view_listener_t // [RLVa:KB] - Checked: 2010-03-15 (RLVa-1.2.0a) | Modified: RLVa-1.0.5 // NOTE: copy/paste of the code in enable_detach() - if ((rlv_handler_t::isEnabled()) && (gRlvAttachmentLocks.hasLockedAttachmentPoint(RLV_LOCK_REMOVE))) + if ((rlv_handler_t::isEnabled()) && (gRlvAttachmentLocks.hasLockedAttachmentPoint(RLV_LOCK_REMOVE)) && + gRlvAttachmentLocks.isLockedAttachment(objectp->getRootEdit())) { - //LLObjectSelectionHandle hSelect = LLSelectMgr::getInstance()->getSelection(); - //RlvSelectHasLockedAttach f; - //if ((hSelect->isAttachment()) && (hSelect->getFirstRootNode(&f, FALSE) != NULL)) - // return true; - return !gRlvAttachmentLocks.isLockedAttachment(objectp->getRootEdit()); // Kitty will have to check this... + return false; } // [/RLVa:KB] diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index a0c585b18b..4c4c37de19 100755 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -834,6 +834,7 @@ void LLViewerRegion::setRegionID(const LLUUID& region_id) void LLViewerRegion::loadObjectCache() { + LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK; if (mCacheLoaded) { return; @@ -3126,6 +3127,7 @@ void LLViewerRegion::clearVOCacheFromMemory() void LLViewerRegion::unpackRegionHandshake() { + LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK; LLMessageSystem *msg = gMessageSystem; U64 region_flags = 0; diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp index 994b2870ef..f0d51199ab 100644 --- a/indra/newview/llvocache.cpp +++ b/indra/newview/llvocache.cpp @@ -1541,6 +1541,7 @@ BOOL LLVOCache::updateEntry(const HeaderEntryInfo* entry) bool LLVOCache::readFromCache(U64 handle, const LLUUID& id, LLVOCacheEntry::vocache_entry_map_t& cache_entry_map) // { + LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK; if(!mEnabled) { LL_WARNS() << "Not reading cache for handle " << handle << "): Cache is currently disabled." << LL_ENDL; @@ -1559,6 +1560,7 @@ bool LLVOCache::readFromCache(U64 handle, const LLUUID& id, LLVOCacheEntry::voca S32 num_entries=0; // FIRE-33808 - Material Override Cache causes long delays std::string filename; { + LL_PROFILE_ZONE_NAMED_CATEGORY_NETWORK("VOCache:loadRegionObjectCache"); LLUUID cache_id; getObjectCacheFilename(handle, filename); LLAPRFile apr_file(filename, APR_READ|APR_BINARY, mLocalAPRFilePoolp); @@ -1567,6 +1569,7 @@ bool LLVOCache::readFromCache(U64 handle, const LLUUID& id, LLVOCacheEntry::voca if(success) { + LL_PROFILE_ZONE_NAMED_CATEGORY_NETWORK("VOCache:loadCacheForRegion"); if(cache_id != id) { LL_INFOS() << "Cache ID doesn't match for this region, discarding"<< LL_ENDL; @@ -1615,6 +1618,7 @@ bool LLVOCache::readFromCache(U64 handle, const LLUUID& id, LLVOCacheEntry::voca // void LLVOCache::readGenericExtrasFromCache(U64 handle, const LLUUID& id, LLVOCacheEntry::vocache_gltf_overrides_map_t& cache_extras_entry_map) void LLVOCache::readGenericExtrasFromCache(U64 handle, const LLUUID& id, LLVOCacheEntry::vocache_gltf_overrides_map_t& cache_extras_entry_map, const LLVOCacheEntry::vocache_entry_map_t& cache_entry_map) { + LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK; int loaded= 0; int discarded = 0; // get ViewerRegion pointer from handle @@ -1635,6 +1639,13 @@ void LLVOCache::readGenericExtrasFromCache(U64 handle, const LLUUID& id, LLVOCac } std::string filename(getObjectCacheExtrasFilename(handle)); + // Material Override Cache caused long delays + #ifdef TRACY_ENABLE + static char extra_filename[256]; + strncpy(extra_filename, filename.c_str(), 256); + LL_PROFILE_ZONE_TEXT(extra_filename,256); + #endif + // llifstream in(filename, std::ios::in | std::ios::binary); std::string line; @@ -1714,8 +1725,10 @@ void LLVOCache::readGenericExtrasFromCache(U64 handle, const LLUUID& id, LLVOCac LL_DEBUGS("GLTF") << "Beginning reading extras cache for handle " << handle << " from " << getObjectCacheExtrasFilename(handle) << LL_ENDL; LLSD entry_llsd; + LL_PROFILE_ZONE_NUM(num_entries); for (U32 i = 0; i < num_entries && !in.eof(); i++) { + LL_PROFILE_ZONE_NAMED_CATEGORY_NETWORK("RegionExtrasReadEntries"); static const U32 max_size = 4096; bool success = LLSDSerialize::deserialize(entry_llsd, in, max_size); // check bool(in) this time since eof is not a failure condition here @@ -1756,6 +1769,7 @@ void LLVOCache::readGenericExtrasFromCache(U64 handle, const LLUUID& id, LLVOCac void LLVOCache::purgeEntries(U32 size) { + LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK; // FIRE-33808 - Material Override Cache causes long delays LL_DEBUGS("VOCache","GLTF") << "Purging " << size << " entries from cache" << LL_ENDL; while(mHeaderEntryQueue.size() > size) @@ -1775,6 +1789,7 @@ void LLVOCache::purgeEntries(U32 size) void LLVOCache::writeToCache(U64 handle, const LLUUID& id, const LLVOCacheEntry::vocache_entry_map_t& cache_entry_map, BOOL dirty_cache, bool removal_enabled) { + LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK; // FIRE-33808 - Material Override Cache causes long delays std::string filename; getObjectCacheFilename(handle, filename); @@ -1929,19 +1944,20 @@ void LLVOCache::removeGenericExtrasForHandle(U64 handle) auto* entry = mHandleEntryMap[handle]; if (entry) { + LL_WARNS("GLTF", "VOCache") << "Removing generic extras for handle " << entry->mHandle << "Filename: " << getObjectCacheExtrasFilename(handle) << LL_ENDL; removeEntry(entry); } else { //shouldn't happen, but if it does, we should remove the extras file since it's orphaned - LL_WARNS("GLTF", "VOCache") << "Removing generic extras for handle " << entry->mHandle << "Filename: " << getObjectCacheExtrasFilename(handle) << LL_ENDL; - LLFile::remove(getObjectCacheExtrasFilename(entry->mHandle)); + LLFile::remove(getObjectCacheExtrasFilename(handle)); } } // void LLVOCache::writeGenericExtrasToCache(U64 handle, const LLUUID& id, const LLVOCacheEntry::vocache_gltf_overrides_map_t& cache_extras_entry_map, BOOL dirty_cache, bool removal_enabled) { + LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK; if(!mEnabled) { LL_WARNS() << "Not writing extras cache for handle " << handle << "): Cache is currently disabled." << LL_ENDL; diff --git a/indra/newview/llworldmapmessage.cpp b/indra/newview/llworldmapmessage.cpp index 0426fb338c..d521f5ded9 100644 --- a/indra/newview/llworldmapmessage.cpp +++ b/indra/newview/llworldmapmessage.cpp @@ -36,6 +36,7 @@ // Aurora Sim #include "llviewernetwork.h" // Aurora Sim +#include "fsworldmapmessage.h" // FIRE-31368: [OPENSIM] ... Search returns more than one result const U32 LAYER_FLAG = 2; @@ -99,6 +100,14 @@ void LLWorldMapMessage::sendNamedRegionRequest(std::string region_name, const std::string& callback_url, bool teleport) // immediately teleport when result returned { + // FIRE-31368: [OPENSIM] ... Search returns more than one result +#ifdef OPENSIM + if (hypergrid::sendExactNamedRegionRequest(region_name, callback, callback_url, teleport)) + { + return; + } +#endif + // //LL_INFOS("WorldMap") << LL_ENDL; mSLURLRegionName = region_name; mSLURLRegionHandle = 0; @@ -160,6 +169,14 @@ void LLWorldMapMessage::processMapBlockReply(LLMessageSystem* msg, void**) } U32 agent_flags; msg->getU32Fast(_PREHASH_AgentData, _PREHASH_Flags, agent_flags); + // FIRE-31368: [OPENSIM] ... Search returns more than one result +#ifdef OPENSIM + if (hypergrid::processExactNamedRegionResponse(msg, agent_flags)) + { + return; + } +#endif + // // There's only one flag that we ever use here if (agent_flags != LAYER_FLAG) diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 8d047c209f..827b64906b 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -8219,6 +8219,12 @@ void LLPipeline::renderDeferredLighting() const F32 *c = center.getF32ptr(); F32 s = volume->getLightRadius() * 1.5f; + // relocated above colour calc for early exit on small lights + if (s <= 0.001f) + { + continue; + } + // // send light color to shader in linear space LLColor3 col = volume->getLightLinearColor() * light_scale; @@ -8226,12 +8232,12 @@ void LLPipeline::renderDeferredLighting() { continue; } - - if (s <= 0.001f) - { - continue; - } - + // relocated above colour calc for early exit on small lights + // if (s <= 0.001f) + // { + // continue; + // } + // LLVector4a sa; sa.splat(s); if (camera->AABBInFrustumNoFarClip(center, sa) == 0) diff --git a/indra/newview/skins/ansastorm/xui/en/panel_group_info_sidetray.xml b/indra/newview/skins/ansastorm/xui/en/panel_group_info_sidetray.xml index ae98e142b9..e30d500c06 100644 --- a/indra/newview/skins/ansastorm/xui/en/panel_group_info_sidetray.xml +++ b/indra/newview/skins/ansastorm/xui/en/panel_group_info_sidetray.xml @@ -219,6 +219,26 @@ background_visible="false" width="23" /> + +