From 9e47573dae0bf29f4e30eddc9b29308d2588d9b4 Mon Sep 17 00:00:00 2001 From: Ansariel Date: Mon, 9 Dec 2024 13:26:53 +0100 Subject: Remove orphaned notifications (follow-up to 412b3db5a877eab977346e3f30464d5745afd69b) --- .../newview/skins/default/xui/en/notifications.xml | 31 ---------------------- 1 file changed, 31 deletions(-) (limited to 'indra') diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index ee93c8b000..cb31bea237 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -12586,35 +12586,4 @@ are wearing now. name="okbutton" yestext="OK"/> - - - - DELAY - - To improve system performance, [SECOND_LIFE] has reduced texture memory usage after being in the background for [DELAY] seconds. It may take some time for texture image quality to return to normal. - - - - - - DELAY - - To improve system performance, [SECOND_LIFE] has reduced texture memory usage after being minimized for [DELAY] seconds. It may take some time for texture image quality to return to normal. - - - -- cgit v1.2.3 From d17fd56dc42fcd35ef8cf2fe9e4cd7a26ce8ba2a Mon Sep 17 00:00:00 2001 From: Rye Date: Tue, 10 Dec 2024 20:21:24 -0500 Subject: Fix crashes from shader load failures under RenderMaxOpenGLVersion 3.1/3.2/3.3 (#3184) --- indra/llrender/llshadermgr.cpp | 3 +- .../llfloaterpreferencesgraphicsadvanced.cpp | 21 +++++--- indra/newview/llviewershadermgr.cpp | 59 +++++++++++++++++++++- indra/newview/pipeline.cpp | 9 ++-- 4 files changed, 77 insertions(+), 15 deletions(-) (limited to 'indra') diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index 47f1032c34..254ead2bd8 100644 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -580,7 +580,8 @@ GLuint LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shader_lev } else { - if (type == GL_GEOMETRY_SHADER) + // OpenGL 3.2 had GLSL version 1.50. anything after that the version numbers match. + if (type == GL_GEOMETRY_SHADER || minor_version >= 50) { //set version to 1.50 shader_code_text[shader_code_count++] = strdup("#version 150\n"); diff --git a/indra/newview/llfloaterpreferencesgraphicsadvanced.cpp b/indra/newview/llfloaterpreferencesgraphicsadvanced.cpp index cf5b2d033b..8e8967ee3d 100644 --- a/indra/newview/llfloaterpreferencesgraphicsadvanced.cpp +++ b/indra/newview/llfloaterpreferencesgraphicsadvanced.cpp @@ -63,17 +63,24 @@ LLFloaterPreferenceGraphicsAdvanced::~LLFloaterPreferenceGraphicsAdvanced() bool LLFloaterPreferenceGraphicsAdvanced::postBuild() { - // Don't do this on Mac as their braindead GL versioning - // sets this when 8x and 16x are indeed available + // Disable FSAA combo when shaders are not loaded // -#if !LL_DARWIN - if (gGLManager.mIsIntel || gGLManager.mGLVersion < 3.f) - { //remove FSAA settings above "4x" + { LLComboBox* combo = getChild("fsaa"); - combo->remove("8x"); - combo->remove("16x"); + if (!gFXAAProgram[0].isComplete()) + combo->remove("FXAA"); + + if (!gSMAAEdgeDetectProgram[0].isComplete()) + combo->remove("SMAA"); + + if (!gFXAAProgram[0].isComplete() && !gSMAAEdgeDetectProgram[0].isComplete()) + { + combo->setEnabled(false); + getChild("fsaa quality")->setEnabled(false); + } } +#if !LL_DARWIN LLCheckBoxCtrl *use_HiDPI = getChild("use HiDPI"); use_HiDPI->setVisible(false); #endif diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 7ce9c02e8d..5b4648a0bf 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -2512,6 +2512,7 @@ bool LLViewerShaderMgr::loadShadersDeferred() {"28", "High"}, {"39", "Ultra"} }; int i = 0; + bool failed = false; for (const auto& quality_pair : quality_levels) { if (success) @@ -2535,10 +2536,26 @@ bool LLViewerShaderMgr::loadShadersDeferred() gFXAAProgram[i].mShaderLevel = mShaderLevel[SHADER_DEFERRED]; success = gFXAAProgram[i].createShader(); - llassert(success); + // llassert(success); + if (!success) + { + LL_WARNS() << "Failed to create shader '" << gFXAAProgram[i].mName << "', disabling!" << LL_ENDL; + // continue as if this shader never happened + failed = true; + success = true; + break; + } } ++i; } + + if (failed) + { + for (auto i = 0; i < 4; ++i) + { + gFXAAProgram[i].unload(); + } + } } if (gGLManager.mGLVersion > 3.15f && success) @@ -2546,8 +2563,9 @@ bool LLViewerShaderMgr::loadShadersDeferred() std::vector> quality_levels = { {"SMAA_PRESET_LOW", "Low"}, {"SMAA_PRESET_MEDIUM", "Medium"}, {"SMAA_PRESET_HIGH", "High"}, - {"SMAA_PRESET_ULTRA", "Ultra"} }; + {"SMAA_PRESET_ULTRA", "Ultra"} }; int i = 0; + bool failed = false; for (const auto& smaa_pair : quality_levels) { std::map defines; @@ -2576,6 +2594,15 @@ bool LLViewerShaderMgr::loadShadersDeferred() gSMAAEdgeDetectProgram[i].mShaderFiles.push_back(make_pair("deferred/SMAA.glsl", GL_VERTEX_SHADER_ARB)); gSMAAEdgeDetectProgram[i].mShaderLevel = mShaderLevel[SHADER_DEFERRED]; success = gSMAAEdgeDetectProgram[i].createShader(); + // llassert(success); + if (!success) + { + LL_WARNS() << "Failed to create shader '" << gSMAAEdgeDetectProgram[i].mName << "', disabling!" << LL_ENDL; + // continue as if this shader never happened + failed = true; + success = true; + break; + } } if (success) @@ -2593,6 +2620,15 @@ bool LLViewerShaderMgr::loadShadersDeferred() gSMAABlendWeightsProgram[i].mShaderFiles.push_back(make_pair("deferred/SMAA.glsl", GL_VERTEX_SHADER_ARB)); gSMAABlendWeightsProgram[i].mShaderLevel = mShaderLevel[SHADER_DEFERRED]; success = gSMAABlendWeightsProgram[i].createShader(); + // llassert(success); + if (!success) + { + LL_WARNS() << "Failed to create shader '" << gSMAABlendWeightsProgram[i].mName << "', disabling!" << LL_ENDL; + // continue as if this shader never happened + failed = true; + success = true; + break; + } } if (success) @@ -2610,9 +2646,28 @@ bool LLViewerShaderMgr::loadShadersDeferred() gSMAANeighborhoodBlendProgram[i].mShaderFiles.push_back(make_pair("deferred/SMAA.glsl", GL_VERTEX_SHADER_ARB)); gSMAANeighborhoodBlendProgram[i].mShaderLevel = mShaderLevel[SHADER_DEFERRED]; success = gSMAANeighborhoodBlendProgram[i].createShader(); + // llassert(success); + if (!success) + { + LL_WARNS() << "Failed to create shader '" << gSMAANeighborhoodBlendProgram[i].mName << "', disabling!" << LL_ENDL; + // continue as if this shader never happened + failed = true; + success = true; + break; + } } ++i; } + + if (failed) + { + for (auto i = 0; i < 4; ++i) + { + gSMAAEdgeDetectProgram[i].unload(); + gSMAABlendWeightsProgram[i].unload(); + gSMAANeighborhoodBlendProgram[i].unload(); + } + } } if (success && gGLManager.mGLVersion > 4.05f) diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index a86c69b924..1ca67dd88a 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -7396,8 +7396,7 @@ void LLPipeline::applyFXAA(LLRenderTarget* src, LLRenderTarget* dst) { { llassert(!gCubeSnapshot); - bool multisample = RenderFSAAType == 1 && mFXAAMap.isComplete(); - LLGLSLShader* shader = &gGlowCombineProgram; + bool multisample = RenderFSAAType == 1 && gFXAAProgram[0].isComplete() && mFXAAMap.isComplete(); // Present everything. if (multisample) @@ -7410,7 +7409,7 @@ void LLPipeline::applyFXAA(LLRenderTarget* src, LLRenderTarget* dst) mFXAAMap.bindTarget(); mFXAAMap.clear(GL_COLOR_BUFFER_BIT); - shader = &gGlowCombineFXAAProgram; + LLGLSLShader* shader = &gGlowCombineFXAAProgram; shader->bind(); S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, src->getUsage()); @@ -7481,7 +7480,7 @@ void LLPipeline::applyFXAA(LLRenderTarget* src, LLRenderTarget* dst) void LLPipeline::generateSMAABuffers(LLRenderTarget* src) { llassert(!gCubeSnapshot); - bool multisample = RenderFSAAType == 2 && mFXAAMap.isComplete() && mSMAABlendBuffer.isComplete(); + bool multisample = RenderFSAAType == 2 && gSMAAEdgeDetectProgram[0].isComplete() && mFXAAMap.isComplete() && mSMAABlendBuffer.isComplete(); // Present everything. if (multisample) @@ -7599,7 +7598,7 @@ void LLPipeline::generateSMAABuffers(LLRenderTarget* src) void LLPipeline::applySMAA(LLRenderTarget* src, LLRenderTarget* dst) { llassert(!gCubeSnapshot); - bool multisample = RenderFSAAType == 2 && mFXAAMap.isComplete() && mSMAABlendBuffer.isComplete(); + bool multisample = RenderFSAAType == 2 && gSMAAEdgeDetectProgram[0].isComplete() && mFXAAMap.isComplete() && mSMAABlendBuffer.isComplete(); // Present everything. if (multisample) -- cgit v1.2.3 From f8fad89dd00f5c5c0690dc5e2619b9a95026666c Mon Sep 17 00:00:00 2001 From: Rye Date: Tue, 10 Dec 2024 02:31:05 -0500 Subject: Fix mesa failing to link shaders due to missing vertex shader outputs --- indra/llrender/llshadermgr.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index 254ead2bd8..0885740934 100644 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -79,7 +79,7 @@ bool LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader) ////////////////////////////////////// // NOTE order of shader object attaching is VERY IMPORTANT!!! - if (features->calculatesAtmospherics) + if (features->calculatesAtmospherics || features->hasGamma || features->isDeferred) { if (!shader->attachVertexObject("windlight/atmosphericsVarsV.glsl")) { -- cgit v1.2.3 From 9f47542597b2902a500be11e8083c608db39350a Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Wed, 11 Dec 2024 22:21:49 +0200 Subject: #3265 Crash at getAllowEnvironmentOverride Check region pointer and make sure external callbacks get disconected --- indra/newview/llfloaterregioninfo.cpp | 10 ++++++++-- indra/newview/llfloaterregioninfo.h | 4 +++- indra/newview/llpanelenvironment.cpp | 14 ++++++++------ 3 files changed, 19 insertions(+), 9 deletions(-) (limited to 'indra') diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index efeee1ad3c..3239921259 100644 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -2100,8 +2100,14 @@ LLPanelEstateInfo::LLPanelEstateInfo() mEstateID(0) // invalid { LLEstateInfoModel& estate_info = LLEstateInfoModel::instance(); - estate_info.setCommitCallback(boost::bind(&LLPanelEstateInfo::refreshFromEstate, this)); - estate_info.setUpdateCallback(boost::bind(&LLPanelEstateInfo::refreshFromEstate, this)); + mEstateInfoCommitConnection = estate_info.setCommitCallback(boost::bind(&LLPanelEstateInfo::refreshFromEstate, this)); + mEstateInfoUpdateConnection = estate_info.setUpdateCallback(boost::bind(&LLPanelEstateInfo::refreshFromEstate, this)); +} + +LLPanelEstateInfo::~LLPanelEstateInfo() +{ + mEstateInfoCommitConnection.disconnect(); + mEstateInfoUpdateConnection.disconnect(); } // static diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h index 65c1291728..201d8b0a68 100644 --- a/indra/newview/llfloaterregioninfo.h +++ b/indra/newview/llfloaterregioninfo.h @@ -320,7 +320,7 @@ public: bool onMessageCommit(const LLSD& notification, const LLSD& response); LLPanelEstateInfo(); - ~LLPanelEstateInfo() {} + ~LLPanelEstateInfo(); void updateControls(LLViewerRegion* region); @@ -352,6 +352,8 @@ protected: bool checkSunHourSlider(LLUICtrl* child_ctrl); U32 mEstateID; + boost::signals2::connection mEstateInfoCommitConnection; + boost::signals2::connection mEstateInfoUpdateConnection; }; ///////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llpanelenvironment.cpp b/indra/newview/llpanelenvironment.cpp index d3df88b65e..831ad7827a 100644 --- a/indra/newview/llpanelenvironment.cpp +++ b/indra/newview/llpanelenvironment.cpp @@ -359,12 +359,14 @@ void LLPanelEnvironmentInfo::refresh() void LLPanelEnvironmentInfo::refreshFromEstate() { - LLViewerRegion *pRegion = gAgent.getRegion(); - - bool oldAO = mAllowOverride; - mAllowOverride = (isRegion() && LLEstateInfoModel::instance().getAllowEnvironmentOverride()) || pRegion->getAllowEnvironmentOverride(); - if (oldAO != mAllowOverride) - refresh(); + LLViewerRegion* pRegion = gAgent.getRegion(); + if (pRegion) + { + bool oldAO = mAllowOverride; + mAllowOverride = (isRegion() && LLEstateInfoModel::instance().getAllowEnvironmentOverride()) || pRegion->getAllowEnvironmentOverride(); + if (oldAO != mAllowOverride) + refresh(); + } } std::string LLPanelEnvironmentInfo::getNameForTrackIndex(U32 index) -- cgit v1.2.3 From 5a629574b775e2a8f3602ee183fd9e1b2fcfac68 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Thu, 12 Dec 2024 19:21:07 +0200 Subject: #3272 [MAC] Fix wrong RenderReflectionsEnabled on Low --- indra/newview/featuretable_mac.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt index b05e66fed6..aa3d241ecb 100644 --- a/indra/newview/featuretable_mac.txt +++ b/indra/newview/featuretable_mac.txt @@ -111,7 +111,7 @@ RenderShadowDetail 1 0 WLSkyDetail 1 96 RenderFSAAType 1 0 RenderFSAASamples 1 0 -RenderReflectionsEnabled 1 1 +RenderReflectionsEnabled 1 0 RenderReflectionProbeDetail 1 0 RenderScreenSpaceReflections 1 0 RenderReflectionProbeLevel 1 0 -- cgit v1.2.3 From eff46262c8324ed4931cdd544a757f0c13f9ec0a Mon Sep 17 00:00:00 2001 From: Dave Parks Date: Thu, 12 Dec 2024 13:46:01 -0800 Subject: #2590 Radeon mac optimization pass (#3277) - Skip updating of reflection probes that are not the default probe when probe coverage is set to "None" - enable RenderAppleUseMultGL and disable occlusion culling on Macs with AMD GPUs - Reduce the number of texture decode threads on Macs with intel cpus. - Move texture deletion to LLImageGL::updateClass and prevent textures from staying resident in vram longer than 3 frames - Disable SSAO by default on Macs with intel CPUs --- indra/llcommon/llcommon.cpp | 8 ++--- indra/llcommon/llmemory.h | 2 +- indra/llrender/llimagegl.cpp | 32 ++++++++++---------- indra/llwindow/llwindowmacosx.cpp | 52 ++++++++++++++++++++++---------- indra/llwindow/llwindowmacosx.h | 3 ++ indra/newview/featuretable_mac.txt | 24 ++++++++++----- indra/newview/llappviewer.cpp | 7 ++++- indra/newview/llreflectionmapmanager.cpp | 8 +++++ indra/newview/llviewercontrol.cpp | 18 +++++++++++ indra/newview/llviewerwindow.cpp | 13 ++------ 10 files changed, 112 insertions(+), 55 deletions(-) (limited to 'indra') diff --git a/indra/llcommon/llcommon.cpp b/indra/llcommon/llcommon.cpp index f1f3958fe0..84b35749cc 100644 --- a/indra/llcommon/llcommon.cpp +++ b/indra/llcommon/llcommon.cpp @@ -54,7 +54,7 @@ void* ll_tracy_new(size_t size) { throw std::bad_alloc(); } - TracyAlloc(ptr, size); + LL_PROFILE_ALLOC(ptr, size); return ptr; } @@ -70,7 +70,7 @@ void* operator new[](std::size_t count) void ll_tracy_delete(void* ptr) { - TracyFree(ptr); + LL_PROFILE_FREE(ptr); if (gProfilerEnabled) { //LL_PROFILE_ZONE_SCOPED_CATEGORY_MEMORY; @@ -102,13 +102,13 @@ void operator delete[](void* ptr) noexcept void *tracy_aligned_malloc(size_t size, size_t alignment) { auto ptr = ll_aligned_malloc_fallback(size, alignment); - if (ptr) TracyAlloc(ptr, size); + if (ptr) LL_PROFILE_ALLOC(ptr, size); return ptr; } void tracy_aligned_free(void *memblock) { - TracyFree(memblock); + LL_PROFILE_FREE(memblock); ll_aligned_free_fallback(memblock); } diff --git a/indra/llcommon/llmemory.h b/indra/llcommon/llmemory.h index 80cfe554c4..b616edfde7 100644 --- a/indra/llcommon/llmemory.h +++ b/indra/llcommon/llmemory.h @@ -222,7 +222,7 @@ inline void* ll_aligned_realloc_16(void* ptr, size_t size, size_t old_size) // r ll_aligned_free_16(ptr); } #endif - LL_PROFILE_ALLOC(ptr, size); + LL_PROFILE_ALLOC(ret, size); return ret; } diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp index 84c61c790f..5ac3243fd4 100644 --- a/indra/llrender/llimagegl.cpp +++ b/indra/llrender/llimagegl.cpp @@ -1052,7 +1052,7 @@ U32 type_width_from_pixtype(U32 pixtype) bool should_stagger_image_set(bool compressed) { #if LL_DARWIN - return false; + return !compressed && on_main_thread() && gGLManager.mIsAMD; #else // glTexSubImage2D doesn't work with compressed textures on select tested Nvidia GPUs on Windows 10 -Cosmic,2023-03-08 // Setting media textures off-thread seems faster when not using sub_image_lines (Nvidia/Windows 10) -Cosmic,2023-03-31 @@ -1270,37 +1270,37 @@ void LLImageGL::generateTextures(S32 numTextures, U32 *textures) } } +constexpr int DELETE_DELAY = 3; // number of frames to wait before deleting textures +static std::vector sFreeList[DELETE_DELAY+1]; + // static void LLImageGL::updateClass() { sFrameCount++; + + // wait a few frames before actually deleting the textures to avoid + // synchronization issues with the GPU + U32 idx = (sFrameCount+DELETE_DELAY) % (DELETE_DELAY+1); + + if (!sFreeList[idx].empty()) + { + free_tex_images((GLsizei) sFreeList[idx].size(), sFreeList[idx].data()); + glDeleteTextures((GLsizei)sFreeList[idx].size(), sFreeList[idx].data()); + sFreeList[idx].resize(0); + } } // static void LLImageGL::deleteTextures(S32 numTextures, const U32 *textures) { - // wait a few frames before actually deleting the textures to avoid - // synchronization issues with the GPU - static std::vector sFreeList[4]; - if (gGLManager.mInited) { LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE; - U32 idx = sFrameCount % 4; - + U32 idx = sFrameCount % (DELETE_DELAY+1); for (S32 i = 0; i < numTextures; ++i) { sFreeList[idx].push_back(textures[i]); } - - idx = (sFrameCount + 3) % 4; - - if (!sFreeList[idx].empty()) - { - free_tex_images((GLsizei) sFreeList[idx].size(), sFreeList[idx].data()); - glDeleteTextures((GLsizei)sFreeList[idx].size(), sFreeList[idx].data()); - sFreeList[idx].resize(0); - } } } diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp index 80001b14ee..f26d692363 100644 --- a/indra/llwindow/llwindowmacosx.cpp +++ b/indra/llwindow/llwindowmacosx.cpp @@ -68,6 +68,41 @@ namespace bool LLWindowMacOSX::sUseMultGL = false; +//static +void LLWindowMacOSX::setUseMultGL(bool use_mult_gl) +{ + bool was_enabled = sUseMultGL; + + sUseMultGL = use_mult_gl; + + if (gGLManager.mInited) + { + CGLContextObj ctx = CGLGetCurrentContext(); + //enable multi-threaded OpenGL (whether or not sUseMultGL actually changed) + if (sUseMultGL) + { + CGLError cgl_err; + + cgl_err = CGLEnable( ctx, kCGLCEMPEngine); + + if (cgl_err != kCGLNoError ) + { + LL_INFOS("GLInit") << "Multi-threaded OpenGL not available." << LL_ENDL; + sUseMultGL = false; + } + else + { + LL_INFOS("GLInit") << "Multi-threaded OpenGL enabled." << LL_ENDL; + } + } + else if (was_enabled) + { + CGLDisable( ctx, kCGLCEMPEngine); + LL_INFOS("GLInit") << "Multi-threaded OpenGL disabled." << LL_ENDL; + } + } +} + // Cross-platform bits: bool check_for_card(const char* RENDERER, const char* bad_card) @@ -704,23 +739,8 @@ bool LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits // Disable vertical sync for swap toggleVSync(enable_vsync); - //enable multi-threaded OpenGL - if (sUseMultGL) - { - CGLError cgl_err; - CGLContextObj ctx = CGLGetCurrentContext(); - - cgl_err = CGLEnable( ctx, kCGLCEMPEngine); + setUseMultGL(sUseMultGL); - if (cgl_err != kCGLNoError ) - { - LL_INFOS("GLInit") << "Multi-threaded OpenGL not available." << LL_ENDL; - } - else - { - LL_INFOS("GLInit") << "Multi-threaded OpenGL enabled." << LL_ENDL; - } - } makeFirstResponder(mWindow, mGLView); return true; diff --git a/indra/llwindow/llwindowmacosx.h b/indra/llwindow/llwindowmacosx.h index f5b6441746..7de1a40d93 100644 --- a/indra/llwindow/llwindowmacosx.h +++ b/indra/llwindow/llwindowmacosx.h @@ -147,6 +147,9 @@ public: void toggleVSync(bool enable_vsync) override; + // enable or disable multithreaded GL + static void setUseMultGL(bool use_mult_gl); + protected: LLWindowMacOSX(LLWindowCallbacks* callbacks, const std::string& title, const std::string& name, int x, int y, int width, int height, U32 flags, diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt index aa3d241ecb..a0af98a451 100644 --- a/indra/newview/featuretable_mac.txt +++ b/indra/newview/featuretable_mac.txt @@ -1,4 +1,4 @@ -version 68 +version 71 // The version number above should be incremented IF AND ONLY IF some // change has been made that is sufficiently important to justify // resetting the graphics preferences of all users to the recommended @@ -67,9 +67,9 @@ RenderFSAAType 1 2 RenderFSAASamples 1 3 RenderMaxTextureIndex 1 16 RenderGLContextCoreProfile 1 1 -RenderGLMultiThreadedTextures 1 0 -RenderGLMultiThreadedMedia 1 0 -RenderAppleUseMultGL 1 0 +RenderGLMultiThreadedTextures 1 1 +RenderGLMultiThreadedMedia 1 1 +RenderAppleUseMultGL 1 1 RenderReflectionsEnabled 1 1 RenderReflectionProbeDetail 1 2 RenderScreenSpaceReflections 1 1 @@ -405,20 +405,30 @@ list TexUnit16orLess RenderTerrainPBRDetail 1 -1 list AMD -RenderDeferredSSAO 1 0 +UseOcclusion 1 0 +RenderGLMultiThreadedTextures 1 0 + +list NVIDIA +RenderGLMultiThreadedTextures 1 0 +RenderGLMultiThreadedMedia 1 0 +RenderAppleUseMultGL 1 0 list Intel RenderAnisotropic 1 0 RenderFSAASamples 1 0 +RenderGLMultiThreadedTextures 1 0 +RenderGLMultiThreadedMedia 1 0 +RenderAppleUseMultGL 1 0 // AppleGPU and NonAppleGPU can be thought of as Apple silicon vs Intel Mac list AppleGPU RenderGLMultiThreadedMedia 1 0 RenderAppleUseMultGL 1 0 +RenderGLMultiThreadedTextures 1 0 +RenderGLMultiThreadedMedia 1 0 list NonAppleGPU -RenderGLMultiThreadedMedia 1 0 -RenderAppleUseMultGL 1 0 +RenderDeferredSSAO 1 0 list GL3 RenderFSAASamples 0 0 diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index f79eb5ddce..c770b7c917 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -2171,7 +2171,12 @@ bool LLAppViewer::initThreads() // get the number of concurrent threads that can run S32 cores = std::thread::hardware_concurrency(); - +#if LL_DARWIN + if (!gGLManager.mIsApple) + { + cores /= 2; + } +#endif U32 max_cores = gSavedSettings.getU32("EmulateCoreCount"); if (max_cores != 0) { diff --git a/indra/newview/llreflectionmapmanager.cpp b/indra/newview/llreflectionmapmanager.cpp index 232b0b1cdf..8f75b108cc 100644 --- a/indra/newview/llreflectionmapmanager.cpp +++ b/indra/newview/llreflectionmapmanager.cpp @@ -404,6 +404,13 @@ void LLReflectionMapManager::update() { closestDynamic = probe; } + + if (sLevel == 0) + { + // only update default probe when coverage is set to none + llassert(probe == mDefaultProbe); + break; + } } if (realtime && closestDynamic != nullptr) @@ -713,6 +720,7 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face) } else { + llassert(gSavedSettings.getS32("RenderReflectionProbeLevel") > 0); // should never update a probe that's not the default probe if reflection coverage is none probe->update(mRenderTarget.getWidth(), face); } diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 172ffcb0d4..18746e76fc 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -77,6 +77,10 @@ #include "llstartup.h" #include "llperfstats.h" +#if LL_DARWIN +#include "llwindowmacosx.h" +#endif + // Third party library includes #include @@ -453,6 +457,17 @@ static bool handleReflectionProbeDetailChanged(const LLSD& newvalue) return true; } +#if LL_DARWIN +static bool handleAppleUseMultGLChanged(const LLSD& newvalue) +{ + if (gGLManager.mInited) + { + LLWindowMacOSX::setUseMultGL(newvalue.asBoolean()); + } + return true; +} +#endif + static bool handleHeroProbeResolutionChanged(const LLSD &newvalue) { if (gPipeline.isInit()) @@ -820,6 +835,9 @@ void settings_setup_listeners() setting_setup_signal_listener(gSavedSettings, "RenderReflectionProbeLevel", handleReflectionProbeDetailChanged); setting_setup_signal_listener(gSavedSettings, "RenderReflectionProbeDetail", handleReflectionProbeDetailChanged); setting_setup_signal_listener(gSavedSettings, "RenderReflectionsEnabled", handleReflectionProbeDetailChanged); +#if LL_DARWIN + setting_setup_signal_listener(gSavedSettings, "RenderAppleUseMultGL", handleAppleUseMultGLChanged); +#endif setting_setup_signal_listener(gSavedSettings, "RenderScreenSpaceReflections", handleReflectionProbeDetailChanged); setting_setup_signal_listener(gSavedSettings, "RenderMirrors", handleReflectionProbeDetailChanged); setting_setup_signal_listener(gSavedSettings, "RenderHeroProbeResolution", handleHeroProbeResolutionChanged); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 4bd1cdd6a1..8a5aac9b8b 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -5391,6 +5391,8 @@ bool LLViewerWindow::cubeSnapshot(const LLVector3& origin, LLCubeMapArray* cubea camera->setUserClipPlane(clipPlane); } + gPipeline.pushRenderTypeMask(); + glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); // stencil buffer is deprecated | GL_STENCIL_BUFFER_BIT); U32 dynamic_render_types[] = { @@ -5479,16 +5481,7 @@ bool LLViewerWindow::cubeSnapshot(const LLVector3& origin, LLCubeMapArray* cubea } } - if (!dynamic_render) - { - for (int i = 0; i < dynamic_render_type_count; ++i) - { - if (prev_dynamic_render_type[i]) - { - gPipeline.toggleRenderType(dynamic_render_types[i]); - } - } - } + gPipeline.popRenderTypeMask(); if (hide_hud) { -- cgit v1.2.3 From 5d64e644585798e90362ab0dad0969e25aca5010 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Fri, 13 Dec 2024 19:15:53 +0200 Subject: #3285 Crash at remapIndexBuffer --- indra/llmath/llvolume.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index 700e61467b..44b6e7923b 100644 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -5159,7 +5159,10 @@ bool LLVolumeFace::VertexMapData::ComparePosition::operator()(const LLVector3& a void LLVolumeFace::remap() { // Generate a remap buffer - std::vector remap(mNumVertices); + // Documentation for meshopt_generateVertexRemapMulti claims that remap should use vertice count + // but all examples use indice count. There are out of bounds crashes when using vertice count. + // To be on the safe side use bigger of the two. + std::vector remap(llmax(mNumIndices, mNumVertices)); S32 remap_vertices_count = static_cast(LLMeshOptimizer::generateRemapMultiU16(&remap[0], mIndices, mNumIndices, -- cgit v1.2.3 From 5b77436cf0ad749d36e8f0c60077eeb24698d644 Mon Sep 17 00:00:00 2001 From: Brad Linden <46733234+brad-linden@users.noreply.github.com> Date: Fri, 13 Dec 2024 16:13:30 -0800 Subject: #3288 null overrides crashes (#3289) * Fixes for secondlife/viewer#3288 override copy related crashes when overrides can be nullptr --- indra/newview/llselectmgr.cpp | 10 +++++++--- indra/newview/lltooldraganddrop.cpp | 5 +++-- 2 files changed, 10 insertions(+), 5 deletions(-) (limited to 'indra') diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 7f1f90592f..fceb25b3d3 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -2251,11 +2251,15 @@ void LLSelectMgr::selectionRevertGLTFMaterials() // Update material locally objectp->setRenderMaterialID(te, asset_id, false /*wait for LLGLTFMaterialList update*/); - LLGLTFMaterial* material = new LLGLTFMaterial(*nodep->mSavedGLTFOverrideMaterials[te]); - objectp->setTEGLTFMaterialOverride(te, material); + LLGLTFMaterial* material = nodep->mSavedGLTFOverrideMaterials[te]; + if (material) + { + material = new LLGLTFMaterial(*material); + objectp->setTEGLTFMaterialOverride(te, material); + } // Enqueue update to server - if (asset_id.notNull()) + if (asset_id.notNull() && material) { // Restore overrides and base material LLGLTFMaterialList::queueApply(objectp, te, asset_id, material); diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index 6be7ec2262..4efa289141 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -1447,9 +1447,10 @@ void LLToolDragAndDrop::dropTexture(LLViewerObject* hit_obj, } LLTextureEntry* te = hit_obj->getTE(hit_face); - if (te && !remove_pbr) + LLGLTFMaterial * override_mat = nullptr; + if (te && !remove_pbr && (override_mat = te->getGLTFMaterialOverride())) { - LLGLTFMaterial* copy = new LLGLTFMaterial(*te->getGLTFMaterialOverride()); + LLGLTFMaterial* copy = new LLGLTFMaterial(*override_mat); nodep->mSavedGLTFOverrideMaterials[hit_face] = copy; } else -- cgit v1.2.3