Merge pull request #61989 from Faless/js/3.x_threads_gdnative_export

This commit is contained in:
Rémi Verschelde 2022-06-13 12:08:48 +02:00 committed by GitHub
commit 0d2be435ea
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 21 additions and 22 deletions

View file

@ -37,6 +37,8 @@ for ext in env["JS_EXTERNS"]:
build = [] build = []
if env["gdnative_enabled"]: if env["gdnative_enabled"]:
build_targets = ["#bin/godot${PROGSUFFIX}.js", "#bin/godot${PROGSUFFIX}.wasm"] build_targets = ["#bin/godot${PROGSUFFIX}.js", "#bin/godot${PROGSUFFIX}.wasm"]
if env["threads_enabled"]:
build_targets.append("#bin/godot${PROGSUFFIX}.worker.js")
# Reset libraries. The main runtime will only link emscripten libraries, not godot ones. # Reset libraries. The main runtime will only link emscripten libraries, not godot ones.
sys_env["LIBS"] = [] sys_env["LIBS"] = []
# We use IDBFS. Since Emscripten 1.39.1 it needs to be linked explicitly. # We use IDBFS. Since Emscripten 1.39.1 it needs to be linked explicitly.
@ -58,7 +60,7 @@ if env["gdnative_enabled"]:
wasm_env.Append(CCFLAGS=["-s", "SIDE_MODULE=2"]) wasm_env.Append(CCFLAGS=["-s", "SIDE_MODULE=2"])
wasm_env.Append(LINKFLAGS=["-s", "SIDE_MODULE=2"]) wasm_env.Append(LINKFLAGS=["-s", "SIDE_MODULE=2"])
wasm = wasm_env.add_program("#bin/godot.side${PROGSUFFIX}.wasm", javascript_files) wasm = wasm_env.add_program("#bin/godot.side${PROGSUFFIX}.wasm", javascript_files)
build = [sys[0], sys[1], wasm[0]] build = sys + [wasm[0]]
else: else:
build_targets = ["#bin/godot${PROGSUFFIX}.js", "#bin/godot${PROGSUFFIX}.wasm"] build_targets = ["#bin/godot${PROGSUFFIX}.js", "#bin/godot${PROGSUFFIX}.wasm"]
if env["threads_enabled"]: if env["threads_enabled"]:
@ -87,5 +89,5 @@ wrap_list = [
js_wrapped = env.Textfile("#bin/godot", [env.File(f) for f in wrap_list], TEXTFILESUFFIX="${PROGSUFFIX}.wrapped.js") js_wrapped = env.Textfile("#bin/godot", [env.File(f) for f in wrap_list], TEXTFILESUFFIX="${PROGSUFFIX}.wrapped.js")
# Extra will be the thread worker, or the GDNative side, or None # Extra will be the thread worker, or the GDNative side, or None
extra = build[2] if len(build) > 2 else None extra = build[2:] if len(build) > 2 else None
env.CreateTemplateZip(js_wrapped, build[1], extra) env.CreateTemplateZip(js_wrapped, build[1], extra)

View file

@ -174,10 +174,6 @@ def configure(env):
if env["javascript_eval"]: if env["javascript_eval"]:
env.Append(CPPDEFINES=["JAVASCRIPT_EVAL_ENABLED"]) env.Append(CPPDEFINES=["JAVASCRIPT_EVAL_ENABLED"])
if env["threads_enabled"] and env["gdnative_enabled"]:
print("Threads and GDNative support can't be both enabled due to WebAssembly limitations")
sys.exit(255)
# Thread support (via SharedArrayBuffer). # Thread support (via SharedArrayBuffer).
if env["threads_enabled"]: if env["threads_enabled"]:
env.Append(CPPDEFINES=["PTHREAD_NO_RENAME"]) env.Append(CPPDEFINES=["PTHREAD_NO_RENAME"])
@ -194,6 +190,9 @@ def configure(env):
if major < 2 or (major == 2 and minor == 0 and patch < 10): if major < 2 or (major == 2 and minor == 0 and patch < 10):
print("GDNative support requires emscripten >= 2.0.10, detected: %s.%s.%s" % (major, minor, patch)) print("GDNative support requires emscripten >= 2.0.10, detected: %s.%s.%s" % (major, minor, patch))
sys.exit(255) sys.exit(255)
if env["threads_enabled"] and major < 3 or (major == 3 and minor < 1) or (major == 3 and minor == 1 and patch < 14):
print("Threads and GDNative requires emscripten => 3.1.14, detected: %s.%s.%s" % (major, minor, patch))
sys.exit(255)
env.Append(CCFLAGS=["-s", "RELOCATABLE=1"]) env.Append(CCFLAGS=["-s", "RELOCATABLE=1"])
env.Append(LINKFLAGS=["-s", "RELOCATABLE=1"]) env.Append(LINKFLAGS=["-s", "RELOCATABLE=1"])
# Weak symbols are broken upstream: https://github.com/emscripten-core/emscripten/issues/12819 # Weak symbols are broken upstream: https://github.com/emscripten-core/emscripten/issues/12819

View file

@ -52,10 +52,10 @@ def create_template_zip(env, js, wasm, extra):
] ]
# GDNative/Threads specific # GDNative/Threads specific
if env["gdnative_enabled"]: if env["gdnative_enabled"]:
in_files.append(extra) # Runtime in_files.append(extra.pop()) # Runtime
out_files.append(zip_dir.File(binary_name + ".side.wasm")) out_files.append(zip_dir.File(binary_name + ".side.wasm"))
elif env["threads_enabled"]: if env["threads_enabled"]:
in_files.append(extra) # Worker in_files.append(extra.pop()) # Worker
out_files.append(zip_dir.File(binary_name + ".worker.js")) out_files.append(zip_dir.File(binary_name + ".worker.js"))
service_worker = "#misc/dist/html/service-worker.js" service_worker = "#misc/dist/html/service-worker.js"

