_some prog with dynamic linking perhaps
Some checks are pending
Build Android / Game (Android, Release ARM64) (push) Waiting to run
Build iOS / Game (iOS, Release ARM64) (push) Waiting to run
Build Linux / Editor (Linux, Development x64) (push) Waiting to run
Build Linux / Game (Linux, Release x64) (push) Waiting to run
Build macOS / Editor (Mac, Development ARM64) (push) Waiting to run
Build macOS / Game (Mac, Release ARM64) (push) Waiting to run
Build Windows / Editor (Windows, Development x64) (push) Waiting to run
Build Windows / Game (Windows, Release x64) (push) Waiting to run
Cooker / Cook (Mac) (push) Waiting to run
Tests / Tests (Linux) (push) Waiting to run
Tests / Tests (Windows) (push) Waiting to run

This commit is contained in:
2026-03-15 22:45:36 +02:00
parent 1ff4ac0402
commit 8cf6979f90
6 changed files with 121 additions and 13 deletions

View File

@@ -49,7 +49,7 @@ ArchitectureType WebPlatformTools::GetArchitecture() const
DotNetAOTModes WebPlatformTools::UseAOT() const
{
return DotNetAOTModes::MonoAOTStatic;// DotNetAOTModes::None;//DotNetAOTModes::MonoAOTStatic;//DotNetAOTModes::NoDotnet;
return DotNetAOTModes::MonoAOTDynamic;//MonoAOTStatic;// DotNetAOTModes::None;//DotNetAOTModes::MonoAOTStatic;//DotNetAOTModes::NoDotnet;
}
PixelFormat WebPlatformTools::GetTextureFormat(CookingData& data, TextureBase* texture, PixelFormat format)

View File

@@ -18,7 +18,7 @@ public class GraphicsDeviceWebGPU : GraphicsDeviceBaseModule
options.CompileEnv.CustomArgs.Add(port);
options.LinkEnv.CustomArgs.Add("-sASYNCIFY");
options.OutputFiles.Add(port);
options.PublicDefinitions.Add("GRAPHICS_API_WEBGPU");
//options.PublicDefinitions.Add("GRAPHICS_API_WEBGPU");
options.PrivateIncludePaths.Add(Path.Combine(EmscriptenSdk.Instance.EmscriptenPath, "emscripten/cache/ports/emdawnwebgpu/emdawnwebgpu_pkg/webgpu/include"));
options.PrivateDependencies.Add("lz4");
}

View File

@@ -1175,7 +1175,7 @@ void ShadowsPass::SetupShadows(RenderContext& renderContext, RenderContextBatch&
LOG(Fatal, "Failed to setup shadow map of size {0}x{1} and format {2}", desc.Width, desc.Height, ScriptingEnum::ToString(desc.Format));
return;
}
#if PLATFORM_WEB
#if PLATFORM_WEB && GRAPHICS_API_WEBGPU
// Hack to fix WebGPU limitation that requires to specify different sampler type manually to sample depth texture
void SetWebGPUTextureViewSampler(GPUTextureView * view, uint32 samplerType);
SetWebGPUTextureViewSampler(shadows.ShadowMapAtlas->View(), 0x00000004); // WGPUTextureSampleType_Depth

View File

