From 95f88e5d939218b038ab8d0dd6776120aee53ceb Mon Sep 17 00:00:00 2001 From: kim <89579420+NyaaaWhatsUpDoc@users.noreply.github.com> Date: Mon, 10 Mar 2025 17:21:56 +0000 Subject: [PATCH] [chore] add warning message when wazero compiler not supported (#3894) * add warning message when wazero compiler not supported, update supported platforms in README * whoops don't return a reason string for arm64, since it should always be supported --- README.md | 8 +++---- internal/media/ffmpeg/wasm.go | 41 ++++++++++++++++++++++++----------- 2 files changed, 32 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 1968ba521..5e9172926 100644 --- a/README.md +++ b/README.md @@ -292,13 +292,13 @@ This is the current status of support offered by GoToSocial for different platfo #### 64-bit -64-bit platforms require the following (now, very common) CPU features: +Notes on 64-bit CPU feature requirements: -- x86-64 require SSE4.1 (for both media decoding and WASM SQLite) +- x86_64 requires the SSE4.1 instruction set. (CPUs manufactured after ~2010) -- Armv8 require ARM64 Large System Extensions (specifically when using WASM SQLite) +- ARM64 requires no specific features, ARMv8 CPUs (and later) have all required features. -Without these features, performance will suffer. In these situations, you may have some success building a binary yourself with the totally **unsupported, experimental** [nowasm](https://docs.gotosocial.org/en/latest/advanced/builds/nowasm/) tag. +If any of the above features are missing, performance of media processing (and possibly, SQLite) will suffer. In these situations, you may have some success building a binary yourself with the totally **unsupported, experimental** [nowasm](https://docs.gotosocial.org/en/latest/advanced/builds/nowasm/) tag. #### BSDs diff --git a/internal/media/ffmpeg/wasm.go b/internal/media/ffmpeg/wasm.go index 29e547364..51735bec1 100644 --- a/internal/media/ffmpeg/wasm.go +++ b/internal/media/ffmpeg/wasm.go @@ -28,6 +28,7 @@ import ( "codeberg.org/gruf/go-ffmpreg/embed" "codeberg.org/gruf/go-ffmpreg/wasm" + "github.com/superseriousbusiness/gotosocial/internal/log" "github.com/tetratelabs/wazero" "golang.org/x/sys/cpu" ) @@ -50,14 +51,20 @@ func initWASM(ctx context.Context) error { var cfg wazero.RuntimeConfig - // Create new runtime config, taking bug into account: - // taking https://github.com/tetratelabs/wazero/pull/2365 - // - // Thanks @ncruces (of go-sqlite3) for the fix! - if compilerSupported() { - cfg = wazero.NewRuntimeConfigCompiler() - } else { - cfg = wazero.NewRuntimeConfigInterpreter() + // Allocate new runtime config, letting + // wazero determine compiler / interpreter. + cfg = wazero.NewRuntimeConfig() + + // Though still perform a check of CPU features at + // runtime to warn about slow interpreter performance. + if reason, supported := compilerSupported(); !supported { + log.Warn(ctx, "!!! WAZERO COMPILER MAY NOT BE AVAILABLE !!!"+ + " Reason: "+reason+"."+ + " Wazero will likely fall back to interpreter mode,"+ + " resulting in poor performance for media processing (and SQLite, if in use)."+ + " For more info and possible workarounds, please check:"+ + " https://docs.gotosocial.org/en/latest/getting_started/releases/#supported-platforms", + ) } if dir := os.Getenv("GTS_WAZERO_COMPILATION_CACHE"); dir != "" { @@ -121,7 +128,7 @@ func initWASM(ctx context.Context) error { return nil } -func compilerSupported() bool { +func compilerSupported() (string, bool) { switch runtime.GOOS { case "linux", "android", "windows", "darwin", @@ -129,15 +136,23 @@ func compilerSupported() bool { "solaris", "illumos": break default: - return false + return "unsupported OS", false } switch runtime.GOARCH { case "amd64": - return cpu.X86.HasSSE41 + // NOTE: wazero in the future may decouple the + // requirement of simd (sse4_1) from requirements + // for compiler support in the future, but even + // still our module go-ffmpreg makes use of them. + return "amd64 SSE4.1 required", cpu.X86.HasSSE41 case "arm64": - return true + // NOTE: this particular check may change if we + // later update go-ffmpreg to a version that makes + // use of threads, i.e. v7.x.x. in that case we would + // need to check for cpu.ARM64.HasATOMICS. + return "", true default: - return false + return "unsupported ARCH", false } }