summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan "Geenz" Goodman <geenz@lindenlab.com>2025-12-03 11:52:11 -0500
committerGitHub <noreply@github.com>2025-12-03 11:52:11 -0500
commit6b866bc6432ef88a79a826c09b17107392bde15f (patch)
treeb3f2d683f23345b142199ce887e8941ca62ad011
parent5e7e4dfa3900775a5482d296a8fa648c5805d018 (diff)
parentbf347d15804c27348c84a55ab763f89b718e8aac (diff)
Merge pull request #5094 from secondlife/main
2025.08 -> Develop
-rw-r--r--indra/llappearance/lltexlayer.cpp5
-rw-r--r--indra/llappearance/lltexlayerparams.cpp5
-rw-r--r--indra/llcommon/llqueuedthread.cpp34
-rw-r--r--indra/llplugin/llpluginprocessparent.cpp19
-rw-r--r--indra/llrender/llcubemap.cpp10
-rw-r--r--indra/llrender/llglslshader.cpp3
-rw-r--r--indra/llrender/llglslshader.h1
-rw-r--r--indra/llui/llaccordionctrl.cpp7
-rw-r--r--indra/llui/llaccordionctrltab.cpp29
-rw-r--r--indra/llui/lltextbase.cpp1
-rw-r--r--indra/llui/lltextbase.h2
-rw-r--r--indra/llwebrtc/llwebrtc.cpp14
-rw-r--r--indra/newview/lldrawpoolbump.cpp10
-rw-r--r--indra/newview/llfeaturemanager.cpp47
-rw-r--r--indra/newview/llfeaturemanager.h2
-rw-r--r--indra/newview/llfloateravatarwelcomepack.cpp8
-rw-r--r--indra/newview/llfloaterdestinations.cpp12
-rw-r--r--indra/newview/llfloatermarketplace.cpp13
-rw-r--r--indra/newview/llfloaterregioninfo.cpp39
-rw-r--r--indra/newview/llfloaterregioninfo.h1
-rw-r--r--indra/newview/llfloatersearch.cpp15
-rw-r--r--indra/newview/lllocalbitmaps.cpp5
-rw-r--r--indra/newview/llviewerdisplay.cpp5
-rw-r--r--indra/newview/llviewermedia.cpp118
-rw-r--r--indra/newview/llviewermedia.h7
-rw-r--r--indra/newview/llviewerstats.h3
-rw-r--r--indra/newview/llviewertexture.cpp5
-rw-r--r--indra/newview/llviewerwindow.cpp45
-rw-r--r--indra/newview/skins/default/xui/en/floater_marketplace.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_search.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_move.xml2
31 files changed, 367 insertions, 104 deletions
diff --git a/indra/llappearance/lltexlayer.cpp b/indra/llappearance/lltexlayer.cpp
index b3800e6981..7f7eaf1855 100644
--- a/indra/llappearance/lltexlayer.cpp
+++ b/indra/llappearance/lltexlayer.cpp
@@ -1890,7 +1890,10 @@ LLGLTexture* LLTexLayerStaticImageList::getTexture(const std::string& file_name,
image_raw->copyUnscaledAlphaMask(alpha_image_raw, LLColor4U::black);
}
- tex->createGLTexture(0, image_raw, 0, true, LLGLTexture::LOCAL);
+ if (!tex->createGLTexture(0, image_raw, 0, true, LLGLTexture::LOCAL))
+ {
+ LL_WARNS() << "Failed to create GL texture for image: " << file_name << LL_ENDL;
+ }
gGL.getTexUnit(0)->bind(tex);
tex->setAddressMode(LLTexUnit::TAM_CLAMP);
diff --git a/indra/llappearance/lltexlayerparams.cpp b/indra/llappearance/lltexlayerparams.cpp
index 30551c115d..dd2499cf37 100644
--- a/indra/llappearance/lltexlayerparams.cpp
+++ b/indra/llappearance/lltexlayerparams.cpp
@@ -338,7 +338,10 @@ bool LLTexLayerParamAlpha::render(S32 x, S32 y, S32 width, S32 height)
// Create the GL texture, and then hang onto it for future use.
if (mNeedsCreateTexture)
{
- mCachedProcessedTexture->createGLTexture(0, mStaticImageRaw);
+ if (!mCachedProcessedTexture->createGLTexture(0, mStaticImageRaw))
+ {
+ LL_WARNS() << "Failed to create GL texture for image: " << mCachedProcessedTexture->getID() << LL_ENDL;
+ }
mNeedsCreateTexture = false;
gGL.getTexUnit(0)->bind(mCachedProcessedTexture);
mCachedProcessedTexture->setAddressMode(LLTexUnit::TAM_CLAMP);
diff --git a/indra/llcommon/llqueuedthread.cpp b/indra/llcommon/llqueuedthread.cpp
index 0196a24b18..efeeb1340e 100644
--- a/indra/llcommon/llqueuedthread.cpp
+++ b/indra/llcommon/llqueuedthread.cpp
@@ -80,7 +80,7 @@ void LLQueuedThread::shutdown()
mRequestQueue.close();
}
- S32 timeout = 100;
+ S32 timeout = 50;
for ( ; timeout>0; timeout--)
{
if (isStopped())
@@ -101,19 +101,34 @@ void LLQueuedThread::shutdown()
}
QueuedRequest* req;
- S32 active_count = 0;
+ S32 queued_count = 0;
+ bool has_active = false;
+ lockData();
while ( (req = (QueuedRequest*)mRequestHash.pop_element()) )
{
- if (req->getStatus() == STATUS_QUEUED || req->getStatus() == STATUS_INPROGRESS)
+ if (req->getStatus() == STATUS_INPROGRESS)
+ {
+ has_active = true;
+ req->setFlags(FLAG_ABORT | FLAG_AUTO_COMPLETE);
+ continue;
+ }
+ if (req->getStatus() == STATUS_QUEUED)
{
- ++active_count;
+ ++queued_count;
req->setStatus(STATUS_ABORTED); // avoid assert in deleteRequest
}
req->deleteRequest();
}
- if (active_count)
+ unlockData();
+ if (queued_count)
+ {
+ LL_WARNS() << "~LLQueuedThread() called with unpocessed requests: " << queued_count << LL_ENDL;
+ }
+ if (has_active)
{
- LL_WARNS() << "~LLQueuedThread() called with active requests: " << active_count << LL_ENDL;
+ LL_WARNS() << "~LLQueuedThread() called with active requests!" << LL_ENDL;
+ ms_sleep(100); // last chance for request to finish
+ printQueueStats();
}
mRequestQueue.close();
@@ -570,7 +585,12 @@ LLQueuedThread::QueuedRequest::QueuedRequest(LLQueuedThread::handle_t handle, U3
LLQueuedThread::QueuedRequest::~QueuedRequest()
{
- llassert_always(mStatus == STATUS_DELETE);
+ if (mStatus != STATUS_DELETE)
+ {
+ // The only method to delete a request is deleteRequest(),
+ // it should have set the status to STATUS_DELETE
+ LL_ERRS() << "LLQueuedThread::QueuedRequest deleted with status " << mStatus << LL_ENDL;
+ }
}
//virtual
diff --git a/indra/llplugin/llpluginprocessparent.cpp b/indra/llplugin/llpluginprocessparent.cpp
index 02c7d9507d..4f55d75e7d 100644
--- a/indra/llplugin/llpluginprocessparent.cpp
+++ b/indra/llplugin/llpluginprocessparent.cpp
@@ -982,15 +982,18 @@ void LLPluginProcessParent::poll(F64 timeout)
}
}
- // Remove instances in the done state from the sInstances map.
- LLCoros::LockType lock(*sInstancesMutex);
- mapInstances_t::iterator itClean = sInstances.begin();
- while (itClean != sInstances.end())
+ if (sInstancesMutex)
{
- if ((*itClean).second->isDone())
- itClean = sInstances.erase(itClean);
- else
- ++itClean;
+ // Remove instances in the done state from the sInstances map.
+ LLCoros::LockType lock(*sInstancesMutex);
+ mapInstances_t::iterator itClean = sInstances.begin();
+ while (itClean != sInstances.end())
+ {
+ if ((*itClean).second->isDone())
+ itClean = sInstances.erase(itClean);
+ else
+ ++itClean;
+ }
}
}
diff --git a/indra/llrender/llcubemap.cpp b/indra/llrender/llcubemap.cpp
index 26e4aaad52..b15cec5804 100644
--- a/indra/llrender/llcubemap.cpp
+++ b/indra/llrender/llcubemap.cpp
@@ -86,7 +86,10 @@ void LLCubeMap::initGL()
#endif
mImages[i]->setTarget(mTargets[i], LLTexUnit::TT_CUBE_MAP);
mRawImages[i] = new LLImageRaw(RESOLUTION, RESOLUTION, 4);
- mImages[i]->createGLTexture(0, mRawImages[i], texname);
+ if (!mImages[i]->createGLTexture(0, mRawImages[i], texname))
+ {
+ LL_WARNS() << "Failed to create GL texture for environment cubemap face " << i << LL_ENDL;
+ }
gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_CUBE_MAP, texname);
mImages[i]->setAddressMode(LLTexUnit::TAM_CLAMP);
@@ -203,7 +206,10 @@ void LLCubeMap::initEnvironmentMap(const std::vector<LLPointer<LLImageRaw> >& ra
mImages[i] = new LLImageGL(resolution, resolution, components, true);
mImages[i]->setTarget(mTargets[i], LLTexUnit::TT_CUBE_MAP);
mRawImages[i] = rawimages[i];
- mImages[i]->createGLTexture(0, mRawImages[i], texname);
+ if (!mImages[i]->createGLTexture(0, mRawImages[i], texname))
+ {
+ LL_WARNS() << "Failed to create GL texture for environment cubemap face " << i << LL_ENDL;
+ }
gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_CUBE_MAP, texname);
mImages[i]->setAddressMode(LLTexUnit::TAM_CLAMP);
diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp
index 9cd5dc8145..a268ea07bb 100644
--- a/indra/llrender/llglslshader.cpp
+++ b/indra/llrender/llglslshader.cpp
@@ -57,6 +57,7 @@ S32 LLGLSLShader::sIndexedTextureChannels = 0;
U32 LLGLSLShader::sMaxGLTFMaterials = 0;
U32 LLGLSLShader::sMaxGLTFNodes = 0;
bool LLGLSLShader::sProfileEnabled = false;
+bool LLGLSLShader::sCanProfile = true;
std::set<LLGLSLShader*> LLGLSLShader::sInstances;
LLGLSLShader::defines_map_t LLGLSLShader::sGlobalDefines;
U64 LLGLSLShader::sTotalTimeElapsed = 0;
@@ -267,7 +268,7 @@ void LLGLSLShader::placeProfileQuery(bool for_runtime)
bool LLGLSLShader::readProfileQuery(bool for_runtime, bool force_read)
{
- if (sProfileEnabled || for_runtime)
+ if ((sProfileEnabled || for_runtime) && sCanProfile)
{
if (!mProfilePending)
{
diff --git a/indra/llrender/llglslshader.h b/indra/llrender/llglslshader.h
index 4702a27cc5..272a99aaa5 100644
--- a/indra/llrender/llglslshader.h
+++ b/indra/llrender/llglslshader.h
@@ -160,6 +160,7 @@ public:
static std::set<LLGLSLShader*> sInstances;
static bool sProfileEnabled;
+ static bool sCanProfile;
LLGLSLShader();
~LLGLSLShader();
diff --git a/indra/llui/llaccordionctrl.cpp b/indra/llui/llaccordionctrl.cpp
index 8dcc809dfe..ac8f7c2126 100644
--- a/indra/llui/llaccordionctrl.cpp
+++ b/indra/llui/llaccordionctrl.cpp
@@ -309,11 +309,8 @@ void LLAccordionCtrl::ctrlSetLeftTopAndSize(LLView* panel, S32 left, S32 top, S3
return;
LLRect panel_rect = panel->getRect();
panel_rect.setLeftTopAndSize( left, top, width, height);
- if (panel->getRect() != panel_rect)
- {
- panel->reshape( width, height, 1);
- panel->setRect(panel_rect);
- }
+ panel->reshape( width, height, 1);
+ panel->setRect(panel_rect);
}
void LLAccordionCtrl::ctrlShiftVertical(LLView* panel, S32 delta)
diff --git a/indra/llui/llaccordionctrltab.cpp b/indra/llui/llaccordionctrltab.cpp
index bdf93348bb..828bfb289b 100644
--- a/indra/llui/llaccordionctrltab.cpp
+++ b/indra/llui/llaccordionctrltab.cpp
@@ -479,7 +479,34 @@ void LLAccordionCtrlTab::onUpdateScrollToChild(const LLUICtrl *cntrl)
// Translate to parent coordinatess to check if we are in visible rectangle
rect.translate(getRect().mLeft, getRect().mBottom);
- if (!getRect().contains(rect))
+ bool needs_to_scroll = false;
+ const LLRect &acc_rect = getRect();
+ if (!acc_rect.contains(rect))
+ {
+ if (acc_rect.mTop < rect.mBottom || acc_rect.mBottom > rect.mTop)
+ {
+ // Content fully not in view
+ needs_to_scroll = true;
+ }
+ else if (acc_rect.getHeight() >= rect.getHeight())
+ {
+ // Content can be displayed fully, but only partially in view
+ needs_to_scroll = true;
+ }
+ else if (acc_rect.mTop <= rect.mTop || acc_rect.mBottom >= rect.mBottom)
+ {
+ // Intersects, but too big to be displayed fully
+ S32 covered_height = acc_rect.mTop > rect.mTop ? rect.mTop - acc_rect.mBottom : acc_rect.mTop - rect.mBottom;
+ constexpr F32 covered_ratio = 0.7f;
+ if (covered_height < covered_ratio * acc_rect.getHeight())
+ {
+ // Try to show bigger portion of the content
+ needs_to_scroll = true;
+ }
+ }
+ // else too big and in the middle of the view as is
+ }
+ if (needs_to_scroll)
{
// for accordition's scroll, height is in pixels
// Back to local coords and calculate position for scroller
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 2079ff17fc..c9f439d085 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -3477,6 +3477,7 @@ S32 LLTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offs
void LLTextSegment::updateLayout(const LLTextBase& editor) {}
F32 LLTextSegment::draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRectf& draw_rect) { return draw_rect.mLeft; }
bool LLTextSegment::canEdit() const { return false; }
+bool LLTextSegment::getPermitsEmoji() const { return true; }
void LLTextSegment::unlinkFromDocument(LLTextBase*) {}
void LLTextSegment::linkToDocument(LLTextBase*) {}
const LLUIColor& LLTextSegment::getColor() const { static const LLUIColor white = LLUIColorTable::instance().getColor("White", LLColor4::white); return white; }
diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h
index d32b8c2d0e..5549c6d7cd 100644
--- a/indra/llui/lltextbase.h
+++ b/indra/llui/lltextbase.h
@@ -89,6 +89,7 @@ public:
virtual void updateLayout(const class LLTextBase& editor);
virtual F32 draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRectf& draw_rect);
virtual bool canEdit() const;
+ virtual bool getPermitsEmoji() const;
virtual void unlinkFromDocument(class LLTextBase* editor);
virtual void linkToDocument(class LLTextBase* editor);
@@ -259,6 +260,7 @@ public:
/*virtual*/ void updateLayout(const class LLTextBase& editor);
/*virtual*/ F32 draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRectf& draw_rect);
/*virtual*/ bool canEdit() const { return false; }
+ /*virtual*/ bool getPermitsEmoji() const { return false; }
/*virtual*/ void unlinkFromDocument(class LLTextBase* editor);
/*virtual*/ void linkToDocument(class LLTextBase* editor);
diff --git a/indra/llwebrtc/llwebrtc.cpp b/indra/llwebrtc/llwebrtc.cpp
index 76ca4abb25..d1bae49784 100644
--- a/indra/llwebrtc/llwebrtc.cpp
+++ b/indra/llwebrtc/llwebrtc.cpp
@@ -572,14 +572,20 @@ void LLWebRTCImpl::workerDeployDevices()
void LLWebRTCImpl::setCaptureDevice(const std::string &id)
{
- mRecordingDevice = id;
- deployDevices();
+ if (mRecordingDevice != id)
+ {
+ mRecordingDevice = id;
+ deployDevices();
+ }
}
void LLWebRTCImpl::setRenderDevice(const std::string &id)
{
- mPlayoutDevice = id;
- deployDevices();
+ if (mPlayoutDevice != id)
+ {
+ mPlayoutDevice = id;
+ deployDevices();
+ }
}
// updateDevices needs to happen on the worker thread.
diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp
index 0578072bb2..6c151351ff 100644
--- a/indra/newview/lldrawpoolbump.cpp
+++ b/indra/newview/lldrawpoolbump.cpp
@@ -798,7 +798,10 @@ void LLBumpImageList::onSourceStandardLoaded( bool success, LLViewerFetchedTextu
}
src_vi->setExplicitFormat(GL_RGBA, GL_RGBA);
{
- src_vi->createGLTexture(src_vi->getDiscardLevel(), nrm_image);
+ if (!src_vi->createGLTexture(src_vi->getDiscardLevel(), nrm_image))
+ {
+ LL_WARNS() << "Failed to create bump image texture for image " << src_vi->getID() << LL_ENDL;
+ }
}
}
}
@@ -892,7 +895,10 @@ void LLBumpImageList::onSourceUpdated(LLViewerTexture* src, EBumpEffect bump_cod
LLImageGL* src_img = src->getGLTexture();
LLImageGL* dst_img = bump->getGLTexture();
- dst_img->setSize(src->getWidth(), src->getHeight(), 4, 0);
+ if (!dst_img->setSize(src->getWidth(), src->getHeight(), 4, 0))
+ {
+ LL_WARNS() << "Failed to setSize for image " << bump->getID() << LL_ENDL;
+ }
dst_img->setUseMipMaps(true);
dst_img->setDiscardLevel(0);
dst_img->createGLTexture();
diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp
index 1bffe34b8f..e9bee93a19 100644
--- a/indra/newview/llfeaturemanager.cpp
+++ b/indra/newview/llfeaturemanager.cpp
@@ -403,8 +403,53 @@ F32 logExceptionBenchmark()
}
#endif
+bool checkRDNA35()
+{
+ // This checks if we're running on an RDNA3.5 GPU. You're only going to see these on AMD's APUs.
+ // As of driver version 25, we're seeing stalls in some of our queries.
+ // This appears to be a driver bug, and appears to be specific RDNA3.5 APUs.
+ // There's multiples of these guys, so we just use this function to check if that GPU is on the list of known RDNA3.5 APUs.
+ // - Geenz 11/12/2025
+ std::array<std::string, 7> rdna35GPUs = {
+ "8060S",
+ "8050S",
+ "8040S",
+ "860M",
+ "840M",
+ "890M",
+ "880M"
+ };
+
+ for (const auto& gpu_name : rdna35GPUs)
+ {
+ if (gGLManager.getRawGLString().find(gpu_name) != std::string::npos)
+ {
+ LL_WARNS("RenderInit") << "Detected AMD RDNA3.5 GPU (" << gpu_name << ")." << LL_ENDL;
+ return true;
+ }
+ }
+
+ return false;
+}
+
bool LLFeatureManager::loadGPUClass()
{
+ // This is a hack for certain AMD GPUs in newer driver versions on certain APUs.
+ // These GPUs will show inconsistent freezes when attempting to run shader profiles against them.
+ // This is extremely problematic as it can lead to:
+ // - Login freezes
+ // - Inability to start the client
+ // - Completely random avatars triggering a freeze
+ // As a result, we filter out these GPUs for shader profiling.
+ // - Geenz 11/11/2025
+
+ if (gGLManager.getRawGLString().find("Radeon") != std::string::npos && checkRDNA35() && gGLManager.mDriverVersionVendorString.find("25.") != std::string::npos)
+ {
+ LL_WARNS("RenderInit") << "Detected AMD RDNA3.5 GPU on a known bad driver; disabling benchmark and occlusion culling to prevent freezes." << LL_ENDL;
+ gSavedSettings.setBOOL("SkipBenchmark", true);
+ gSavedSettings.setBOOL("UseOcclusion", false);
+ }
+
if (!gSavedSettings.getBOOL("SkipBenchmark"))
{
F32 class1_gbps = gSavedSettings.getF32("RenderClass1MemoryBandwidth");
@@ -464,7 +509,7 @@ bool LLFeatureManager::loadGPUClass()
}
#if LL_WINDOWS
- const F32Gigabytes MIN_PHYSICAL_MEMORY(2);
+ const F32Gigabytes MIN_PHYSICAL_MEMORY(8);
LLMemory::updateMemoryInfo();
F32Gigabytes physical_mem = LLMemory::getMaxMemKB();
diff --git a/indra/newview/llfeaturemanager.h b/indra/newview/llfeaturemanager.h
index 22de6afbae..d04b89cb60 100644
--- a/indra/newview/llfeaturemanager.h
+++ b/indra/newview/llfeaturemanager.h
@@ -123,6 +123,7 @@ public:
S32 getVersion() const { return mTableVersion; }
void setSafe(const bool safe) { mSafe = safe; }
bool isSafe() const { return mSafe; }
+ bool skipProfiling() const { return mSkipProfiling; }
LLFeatureList *findMask(const std::string& name);
bool maskFeatures(const std::string& name);
@@ -170,6 +171,7 @@ protected:
F32 mExpectedGLVersion; //expected GL version according to gpu table
std::string mGPUString;
bool mGPUSupported;
+ bool mSkipProfiling = false;
};
inline
diff --git a/indra/newview/llfloateravatarwelcomepack.cpp b/indra/newview/llfloateravatarwelcomepack.cpp
index 82e44d1398..be384bf4d1 100644
--- a/indra/newview/llfloateravatarwelcomepack.cpp
+++ b/indra/newview/llfloateravatarwelcomepack.cpp
@@ -28,8 +28,10 @@
#include "llviewerprecompiledheaders.h"
#include "llfloateravatarwelcomepack.h"
-#include "lluictrlfactory.h"
#include "llmediactrl.h"
+#include "lluictrlfactory.h"
+#include "llviewercontrol.h"
+#include "llweb.h"
LLFloaterAvatarWelcomePack::LLFloaterAvatarWelcomePack(const LLSD& key)
: LLFloater(key)
@@ -52,6 +54,10 @@ bool LLFloaterAvatarWelcomePack::postBuild()
if (mAvatarPicker)
{
mAvatarPicker->clearCache();
+ mAvatarPicker->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL"));
+ std::string url = gSavedSettings.getString("AvatarWelcomePack");
+ url = LLWeb::expandURLSubstitutions(url, LLSD());
+ mAvatarPicker->navigateTo(url, HTTP_CONTENT_TEXT_HTML);
}
return true;
diff --git a/indra/newview/llfloaterdestinations.cpp b/indra/newview/llfloaterdestinations.cpp
index fad9693e8f..84fc4afcdd 100644
--- a/indra/newview/llfloaterdestinations.cpp
+++ b/indra/newview/llfloaterdestinations.cpp
@@ -28,7 +28,10 @@
#include "llviewerprecompiledheaders.h"
#include "llfloaterdestinations.h"
+#include "llmediactrl.h"
#include "lluictrlfactory.h"
+#include "llviewercontrol.h"
+#include "llweb.h"
LLFloaterDestinations::LLFloaterDestinations(const LLSD& key)
@@ -43,6 +46,15 @@ LLFloaterDestinations::~LLFloaterDestinations()
bool LLFloaterDestinations::postBuild()
{
enableResizeCtrls(true, true, false);
+ LLMediaCtrl* destinations = getChild<LLMediaCtrl>("destination_guide_contents");
+ destinations->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL"));
+ std::string url = gSavedSettings.getString("DestinationGuideURL");
+ url = LLWeb::expandURLSubstitutions(url, LLSD());
+ destinations->navigateTo(url, HTTP_CONTENT_TEXT_HTML);
+
+ // If cookie is there, will set it now. Otherwise will have to wait for login completion
+ // which will also update destinations instance if it already exists.
+ LLViewerMedia::getInstance()->getOpenIDCookie(destinations);
return true;
}
diff --git a/indra/newview/llfloatermarketplace.cpp b/indra/newview/llfloatermarketplace.cpp
index 4abea64302..7316d7617d 100644
--- a/indra/newview/llfloatermarketplace.cpp
+++ b/indra/newview/llfloatermarketplace.cpp
@@ -46,9 +46,16 @@ void LLFloaterMarketplace::onClose(bool app_quitting)
bool LLFloaterMarketplace::postBuild()
{
- LLFloaterWebContent::postBuild();
- mWebBrowser = getChild<LLMediaCtrl>("marketplace_contents");
- mWebBrowser->addObserver(this);
+ if (!LLFloaterWebContent::postBuild())
+ return false;
+
+ mWebBrowser->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL"));
+ std::string url = gSavedSettings.getString("MarketplaceURL");
+ mWebBrowser->navigateTo(url, HTTP_CONTENT_TEXT_HTML);
+
+ // If cookie is there, will set it now, Otherwise will have to wait for login completion
+ // which will also update marketplace instance if it already exists.
+ LLViewerMedia::getInstance()->getOpenIDCookie(mWebBrowser);
return true;
}
diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp
index bfce13affc..4cb6e7be96 100644
--- a/indra/newview/llfloaterregioninfo.cpp
+++ b/indra/newview/llfloaterregioninfo.cpp
@@ -269,10 +269,12 @@ bool LLFloaterRegionInfo::postBuild()
static LLCachedControl<bool> feature_pbr_terrain_transforms_enabled(gSavedSettings, "RenderTerrainPBRTransformsEnabled", false);
if (!feature_pbr_terrain_transforms_enabled() || !feature_pbr_terrain_enabled())
{
+ LL_INFOS("Terrain") << "Building region terrain panel from panel_region_terrain.xml" << LL_ENDL;
panel->buildFromFile("panel_region_terrain.xml");
}
else
{
+ LL_INFOS("Terrain") << "Building region terrain panel from panel_region_terrain_texture_transform.xml" << LL_ENDL;
panel->buildFromFile("panel_region_terrain_texture_transform.xml");
}
mTab->addTabPanel(panel);
@@ -1489,6 +1491,11 @@ bool LLPanelRegionTerrainInfo::validateMaterials()
const LLUUID& material_asset_id = material_ctrl->getImageAssetID();
llassert(material_asset_id.notNull());
if (material_asset_id.isNull()) { return false; }
+ if (material_asset_id == BLANK_MATERIAL_ASSET_ID)
+ {
+ // Default/Blank material is valid by default
+ continue;
+ }
const LLFetchedGLTFMaterial* material = gGLTFMaterialList.getMaterial(material_asset_id);
if (!material->isLoaded())
{
@@ -1998,18 +2005,7 @@ void LLPanelRegionTerrainInfo::initMaterialCtrl(LLTextureCtrl*& ctrl, const std:
ctrl->setCommitCallback(
[this, index](LLUICtrl* ctrl, const LLSD& param)
{
- if (!mMaterialScaleUCtrl[index]
- || !mMaterialScaleVCtrl[index]
- || !mMaterialRotationCtrl[index]
- || !mMaterialOffsetUCtrl[index]
- || !mMaterialOffsetVCtrl[index]) return;
-
- mMaterialScaleUCtrl[index]->setValue(1.f);
- mMaterialScaleVCtrl[index]->setValue(1.f);
- mMaterialRotationCtrl[index]->setValue(0.f);
- mMaterialOffsetUCtrl[index]->setValue(0.f);
- mMaterialOffsetVCtrl[index]->setValue(0.f);
- onChangeAnything();
+ callbackMaterialCommit(index);
});
}
@@ -2097,6 +2093,25 @@ bool LLPanelRegionTerrainInfo::callbackBakeTerrain(const LLSD& notification, con
return false;
}
+void LLPanelRegionTerrainInfo::callbackMaterialCommit(S32 index)
+{
+ // These can be null if 'transforms' panel was not inited
+ if (mMaterialScaleUCtrl[index]
+ && mMaterialScaleVCtrl[index]
+ && mMaterialRotationCtrl[index]
+ && mMaterialOffsetUCtrl[index]
+ && mMaterialOffsetVCtrl[index])
+ {
+ mMaterialScaleUCtrl[index]->setValue(1.f);
+ mMaterialScaleVCtrl[index]->setValue(1.f);
+ mMaterialRotationCtrl[index]->setValue(0.f);
+ mMaterialOffsetUCtrl[index]->setValue(0.f);
+ mMaterialOffsetVCtrl[index]->setValue(0.f);
+ }
+
+ onChangeAnything();
+}
+
/////////////////////////////////////////////////////////////////////////////
// LLPanelEstateInfo
//
diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h
index a8631c36ca..0036df9c3d 100644
--- a/indra/newview/llfloaterregioninfo.h
+++ b/indra/newview/llfloaterregioninfo.h
@@ -272,6 +272,7 @@ public:
static void onClickBakeTerrain(void*);
bool callbackBakeTerrain(const LLSD& notification, const LLSD& response);
bool callbackTextureHeights(const LLSD& notification, const LLSD& response);
+ void callbackMaterialCommit(S32 index);
protected:
bool sendUpdate() override;
diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp
index 7ee1b88f05..9b7a4e5134 100644
--- a/indra/newview/llfloatersearch.cpp
+++ b/indra/newview/llfloatersearch.cpp
@@ -161,15 +161,20 @@ void LLFloaterSearch::initiateSearch(const LLSD& tokens)
// Naviation to the calculated URL - we know it's HTML so we can
// tell the media system not to bother with the MIME type check.
- LLMediaCtrl* search_browser = findChild<LLMediaCtrl>("search_contents");
- search_browser->navigateTo(url, HTTP_CONTENT_TEXT_HTML);
+ mWebBrowser->navigateTo(url, HTTP_CONTENT_TEXT_HTML);
}
bool LLFloaterSearch::postBuild()
{
- LLFloaterWebContent::postBuild();
- mWebBrowser = getChild<LLMediaCtrl>("search_contents");
- mWebBrowser->addObserver(this);
+ if (!LLFloaterWebContent::postBuild())
+ return false;
+
+ mWebBrowser->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL"));
+
+ // If cookie is there, will set it now, Otherwise will have to wait for login completion
+ // which will also update search instance if it already exists.
+ LLViewerMedia::getInstance()->getOpenIDCookie(mWebBrowser);
+
getChildView("address")->setEnabled(false);
getChildView("popexternal")->setEnabled(false);
diff --git a/indra/newview/lllocalbitmaps.cpp b/indra/newview/lllocalbitmaps.cpp
index a99c9df0ff..6e56aac270 100644
--- a/indra/newview/lllocalbitmaps.cpp
+++ b/indra/newview/lllocalbitmaps.cpp
@@ -219,7 +219,10 @@ bool LLLocalBitmap::updateSelf(EUpdateType optional_firstupdate)
LLPointer<LLViewerFetchedTexture> texture = new LLViewerFetchedTexture
("file://"+mFilename, FTT_LOCAL_FILE, mWorldID, LL_LOCAL_USE_MIPMAPS);
- texture->createGLTexture(LL_LOCAL_DISCARD_LEVEL, raw_image);
+ if (!texture->createGLTexture(LL_LOCAL_DISCARD_LEVEL, raw_image))
+ {
+ LL_WARNS() << "Failed to create GL texture for local bitmap: " << mFilename << " " << mWorldID << LL_ENDL;
+ }
texture->ref();
gTextureList.addImage(texture, TEX_LIST_STANDARD);
diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp
index 4c408ec17d..35ac7919ac 100644
--- a/indra/newview/llviewerdisplay.cpp
+++ b/indra/newview/llviewerdisplay.cpp
@@ -240,8 +240,11 @@ void display_stats()
if (gRecentFPSTime.getElapsedTimeF32() >= FPS_LOG_FREQUENCY)
{
LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("DS - FPS");
+ LLTrace::Recording& recording = LLTrace::get_frame_recording().getLastRecording();
+ F64 normalized_session_jitter = recording.getLastValue(LLStatViewer::NOTRMALIZED_FRAMETIME_JITTER_SESSION);
+ F64 normalized_period_jitter = recording.getLastValue(LLStatViewer::NORMALIZED_FRAMTIME_JITTER_PERIOD);
F32 fps = gRecentFrameCount / FPS_LOG_FREQUENCY;
- LL_INFOS() << llformat("FPS: %.02f", fps) << LL_ENDL;
+ LL_INFOS() << llformat("FPS: %.02f SESSION JITTER: %.4f PERIOD JITTER: %.4f", fps, normalized_session_jitter, normalized_period_jitter) << LL_ENDL;
gRecentFrameCount = 0;
gRecentFPSTime.reset();
}
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index d5f63674e9..bb956d455f 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -83,6 +83,8 @@ extern bool gCubeSnapshot;
// *TODO: Consider enabling mipmaps (they have been disabled for a long time). Likely has a significant performance impact for tiled/high texture repeat media. Mip generation in a shader may also be an option if necessary.
constexpr bool USE_MIPMAPS = false;
+constexpr S32 MAX_MEDIA_INSTANCES_DEFAULT = 8;
+constexpr S32 MEDIA_INSTANCES_MIN_LIMIT = 6; // 4 'permanent' floaters plus reserve for dynamic ones
void init_threaded_picker_load_dialog(LLPluginClassMedia* plugin, LLFilePicker::ELoadFilter filter, bool get_multiple)
{
@@ -214,6 +216,7 @@ static bool sViewerMediaMuteListObserverInitialized = false;
LLViewerMedia::LLViewerMedia():
mAnyMediaShowing(false),
mAnyMediaPlaying(false),
+mMaxIntances(MAX_MEDIA_INSTANCES_DEFAULT),
mSpareBrowserMediaSource(NULL)
{
}
@@ -222,6 +225,7 @@ LLViewerMedia::~LLViewerMedia()
{
gIdleCallbacks.deleteFunction(LLViewerMedia::onIdle, NULL);
mTeleportFinishConnection.disconnect();
+ mMaxInstancesConnection.disconnect();
if (mSpareBrowserMediaSource != NULL)
{
delete mSpareBrowserMediaSource;
@@ -235,6 +239,35 @@ void LLViewerMedia::initSingleton()
gIdleCallbacks.addFunction(LLViewerMedia::onIdle, NULL);
mTeleportFinishConnection = LLViewerParcelMgr::getInstance()->
setTeleportFinishedCallback(boost::bind(&LLViewerMedia::onTeleportFinished, this));
+
+ LLControlVariable* ctrl = gSavedSettings.getControl("PluginInstancesTotal");
+ if (ctrl)
+ {
+ setMaxInstances(ctrl->getValue().asInteger());
+ mMaxInstancesConnection = ctrl->getSignal()->connect([this](LLControlVariable* control, const LLSD& new_val, const LLSD& old_val)
+ {
+ setMaxInstances(new_val.asInteger());
+ });
+ }
+ else
+ {
+ setMaxInstances(MAX_MEDIA_INSTANCES_DEFAULT);
+ }
+}
+
+void LLViewerMedia::setMaxInstances(S32 max_instances)
+{
+ const F32Gigabytes MIN_PHYSICAL_MEMORY(8);
+ LLMemory::updateMemoryInfo();
+ F32Gigabytes physical_mem = LLMemory::getMaxMemKB();
+ if (MIN_PHYSICAL_MEMORY > physical_mem)
+ {
+ mMaxIntances = llmax(max_instances - 2, MEDIA_INSTANCES_MIN_LIMIT);
+ }
+ else
+ {
+ mMaxIntances = llmax(max_instances, MEDIA_INSTANCES_MIN_LIMIT);
+ }
}
//////////////////////////////////////////////////////////////////////////////////////////
@@ -688,7 +721,6 @@ void LLViewerMedia::updateMedia(void *dummy_arg)
static LLCachedControl<bool> inworld_media_enabled(gSavedSettings, "AudioStreamingMedia", true);
static LLCachedControl<bool> inworld_audio_enabled(gSavedSettings, "AudioStreamingMusic", true);
- static LLCachedControl<U32> max_instances(gSavedSettings, "PluginInstancesTotal", 8);
static LLCachedControl<U32> max_normal(gSavedSettings, "PluginInstancesNormal", 2);
static LLCachedControl<U32> max_low(gSavedSettings, "PluginInstancesLow", 4);
static LLCachedControl<F32> max_cpu(gSavedSettings, "PluginInstancesCPULimit", 0.9);
@@ -709,7 +741,7 @@ void LLViewerMedia::updateMedia(void *dummy_arg)
LLPluginClassMedia::EPriority new_priority = LLPluginClassMedia::PRIORITY_NORMAL;
- if(pimpl->isForcedUnloaded() || (impl_count_total >= (int)max_instances))
+ if(pimpl->isForcedUnloaded() || (impl_count_total >= mMaxIntances))
{
// Never load muted or failed impls.
// Hard limit on the number of instances that will be loaded at one time
@@ -869,7 +901,7 @@ void LLViewerMedia::updateMedia(void *dummy_arg)
sLowestLoadableImplInterest = 0.0f;
// Only do this calculation if we've hit the impl count limit -- up until that point we always need to load media data.
- if(lowest_interest_loadable && (impl_count_total >= (int)max_instances))
+ if(lowest_interest_loadable && (impl_count_total >= mMaxIntances))
{
// Get the interest value of this impl's object for use by isInterestingEnough
LLVOVolume *object = lowest_interest_loadable->getSomeObject();
@@ -1201,6 +1233,54 @@ LLCore::HttpHeaders::ptr_t LLViewerMedia::getHttpHeaders()
return headers;
}
+bool LLViewerMedia::getOpenIDCookie(LLMediaCtrl* media_instance) const
+{
+ if (mOpenIDCookie.empty())
+ {
+ return false;
+ }
+
+ std::string authority = mOpenIDURL.mAuthority;
+ std::string::size_type hostStart = authority.find('@');
+ if (hostStart == std::string::npos)
+ {
+ // no username/password
+ hostStart = 0;
+ }
+ else
+ {
+ // Hostname starts after the @.
+ // (If the hostname part is empty, this may put host_start at the end of the string. In that case, it will end up passing through an empty hostname, which is correct.)
+ ++hostStart;
+ }
+ std::string::size_type hostEnd = authority.rfind(':');
+ if ((hostEnd == std::string::npos) || (hostEnd < hostStart))
+ {
+ // no port
+ hostEnd = authority.size();
+ }
+
+ std::string cookie_host = authority.substr(hostStart, hostEnd - hostStart);
+ std::string cookie_name = "";
+ std::string cookie_value = "";
+ std::string cookie_path = "";
+ bool httponly = true;
+ bool secure = true;
+ if (!parseRawCookie(mOpenIDCookie, cookie_name, cookie_value, cookie_path, httponly, secure))
+ {
+ return false;
+ }
+ std::string cefUrl(std::string(mOpenIDURL.mURI) + "://" + std::string(mOpenIDURL.mAuthority));
+ if (media_instance && media_instance->getMediaPlugin())
+ {
+ media_instance->getMediaPlugin()->setCookie(cefUrl, cookie_name, cookie_value, cookie_host,
+ cookie_path, httponly, secure);
+
+ media_instance->getMediaPlugin()->storeOpenIDCookie(cefUrl, cookie_name, cookie_value,
+ cookie_host, cookie_path, httponly, secure);
+ }
+ return true;
+}
/////////////////////////////////////////////////////////////////////////////////////////
void LLViewerMedia::setOpenIDCookie(const std::string& url)
@@ -1267,7 +1347,7 @@ void LLViewerMedia::getOpenIDCookieCoro(std::string url)
bool secure = true;
LLViewerMedia* inst = getInstance();
- if (inst->parseRawCookie(inst->mOpenIDCookie, cookie_name, cookie_value, cookie_path, httponly, secure))
+ if (parseRawCookie(inst->mOpenIDCookie, cookie_name, cookie_value, cookie_path, httponly, secure))
{
// MAINT-5711 - inexplicably, the CEF setCookie function will no longer set the cookie if the
// url and domain are not the same. This used to be my.sl.com and id.sl.com respectively and worked.
@@ -1284,20 +1364,24 @@ void LLViewerMedia::getOpenIDCookieCoro(std::string url)
std::string browser_name;
};
struct MediaCookieInstance media_cookie_instances[] = {
- {"search", "search_contents" },
- {"marketplace", "marketplace_contents" },
+ {"search", "webbrowser" },
+ {"marketplace", "webbrowser" },
{"destinations", "destination_guide_contents" },
};
for (MediaCookieInstance mci : media_cookie_instances)
{
- LLMediaCtrl* media_instance = LLFloaterReg::getInstance(mci.floater_name)->getChild<LLMediaCtrl>(mci.browser_name);
- if (media_instance && media_instance->getMediaPlugin())
+ LLFloater *floaterp = LLFloaterReg::findInstance(mci.floater_name);
+ if (floaterp)
{
- media_instance->getMediaPlugin()->setCookie(cefUrl, cookie_name, cookie_value, cookie_host,
- cookie_path, httponly, secure);
+ LLMediaCtrl* media_instance = floaterp->getChild<LLMediaCtrl>(mci.browser_name);
+ if (media_instance && media_instance->getMediaPlugin())
+ {
+ media_instance->getMediaPlugin()->setCookie(cefUrl, cookie_name, cookie_value, cookie_host,
+ cookie_path, httponly, secure);
- media_instance->getMediaPlugin()->storeOpenIDCookie(cefUrl, cookie_name, cookie_value,
- cookie_host, cookie_path, httponly, secure);
+ media_instance->getMediaPlugin()->storeOpenIDCookie(cefUrl, cookie_name, cookie_value,
+ cookie_host, cookie_path, httponly, secure);
+ }
}
}
}
@@ -3001,7 +3085,10 @@ void LLViewerMediaImpl::doMediaTexUpdate(LLViewerMediaTexture* media_tex, U8* da
// -Cosmic,2023-04-04
// Allocate GL texture based on LLImageRaw but do NOT copy to GL
LLGLuint tex_name = 0;
- media_tex->createGLTexture(0, raw, 0, true, LLGLTexture::OTHER, true, &tex_name);
+ if (!media_tex->createGLTexture(0, raw, 0, true, LLGLTexture::OTHER, true, &tex_name))
+ {
+ LL_WARNS("Media") << "Failed to create media texture" << LL_ENDL;
+ }
// copy just the subimage covered by the image raw to GL
media_tex->setSubImage(data, data_width, data_height, x_pos, y_pos, width, height, tex_name);
@@ -3070,7 +3157,10 @@ LLViewerMediaTexture* LLViewerMediaImpl::updateMediaImage()
mMediaSource->getTextureFormatSwapBytes());
int discard_level = 0;
- media_tex->createGLTexture(discard_level, raw);
+ if (!media_tex->createGLTexture(discard_level, raw))
+ {
+ LL_WARNS("Media") << "Failed to create media texture" << LL_ENDL;
+ }
// MEDIAOPT: set this dynamically on play/stop
// FIXME
diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h
index c17cf59815..1fc5bbc9e0 100644
--- a/indra/newview/llviewermedia.h
+++ b/indra/newview/llviewermedia.h
@@ -69,6 +69,7 @@ private:
};
class LLViewerMediaImpl;
+class LLMediaCtrl;
class LLViewerMedia: public LLSingleton<LLViewerMedia>
{
@@ -162,22 +163,26 @@ public:
LLSD getHeaders();
LLCore::HttpHeaders::ptr_t getHttpHeaders();
+ bool getOpenIDCookie(LLMediaCtrl* media_instance) const;
private:
void onAuthSubmit(const LLSD& notification, const LLSD& response);
- bool parseRawCookie(const std::string raw_cookie, std::string& name, std::string& value, std::string& path, bool& httponly, bool& secure);
+ static bool parseRawCookie(const std::string raw_cookie, std::string& name, std::string& value, std::string& path, bool& httponly, bool& secure);
void setOpenIDCookie(const std::string& url);
void onTeleportFinished();
static void openIDSetupCoro(std::string openidUrl, std::string openidToken);
static void getOpenIDCookieCoro(std::string url);
+ void setMaxInstances(S32 max_instances);
bool mAnyMediaShowing;
bool mAnyMediaPlaying;
+ S32 mMaxIntances = 8;
LLURL mOpenIDURL;
std::string mOpenIDCookie;
LLPluginClassMedia* mSpareBrowserMediaSource;
boost::signals2::connection mTeleportFinishConnection;
+ boost::signals2::connection mMaxInstancesConnection;
};
// Implementation functions not exported into header file
diff --git a/indra/newview/llviewerstats.h b/indra/newview/llviewerstats.h
index 011269d7ee..1ac8b2f66b 100644
--- a/indra/newview/llviewerstats.h
+++ b/indra/newview/llviewerstats.h
@@ -229,6 +229,9 @@ extern LLTrace::EventStatHandle<F64Seconds > AVATAR_EDIT_TIME,
extern LLTrace::EventStatHandle<LLUnit<F32, LLUnits::Percent> > OBJECT_CACHE_HIT_RATE;
+extern LLTrace::SampleStatHandle<F64> NOTRMALIZED_FRAMETIME_JITTER_SESSION;
+extern LLTrace::SampleStatHandle<F64> NORMALIZED_FRAMTIME_JITTER_PERIOD;
+
}
class LLViewerStats : public LLSingleton<LLViewerStats>
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index 6135e18840..1e83482752 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -406,7 +406,10 @@ void LLViewerTextureManager::init()
}
}
}
- imagep->createGLTexture(0, image_raw);
+ if (!imagep->createGLTexture(0, image_raw))
+ {
+ LL_WARNS() << "Failed to create default texture " << IMG_DEFAULT << LL_ENDL;
+ }
image_raw = NULL;
#else
LLViewerFetchedTexture::sDefaultImagep = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, true, LLGLTexture::BOOST_UI);
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index c474bff2dc..187cfc9792 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -2324,36 +2324,23 @@ void LLViewerWindow::initWorldUI()
gToolBarView->setVisible(true);
}
- if (!gNonInteractive)
+ // Don't preload cef instances on low end hardware
+ const F32Gigabytes MIN_PHYSICAL_MEMORY(8);
+ F32Gigabytes physical_mem = LLMemory::getMaxMemKB();
+ if (physical_mem <= 0)
{
- LLMediaCtrl* destinations = LLFloaterReg::getInstance("destinations")->getChild<LLMediaCtrl>("destination_guide_contents");
- if (destinations)
- {
- destinations->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL"));
- std::string url = gSavedSettings.getString("DestinationGuideURL");
- url = LLWeb::expandURLSubstitutions(url, LLSD());
- destinations->navigateTo(url, HTTP_CONTENT_TEXT_HTML);
- }
- LLMediaCtrl* avatar_welcome_pack = LLFloaterReg::getInstance("avatar_welcome_pack")->findChild<LLMediaCtrl>("avatar_picker_contents");
- if (avatar_welcome_pack)
- {
- avatar_welcome_pack->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL"));
- std::string url = gSavedSettings.getString("AvatarWelcomePack");
- url = LLWeb::expandURLSubstitutions(url, LLSD());
- avatar_welcome_pack->navigateTo(url, HTTP_CONTENT_TEXT_HTML);
- }
- LLMediaCtrl* search = LLFloaterReg::getInstance("search")->findChild<LLMediaCtrl>("search_contents");
- if (search)
- {
- search->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL"));
- }
- LLMediaCtrl* marketplace = LLFloaterReg::getInstance("marketplace")->getChild<LLMediaCtrl>("marketplace_contents");
- if (marketplace)
- {
- marketplace->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL"));
- std::string url = gSavedSettings.getString("MarketplaceURL");
- marketplace->navigateTo(url, HTTP_CONTENT_TEXT_HTML);
- }
+ LLMemory::updateMemoryInfo();
+ physical_mem = LLMemory::getMaxMemKB();
+ }
+
+ if (!gNonInteractive && physical_mem > MIN_PHYSICAL_MEMORY)
+ {
+ LL_INFOS() << "Preloading cef instances" << LL_ENDL;
+
+ LLFloaterReg::getInstance("destinations");
+ LLFloaterReg::getInstance("avatar_welcome_pack");
+ LLFloaterReg::getInstance("search");
+ LLFloaterReg::getInstance("marketplace");
}
}
diff --git a/indra/newview/skins/default/xui/en/floater_marketplace.xml b/indra/newview/skins/default/xui/en/floater_marketplace.xml
index 99fb3a1ad8..40bf674d2d 100644
--- a/indra/newview/skins/default/xui/en/floater_marketplace.xml
+++ b/indra/newview/skins/default/xui/en/floater_marketplace.xml
@@ -169,7 +169,7 @@
follows="all"
layout="topleft"
left="0"
- name="marketplace_contents"
+ name="webbrowser"
top="0"/>
</layout_panel>
<layout_panel name="status_bar"
diff --git a/indra/newview/skins/default/xui/en/floater_search.xml b/indra/newview/skins/default/xui/en/floater_search.xml
index 43c4aa1b9d..8891ebcd87 100644
--- a/indra/newview/skins/default/xui/en/floater_search.xml
+++ b/indra/newview/skins/default/xui/en/floater_search.xml
@@ -170,7 +170,7 @@
layout="topleft"
left="0"
trusted_content="true"
- name="search_contents"
+ name="webbrowser"
top="0"/>
</layout_panel>
<layout_panel name="status_bar"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_move.xml b/indra/newview/skins/default/xui/en/panel_preferences_move.xml
index 3a5a8cbfec..2fc859f43e 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_move.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_move.xml
@@ -214,7 +214,7 @@
left_pad="10"
top_delta="-6"
name="mouse_warp_combo"
- tooltip="Controls warping of the mouse to the center of the screen during alt-zoom and mouse look."
+ tool_tip="Controls warping of the mouse to the center of the screen during alt-zoom and mouse look."
width="200">
<combo_box.item
label="Automatic"