From 7a21ba15ed0385878ba9bf9741b8df9b61ebe3cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20S=C3=B8rvig?= Date: Mon, 15 Jul 2024 14:21:18 +0200 Subject: [PATCH] wasm: support enabling JSPI via QT_EMSCRIPTEN_ASYNCIFY=2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Emscripten has deprecated the "asyncify 2" naming in favor of "-sJSPI", but for now extending the existing asyncify option makes sense for Qt since JSPI is not widely supported yet. There's no difference between these on the C++ code level, and we can set QT_HAVE_EMSCRIPTEN_ASYNCIFY for JSPI as well. Change-Id: I371dfb761e8de3cb7f3273a685bb4219e984e84c Reviewed-by: Piotr WierciƄski --- cmake/QtWasmHelpers.cmake | 6 ++++++ mkspecs/common/wasm/wasm.conf | 11 ++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/cmake/QtWasmHelpers.cmake b/cmake/QtWasmHelpers.cmake index 6c42bd124d5..b30f5895c7a 100644 --- a/cmake/QtWasmHelpers.cmake +++ b/cmake/QtWasmHelpers.cmake @@ -72,6 +72,12 @@ function (qt_internal_setup_wasm_target_properties wasmTarget) target_link_options("${wasmTarget}" INTERFACE "SHELL:-s ASYNCIFY" "-Os") target_compile_definitions("${wasmTarget}" INTERFACE QT_HAVE_EMSCRIPTEN_ASYNCIFY) + elseif ("QT_EMSCRIPTEN_ASYNCIFY=2" IN_LIST QT_QMAKE_DEVICE_OPTIONS) + # Enable JSPI (also known as asyncify 2). Unlike asyncify 1 this + # is supported natively by the browsers, and does not require + # enabling optimizations. + target_link_options("${wasmTarget}" INTERFACE "SHELL:-s JSPI") + target_compile_definitions("${wasmTarget}" INTERFACE QT_HAVE_EMSCRIPTEN_ASYNCIFY) endif() # Set ASYNCIFY_IMPORTS unconditionally in order to support enabling asyncify at link time. diff --git a/mkspecs/common/wasm/wasm.conf b/mkspecs/common/wasm/wasm.conf index 51fa9d7ceb3..6b967d79f24 100644 --- a/mkspecs/common/wasm/wasm.conf +++ b/mkspecs/common/wasm/wasm.conf @@ -8,10 +8,10 @@ include(../clang.conf) load(device_config) load(emcc_ver) -# Support enabling asyncify by configuring with "-device-option QT_EMSCRIPTEN_ASYNCIFY=1" +# Support enabling asyncify by configuring with "-device-option QT_EMSCRIPTEN_ASYNCIFY" !isEmpty(QT_EMSCRIPTEN_ASYNCIFY): { - !equals(QT_EMSCRIPTEN_ASYNCIFY, 1):!equals(QT_EMSCRIPTEN_ASYNCIFY, 0): \ - message(Error: The value for QT_EMSCRIPTEN_ASYNCIFY must be 0 or 1) + !equals(QT_EMSCRIPTEN_ASYNCIFY, 2):!equals(QT_EMSCRIPTEN_ASYNCIFY, 1):!equals(QT_EMSCRIPTEN_ASYNCIFY, 0): \ + message(Error: The value for QT_EMSCRIPTEN_ASYNCIFY must be 0, 1, or 2) equals(QT_EMSCRIPTEN_ASYNCIFY, 1): { QMAKE_CFLAGS += -DQT_HAVE_EMSCRIPTEN_ASYNCIFY QMAKE_CXXFLAGS += -DQT_HAVE_EMSCRIPTEN_ASYNCIFY @@ -23,6 +23,11 @@ load(emcc_ver) # are omitted. Enable optimizations also for debug builds. QMAKE_LFLAGS_DEBUG += -Os } + equals(QT_EMSCRIPTEN_ASYNCIFY, 2): { + QMAKE_CFLAGS += -DQT_HAVE_EMSCRIPTEN_ASYNCIFY + QMAKE_CXXFLAGS += -DQT_HAVE_EMSCRIPTEN_ASYNCIFY + QMAKE_LFLAGS += -s JSPI + } } # Declare async functions