View file

@ -271,19 +271,16 @@ class EditorExportPlatformJavaScript : public EditorExportPlatform {
EXPORT_MODE_NORMAL = 0, EXPORT_MODE_NORMAL = 0,
EXPORT_MODE_THREADS = 1, EXPORT_MODE_THREADS = 1,
EXPORT_MODE_GDNATIVE = 2, EXPORT_MODE_GDNATIVE = 2,
EXPORT_MODE_THREADS_GDNATIVE = 3,
}; };
String _get_template_name(ExportMode p_mode, bool p_debug) const { String _get_template_name(ExportMode p_mode, bool p_debug) const {
String name = "webassembly"; String name = "webassembly";
switch (p_mode) { if (p_mode & EXPORT_MODE_GDNATIVE) {
case EXPORT_MODE_THREADS: name += "_gdnative";
name += "_threads"; }
break; if (p_mode & EXPORT_MODE_THREADS) {
case EXPORT_MODE_GDNATIVE: name += "_threads";
name += "_gdnative";
break;
default:
break;
} }
if (p_debug) { if (p_debug) {
name += "_debug.zip"; name += "_debug.zip";
@ -540,7 +537,7 @@ Error EditorExportPlatformJavaScript::_build_pwa(const Ref<EditorExportPreset> &
cache_files.push_back(name + ".icon.png"); cache_files.push_back(name + ".icon.png");
cache_files.push_back(name + ".apple-touch-icon.png"); cache_files.push_back(name + ".apple-touch-icon.png");
} }
if (mode == EXPORT_MODE_THREADS) { if (mode & EXPORT_MODE_THREADS) {
cache_files.push_back(name + ".worker.js"); cache_files.push_back(name + ".worker.js");
cache_files.push_back(name + ".audio.worklet.js"); cache_files.push_back(name + ".audio.worklet.js");
} }
@ -550,7 +547,7 @@ Error EditorExportPlatformJavaScript::_build_pwa(const Ref<EditorExportPreset> &
Array opt_cache_files; Array opt_cache_files;
opt_cache_files.push_back(name + ".wasm"); opt_cache_files.push_back(name + ".wasm");
opt_cache_files.push_back(name + ".pck"); opt_cache_files.push_back(name + ".pck");
if (mode == EXPORT_MODE_GDNATIVE) { if (mode & EXPORT_MODE_GDNATIVE) {
opt_cache_files.push_back(name + ".side.wasm"); opt_cache_files.push_back(name + ".side.wasm");
for (int i = 0; i < p_shared_objects.size(); i++) { for (int i = 0; i < p_shared_objects.size(); i++) {
opt_cache_files.push_back(p_shared_objects[i].path.get_file()); opt_cache_files.push_back(p_shared_objects[i].path.get_file());
@ -646,9 +643,10 @@ void EditorExportPlatformJavaScript::get_preset_features(const Ref<EditorExportP
} }
} }
ExportMode mode = (ExportMode)(int)p_preset->get("variant/export_type"); ExportMode mode = (ExportMode)(int)p_preset->get("variant/export_type");
if (mode == EXPORT_MODE_THREADS) { if (mode & EXPORT_MODE_THREADS) {
r_features->push_back("threads"); r_features->push_back("threads");
} else if (mode == EXPORT_MODE_GDNATIVE) { }
if (mode & EXPORT_MODE_GDNATIVE) {
r_features->push_back("wasm32"); r_features->push_back("wasm32");
} }
} }