@@ -2075,6 +2075,11 @@ static MonoAssembly* OnMonoAssemblyLoad(const char* aname)
#if DOTNET_HOST_MONO_DEBUG
LOG(Info, "Loading C# assembly from path = {0}, exist = {1}", path, FileSystem::FileExists(path));
#endif
String testPath = path;
testPath += TEXT(".so");
LOG(Info, "{0} exist = {1}", testPath, FileSystem::FileExists(testPath));
//Platform::LoadLibrary(testPath.Get());
MonoAssembly* assembly = nullptr;
if (FileSystem::FileExists(path))
{

View File

@@ -2,6 +2,7 @@
using Mono.Cecil;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
using System.Linq;
@@ -420,7 +421,18 @@ namespace Flax.Build
rmdir /S /Q %command%
"""
);
/*Utilities.WriteFileIfChanged(Path.Combine(Path.GetDirectoryName(inputFiles[0]), "rm.bat"),
"""
@echo off
setlocal enabledelayedexpansion
set command=%*
set command=!command:~3!
del /F /Q /S %command%
rmdir /S /Q %command%
"""
);*/
ConcurrentBag<string> outputStaticLibraryFiles = new ();
var compileAssembly = (string assemblyPath) =>
{
//if (!assemblyPath.Contains("Newtonsoft"))
@@ -493,8 +505,9 @@ namespace Flax.Build
// Copy AOT build products
foreach (var outputFile in options.OutputFiles)
{
outputStaticLibraryFiles.Add(outputFile);
// Skip if deployed file is already valid
var deployedFilePath = Path.Combine(dotnetOutputPath, Path.GetFileName(outputFile));
/*var deployedFilePath = Path.Combine(dotnetOutputPath, Path.GetFileName(outputFile));
if (!File.Exists(deployedFilePath) || File.GetLastWriteTime(outputFile) > File.GetLastWriteTime(deployedFilePath))
{
// Copy to the destination folder
@@ -502,7 +515,7 @@ namespace Flax.Build
if (useDebug && File.Exists(outputFile + ".pdb"))
Utilities.FileCopy(outputFile + ".pdb", Path.Combine(dotnetOutputPath, Path.GetFileName(outputFile + ".pdb")));
validCache = false;
}
}*/
}
}
else
@@ -554,6 +567,65 @@ namespace Flax.Build
throw new Exception("Mono AOT failed to link static libraries into a shared module");
}
}
else if (Configuration.AOTMode == DotNetAOTModes.MonoAOTDynamic)
{
var linkAssembly = (string outputFile) =>
{
Log.Info("");
Log.Warning(" " + Path.GetFileNameWithoutExtension(outputFile));
Log.Info("");
// Get output file path for this assembly (platform can use custom extension)
var options = new Toolchain.CSharpOptions
{
Action = Toolchain.CSharpOptions.ActionTypes.MonoLink,
InputFiles = [Path.Combine(Path.GetDirectoryName(outputFile), Path.GetFileNameWithoutExtension(outputFile))],
OutputFiles = [outputFile],
AssembliesPath = aotAssembliesPath,
//ClassLibraryPath = dotnetLibPath,
PlatformToolsPath = Path.GetDirectoryName(outputFile),
//EnableDebugSymbols = useDebug,
//EnableToolDebug = dotnetAotDebug,
};
if (!File.Exists(outputFile) && buildToolchain.CompileCSharp(ref options))
{
Log.Error("Failed to run linker on assembly " + outputFile);
failed = true;
return;
}
// Skip if deployed file is already valid
var deployedFilePath = Path.Combine(dotnetOutputPath, Path.GetFileName(outputFile));
if (!File.Exists(deployedFilePath) || File.GetLastWriteTime(outputFile) > File.GetLastWriteTime(deployedFilePath))
{
// Copy to the destination folder
Utilities.FileCopy(outputFile, deployedFilePath);
if (/*useDebug &&*/ File.Exists(outputFile + ".pdb"))
Utilities.FileCopy(outputFile + ".pdb", Path.Combine(dotnetOutputPath, Path.GetFileName(outputFile + ".pdb")));
validCache = false;
}
};
// Run final linking with single-threaded as this is very memory intensive process
if (Configuration.MaxConcurrency > 1 && Configuration.ConcurrencyProcessorScale > 0.0f && !dotnetAotDebug)
{
// Multi-threaded
var outputFiles = outputStaticLibraryFiles.OrderBy(x => x.Contains("System.Private.CoreLib") || x.Contains("System.Linq") || x.Contains("System.Private.Xml") ? 0 : 1).ToArray(); // Process the file which takes longest time first
System.Threading.Tasks.Parallel.ForEach(outputFiles/*, new System.Threading.Tasks.ParallelOptions() { MaxDegreeOfParallelism = Math.Min(8, Configuration.MaxConcurrency) }*/, linkAssembly);
}
else
{
foreach (var outputFile in outputStaticLibraryFiles)
{
linkAssembly(outputFile);
if (failed)
break;
}
}
if (failed)
throw new Exception($"Failed to run AOT. See log ({Configuration.LogFile}).");
}
}
else
{

View File

@@ -321,12 +321,12 @@ namespace Flax.Build.Platforms
var initialMemory = Configuration.WebInitialMemory;
//if (options.CompileEnv.Sanitizers.HasFlag(Sanitizer.Address))
// initialMemory = Math.Max(initialMemory, 64); // Address Sanitizer needs more memory
/*args.Add($"-sINITIAL_MEMORY={initialMemory}MB");
args.Add($"-sINITIAL_MEMORY={initialMemory}MB");
args.Add("-sSTACK_SIZE=4MB");
args.Add("-sALLOW_MEMORY_GROWTH=1");
// Setup file access (Game Cooker packs files with file_packager tool)
args.Add("-sFORCE_FILESYSTEM");*/
args.Add("-sFORCE_FILESYSTEM");
//args.Add("-sLZ4");
// https://emscripten.org/docs/compiling/Dynamic-Linking.html#dynamic-linking
@@ -342,6 +342,12 @@ namespace Flax.Build.Platforms
}
}
args.Add("-O0");
args.Add("--verbose");
//args.Add("--trace");
args.Add("-Wl,--allow-multiple-definition"); // Multiple pthread-related definitions in dotnet runtime
args.Add("-Wl,--start-group");
@@ -380,6 +386,12 @@ namespace Flax.Build.Platforms
args.Add(string.Format("\"-l{0}\"", GetLibName(library)));
libraryPaths.Add(dir); // FIXME
}*/
/*if (library.Contains("net10.0"))
{
if (!library.Contains("System.Private.CoreLib"))
continue;
}*/
args.Add(library.Replace(Path.DirectorySeparatorChar, '/') + Platform.StaticLibraryFileExtension);
}
@@ -415,7 +427,9 @@ namespace Flax.Build.Platforms
//task.CommandPath = _compilerPath;
//task.CommandArguments = string.Join(" ", args);
int result = Utilities.Run(NativeCompilerPath, $"{string.Join(" ", args)}", null, Path.GetDirectoryName(options.OutputFiles[0]), Utilities.RunOptions.AppMustExist | Utilities.RunOptions.ConsoleLogOutput);
//int result = Utilities.Run(NativeCompilerPath, $"{string.Join(" ", args)}", null, Path.GetDirectoryName(options.OutputFiles[0]), Utilities.RunOptions.AppMustExist | Utilities.RunOptions.ConsoleLogOutput);
int result = Utilities.Run(NativeCompilerPath, $"{string.Join(" ", args)}", null, options.PlatformToolsPath, Utilities.RunOptions.AppMustExist | Utilities.RunOptions.ConsoleLogOutput);
if (result != 0)
return true;
@@ -441,9 +455,9 @@ namespace Flax.Build.Platforms
string outputFile;
{
if (Configuration.AOTMode == DotNetAOTModes.MonoAOTDynamic)
/*if (Configuration.AOTMode == DotNetAOTModes.MonoAOTDynamic)
outputFile = inputFile + Platform.SharedLibraryFileExtension;
else
else*/
outputFile = Path.Combine(Path.GetDirectoryName(inputFile), Platform.StaticLibraryFilePrefix + Path.GetFileName(inputFile) + Platform.StaticLibraryFileExtension);
}
@@ -452,15 +466,17 @@ namespace Flax.Build.Platforms
bool useLLVM = true;
//if (useLLVM)
debugSymbols = false;
var llvmPath = "\"C:\\Program Files\\LLVM\\bin\"";//Path.Combine(EmscriptenSdk.Instance.EmscriptenPath, "bin");
//var llvmPath = "\"C:\\Program Files\\LLVM\\bin\"";//Path.Combine(EmscriptenSdk.Instance.EmscriptenPath, "bin");
var llvmPath = "\"" + Path.Combine(EmscriptenSdk.Instance.EmscriptenPath, "bin") + "\"";
var monoAotMode = "full";
if (useLLVM)
monoAotMode = "llvmonly";
monoAotMode = "no-opt,llvmonly";//"llvmonly";
//if ("mscorlib.dll" == "")
// monoAotMode = "interp";
var monoDebugMode = debugSymbols ? "soft-debug" : "nodebug";
//var aotCompilerArgs = $"{(useLLVM ? "--llvm" : "")} --aot={monoAotMode},asmonly,verbose,stats,print-skipped,{monoDebugMode}{(useLLVM ? $",llvm-path={llvmPath},llvm-outfile=" + Path.GetFileName(outputFile) : "")} -O=float32";
var aotCompilerArgs = $"{(useLLVM ? "--llvm" : "")} --aot={monoAotMode},asmonly,verbose,stats,print-skipped,{monoDebugMode}{(useLLVM ? $",llvm-path={llvmPath},llvm-outfile=" + Path.GetFileName(outputFile) : "")} -O=float32";
//aotCompilerArgs += " --verbose";
@@ -479,13 +495,28 @@ namespace Flax.Build.Platforms
}
//envVars["MONO_DEBUG"] = "gen-seq-points";
// Run cross-compiler compiler (outputs assembly code)
//int result = 0;
int result = Utilities.Run(aotCompilerPath, $"{aotCompilerArgs} \"{inputFile}\"", null, inputFileFolder, Utilities.RunOptions.AppMustExist | Utilities.RunOptions.ConsoleLogOutput, envVars);
if (result != 0)
return true;
/*CSharpOptions soOptions = new CSharpOptions()
{
Action = CSharpOptions.ActionTypes.MonoLink,
InputFiles = [Path.Combine(Path.GetDirectoryName(inputFile), Platform.StaticLibraryFilePrefix + Path.GetFileName(inputFile))],
OutputFiles = [ inputFile + Platform.SharedLibraryFileExtension ],
AssembliesPath = options.AssembliesPath,
PlatformToolsPath = inputFileFolder,
};
return CompileCSharp(ref soOptions);*/
/*result = Utilities.Run(aotCompilerPath, $"{aotCompilerArgs} \"{inputFile}\"", null, inputFileFolder, Utilities.RunOptions.AppMustExist | Utilities.RunOptions.ConsoleLogOutput, envVars);
if (result != 0)
return true;*/
// Get build args for iOS
/*var clangArgs = new List<string>();
AddArgsCommon(null, clangArgs);