Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
267 commits
Select commit Hold shift + click to select a range
638c7f7
#5629 Velopack allows uninstall while the viewer is running (#5662)
akleshchev Apr 21, 2026
0cef181
#1355 Permit smaller values in cloud scroll rate
akleshchev Apr 21, 2026
2ea8591
p#475 Excess texture fetch shutdown logging
akleshchev Apr 22, 2026
7117240
#2965 Indicate when role members aren't loaded
akleshchev Dec 6, 2024
f9ac8f4
secondlife/viewer#5702: Ensure non-visible preloaded media has PRIORI…
cosmic-linden Apr 23, 2026
67807bc
#5676 Expand PBR planar aligment to cover all channels
akleshchev Apr 22, 2026
fca6e9f
Revert "Get rid of a duplicate notification"
Hecklezz Apr 24, 2026
72f73ff
#1681 Respect custom logfile during startup
mayconbekkers Apr 27, 2026
9b86487
#5690 fix viewer trying to fetch group chat history for p2p IM
maxim-productengine Apr 27, 2026
b0e867c
Merge pull request #5705 from secondlife/v-5672
cosmic-linden Apr 27, 2026
e0a5e8f
#5724 Crash initing a buy_currency floater
akleshchev Apr 27, 2026
a66e6c9
p#479 make sure running app is the one handling urls
akleshchev Apr 23, 2026
ae9f6a5
p#5719 Detect hybernation
akleshchev Apr 26, 2026
116e802
#5728 Update license files
akleshchev Apr 29, 2026
998c2bc
#5084 Improve watchdog's behavior
akleshchev Mar 6, 2026
e129eac
#5719 Partial detection of shutdown from task manager
akleshchev Apr 28, 2026
6fb576a
#5084 Improve watchdog's behavior #2
akleshchev Apr 29, 2026
30b897d
Bump actions/download-artifact from 4 to 8
dependabot[bot] May 2, 2026
fa7b229
Bump BugSplat-Git/symbol-upload from 10.3.0 to 10.3.2
dependabot[bot] May 2, 2026
d700478
#5682 add LEAP API to get info about web_browser widget
maxim-productengine May 4, 2026
c828dc3
#5084 Fix watchdog's cleanup
akleshchev May 4, 2026
5b5c4e5
#5756 Improve LLUICtrlFactory's performance
akleshchev May 4, 2026
281eb9b
#5756 Performance optimizations around UI
rohvani Oct 6, 2025
709dbea
Bump actions/github-script from 8 to 9
dependabot[bot] May 2, 2026
29335d2
#5232 Crash in handleMessage #2
akleshchev May 5, 2026
9f60b2b
#5742 Add LEAP API to get info about scene-level attached objects
maxim-productengine May 7, 2026
0730640
#5677 Left side of Profile's Pick's location string can be cut
akleshchev May 6, 2026
1d03b21
#4802 Handle KDU crashes
akleshchev May 5, 2026
d2a3a15
#5772 'Control not found' crash
akleshchev May 7, 2026
dfeed0c
#5777 Exception handling for an LLSD formatter
akleshchev May 8, 2026
da71b0b
fix picks from moved regions #5519
trish-sl Apr 28, 2026
6b945de
#5784 fix crash at LLViewerRegion::killInvisibleObjects
maxim-productengine May 11, 2026
a4e8f71
FIX - Prejump regressions
trish-sl Apr 28, 2026
127fe9b
fix: replace non-ASCII source comments
santoslgl01-web Apr 29, 2026
cdb9064
#5744 Prefill 'report' floater for objects' IMs
akleshchev May 8, 2026
064ee01
#5775 Update copyright date in cmake
akleshchev May 12, 2026
5ffe81b
#5801 add Mute sound menu option
maxim-productengine May 13, 2026
9cd5eb8
#5806 add option to reset environment after teleport
maxim-productengine May 13, 2026
0422a38
#5810 Improve early exit's cleanup
akleshchev May 13, 2026
b85695a
#5799 update message for no search results
maxim-productengine May 14, 2026
35b7766
#5804 Prevent group chat focus steal when opening adhoc IM
marchcat May 13, 2026
9e7d3b1
#5802 Open teleport history with a keystroke
maxim-productengine May 15, 2026
e3fa81c
Fix display of ad-hoc session type in About and display p2p instead a…
cosmic-linden May 14, 2026
ba619ac
#5810 Differentiate startup crashes from runtime crashes
akleshchev May 14, 2026
f3247dc
#5820 Add 'Set UI Size to Default' to help menu on login screen
akleshchev May 15, 2026
4cf0f55
#3430 Fix incorectly stated permissions for scripts.
akleshchev May 15, 2026
d3e12a5
#5804 Prevent focus steal when removing unselected conversation widget
marchcat May 15, 2026
a042022
#5785 fix login and world UI overlap
maxim-productengine May 18, 2026
5f046e1
Merge pull request #5824 from secondlife/cosmic/janus_set_version
cosmic-linden May 18, 2026
447f307
Fix GLTF bind matrix remapping
gaiaclary May 9, 2026
b2878ac
#5786 Fix a case of unitialized override matrix
akleshchev May 18, 2026
d4d9458
Update OpenJPEG to 2.5.4
TommyTheTerrible May 17, 2026
df84417
#5818 Fix setCursor crash
akleshchev May 18, 2026
40cd161
Merge branch 'develop' into geenz/26.3-to-develop
Geenz May 20, 2026
7a40e27
Update llappviewer.cpp
Geenz May 20, 2026
acde43c
Merge pull request #5844 from secondlife/geenz/26.3-to-develop
Geenz May 20, 2026
a1d8077
#4823 WebRTC crashes
akleshchev May 19, 2026
9a8aacf
#5794 add Voice tab and update Sound & Media tab in Preferences
maxim-productengine May 21, 2026
e88380e
#5858 Crash at LLFontFreetype::renderGlyph
akleshchev May 21, 2026
1357773
#5859 Fix a missed null category check
akleshchev May 21, 2026
71fa58c
#5809 Fix wording
akleshchev May 20, 2026
44b8fa4
#5845 Crash in LLFloaterInspect on shutdown
akleshchev May 20, 2026
ec6fd95
#5846 Fix crash on pushBatch
akleshchev May 20, 2026
e636516
#3430 Strip the 'inside an object' from message as it is not object s…
akleshchev May 22, 2026
f99e223
Log failed delivery of crucial vewer-->simulator connection UDP messa…
AndrewMeadows May 27, 2026
a1b68fb
Drop fewer packets on UDP packet flood (#5565)
AndrewMeadows May 27, 2026
0be2780
#5855 Added a way to check triangles for all lods
akleshchev May 28, 2026
e0b3b7f
#3729 Reduce inventory memory overhead
akleshchev May 25, 2026
ec82c45
#3729 Don't store tooltips for inventory
akleshchev May 26, 2026
0a7b6a8
#3729 Avoid storing inventory item names in UI outside of debug
akleshchev May 26, 2026
34540cc
#3729 Don't initialize inbox views if inbox isn't visible
akleshchev May 28, 2026
edf982b
#5719 Detect hybernation #2
akleshchev May 29, 2026
c30ad11
#5798 fix displaying outfit Search results and update default filtering
maxim-productengine Jun 1, 2026
e8e4c5f
#5877 Fix truncated Favorites bar text
akleshchev Jun 2, 2026
3e4502c
#3342 Fix "Cut" and "Copy" options for objects in notecards
akleshchev Jun 2, 2026
0797d76
Make platform specific files visible in the IDE
akleshchev May 29, 2026
1832026
#5856 An option to prevent hibernation
akleshchev May 29, 2026
5543a2a
#5856 Localize OS hibernation preference strings across locales
Copilot Jun 2, 2026
fe42595
Some minor tweaks to the color picker after interest was expressed in…
callumlinden Jun 3, 2026
6a61d7e
p575 Unify description field
akleshchev Jun 5, 2026
2e2d978
p575 Fix wrong text field type in locales
akleshchev Jun 6, 2026
a42082f
#5900 Fix material editor lockup when saving from object to inventory
akleshchev Jun 8, 2026
31ba51b
#5905 Fix Win32 white flash on startup
primgineer Jun 10, 2026
88314fd
#5915 A missed null check in give_inventory_cb
akleshchev Jun 10, 2026
02bb6c4
#5917 Fix crash on deleted LLVoiceClient
akleshchev Jun 10, 2026
2052be7
#5874 Fix transparent highlights omitting HUDs
trish-sl Jun 11, 2026
690374c
#5924 Crash on is_water_exclusion_face
akleshchev Jun 12, 2026
dace314
#5856 Improve stats reliability on non-standard shutdown
akleshchev Jun 15, 2026
34c308e
macOS 27 build fixes + transition to UTType for file pickers (#5937)
Geenz Jun 17, 2026
f8c6343
#5934 Fix animeshes being ranked incorrectly
akleshchev Jun 17, 2026
fc2e961
p#587 Taskbar icon does not expand into app when opened
akleshchev Jun 16, 2026
2c591b1
#5928 Gesture auto-complete, similar to emojis/mentions
gwigz Jun 18, 2026
bcabe07
#5837 Fix mature group search showing zero results
akleshchev Jun 19, 2026
9f05efc
#4298 Handle OOM in loadCachedProgramBinary
akleshchev Jun 19, 2026
6d9293f
#5084 Include watchdog's state in crash report
akleshchev Jun 19, 2026
22b694d
#5837 Fix mature group search showing zero results #2
akleshchev Jun 22, 2026
134bdc8
#5945 cacheOptimize crash handling
akleshchev Jun 22, 2026
7d8e9d9
#5946 Fix excessive 'allowed to terraform' warning
akleshchev Jun 23, 2026
b760017
Add localized Debug Settings
vedned Jun 25, 2026
9aaf3e7
@5929 Add drag-n-drop reordering for clothing layers (#5918)
gwigz Jun 25, 2026
621a2d8
Merge branch 'develop' into Add-localized-Debug-Settings
vedned Jun 25, 2026
14262bf
p#388 Improve protections and loggiong around shader cache saving
akleshchev Jun 25, 2026
d864cde
Address post-merge feedback for gesture autocomplete
gwigz Jun 26, 2026
dc58a87
Address post-merge feedback for clothing layer reorder
gwigz Jun 26, 2026
45fc31b
fix: skip empty comment strings in apply_localized_comments
vedned Jul 1, 2026
4e02831
#5962 Optimize writeWearablesToAvatar
akleshchev Jun 26, 2026
2eb30ff
Bump actions/checkout from 6 to 7
dependabot[bot] Jul 1, 2026
3ff0c93
Bump BugSplat-Git/symbol-upload from 10.3.2 to 10.5.0
dependabot[bot] Jul 1, 2026
2fb55bb
Bump actions/cache from 5 to 6
dependabot[bot] Jul 1, 2026
0381e7f
#5968 Fix outfit tabs not showing up without a filter reset
akleshchev Jul 3, 2026
5be0750
Merge pull request #5895 from secondlife/callum/color-picker-tweaks
callumlinden Jul 6, 2026
854ac88
Merge pull request #5956 from vedned/Add-localized-Debug-Settings
marchcat Jul 7, 2026
5d48214
#5892 Process high priority inventory updates immediately
akleshchev Jun 3, 2026
05ee4d2
#5881 Optimize inventory cache loading
akleshchev Jun 4, 2026
2957421
#5981 Fix viewer scale interpolation not finishing
akleshchev Jul 8, 2026
97b0c99
#5966 Fixed width font's numbers
akleshchev Jul 9, 2026
07c58ed
#5972 LLUIImage based buffer cache
akleshchev Jul 1, 2026
fa38b81
#5972 LLUIImage based buffer cache #2
akleshchev Jul 1, 2026
cd82e38
#5994 Additional llprocess unit test
akleshchev Jul 13, 2026
d9f6702
#5994 More llprocess tests (#5996)
akleshchev Jul 14, 2026
8b909b6
#5994 Replace apr with boost in LLProcess
akleshchev Jul 14, 2026
da222f7
p#662 Clarify attachment action desription in inventory settings
akleshchev Jul 14, 2026
b76dce8
#5995 Fix azure translation not accepting large keys
akleshchev Jul 16, 2026
8aa0161
#6002 Filter out inaudible media volume changes
akleshchev Jul 15, 2026
fcd7212
#5994 Fix llprocess waiting too long on kill
akleshchev Jul 17, 2026
331c3c7
Add timing tests for tick() and destructor after kill()
Copilot Jul 17, 2026
ce21ab1
#6014 Reduce shutdown delays on thread cleanup
akleshchev Jul 19, 2026
5986568
#6014 More tracy coverage
akleshchev Jul 20, 2026
f37f129
Fix undefined symbol link error in llcorehttp
nibbbl Jul 18, 2026
7060952
#6022 Detect OS default audio device changes
nibbbl Jul 21, 2026
0f0e7e8
#6014 Offload inventory cache packing onto a thread
akleshchev Jul 20, 2026
4474d4f
#6014 Make inventory caching flat instead of recursive
akleshchev Jul 20, 2026
baf6a33
#6014 Update splash screen
akleshchev Jul 21, 2026
413a42e
#6014 Simplify killAllObjects
akleshchev Jul 21, 2026
3cd27c6
#6014 Inventory cache tweaks
akleshchev Jul 21, 2026
9fce826
Harden llprocess EOF timing tests
Copilot Jul 21, 2026
2a75b42
#6014 Speedup cleanupInventory
akleshchev Jul 21, 2026
b35e537
#5972 Track UI texture changes
akleshchev Jul 21, 2026
b906284
Defer processing AvatarAppearance until after first ObjectUpdate (#6017)
AndrewMeadows Jul 22, 2026
7a82e26
#3988 Don't render malformed sculpts
akleshchev Jun 24, 2026
52e6938
#6040 Minor startup warnings fixes
akleshchev Jul 23, 2026
adc5f3c
#5796 Add CEF remote debugging port debug setting
maxim-productengine Jul 24, 2026
d1796fb
Fix rendering on Parallels VMs with graphics set to "low"
mcgroarty Jul 27, 2026
c132026
#6040 Fix dummy snapshot spinners
akleshchev Jul 24, 2026
f71fbab
#6040 Minor warnings fixes #2
akleshchev Jul 24, 2026
cf74ead
#6040 Fix phantom profile button
akleshchev Jul 24, 2026
e5fbe49
#6040 Make apr warnings easier to understand
akleshchev Jul 24, 2026
a0e4f18
Fix LLGroupMgr::removeObserver possibly failing to find and erase obs…
Hecklezz Jul 26, 2026
bc49cc8
#5994 Add process autokill test
akleshchev Jul 25, 2026
ad14755
#5994 Make sure process terminates with the parent
akleshchev Jul 24, 2026
1c81813
#6055 Move texture upload preparation off the main thread (#6031)
LisaScheers Jul 27, 2026
2193902
Merge pull request #1 from secondlife/develop
mcgroarty Jul 27, 2026
1d92b25
#6057 Fix script's 'save as' logic not sanitizing file names
akleshchev Jul 27, 2026
556964a
Revert "#6055 Move texture upload preparation off the main thread (#6…
akleshchev Jul 28, 2026
6a0eccd
#3703 Fix disabled HiDPI value in About floater
volksec Jul 28, 2026
5a2cced
#5907 Fix flyout button using old and incorrect textures
Ansariel Jul 29, 2026
7764024
#6062 Fix dupplicate rename AIS requests
akleshchev Jul 29, 2026
b8daedc
#5907 Fix textures for "Save" button in edit daycycle floater for fla…
Ansariel Jul 29, 2026
5e9fb00
Merge pull request #6053 from mcgroarty/develop
mcgroarty Aug 2, 2026
c84ac44
Bump actions/labeler from 6 to 7
dependabot[bot] Aug 1, 2026
8911bf4
#4569 Fix fullscreen focus with native file dialogs
volksec Aug 4, 2026
18dc4eb
#1861 Show five-digit precision for texture transforms
volksec Aug 4, 2026
b68613f
#5869 Add LEAP API to get a full tree from root (getInfo and getPaths…
maxim-productengine Aug 5, 2026
15aa46f
#6042 Explain local network access for voice chat
marchcat Aug 4, 2026
ac91515
#6055 Optimize LLImageGL::analyzeAlpha
akleshchev Jul 28, 2026
ae544f0
Bump BugSplat-Git/symbol-upload from 10.5.0 to 10.5.1
dependabot[bot] Aug 1, 2026
d4b4187
#6071 Validity checks for LLViewerJointMesh::drawShape
akleshchev Aug 4, 2026
0d11c7f
#6071 Software skinning was removed a while back
akleshchev Aug 4, 2026
0af5e55
#6071 Fix LLVisualParamHint's background image
akleshchev Aug 5, 2026
ebf9cd3
Move object publishing tracking to its own manager in the viewer.
Rider-Linden Aug 6, 2026
35e7b99
p#682 WebRTC can lock up after OS sleep
akleshchev Aug 3, 2026
0686467
Terminate open connections on the signaling thread during shutdown.
roxanneskelly Aug 5, 2026
de0a0dc
#6040 Fix object cache logging
akleshchev Aug 5, 2026
309fc5b
JSON-RPC command.execute instruction for arbitrary 1-off commands and…
Rider-Linden Aug 6, 2026
8c5ec43
p#682 Fix shutdown crash flushing peer connection stats
roxanneskelly Aug 6, 2026
932e8ac
Merge pull request #6101 from secondlife/roxie/fix-webrtc-terminate
Geenz Aug 7, 2026
68b08e4
#6071 Exra logging and guards for LLVisualParamHint
akleshchev Aug 6, 2026
8ec9cf9
#6040 Fix couple oversights
akleshchev Aug 8, 2026
2ba0e20
#6106 Guard emoji picker navigation bounds
marchcat Aug 10, 2026
f6af7f4
Bump actions/setup-python from 6 to 7
dependabot[bot] Aug 1, 2026
5e2d671
Refresh the object's data when it is published. (link children seem t…
Rider-Linden Aug 10, 2026
e776834
#6071 Fix WT_SKIRT not being rendered
akleshchev Aug 10, 2026
9b7ab49
#3814 Handle bad_allocs in unpackVolumeFaces
akleshchev Aug 10, 2026
8cabc33
Merge remote-tracking branch 'origin/develop-linux' into geenz/linux-…
Geenz Aug 12, 2026
99059c5
p#648 Fix recursive folder pasting
akleshchev Aug 11, 2026
93af7be
Issue #https://github.com/secondlife/sl-vscode-plugin/issues/93: This…
Rider-Linden Aug 12, 2026
6711197
#5815 Rename Lua runtime dropdown entries
marchcat Aug 12, 2026
c9bd8ab
#5574 Add Lua recompilation menu options
marchcat Aug 12, 2026
b6648c2
#6113 Crash at LLViewerMedia::updateMedia
akleshchev Aug 12, 2026
21bb60f
#6117 Guard against stale nearby chat toast handles
marchcat Aug 12, 2026
da1983f
#5574 Filter incompatible scripts by metadata
marchcat Aug 12, 2026
480af3e
Merge branch 'release/26.3' into geenz/linux-to-develop
Geenz Aug 12, 2026
4645368
Add a retry mechanism for transient dependency install failures.
Geenz Aug 12, 2026
d4efc4f
p#682 Fix shutdown crash and cut WebRTC teardown time
roxanneskelly Aug 12, 2026
66570c6
Merge branch 'release/26.3' of github.com:secondlife/viewer into roxi…
roxanneskelly Aug 12, 2026
32a8200
Issue https://github.com/secondlife/sl-vscode-plugin/issues/99: Allow…
Rider-Linden Aug 12, 2026
159a08c
Fix up LLProcess tests.
Geenz Aug 12, 2026
222f568
Issue 6131: Show toast when starting and stopping the script edit ser…
Rider-Linden Aug 12, 2026
e3a92a3
Merge branch 'develop' into geenz/linux-to-develop
Geenz Aug 12, 2026
f376c52
Merge branch 'geenz/linux-to-develop' into marchcat/lua-linux-develop
marchcat Aug 13, 2026
705d53b
#6125 Fix LLViewerParcelMgr::writeHighlightSegments crashing from wri…
Hecklezz Aug 13, 2026
6554021
#6119 Mutex deadlock on LLGridManager singleton
akleshchev Aug 12, 2026
dcff8c9
#6127 Ensure Agent command scope is global
akleshchev Aug 12, 2026
c873053
Merge pull request #6104 from secondlife/rider/explore_selection
Rider-Linden Aug 13, 2026
039c1b4
Merge pull request #6133 from secondlife/marchcat/lua-linux-develop
marchcat Aug 13, 2026
5b2090e
Pin xcode SDK to 26.3
marchcat Aug 13, 2026
e0f9f24
#5815 Update Lua runtime dropdown entries
marchcat Aug 14, 2026
b72dc95
p#692 Update system data with simd
akleshchev Aug 13, 2026
1d3edf3
p#692 Update stat reporting, add vram and ram usage
akleshchev Aug 13, 2026
a3c380a
#6135 Make sure texture worker cleanup is reliable
akleshchev Aug 13, 2026
305bebb
Merge pull request #6124 from secondlife/marchcat/5574
marchcat Aug 14, 2026
0007f7f
Merge branch 'develop' into geenz/linux-to-develop
Geenz Aug 14, 2026
05a5a15
Merge pull request #6132 from secondlife/geenz/linux-to-develop
Geenz Aug 14, 2026
79ca9ee
#6141 #6142 Prevent morph mask cache allocation leaks
marchcat Aug 17, 2026
d4e63ae
#5994 Fix path based launch for LLProcess
akleshchev Aug 17, 2026
7af436c
Issue https://github.com/secondlife/sl-vscode-plugin/issues/98: Refac…
Rider-Linden Aug 18, 2026
b33d405
#1841 Fix viewer attempting to parse joystick key string into an llsd
akleshchev Aug 17, 2026
ae3e2ee
Merge pull request #6129 from secondlife/roxie/fix-webrtc-terminate
roxanneskelly Aug 18, 2026
07d35b1
Fix error popup saying voice is incompatible with region voice
roxanneskelly Jul 24, 2026
293031f
Merge pull request #6046 from secondlife/roxie/fix-region-incompat-voice
roxanneskelly Aug 18, 2026
c1ccfae
#5749 Add LEAP API for Cut, Copy, Paste, and Select All
maxim-productengine Aug 19, 2026
1c1e8e0
#6148 Crash at LLViewerRegion::addNewObject
akleshchev Aug 18, 2026
63eb2da
move zerocode logic to util, add unit-tests (#6152)
AndrewMeadows Aug 19, 2026
522cc05
Bump actions/setup-dotnet from 4 to 6
dependabot[bot] Aug 1, 2026
ece8b73
Extract the correct compile error location from message.
Rider-Linden Aug 19, 2026
158b3ce
Update VIEWER_VERSION.txt
akleshchev Aug 19, 2026
f26e024
Merge pull request #6156 from secondlife/rider/runtime_msging
Rider-Linden Aug 19, 2026
ecd9285
#6157 Crash at LLParticlePartition::getGeometry
akleshchev Aug 19, 2026
37152df
#6162 Preserve script keyword defaults when region omits definitions
marchcat Aug 20, 2026
99dbc2d
#6163 Crash on LLImageGL::scaleDown(int)
akleshchev Aug 20, 2026
fcbd59e
Bump actions/stale from 10 to 11
dependabot[bot] Aug 1, 2026
d43bff5
#6123 Fix worker thread crash on termination
akleshchev Aug 20, 2026
0a1fc86
#6130 Fix combo box in inventory settings
akleshchev Aug 19, 2026
b26e451
#6155 Crash at delete_buffers
akleshchev Aug 19, 2026
1dce7c1
#6167 fix WebRTC logging level
maxim-productengine Aug 24, 2026
0da3853
#6172 Crash on recordResultCode
akleshchev Aug 21, 2026
a402fd4
#5871 Handle trailing line breaks when pasting text (#6069)
volksec Aug 24, 2026
30bd7c3
Merge pull request #6122 from secondlife/marchcat/5815
roxanneskelly Aug 24, 2026
b7fb9d8
Fix doc drift between viewer and plugin.
Rider-Linden Aug 24, 2026
9228953
Merge pull request #6178 from secondlife/rider/doc_update
Rider-Linden Aug 24, 2026
2e9c387
Merge branch 'develop' into project/lua_editor
Geenz Aug 25, 2026
60b7e3b
#6153 Make hardware test more robust
akleshchev Aug 25, 2026
82caf45
p#700 Extra scale logging
akleshchev Aug 24, 2026
f6f5cd0
Merge pull request #3537 from secondlife/project/lua_editor
Geenz Aug 25, 2026
4ef9f8f
#6109 StopRecording() crash
akleshchev Aug 25, 2026
6be70b2
Create secondlife_256.png
Geenz Aug 26, 2026
2284b44
Merge Linden release/26.4
RyeMutt Aug 27, 2026
1370f62
Fix defects found reviewing the 26.4 merge
RyeMutt Aug 27, 2026
a7dec30
Honour --logfile on every platform, and free a shortcut it had taken
RyeMutt Aug 27, 2026
0b3af14
Merge remote-tracking branch 'public/develop' into rye/linden264
RyeMutt Aug 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
870 changes: 691 additions & 179 deletions doc/external-editor-json-rpc.md

Large diffs are not rendered by default.

9 changes: 7 additions & 2 deletions indra/cmake/Boost.cmake
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
include_guard()
add_library(ll::boost INTERFACE IMPORTED)

find_package(Boost CONFIG REQUIRED COMPONENTS context dll fiber filesystem program_options url)
target_link_libraries(ll::boost INTERFACE Boost::disable_autolinking Boost::headers Boost::dll Boost::fiber Boost::context Boost::filesystem Boost::program_options Boost::url)
find_package(Boost CONFIG REQUIRED COMPONENTS context dll fiber filesystem process program_options url)
target_link_libraries(ll::boost INTERFACE Boost::disable_autolinking Boost::headers Boost::dll Boost::fiber Boost::context Boost::filesystem Boost::process Boost::program_options Boost::url)

if(WINDOWS)
find_package(Boost CONFIG REQUIRED COMPONENTS stacktrace_windbg)
Expand All @@ -11,3 +11,8 @@ else()
find_package(Boost CONFIG REQUIRED COMPONENTS stacktrace_basic)
target_link_libraries(ll::boost INTERFACE Boost::stacktrace_basic)
endif()

if(WINDOWS)
# Boost.Process v2 needs ntdll (NtSuspendProcess/NtResumeProcess)
target_link_libraries(ll::boost INTERFACE ntdll)
endif(WINDOWS)
2 changes: 2 additions & 0 deletions indra/cmake/Linking.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ else()
find_library(COREAUDIO_LIBRARY CoreAudio)
find_library(COREGRAPHICS_LIBRARY CoreGraphics)
find_library(AUDIOTOOLBOX_LIBRARY AudioToolbox)
find_library(UNIFORMTYPEIDENTIFIERS_LIBRARY UniformTypeIdentifiers)

target_link_libraries( ll::oslibraries INTERFACE
${COCOA_LIBRARY}
Expand All @@ -70,6 +71,7 @@ else()
${COREAUDIO_LIBRARY}
${AUDIOTOOLBOX_LIBRARY}
${COREGRAPHICS_LIBRARY}
${UNIFORMTYPEIDENTIFIERS_LIBRARY}
Threads::Threads
)
endif()
Expand Down
1 change: 1 addition & 0 deletions indra/llappearance/llpolymesh.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -862,6 +862,7 @@ LLPolyMesh *LLPolyMesh::getMesh(const std::string &name, LLPolyMesh* reference_m
//-----------------------------------------------------------------------------
void LLPolyMesh::freeAllMeshes()
{
LL_PROFILE_ZONE_SCOPED;
// delete each item in the global lists
for_each(sGlobalSharedMeshList.begin(), sGlobalSharedMeshList.end(), DeletePairedPointer());
sGlobalSharedMeshList.clear();
Expand Down
11 changes: 11 additions & 0 deletions indra/llappearance/lltexlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1427,6 +1427,15 @@ void LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC
// We should only be doing this when we believe something has changed with respect to the user's appearance.
{
LL_DEBUGS("Morph") << "gl alpha cache of morph mask not found, doing readback: " << getName() << LL_ENDL;

// Replace the cached mask without leaking its old allocation.
alpha_cache_t::iterator cached = mAlphaCache.find(cache_index);
if (cached != mAlphaCache.end())
{
ll_aligned_free_32(cached->second);
mAlphaCache.erase(cached);
}

// clear out a slot if we have filled our cache
S32 max_cache_entries = getTexLayerSet()->getAvatarAppearance()->isSelf() ? 4 : 1;
while ((S32)mAlphaCache.size() >= max_cache_entries)
Expand Down Expand Up @@ -1463,6 +1472,7 @@ void LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC
U8* temp = (U8*)ll_aligned_malloc_32(mem_size << 2); // allocate same size, but RGBA
if (!temp)
{
ll_aligned_free_32(alpha_data);
LLError::LLUserWarningMsg::showOutOfMemory();
LL_ERRS() << "Failed to allocate temporary memory for morph texture readback: " << (S32)(mem_size << 2) << LL_ENDL;
return;
Expand Down Expand Up @@ -1505,6 +1515,7 @@ void LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC
U8* temp_data = (U8*)ll_aligned_malloc_32(mem_size * TEMP_BYTES_PER_PIXEL);
if (!temp_data)
{
ll_aligned_free_32(alpha_data);
LLError::LLUserWarningMsg::showOutOfMemory();
LL_ERRS() << "Failed to allocate temporary memory for morph texture: " << (S32)(mem_size * TEMP_BYTES_PER_PIXEL) << LL_ENDL;
return;
Expand Down
19 changes: 12 additions & 7 deletions indra/llappearance/llwearable.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -727,17 +727,22 @@ void LLWearable::writeToAvatar(LLAvatarAppearance* avatarp)
if (!avatarp) return;

// Pull params
for( const LLVisualParam* param = avatarp->getFirstVisualParam(); param; param = avatarp->getNextVisualParam() )
// Iterate over wearable's params first since they should be fewer than avatar params.
// Wearables are cloned from avatar params by mType, so they should be always be a
// subset of the avatar's params and a situation where mType param doesn't exist in
// a wearable yet exist in the avatar should not happen.
for (const visual_param_index_map_t::value_type& vp_pair : mVisualParamIndexMap)
{
LLVisualParam* wearable_param = vp_pair.second;

// cross-wearable parameters are not authoritative, as they are driven by a different wearable. So don't copy the values to the
// avatar object if cross wearable. Cross wearable params get their values from the avatar, they shouldn't write the other way.
if( (((LLViewerVisualParam*)param)->getWearableType() == mType) && (!((LLViewerVisualParam*)param)->getCrossWearable()) )
{
S32 param_id = param->getID();
F32 weight = getVisualParamWeight(param_id);
if (((LLViewerVisualParam*)wearable_param)->getCrossWearable())
continue;

avatarp->setVisualParamWeight( param_id, weight);
}
F32 weight = wearable_param->getWeight();
// Silently fails if param was not found
avatarp->setVisualParamWeight(vp_pair.first, mType, weight);
}
}

Expand Down
138 changes: 138 additions & 0 deletions indra/llaudio/llaudioengine_openal.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -164,9 +164,122 @@ bool LLAudioEngine_OpenAL::init(void* userdata, const std::string &app_title)
mDisconnectPollTimer.reset();
}

initSystemDefaultFollowing();

return true;
}

// ALC_SOFT_system_events tells us when the OS default output device
// changes; ALC_SOFT_reopen_device lets us move onto it without tearing
// down the context. Both are needed, and both only matter while the user
// is running on the system default — a pinned device stays pinned.
void LLAudioEngine_OpenAL::initSystemDefaultFollowing()
{
mFollowSystemDefault = false;
mEventControlSOFT = nullptr;
mEventCallbackSOFT = nullptr;

if (alcIsExtensionPresent(mALCDevice, "ALC_SOFT_reopen_device") != ALC_TRUE ||
alcIsExtensionPresent(mALCDevice, "ALC_SOFT_system_events") != ALC_TRUE)
{
LL_INFOS() << "LLAudioEngine_OpenAL::init() ALC_SOFT_system_events / "
"ALC_SOFT_reopen_device unavailable; a restart is needed "
"to pick up OS default device changes." << LL_ENDL;
return;
}

mEventControlSOFT = reinterpret_cast<LPALCEVENTCONTROLSOFT>(
alcGetProcAddress(mALCDevice, "alcEventControlSOFT"));
mEventCallbackSOFT = reinterpret_cast<LPALCEVENTCALLBACKSOFT>(
alcGetProcAddress(mALCDevice, "alcEventCallbackSOFT"));
if (!mEventControlSOFT || !mEventCallbackSOFT)
{
mEventControlSOFT = nullptr;
mEventCallbackSOFT = nullptr;
LL_WARNS() << "LLAudioEngine_OpenAL::init() ALC_SOFT_system_events "
"advertised but its entry points did not resolve."
<< LL_ENDL;
return;
}

// Subscribe regardless of the current preference: the user can move
// back to "default" at runtime, and re-arming then would mean
// resolving entry points against a device we may no longer hold.
mDefaultDeviceChanged = false;
mEventCallbackSOFT(&LLAudioEngine_OpenAL::onDeviceEventSOFT, this);
ALCenum events[] = { ALC_EVENT_TYPE_DEFAULT_DEVICE_CHANGED_SOFT };
mEventControlSOFT(1, events, ALC_TRUE);

mFollowSystemDefault = mPreferredDevice.empty();
if (mFollowSystemDefault)
{
LL_INFOS() << "LLAudioEngine_OpenAL::init() following the OS default "
"output device." << LL_ENDL;
}
else
{
LL_INFOS() << "LLAudioEngine_OpenAL::init() output device pinned to '"
<< mPreferredDevice << "'; OS default changes ignored."
<< LL_ENDL;
}
}

// static
void ALC_APIENTRY LLAudioEngine_OpenAL::onDeviceEventSOFT(ALCenum event_type, ALCenum device_type,
ALCdevice* /*device*/, ALCsizei /*length*/,
const ALCchar* /*message*/, void* user_param) noexcept
{
// Runs on OpenAL's own event thread. Do nothing here but raise the
// flag — idle() does the reopen on the main thread, where the rest
// of the engine's AL state is owned.
if (event_type != ALC_EVENT_TYPE_DEFAULT_DEVICE_CHANGED_SOFT) return;

// The same event reports the default CAPTURE device changing. Reopening
// playback for that would interrupt audio because the user picked a
// different microphone.
if (device_type != ALC_PLAYBACK_DEVICE_SOFT) return;

if (auto* self = static_cast<LLAudioEngine_OpenAL*>(user_param))
{
self->mDefaultDeviceChanged = true;
}
}

void LLAudioEngine_OpenAL::reopenOnDefaultDevice()
{
if (!mFollowSystemDefault || !mALCDevice) return;

using ReopenFn = ALCboolean (ALC_APIENTRY *)(ALCdevice*, const ALCchar*,
const ALCint*);
auto reopen = reinterpret_cast<ReopenFn>(
alcGetProcAddress(mALCDevice, "alcReopenDeviceSOFT"));
if (!reopen) return;

LL_INFOS() << "LLAudioEngine_OpenAL: OS default output device changed; "
"reopening (was '" << mActiveDevice << "')" << LL_ENDL;

// Clear any pending device error so the failure branch reports ours.
(void)alcGetError(mALCDevice);

if (reopen(mALCDevice, nullptr, nullptr) != ALC_TRUE)
{
LL_WARNS() << "LLAudioEngine_OpenAL::reopenOnDefaultDevice() "
"alcReopenDeviceSOFT failed: 0x" << std::hex
<< alcGetError(mALCDevice) << std::dec << LL_ENDL;
return;
}

if (const char* opened = alcGetString(mALCDevice, ALC_ALL_DEVICES_SPECIFIER))
{
mActiveDevice = opened;
}
LL_INFOS() << "LLAudioEngine_OpenAL::reopenOnDefaultDevice() now on '"
<< mActiveDevice << "'" << LL_ENDL;

// The Sound prefs combo shows the active device, so let it refresh.
mDevicesChangedSignal();
}

// virtual
std::string LLAudioEngine_OpenAL::getDriverName(bool verbose)
{
Expand Down Expand Up @@ -218,6 +331,18 @@ void LLAudioEngine_OpenAL::shutdown()
// ordering.
shutdownEfx();

// Unhook the OS default-device callback before the device is closed,
// so OpenAL's event thread can't call back into a half-torn engine.
if (mEventControlSOFT && mEventCallbackSOFT)
{
ALCenum events[] = { ALC_EVENT_TYPE_DEFAULT_DEVICE_CHANGED_SOFT };
mEventControlSOFT(1, events, ALC_FALSE);
mEventCallbackSOFT(nullptr, nullptr);
}
mFollowSystemDefault = false;
mEventControlSOFT = nullptr;
mEventCallbackSOFT = nullptr;

LL_INFOS() << "About to LLAudioEngine::shutdown()" << LL_ENDL;
LLAudioEngine::shutdown();

Expand Down Expand Up @@ -300,6 +425,12 @@ void LLAudioEngine_OpenAL::setOutputDevice(const std::string& id)
return; // already running on this device
}
mPreferredDevice = id;
// Following the OS default is only correct while the user is ON the
// default; picking a device pins it, picking "default" resumes. Set it
// here so the early exits below cannot leave it disagreeing with
// mPreferredDevice.
mFollowSystemDefault = mPreferredDevice.empty() && mEventControlSOFT != nullptr;
mDefaultDeviceChanged = false;

if (!mALCDevice)
{
Expand Down Expand Up @@ -361,6 +492,13 @@ void LLAudioEngine_OpenAL::idle()
// independent of any of it and just rides on top once a second.
LLAudioEngine::idle();

// Raised on OpenAL's event thread by onDeviceEventSOFT.
if (mDefaultDeviceChanged)
{
mDefaultDeviceChanged = false;
reopenOnDefaultDevice();
}

if (!mDisconnectExtAvailable || !mALCDevice) return;

// Polling ALC_CONNECTED on every frame would generate an ALC call
Expand Down
18 changes: 18 additions & 0 deletions indra/llaudio/llaudioengine_openal.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
#include "llaudioengine.h"
#include "lllistener_openal.h"
#include "llwindgen.h"
#include "llatomic.h"

#include <deque>
#include <memory>
Expand Down Expand Up @@ -151,6 +152,23 @@ class LLAudioEngine_OpenAL : public LLAudioEngine
int mConsecutiveDisconnects = 0;
LLFrameTimer mDisconnectPollTimer;

// ALC_SOFT_system_events + ALC_SOFT_reopen_device let us follow
// the OS default output device while the viewer is running. Only
// armed when the user hasn't pinned a specific device — if
// mPreferredDevice names one, following the OS default would drag
// them off their choice. mDefaultDeviceChanged is written from
// OpenAL's own event thread and consumed in idle().
bool mFollowSystemDefault = false;
LPALCEVENTCONTROLSOFT mEventControlSOFT = nullptr;
LPALCEVENTCALLBACKSOFT mEventCallbackSOFT = nullptr;
LLAtomicBool mDefaultDeviceChanged{false};

void initSystemDefaultFollowing();
static void ALC_APIENTRY onDeviceEventSOFT(ALCenum event_type, ALCenum device_type,
ALCdevice* device, ALCsizei length,
const ALCchar* message, void* user_param) noexcept;
void reopenOnDefaultDevice();

// Pre-allocated buffer pool. Replaces the historical per-frame
// alGenBuffers / alDeleteBuffers churn that ran every update
// tick. At initWind we gen MAX_NUM_WIND_BUFFERS buffer ids
Expand Down
25 changes: 25 additions & 0 deletions indra/llcharacter/llcharacter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -319,6 +319,31 @@ bool LLCharacter::setVisualParamWeight(S32 index, F32 weight)
return false;
}

//-----------------------------------------------------------------------------
// setVisualParamWeight()
//-----------------------------------------------------------------------------
bool LLCharacter::setVisualParamWeight(S32 index, S32 type, F32 weight)
{
visual_param_index_map_t::iterator index_iter = mVisualParamIndexMap.find(index);
if (index_iter != mVisualParamIndexMap.end())
{
LLVisualParam* param = index_iter->second;
if (param->getWearableType() == type)
{
param->setWeight(weight);
return true;
}
else
{
// setVisualParamWeight at the moment is only used in writeToAvatar.
// The type is supposed to match since wearable is a subset of avatar by type.
llassert(false);
LL_WARNS() << "Visual param index " << index << " is not of type " << type << LL_ENDL;
}
}
return false;
}

//-----------------------------------------------------------------------------
// getVisualParamWeight()
//-----------------------------------------------------------------------------
Expand Down
1 change: 1 addition & 0 deletions indra/llcharacter/llcharacter.h
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,7 @@ class LLCharacter
virtual bool setVisualParamWeight(const LLVisualParam *which_param, F32 weight);
virtual bool setVisualParamWeight(const char* param_name, F32 weight);
virtual bool setVisualParamWeight(S32 index, F32 weight);
virtual bool setVisualParamWeight(S32 index, S32 type, F32 weight);

// get visual param weight by param or name
F32 getVisualParamWeight(LLVisualParam *distortion);
Expand Down
1 change: 1 addition & 0 deletions indra/llcharacter/llvisualparam.h
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ class alignas(16) LLVisualParam
// Pure virtuals
//virtual bool parseData( LLXmlTreeNode *node ) = 0;
virtual void apply( ESex avatar_sex ) = 0;
virtual S32 getWearableType() const = 0;
// Default functions
virtual void setWeight(F32 weight);
virtual void setAnimationTarget( F32 target_value);
Expand Down
30 changes: 27 additions & 3 deletions indra/llcommon/llapr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -135,11 +135,35 @@ apr_pool_t* LLAPRPool::getAPRPool()
bool _ll_apr_warn_status(apr_status_t status, const char* file, int line)
{
if(APR_SUCCESS == status) return false;

char buf[MAX_STRING]; /* Flawfinder: ignore */
char buf[MAX_STRING];
apr_strerror(status, buf, sizeof(buf));
LL_WARNS("APR") << "APR: " << file << ":" << line << " " << buf << LL_ENDL;

#ifdef LL_WINDOWS
// On Windows, APR error strings may be in the system's ANSI code page (e.g., Cyrillic)
// Convert to UTF-8 for proper logging
std::string error_msg = buf;
int wlen = MultiByteToWideChar(CP_ACP, 0, buf, -1, nullptr, 0);
if (wlen > 0)
{
std::wstring wbuf(wlen, L'\0');
MultiByteToWideChar(CP_ACP, 0, buf, -1, &wbuf[0], wlen);

int utf8len = WideCharToMultiByte(CP_UTF8, 0, wbuf.c_str(), -1, nullptr, 0, nullptr, nullptr);
if (utf8len > 0)
{
std::string utf8buf(utf8len, '\0');
WideCharToMultiByte(CP_UTF8, 0, wbuf.c_str(), -1, &utf8buf[0], utf8len, nullptr, nullptr);
error_msg = utf8buf.c_str(); // Remove null terminator
}
LL_WARNS("APR") << "APR: " << file << ":" << line << " " << error_msg << " (0x" << std::hex << status << std::dec << ")" << LL_ENDL;
}
else
{
LL_WARNS("APR") << "APR: " << file << ":" << line << " " << buf << " (0x" << std::hex << status << std::dec << ")" << LL_ENDL;
}
#else
LL_WARNS("APR") << "APR: " << file << ":" << line << " " << buf << " (0x" << std::hex << status << std::dec << ")" << LL_ENDL;
#endif
return true;
}

Expand Down
Loading
Loading