mirror of
https://github.com/saymrwulf/onnxruntime.git
synced 2026-07-30 20:18:08 +00:00
### Description This PR allows WebGPU EP to be built with Emscripten for WebAssembly, Including: - cmake build files update to support correct setup for Emscripten. - code changes to fix build breaks for wasm - change in Web CI pipeline to add a build-only target for wasm with `--use_webgpu`.
118 lines
4.9 KiB
Diff
118 lines
4.9 KiB
Diff
diff --git a/src/emdawnwebgpu/CMakeLists.txt b/src/emdawnwebgpu/CMakeLists.txt
|
|
index de673537d3..c98dc46de7 100644
|
|
--- a/src/emdawnwebgpu/CMakeLists.txt
|
|
+++ b/src/emdawnwebgpu/CMakeLists.txt
|
|
@@ -78,6 +78,7 @@ if (${DAWN_ENABLE_EMSCRIPTEN})
|
|
endif()
|
|
|
|
set(ARGS
|
|
+ ${Python3_EXECUTABLE}
|
|
"${DAWN_EMSCRIPTEN_TOOLCHAIN}/tools/maint/gen_struct_info.py"
|
|
-q
|
|
"${EM_BUILD_GEN_DIR}/struct_info_webgpu.json"
|
|
diff --git a/third_party/emdawnwebgpu/library_webgpu.js b/third_party/emdawnwebgpu/library_webgpu.js
|
|
index d1835cb090..df03ea2f94 100644
|
|
--- a/third_party/emdawnwebgpu/library_webgpu.js
|
|
+++ b/third_party/emdawnwebgpu/library_webgpu.js
|
|
@@ -16,10 +16,19 @@
|
|
throw new Error("To use Dawn's library_webgpu.js, disable -sUSE_WEBGPU and first include Dawn's library_webgpu_struct_info.js and library_webgpu_enum_tables.js (before library_webgpu.js)");
|
|
}
|
|
|
|
+ if (MEMORY64) {
|
|
+ throw new Error("The current implementation of Dawn's library_webgpu.js does not support MEMORY64 yet");
|
|
+ }
|
|
+
|
|
// Helper functions for code generation
|
|
globalThis.gpu = {
|
|
- convertSentinelToUndefined: function(name) {
|
|
- return `if (${name} == -1) ${name} = undefined;`;
|
|
+ convertSentinelToUndefined: function(name, isPtr = false) {
|
|
+ // When `CAN_ADDRESS_2GB` is true, value `-1` is normalized to `0xFFFFFFFF` for pointer.
|
|
+ if (CAN_ADDRESS_2GB && isPtr) {
|
|
+ return `if (${name} == 0xFFFFFFFF) ${name} = undefined;`;
|
|
+ } else {
|
|
+ return `if (${name} == -1) ${name} = undefined;`;
|
|
+ }
|
|
},
|
|
|
|
makeGetBool: function(struct, offset) {
|
|
@@ -700,6 +709,7 @@ var LibraryWebGPU = {
|
|
{{{ makeSetValue('info', C_STRUCTS.WGPUAdapterInfo.adapterType, 'adapterType', 'i32') }}};
|
|
{{{ makeSetValue('info', C_STRUCTS.WGPUAdapterInfo.vendorID, '0', 'i32') }}};
|
|
{{{ makeSetValue('info', C_STRUCTS.WGPUAdapterInfo.deviceID, '0', 'i32') }}};
|
|
+ return 1;
|
|
},
|
|
|
|
wgpuAdapterGetLimits: (adapterPtr, limitsOutPtr) => {
|
|
@@ -882,7 +892,7 @@ var LibraryWebGPU = {
|
|
|
|
if (size === 0) warnOnce('getMappedRange size=0 no longer means WGPU_WHOLE_MAP_SIZE');
|
|
|
|
- {{{ gpu.convertSentinelToUndefined('size') }}}
|
|
+ {{{ gpu.convertSentinelToUndefined('size', true) }}}
|
|
|
|
var mapped;
|
|
try {
|
|
@@ -909,7 +919,7 @@ var LibraryWebGPU = {
|
|
|
|
if (size === 0) warnOnce('getMappedRange size=0 no longer means WGPU_WHOLE_MAP_SIZE');
|
|
|
|
- {{{ gpu.convertSentinelToUndefined('size') }}}
|
|
+ {{{ gpu.convertSentinelToUndefined('size', true) }}}
|
|
|
|
var mapped;
|
|
try {
|
|
@@ -950,7 +960,7 @@ var LibraryWebGPU = {
|
|
var buffer = WebGPU.getJsObject(bufferPtr);
|
|
WebGPU.Internals.bufferOnUnmaps[bufferPtr] = [];
|
|
|
|
- {{{ gpu.convertSentinelToUndefined('size') }}}
|
|
+ {{{ gpu.convertSentinelToUndefined('size', true) }}}
|
|
|
|
{{{ runtimeKeepalivePush() }}}
|
|
WebGPU.Internals.futureInsert(futureId, buffer.mapAsync(mode, offset, size).then(() => {
|
|
@@ -1145,7 +1155,7 @@ var LibraryWebGPU = {
|
|
|
|
wgpuCommandEncoderClearBuffer: (encoderPtr, bufferPtr, offset, size) => {
|
|
var commandEncoder = WebGPU.getJsObject(encoderPtr);
|
|
- {{{ gpu.convertSentinelToUndefined('size') }}}
|
|
+ {{{ gpu.convertSentinelToUndefined('size', true) }}}
|
|
|
|
var buffer = WebGPU.getJsObject(bufferPtr);
|
|
commandEncoder.clearBuffer(buffer, offset, size);
|
|
@@ -2103,7 +2113,7 @@ var LibraryWebGPU = {
|
|
wgpuRenderBundleEncoderSetIndexBuffer: (passPtr, bufferPtr, format, offset, size) => {
|
|
var pass = WebGPU.getJsObject(passPtr);
|
|
var buffer = WebGPU.getJsObject(bufferPtr);
|
|
- {{{ gpu.convertSentinelToUndefined('size') }}}
|
|
+ {{{ gpu.convertSentinelToUndefined('size', true) }}}
|
|
pass.setIndexBuffer(buffer, WebGPU.IndexFormat[format], offset, size);
|
|
},
|
|
|
|
@@ -2116,7 +2126,7 @@ var LibraryWebGPU = {
|
|
wgpuRenderBundleEncoderSetVertexBuffer: (passPtr, slot, bufferPtr, offset, size) => {
|
|
var pass = WebGPU.getJsObject(passPtr);
|
|
var buffer = WebGPU.getJsObject(bufferPtr);
|
|
- {{{ gpu.convertSentinelToUndefined('size') }}}
|
|
+ {{{ gpu.convertSentinelToUndefined('size', true) }}}
|
|
pass.setVertexBuffer(slot, buffer, offset, size);
|
|
},
|
|
|
|
@@ -2211,7 +2221,7 @@ var LibraryWebGPU = {
|
|
wgpuRenderPassEncoderSetIndexBuffer: (passPtr, bufferPtr, format, offset, size) => {
|
|
var pass = WebGPU.getJsObject(passPtr);
|
|
var buffer = WebGPU.getJsObject(bufferPtr);
|
|
- {{{ gpu.convertSentinelToUndefined('size') }}}
|
|
+ {{{ gpu.convertSentinelToUndefined('size', true) }}}
|
|
pass.setIndexBuffer(buffer, WebGPU.IndexFormat[format], offset, size);
|
|
},
|
|
|
|
@@ -2234,7 +2244,7 @@ var LibraryWebGPU = {
|
|
wgpuRenderPassEncoderSetVertexBuffer: (passPtr, slot, bufferPtr, offset, size) => {
|
|
var pass = WebGPU.getJsObject(passPtr);
|
|
var buffer = WebGPU.getJsObject(bufferPtr);
|
|
- {{{ gpu.convertSentinelToUndefined('size') }}}
|
|
+ {{{ gpu.convertSentinelToUndefined('size', true) }}}
|
|
pass.setVertexBuffer(slot, buffer, offset, size);
|
|
},
|
|
|