Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
fccbdf9
chore(unity): Linux player target and 6000.5 serialized settings
eordano Sep 7, 2026
ab97a55
feat(build): batchmode build entry points and editor diagnostics
eordano Sep 7, 2026
9c3d2a7
feat(plugins): Linux native plugin binaries with reproducible provenance
eordano Sep 7, 2026
51bbf7c
feat(comms): vendor the LiveKit SDK with Linux FFI support
eordano Sep 7, 2026
74f6060
feat(packages): clean-room GPU-instancing package
eordano Sep 6, 2026
a6ea219
feat(packages): clean-room render-features package
eordano Sep 6, 2026
45406a7
feat(packages): clean-room stylized grass package
eordano Sep 7, 2026
630930b
feat(packages): clean-room virtualized scroll views
eordano Sep 6, 2026
4ab4c26
feat(packages): clean-room native file dialogs
eordano Sep 7, 2026
55dcfa9
chore(packages): resolve the clean-room and vendored packages from Ex…
eordano Sep 7, 2026
03020ab
feat(media): UUAV media backend with Linux-native video playback
eordano Sep 7, 2026
fd4cb47
feat(ab): asset-bundle routing and embedded shader bundles for Linux
eordano Sep 7, 2026
feca83c
fix(rendering): GPU-instanced landscape, palette PNGs and streamable …
eordano Sep 7, 2026
aa60026
fix(shaders): Vulkan-portable spellings in unity-shared-dependencies
eordano Sep 7, 2026
e626378
feat(realm): world manifests and comms for custom base domains
eordano Sep 7, 2026
60d0e85
feat(linux): launcher bridge, self-serve update channel and Sentry re…
eordano Sep 7, 2026
37a3f8c
feat(golden): deterministic pixel-capture harness
eordano Sep 7, 2026
61fc065
feat(bench): controlled performance benchmark harness
eordano Sep 7, 2026
a5b5e1e
feat(mcp): scene-automation tools
eordano Sep 7, 2026
6abc156
fix(golden): canonical frozen pose, pinned scene-light budget and tes…
eordano Sep 7, 2026
869db51
UUAV: rebuild the Windows binaries from the 0.4.0 native tree and relock
eordano Sep 13, 2026
e6b43e6
UUAV: document the LLVM-on-PATH prerequisite for the Windows build
eordano Sep 13, 2026
e05562c
UUAV: hold a seek issued while the media is opening
eordano Sep 13, 2026
b652f4a
UUAV: build the netshutdown example on every platform
eordano Sep 13, 2026
9a0446d
UUAV: keep upstream's chained error messages
eordano Sep 13, 2026
ac0a528
UUAV: rebuild the Linux plugins from the current native tree
eordano Sep 13, 2026
8785fed
UUAV: rebuild the macOS and Windows binaries from the current native …
eordano Sep 13, 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
  •  
  •  
  •  
8 changes: 8 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,16 @@ Explorer/Assets/StreamingAssets/AssetBundles/**/*.meta -filter=lfs -diff=lfs -me
*.png filter=lfs diff=lfs merge=lfs -text
*.dll filter=lfs diff=lfs merge=lfs -text
*.dylib filter=lfs diff=lfs merge=lfs -text
# Linux native libraries; versioned sonames (libavcodec.so.62) are binaries, their Unity .meta sidecars are text.
*.so filter=lfs diff=lfs merge=lfs -text
*.so.[0-9]* filter=lfs diff=lfs merge=lfs -text
*.so.[0-9]*.meta !filter !diff !merge !text
# Plain blobs that predate the *.so rule; they join LFS when they are next rebuilt.
Explorer/Assets/Plugins/ENet/runtimes/linux-x64/native/libenet.so !filter !diff !merge !text
Explorer/Assets/Plugins/RustSegment/SegmentServerWrap/Libraries/Linux/segment-server.so !filter !diff !merge !text
Explorer/Assets/Plugins/UUAV/Packages/UUAV/Runtime/Plugins/x86_64/uuav-helper.exe filter=lfs diff=lfs merge=lfs -text
Explorer/Assets/Plugins/UUAV/Packages/UUAV/Runtime/Plugins/macOS/uuav-helper filter=lfs diff=lfs merge=lfs -text
Explorer/Assets/Plugins/UUAV/Packages/UUAV/Runtime/Plugins/linux-x86_64/uuav-helper filter=lfs diff=lfs merge=lfs -text

