Skip to content

Commit 1d954f4

Browse files
Revert "[skwasm] Dynamic Threading (#164748)" (#165350)
This reverts commit b2a4a05. This has been causing issues when rolling to flutter/packages repo. See #165347.
1 parent b836fb2 commit 1d954f4

File tree

16 files changed

+309
-205
lines changed

16 files changed

+309
-205
lines changed

engine/src/build/config/compiler/BUILD.gn

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -277,9 +277,9 @@ config("compiler") {
277277
}
278278

279279
if (is_wasm) {
280-
if (wasm_use_workers) {
281-
cflags += [ "-sWASM_WORKERS=1" ]
282-
ldflags += [ "-sWASM_WORKERS=1" ]
280+
if (wasm_use_pthreads) {
281+
cflags += [ "-pthread" ]
282+
ldflags += [ "-pthread" ]
283283
} if (wasm_shared_memory) {
284284
cflags += [ "-sSHARED_MEMORY=1" ]
285285
ldflags += [ "-sSHARED_MEMORY=1" ]
@@ -396,12 +396,12 @@ config("compiler") {
396396
# to say that it does. Define them here instead.
397397
defines += [ "HAVE_SYS_UIO_H" ]
398398

399-
# When Android requires new flags consider also editing the flags in
400-
# the following locations.
399+
# When Android requires new flags consider also editing the flags in
400+
# the following locations.
401401
# Framework plugin_ffi template: packages/flutter_tools/templates/plugin_ffi/src.tmpl/CMakeLists.txt.tmpl
402402
# Example PR: https://github.com/flutter/flutter/pull/155508
403-
# Dart Lang JNI package: pkgs/jni/src/CMakeLists.txt
404-
# Example PR: https://github.com/dart-lang/native/pull/1615
403+
# Dart Lang JNI package: pkgs/jni/src/CMakeLists.txt
404+
# Example PR: https://github.com/dart-lang/native/pull/1615
405405
ldflags += [
406406
"-Wl,--no-undefined",
407407
"-Wl,--exclude-libs,ALL",

engine/src/build/toolchain/wasm.gni

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ declare_args() {
1111
# The location of an activated embedded emsdk.
1212
emsdk_dir = rebase_path("//flutter/prebuilts/emsdk")
1313

14-
wasm_use_workers = false
14+
wasm_use_pthreads = false
1515
wasm_shared_memory = false
1616
wasm_use_dwarf = false
1717
}

engine/src/flutter/ci/licenses_golden/licenses_flutter

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42734,6 +42734,8 @@ ORIGIN: ../../../flutter/lib/web_ui/skwasm/filters.cpp + ../../../flutter/LICENS
4273442734
ORIGIN: ../../../flutter/lib/web_ui/skwasm/fonts.cpp + ../../../flutter/LICENSE
4273542735
ORIGIN: ../../../flutter/lib/web_ui/skwasm/helpers.h + ../../../flutter/LICENSE
4273642736
ORIGIN: ../../../flutter/lib/web_ui/skwasm/image.cpp + ../../../flutter/LICENSE
42737+
ORIGIN: ../../../flutter/lib/web_ui/skwasm/library_skwasm_multi_threaded.js + ../../../flutter/LICENSE
42738+
ORIGIN: ../../../flutter/lib/web_ui/skwasm/library_skwasm_single_threaded.js + ../../../flutter/LICENSE
4273742739
ORIGIN: ../../../flutter/lib/web_ui/skwasm/library_skwasm_support.js + ../../../flutter/LICENSE
4273842740
ORIGIN: ../../../flutter/lib/web_ui/skwasm/paint.cpp + ../../../flutter/LICENSE
4273942741
ORIGIN: ../../../flutter/lib/web_ui/skwasm/path.cpp + ../../../flutter/LICENSE
@@ -42743,6 +42745,8 @@ ORIGIN: ../../../flutter/lib/web_ui/skwasm/skwasm_support.h + ../../../flutter/L
4274342745
ORIGIN: ../../../flutter/lib/web_ui/skwasm/string.cpp + ../../../flutter/LICENSE
4274442746
ORIGIN: ../../../flutter/lib/web_ui/skwasm/surface.cpp + ../../../flutter/LICENSE
4274542747
ORIGIN: ../../../flutter/lib/web_ui/skwasm/surface.h + ../../../flutter/LICENSE
42748+
ORIGIN: ../../../flutter/lib/web_ui/skwasm/surface_mt.cpp + ../../../flutter/LICENSE
42749+
ORIGIN: ../../../flutter/lib/web_ui/skwasm/surface_st.cpp + ../../../flutter/LICENSE
4274642750
ORIGIN: ../../../flutter/lib/web_ui/skwasm/text/line_metrics.cpp + ../../../flutter/LICENSE
4274742751
ORIGIN: ../../../flutter/lib/web_ui/skwasm/text/paragraph.cpp + ../../../flutter/LICENSE
4274842752
ORIGIN: ../../../flutter/lib/web_ui/skwasm/text/paragraph_builder.cpp + ../../../flutter/LICENSE
@@ -45705,6 +45709,8 @@ FILE: ../../../flutter/lib/web_ui/skwasm/filters.cpp
4570545709
FILE: ../../../flutter/lib/web_ui/skwasm/fonts.cpp
4570645710
FILE: ../../../flutter/lib/web_ui/skwasm/helpers.h
4570745711
FILE: ../../../flutter/lib/web_ui/skwasm/image.cpp
45712+
FILE: ../../../flutter/lib/web_ui/skwasm/library_skwasm_multi_threaded.js
45713+
FILE: ../../../flutter/lib/web_ui/skwasm/library_skwasm_single_threaded.js
4570845714
FILE: ../../../flutter/lib/web_ui/skwasm/library_skwasm_support.js
4570945715
FILE: ../../../flutter/lib/web_ui/skwasm/paint.cpp
4571045716
FILE: ../../../flutter/lib/web_ui/skwasm/path.cpp
@@ -45714,6 +45720,8 @@ FILE: ../../../flutter/lib/web_ui/skwasm/skwasm_support.h
4571445720
FILE: ../../../flutter/lib/web_ui/skwasm/string.cpp
4571545721
FILE: ../../../flutter/lib/web_ui/skwasm/surface.cpp
4571645722
FILE: ../../../flutter/lib/web_ui/skwasm/surface.h
45723+
FILE: ../../../flutter/lib/web_ui/skwasm/surface_mt.cpp
45724+
FILE: ../../../flutter/lib/web_ui/skwasm/surface_st.cpp
4571745725
FILE: ../../../flutter/lib/web_ui/skwasm/text/line_metrics.cpp
4571845726
FILE: ../../../flutter/lib/web_ui/skwasm/text/paragraph.cpp
4571945727
FILE: ../../../flutter/lib/web_ui/skwasm/text/paragraph_builder.cpp

engine/src/flutter/lib/web_ui/dev/steps/copy_artifacts_step.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,15 @@ class CopyArtifactsStep implements PipelineStep {
7676
final String canvaskitSourceDirectory;
7777
final String canvaskitChromiumSourceDirectory;
7878
final String skwasmSourceDirectory;
79+
final String skwasmStSourceDirectory;
7980
switch (source) {
8081
case LocalArtifactSource(:final mode):
8182
final buildDirectory = getBuildDirectoryForRuntimeMode(mode).path;
8283
flutterJsSourceDirectory = pathlib.join(buildDirectory, 'flutter_web_sdk', 'flutter_js');
8384
canvaskitSourceDirectory = pathlib.join(buildDirectory, 'canvaskit');
8485
canvaskitChromiumSourceDirectory = pathlib.join(buildDirectory, 'canvaskit_chromium');
8586
skwasmSourceDirectory = pathlib.join(buildDirectory, 'skwasm');
87+
skwasmStSourceDirectory = pathlib.join(buildDirectory, 'skwasm_st');
8688

8789
case GcsArtifactSource(:final realm):
8890
final artifactsDirectory = (await _downloadArtifacts(realm)).path;
@@ -94,6 +96,7 @@ class CopyArtifactsStep implements PipelineStep {
9496
'chromium',
9597
);
9698
skwasmSourceDirectory = pathlib.join(artifactsDirectory, 'canvaskit');
99+
skwasmStSourceDirectory = pathlib.join(artifactsDirectory, 'canvaskit');
97100
}
98101

99102
await environment.webTestsArtifactsDir.create(recursive: true);
@@ -113,6 +116,7 @@ class CopyArtifactsStep implements PipelineStep {
113116
if (artifactDeps.skwasm) {
114117
copied.add('Skwasm');
115118
await copyWasmLibrary('skwasm', skwasmSourceDirectory, 'canvaskit');
119+
await copyWasmLibrary('skwasm_st', skwasmStSourceDirectory, 'canvaskit');
116120
}
117121
print('Copied artifacts: ${copied.join(', ')}');
118122
}

engine/src/flutter/lib/web_ui/flutter_js/src/skwasm_loader.js

Lines changed: 12 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -6,64 +6,24 @@ import { createWasmInstantiator } from "./instantiate_wasm.js";
66
import { resolveUrlWithSegments } from "./utils.js";
77

88
export const loadSkwasm = async (deps, config, browserEnvironment, baseUrl) => {
9-
const rawSkwasmUrl = resolveUrlWithSegments(baseUrl, 'skwasm.js')
9+
const fileStem = (browserEnvironment.crossOriginIsolated && !config.forceSingleThreadedSkwasm) ? "skwasm" : "skwasm_st";
10+
const rawSkwasmUrl = resolveUrlWithSegments(baseUrl, `${fileStem}.js`)
1011
let skwasmUrl = rawSkwasmUrl;
1112
if (deps.flutterTT.policy) {
1213
skwasmUrl = deps.flutterTT.policy.createScriptURL(skwasmUrl);
1314
}
14-
const wasmInstantiator = createWasmInstantiator(resolveUrlWithSegments(baseUrl, 'skwasm.wasm'));
15+
const wasmInstantiator = createWasmInstantiator(resolveUrlWithSegments(baseUrl, `${fileStem}.wasm`));
1516
const skwasm = await import(skwasmUrl);
1617
return await skwasm.default({
17-
skwasmSingleThreaded: !browserEnvironment.crossOriginIsolated || config.forceSingleThreadedSkwasm,
1818
instantiateWasm: wasmInstantiator,
19-
locateFile: (filename, scriptDirectory) => {
20-
// The wasm workers API has a separate .ww.js file that bootstraps the
21-
// web worker. However, it turns out this worker bootstrapper doesn't
22-
// actually work with ES6 modules, which we have enabled. So we instead
23-
// pass our own bootstrapper that loads skwasm.js as an ES6 module, and
24-
// queues/flushes pending messages that were received during the
25-
// asynchronous load.
26-
if (filename.endsWith('.ww.js')) {
27-
const url = resolveUrlWithSegments(baseUrl, filename);
28-
return URL.createObjectURL(new Blob(
29-
[`
30-
"use strict";
31-
32-
let eventListener;
33-
eventListener = (message) => {
34-
const pendingMessages = [];
35-
const data = message.data;
36-
data["instantiateWasm"] = (info,receiveInstance) => {
37-
const instance = new WebAssembly.Instance(data["wasm"], info);
38-
return receiveInstance(instance, data["wasm"])
39-
};
40-
import(data.js).then(async (skwasm) => {
41-
await skwasm.default(data);
42-
43-
removeEventListener("message", eventListener);
44-
for (const message of pendingMessages) {
45-
dispatchEvent(message);
46-
}
47-
});
48-
console.log("removing initial listener");
49-
removeEventListener("message", eventListener);
50-
eventListener = (message) => {
51-
52-
pendingMessages.push(message);
53-
};
54-
55-
addEventListener("message", eventListener);
56-
};
57-
addEventListener("message", eventListener);
58-
`
59-
],
60-
{ 'type': 'application/javascript' }));
61-
}
62-
return url;
63-
},
64-
// Because of the above workaround, the worker is just a blob and
65-
// can't locate the main script using a relative path to itself,
66-
// so we pass the main script location in.
67-
mainScriptUrlOrBlob: rawSkwasmUrl,
19+
// When hosted via a CDN or some other url that is not the same
20+
// origin as the main script of the page, we will fail to create
21+
// a web worker with the bootstrapping script. This workaround will
22+
// make sure that the worker JS can be loaded regardless of where
23+
// it is hosted.
24+
mainScriptUrlOrBlob: new Blob(
25+
[`import '${skwasmUrl}'`],
26+
{ 'type': 'application/javascript' },
27+
),
6828
});
6929
}

engine/src/flutter/lib/web_ui/skwasm/BUILD.gn

Lines changed: 84 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -4,69 +4,96 @@
44

55
import("//build/toolchain/wasm.gni")
66

7-
wasm_lib("skwasm") {
8-
public_configs = [ "//flutter:config" ]
7+
template("skwasm_variant") {
8+
wasm_lib(target_name) {
9+
public_configs = [ "//flutter:config" ]
910

10-
sources = [
11-
"canvas.cpp",
12-
"contour_measure.cpp",
13-
"data.cpp",
14-
"export.h",
15-
"filters.cpp",
16-
"fonts.cpp",
17-
"helpers.h",
18-
"image.cpp",
19-
"paint.cpp",
20-
"path.cpp",
21-
"picture.cpp",
22-
"shaders.cpp",
23-
"skwasm_support.h",
24-
"string.cpp",
25-
"surface.cpp",
26-
"text/line_metrics.cpp",
27-
"text/paragraph.cpp",
28-
"text/paragraph_builder.cpp",
29-
"text/paragraph_style.cpp",
30-
"text/strut_style.cpp",
31-
"text/text_style.cpp",
32-
"vertices.cpp",
33-
"wrappers.h",
34-
]
11+
sources = [
12+
"canvas.cpp",
13+
"contour_measure.cpp",
14+
"data.cpp",
15+
"export.h",
16+
"filters.cpp",
17+
"fonts.cpp",
18+
"helpers.h",
19+
"image.cpp",
20+
"paint.cpp",
21+
"path.cpp",
22+
"picture.cpp",
23+
"shaders.cpp",
24+
"skwasm_support.h",
25+
"string.cpp",
26+
"surface.cpp",
27+
"text/line_metrics.cpp",
28+
"text/paragraph.cpp",
29+
"text/paragraph_builder.cpp",
30+
"text/paragraph_style.cpp",
31+
"text/strut_style.cpp",
32+
"text/text_style.cpp",
33+
"vertices.cpp",
34+
"wrappers.h",
35+
]
36+
37+
cflags = [ "-mreference-types" ]
38+
39+
ldflags = [
40+
"-std=c++20",
41+
"-lGL",
42+
"-sUSE_WEBGL2=1",
43+
"-sMAX_WEBGL_VERSION=2",
44+
"-sOFFSCREENCANVAS_SUPPORT",
45+
"-sALLOW_MEMORY_GROWTH",
46+
"-sALLOW_TABLE_GROWTH",
47+
"-lexports.js",
48+
"-sEXPORTED_FUNCTIONS=[stackAlloc]",
49+
"-sEXPORTED_RUNTIME_METHODS=[addFunction,wasmExports,wasmMemory,stackAlloc]",
50+
"-sINCOMING_MODULE_JS_API=[instantiateWasm,noExitRuntime,mainScriptUrlOrBlob]",
51+
"-sUSE_ES6_IMPORT_META=0",
52+
"--js-library",
53+
rebase_path("library_skwasm_support.js"),
54+
]
3555

36-
cflags = [ "-mreference-types" ]
56+
inputs = [ rebase_path("library_skwasm_support.js") ]
3757

38-
ldflags = [
39-
"-std=c++20",
40-
"-lGL",
41-
"-sUSE_WEBGL2=1",
42-
"-sMAX_WEBGL_VERSION=2",
43-
"-sOFFSCREENCANVAS_SUPPORT",
44-
"-sALLOW_MEMORY_GROWTH",
45-
"-sALLOW_TABLE_GROWTH",
46-
"-lexports.js",
47-
"-sEXPORTED_FUNCTIONS=[stackAlloc]",
48-
"-sEXPORTED_RUNTIME_METHODS=[addFunction,wasmExports,wasmMemory,stackAlloc]",
49-
"-sINCOMING_MODULE_JS_API=[instantiateWasm,locateFile,noExitRuntime,mainScriptUrlOrBlob,wasmMemory,wasm,skwasmSingleThreaded]",
50-
"-sUSE_ES6_IMPORT_META=0",
51-
"--js-library",
52-
rebase_path("library_skwasm_support.js"),
53-
]
58+
if (invoker.multi_threaded) {
59+
sources += [ "surface_mt.cpp" ]
60+
ldflags += [
61+
"-sPTHREAD_POOL_SIZE=1",
62+
"-Wno-pthreads-mem-growth",
63+
"--js-library",
64+
rebase_path("library_skwasm_multi_threaded.js"),
65+
]
66+
inputs += [ rebase_path("library_skwasm_multi_threaded.js") ]
67+
} else {
68+
sources += [ "surface_st.cpp" ]
69+
ldflags += [
70+
"--js-library",
71+
rebase_path("library_skwasm_single_threaded.js"),
72+
]
73+
inputs += [ rebase_path("library_skwasm_single_threaded.js") ]
74+
}
5475

55-
inputs = [ rebase_path("library_skwasm_support.js") ]
76+
if (is_debug) {
77+
ldflags += [
78+
"-sASSERTIONS=1",
79+
"-sGL_ASSERTIONS=1",
80+
]
81+
} else {
82+
ldflags += [ "--closure=1" ]
83+
}
5684

57-
if (is_debug) {
58-
ldflags += [
59-
"-sASSERTIONS=1",
60-
"-sGL_ASSERTIONS=1",
61-
"-sSTACK_OVERFLOW_CHECK=2",
85+
deps = [
86+
"//flutter/skia",
87+
"//flutter/skia/modules/skparagraph",
88+
"//flutter/skia/modules/skunicode",
6289
]
63-
} else {
64-
ldflags += [ "--closure=1" ]
6590
}
91+
}
92+
93+
skwasm_variant("skwasm") {
94+
multi_threaded = true
95+
}
6696

67-
deps = [
68-
"//flutter/skia",
69-
"//flutter/skia/modules/skparagraph",
70-
"//flutter/skia/modules/skunicode",
71-
]
97+
skwasm_variant("skwasm_st") {
98+
multi_threaded = false
7299
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
// Copyright 2013 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
// This file adds JavaScript APIs that are accessible to the C++ layer.
6+
// See: https://emscripten.org/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.html#implement-a-c-api-in-javascript
7+
8+
mergeInto(LibraryManager.library, {
9+
$skwasm_threading_setup__postset: 'skwasm_threading_setup();',
10+
$skwasm_threading_setup: function() {
11+
// This value represents the difference between the time origin of the main
12+
// thread and whichever web worker this code is running on. This is so that
13+
// when we report frame timings, that they are in the same time domain
14+
// regardless of whether they are captured on the main thread or the web
15+
// worker.
16+
let timeOriginDelta = 0;
17+
skwasm_registerMessageListener = function(threadId, listener) {
18+
const eventListener = function({data}) {
19+
const skwasmMessage = data.skwasmMessage;
20+
if (!skwasmMessage) {
21+
return;
22+
}
23+
if (skwasmMessage == 'syncTimeOrigin') {
24+
timeOriginDelta = performance.timeOrigin - data.timeOrigin;
25+
return;
26+
}
27+
listener(data);
28+
};
29+
if (!threadId) {
30+
addEventListener("message", eventListener);
31+
} else {
32+
PThread.pthreads[threadId].addEventListener("message", eventListener);
33+
PThread.pthreads[threadId].postMessage({
34+
skwasmMessage: 'syncTimeOrigin',
35+
timeOrigin: performance.timeOrigin,
36+
});
37+
}
38+
};
39+
skwasm_getCurrentTimestamp = function() {
40+
return performance.now() + timeOriginDelta;
41+
};
42+
skwasm_postMessage = function(message, transfers, threadId) {
43+
if (threadId) {
44+
PThread.pthreads[threadId].postMessage(message, transfers);
45+
} else {
46+
postMessage(message, transfers);
47+
}
48+
};
49+
},
50+
$skwasm_threading_setup__deps: ['$skwasm_registerMessageListener', '$skwasm_getCurrentTimestamp', '$skwasm_postMessage'],
51+
$skwasm_registerMessageListener: function() {},
52+
$skwasm_registerMessageListener__deps: ['$skwasm_threading_setup'],
53+
$skwasm_getCurrentTimestamp: function () {},
54+
$skwasm_getCurrentTimestamp__deps: ['$skwasm_threading_setup'],
55+
$skwasm_postMessage: function () {},
56+
$skwasm_postMessage__deps: ['$skwasm_threading_setup'],
57+
});

0 commit comments

Comments
 (0)