diff --git a/cmake/external/onnxruntime_external_deps.cmake b/cmake/external/onnxruntime_external_deps.cmake index 4e5875f969..c02530c4e7 100644 --- a/cmake/external/onnxruntime_external_deps.cmake +++ b/cmake/external/onnxruntime_external_deps.cmake @@ -631,7 +631,7 @@ if (onnxruntime_USE_WEBGPU) URL_HASH SHA1=${DEP_SHA1_dawn} # All previous patches are merged into the upstream dawn project. We don't need to apply any patches right now. # if we need to apply patches in the future, we can uncomment the following line. - # PATCH_COMMAND ${Patch_EXECUTABLE} --binary --ignore-whitespace -p1 < ${PROJECT_SOURCE_DIR}/patches/dawn/dawn.patch + PATCH_COMMAND ${Patch_EXECUTABLE} --binary --ignore-whitespace -p1 < ${PROJECT_SOURCE_DIR}/patches/dawn/dawn.patch ) endif() diff --git a/cmake/patches/dawn/dawn.patch b/cmake/patches/dawn/dawn.patch new file mode 100644 index 0000000000..868db0c43e --- /dev/null +++ b/cmake/patches/dawn/dawn.patch @@ -0,0 +1,118 @@ +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); + }, +