##############################################################################
# UUAV native - hashed bytes, so the line endings are part of the content
Expand Down
11 changes: 0 additions & 11 deletions .github/workflows/test-performance.yml
Original file line number Diff line number Diff line change
Expand Up @@ -68,16 +68,6 @@ jobs:
git add .
git reset --hard

- uses: webfactory/ssh-agent@v0.8.0
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}

- name: 'Add GitHub to the SSH known hosts file'
run: |
mkdir -p -m 0700 /home/runner/.ssh
curl --silent https://api.github.com/meta | jq --raw-output '"github.com "+.ssh_keys[]' >> /home/runner/.ssh/known_hosts
chmod 600 /home/runner/.ssh/known_hosts

- name: Restore Library cache
uses: actions/cache@v5
with:
Expand Down Expand Up @@ -157,7 +147,6 @@ jobs:
with:
projectPath: Explorer
testMode: playmode
sshAgent: ${{ env.SSH_AUTH_SOCK }}
customImage: ${{ steps.img.outputs.ghcr }}
customParameters: -buildTarget StandaloneLinux64 -testCategory "Performance" -perfTestResults ./PerformanceTestResults.json -DCLBenchmarkCIPKey ${{ secrets.DCL_BENCHMARK_CIP_KEY }}
githubToken: ${{ env.GITHUB_TOKEN }}
Expand Down
34 changes: 0 additions & 34 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -194,24 +194,6 @@ jobs:
git add .
git reset --hard

- uses: webfactory/ssh-agent@v0.8.0
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}

- name: Add GitHub to the SSH known hosts file
run: |
mkdir -p -m 0700 /home/runner/.ssh
curl --silent https://api.github.com/meta | jq --raw-output '"github.com "+.ssh_keys[]' >> /home/runner/.ssh/known_hosts
chmod 600 /home/runner/.ssh/known_hosts

- name: Prepare SSH for Unity
run: |
rm -rf /tmp/ssh-unity
mkdir -p -m 0700 /tmp/ssh-unity
cp /home/runner/.ssh/known_hosts /tmp/ssh-unity/known_hosts
cp /home/runner/.ssh/key-* /tmp/ssh-unity/ 2>/dev/null || true
chmod 600 /tmp/ssh-unity/*

- name: Prepare Unity writable dirs
run: |
mkdir -p /tmp/unity-home/.local/share/unity3d
Expand Down Expand Up @@ -288,12 +270,9 @@ jobs:
# run: |
# docker run --rm \
# -v "${{ github.workspace }}:/workspace" \
# -v $SSH_AUTH_SOCK:$SSH_AUTH_SOCK \
# -v /tmp/ssh-unity:/root/.ssh:ro \
# -v /tmp/unity-home/.local/share/unity3d:/root/.local/share/unity3d \
# -v /tmp/unity-home/.cache/unity3d:/root/.cache/unity3d \
# -v /tmp/unity-home/.config/unity3d:/root/.config/unity3d \
# -e SSH_AUTH_SOCK=$SSH_AUTH_SOCK \
# -e UNITY_EMAIL="$UNITY_EMAIL" \
# -e UNITY_PASSWORD="$UNITY_PASSWORD" \
# -e UNITY_LICENSE="$UNITY_LICENSE" \
Expand Down Expand Up @@ -614,18 +593,6 @@ jobs:
git add .
git reset --hard

- uses: webfactory/ssh-agent@v0.8.0
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}

- name: 'Add GitHub to the SSH known hosts file'
run: |
mkdir -p -m 0700 ~/.ssh
echo 'github.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl' >> ~/.ssh/known_hosts
echo 'github.com ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEmKSENjQEezOmxkZMy7opKgwFB9nkt5YRrYMjNuG5N87uRgg6CLrbo5wAdT/y6v0mKV0U2w0WZ2YB/++Tpockg=' >> ~/.ssh/known_hosts
echo 'github.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCj7ndNxQowgcQnjshcLrqPEiiphnt+VTTvDP6mHBL9j1aNUkY4Ue1gvwnGLVlOhGeYrnZKAc/NKgzBh2bFNFMR0mVmYeeNR1cb+gZXH6N1gjEHGo2J3qjVg9rBJ0aM5st/22iqkAl7K6d9jMTi6COwJKqFHGmn7gwK+FBnfaYDwdOB8JqGz9eDNi2SegGaKie1jURLEuRPkLqlJrJ3AEdC5v7ibREzMQPGiHlIC5bE0GD/3mPN1Kul4a4EZhIC5RFxewRqDaK7be0wYMbSW7JzfLDMVtRAkKO5GjaKKv4RzGmrgVApFI/j6jJ0sTJZVgmmqODx0P+RcAfGV0RBCjMEdOPj4yr5ObHGjYCdaFEhXGTIlSGeFSEAFGFweZb9t80b8ABbeBRwx/dqI94aaFkMRkzT8VJ9B4yQvbWO7HP64Lxk6rab5Ygwypbcghmms/ATrc0CVh0zGw36VTzV2eBwboRa7G0sxgBudGrJ4BAOI/JrF4BnWcG5fvQewJ1Uc=' >> ~/.ssh/known_hosts
chmod 600 ~/.ssh/known_hosts

- name: Restore Library cache
uses: actions/cache@v5
with:
Expand Down Expand Up @@ -741,7 +708,6 @@ jobs:
with:
projectPath: Explorer
testMode: ${{ matrix.testMode }}
sshAgent: ${{ env.SSH_AUTH_SOCK }}
customImage: ${{ matrix.testMode == 'editmode' && steps.rg-img.outputs.image || steps.img.outputs.ghcr }}
customParameters: -buildTarget StandaloneLinux64 -testCategory "!Performance" -burst-disable-compilation -accept-apiupdate
githubToken: ${{ env.GITHUB_TOKEN }}
Expand Down
2 changes: 0 additions & 2 deletions Explorer/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,6 @@
/[Bb]uilds/
/[Ll]ogs/
/[Mm]emoryCaptures/
[Aa]ssets/AVProVideo
[Aa]ssets/AVProVideo.meta
Assets/StreamingAssets/AssetBundles/lods/
enet-debug.log
Assets/_LocalHidden/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,11 +85,6 @@ MonoBehaviour:
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 303b28effad14e94871a6cfad2db6615
m_Address: Hidden/GPUInstancerPro/InternalErrorShader
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 327b853b79746cf48ab308998970d8ae
m_Address: Fork_C
m_ReadOnly: 0
Expand Down Expand Up @@ -165,26 +160,11 @@ MonoBehaviour:
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 7835c6b3cbd1dd24bb8cf791f83b3ec9
m_Address: GPUInstancerPro/Standard
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 7c45d7279c9840b40bf9cf08795bcb8f
m_Address: Fork_A
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 7f2bfe2de9f99024383bae22ae477a2a
m_Address: Universal Render Pipeline/Nature/SpeedTree8_PBRLit_GPUIPro
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 8478781d80234fa29651593b02782b9d
m_Address: Hidden/GPUInstancerPro/Nature/TreeProxy
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 8656fee7f6c6a234eac9ff6886c06a44
m_Address: Crossroads_00
m_ReadOnly: 0
Expand Down Expand Up @@ -325,11 +305,6 @@ MonoBehaviour:
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: eac608796bf9b9546b3dd3a76bf994aa
m_Address: Shader Graphs/Rock_GPUIPro
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: ecd3b5e941b880d4382093688c559bd6
m_Address: DeadEnd_C
m_ReadOnly: 0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,12 @@ MonoBehaviour:
m_SerializedLabels:
- Locale-en
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: b6e9645ea90c9494a9ae8aba0ba9f004
m_Address: Tests Localization Table_en
m_ReadOnly: 1
m_SerializedLabels:
- Locale-en
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: b983fc3744bd749df80bbb972f615bc9
m_Address: UI Text Localization Table_en
m_ReadOnly: 1
Expand Down
8 changes: 8 additions & 0 deletions Explorer/Assets/AddressableAssetsData/Linux.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Git LFS file not shown

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ public class DefaultSpecProfileProvider : ISpecProfileProvider
private const int MIN_RAM_MB = 16 * 1024;
private const int MIN_STORAGE_MB = 8 * 1024;

private const int LINUX_MIN_VRAM_MB = 2 * 1024;
private const int LINUX_MIN_RAM_MB = 8 * 1024;

private const string WIN_OS_REQ = "Windows 10 or newer";
private const string WIN_CPU_REQ = "Intel i5 (7th Gen) or AMD Ryzen 5+";
private const string WIN_GPU_REQ = "Nvidia RTX 20 series or AMD RX 5000 series+ (DirectX 12 compatible)";
Expand All @@ -19,6 +22,12 @@ public class DefaultSpecProfileProvider : ISpecProfileProvider
private const string MAC_GPU_REQ = "Apple M1 Integrated";
private const string MAC_SHADER_REQ = "Metal-compatible (Compute Shaders)";

private const string LINUX_OS_REQ = "Linux kernel 5.15 or newer";
private const string LINUX_CPU_REQ = "x86_64 Intel or AMD CPU, 2+ cores";
private const string LINUX_GPU_REQ = "Vulkan-capable GPU (NVIDIA, AMD, or Intel — discrete or integrated). Software renderers (llvmpipe, lavapipe, softpipe, swrast, SwiftShader) are unsupported.";
private const string LINUX_GPU_INTEGRATED_REQ = "Performance may be reduced on integrated graphics.";
private const string LINUX_SHADER_REQ = "Compute Shaders";

public SpecProfile GetProfile(PlatformOS platform)
{
return platform switch
Expand Down Expand Up @@ -52,6 +61,25 @@ public SpecProfile GetProfile(PlatformOS platform)
MinVramMB = MIN_VRAM_MB, MinRamMB = MIN_RAM_MB, MinStorageMB = MIN_STORAGE_MB
},

PlatformOS.Linux => new SpecProfile
{
OsCheck = SystemSpecUtils.IsLinuxOsAcceptable,
CpuCheck = SystemSpecUtils.IsLinuxCpuAcceptable,
GpuCheck = SystemSpecUtils.IsLinuxGpuAcceptable,
IsIntegratedGpuCheck = SystemSpecUtils.IsLinuxIntegratedGpu,
ShaderCheck = SystemSpecUtils.ComputeShaderCheck,

OsRequirement = LINUX_OS_REQ,
CpuRequirement = LINUX_CPU_REQ,
GpuRequirement = LINUX_GPU_REQ,
GpuIntegratedRequirement = LINUX_GPU_INTEGRATED_REQ,
ShaderRequirement = LINUX_SHADER_REQ,

MinVramMB = LINUX_MIN_VRAM_MB,
MinRamMB = LINUX_MIN_RAM_MB,
MinStorageMB = MIN_STORAGE_MB,
},

_ => throw new NotSupportedException($"Platform '{platform}' is not supported.")
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ public enum PlatformOS
{
Windows,
Mac,
Linux,
Unsupported
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ public static PlatformOS DetectPlatform()
{
RuntimePlatform.WindowsPlayer or RuntimePlatform.WindowsEditor => PlatformOS.Windows,
RuntimePlatform.OSXPlayer or RuntimePlatform.OSXEditor => PlatformOS.Mac,
RuntimePlatform.LinuxPlayer or RuntimePlatform.LinuxEditor => PlatformOS.Linux,
_ => PlatformOS.Unsupported,
};
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
using DCL.FeatureFlags;
using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Text.RegularExpressions;
using UnityEngine;
using UnityEngine.Rendering;
Expand Down Expand Up @@ -150,6 +152,87 @@ public static bool ComputeShaderCheck()
return SystemInfo.supportsComputeShaders;
}

private const int LINUX_MIN_KERNEL_MAJOR = 5;
private const int LINUX_MIN_KERNEL_MINOR = 15;

private const int LINUX_MIN_CORES = 2;

private static readonly string[] LINUX_SOFTWARE_GPU_NAMES =
{
"llvmpipe", "lavapipe", "softpipe", "swrast", "swiftshader",
};

private static readonly string[] LINUX_INTEGRATED_GPU_KEYWORDS =
{
"intel(r) hd", "intel hd", "intel(r) uhd", "intel uhd",
"intel(r) iris", "intel iris", "iris xe",
"radeon vega", "radeon graphics", "radeon r5", "radeon r6", "radeon r7",
"vangogh", "custom gpu 0405", "custom apu 0405",
"raphael", "rembrandt", "phoenix", "strix", "lucienne", "cezanne", "renoir",
};

public static bool IsLinuxOsAcceptable(string os)
{
try
{
string osrelease = File.ReadAllText("/proc/sys/kernel/osrelease").Trim();
return IsLinuxOsAcceptable_Inner(osrelease);
}
catch (Exception)
{
return IsLinuxOsAcceptable_Inner(os ?? "");
}
}

public static bool IsLinuxOsAcceptable_Inner(string osreleaseOrSystemInfo)
{
var match = Regex.Match(osreleaseOrSystemInfo, @"(\d+)\.(\d+)");
if (!match.Success) return false;
if (!int.TryParse(match.Groups[1].Value, out int major)) return false;
if (!int.TryParse(match.Groups[2].Value, out int minor)) return false;
if (major > LINUX_MIN_KERNEL_MAJOR) return true;
if (major < LINUX_MIN_KERNEL_MAJOR) return false;
return minor >= LINUX_MIN_KERNEL_MINOR;
}

public static bool IsLinuxCpuAcceptable(string cpu)
{
if (RuntimeInformation.OSArchitecture != Architecture.X64)
return false;
if (SystemInfo.processorCount < LINUX_MIN_CORES)
return false;
string lower = (cpu ?? "").ToLowerInvariant();
return lower.Contains("intel") || lower.Contains("amd")
|| lower.Contains("ryzen") || lower.Contains("core");
}

public static bool IsLinuxGpuAcceptable(string gpu)
{
if (SystemInfo.graphicsDeviceType != GraphicsDeviceType.Vulkan)
return false;
string lowerName = (gpu ?? "").ToLowerInvariant();
string lowerVendor = (SystemInfo.graphicsDeviceVendor ?? "").ToLowerInvariant();
foreach (string fallback in LINUX_SOFTWARE_GPU_NAMES)
{
if (lowerName.Contains(fallback) || lowerVendor.Contains(fallback))
return false;
}
return true;
}

public static bool IsLinuxIntegratedGpu(string gpuName)
{
if (string.IsNullOrEmpty(gpuName))
return false;
string lowerGpuName = gpuName.ToLowerInvariant();
foreach (string keyword in LINUX_INTEGRATED_GPU_KEYWORDS)
{
if (lowerGpuName.Contains(keyword))
return true;
}
return false;
}

/// <summary>
/// Checks if the provided memory size meets the minimum requirement,
/// accounting for reporting discrepancies (e.g., 15.9 GB for a 16 GB module).
Expand Down
Loading
Loading