cocos-engine-external/emscripten/webgpu/webgpu_wasm.js

5851 lines
209 KiB
JavaScript

var wasmDevice = (() => {
var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined;
return (
function(moduleArg = {}) {
// include: shell.js
// The Module object: Our interface to the outside world. We import
// and export values on it. There are various ways Module can be used:
// 1. Not defined. We create it here
// 2. A function parameter, function(Module) { ..generated code.. }
// 3. pre-run appended it, var Module = {}; ..generated code..
// 4. External script tag defines var Module.
// We need to check if Module already exists (e.g. case 3 above).
// Substitution will be replaced with actual code on later stage of the build,
// this way Closure Compiler will not mangle it (e.g. case 4. above).
// Note that if you want to run closure, and also to use Module
// after the generated code, you will need to define var Module = {};
// before the code. Then that object will be used in the code, and you
// can continue to use Module afterwards as well.
var Module = moduleArg;
// Set up the promise that indicates the Module is initialized
var readyPromiseResolve, readyPromiseReject;
Module['ready'] = new Promise((resolve, reject) => {
readyPromiseResolve = resolve;
readyPromiseReject = reject;
});
["_memory","___indirect_function_table","_fflush","__embind_initialize_bindings","___set_stack_limits","onRuntimeInitialized"].forEach((prop) => {
if (!Object.getOwnPropertyDescriptor(Module['ready'], prop)) {
Object.defineProperty(Module['ready'], prop, {
get: () => abort('You are getting ' + prop + ' on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js'),
set: () => abort('You are setting ' + prop + ' on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js'),
});
}
});
// --pre-jses are emitted after the Module integration code, so that they can
// refer to Module (if they choose; they can also define Module)
// Sometimes an existing Module object exists with properties
// meant to overwrite the default module functionality. Here
// we collect those properties and reapply _after_ we configure
// the current environment's defaults to avoid having to be so
// defensive during initialization.
var moduleOverrides = Object.assign({}, Module);
var arguments_ = [];
var thisProgram = './this.program';
var quit_ = (status, toThrow) => {
throw toThrow;
};
// Determine the runtime environment we are in. You can customize this by
// setting the ENVIRONMENT setting at compile time (see settings.js).
var ENVIRONMENT_IS_WEB = true;
var ENVIRONMENT_IS_WORKER = false;
var ENVIRONMENT_IS_NODE = false;
var ENVIRONMENT_IS_SHELL = false;
if (Module['ENVIRONMENT']) {
throw new Error('Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -sENVIRONMENT=web or -sENVIRONMENT=node)');
}
// `/` should be present at the end if `scriptDirectory` is not empty
var scriptDirectory = '';
function locateFile(path) {
if (Module['locateFile']) {
return Module['locateFile'](path, scriptDirectory);
}
return scriptDirectory + path;
}
// Hooks that are implemented differently in different runtime environments.
var read_,
readAsync,
readBinary,
setWindowTitle;
if (ENVIRONMENT_IS_SHELL) {
if ((typeof process == 'object' && typeof require === 'function') || typeof window == 'object' || typeof importScripts == 'function') throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)');
if (typeof read != 'undefined') {
read_ = read;
}
readBinary = (f) => {
if (typeof readbuffer == 'function') {
return new Uint8Array(readbuffer(f));
}
let data = read(f, 'binary');
assert(typeof data == 'object');
return data;
};
readAsync = (f, onload, onerror) => {
setTimeout(() => onload(readBinary(f)));
};
if (typeof clearTimeout == 'undefined') {
globalThis.clearTimeout = (id) => {};
}
if (typeof setTimeout == 'undefined') {
// spidermonkey lacks setTimeout but we use it above in readAsync.
globalThis.setTimeout = (f) => (typeof f == 'function') ? f() : abort();
}
if (typeof scriptArgs != 'undefined') {
arguments_ = scriptArgs;
} else if (typeof arguments != 'undefined') {
arguments_ = arguments;
}
if (typeof quit == 'function') {
quit_ = (status, toThrow) => {
// Unlike node which has process.exitCode, d8 has no such mechanism. So we
// have no way to set the exit code and then let the program exit with
// that code when it naturally stops running (say, when all setTimeouts
// have completed). For that reason, we must call `quit` - the only way to
// set the exit code - but quit also halts immediately. To increase
// consistency with node (and the web) we schedule the actual quit call
// using a setTimeout to give the current stack and any exception handlers
// a chance to run. This enables features such as addOnPostRun (which
// expected to be able to run code after main returns).
setTimeout(() => {
if (!(toThrow instanceof ExitStatus)) {
let toLog = toThrow;
if (toThrow && typeof toThrow == 'object' && toThrow.stack) {
toLog = [toThrow, toThrow.stack];
}
err(`exiting due to exception: ${toLog}`);
}
quit(status);
});
throw toThrow;
};
}
if (typeof print != 'undefined') {
// Prefer to use print/printErr where they exist, as they usually work better.
if (typeof console == 'undefined') console = /** @type{!Console} */({});
console.log = /** @type{!function(this:Console, ...*): undefined} */ (print);
console.warn = console.error = /** @type{!function(this:Console, ...*): undefined} */ (typeof printErr != 'undefined' ? printErr : print);
}
} else
// Note that this includes Node.js workers when relevant (pthreads is enabled).
// Node.js workers are detected as a combination of ENVIRONMENT_IS_WORKER and
// ENVIRONMENT_IS_NODE.
if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
if (ENVIRONMENT_IS_WORKER) { // Check worker, not web, since window could be polyfilled
scriptDirectory = self.location.href;
} else if (typeof document != 'undefined' && document.currentScript) { // web
scriptDirectory = document.currentScript.src;
}
// When MODULARIZE, this JS may be executed later, after document.currentScript
// is gone, so we saved it, and we use it here instead of any other info.
if (_scriptDir) {
scriptDirectory = _scriptDir;
}
// blob urls look like blob:http://site.com/etc/etc and we cannot infer anything from them.
// otherwise, slice off the final part of the url to find the script directory.
// if scriptDirectory does not contain a slash, lastIndexOf will return -1,
// and scriptDirectory will correctly be replaced with an empty string.
// If scriptDirectory contains a query (starting with ?) or a fragment (starting with #),
// they are removed because they could contain a slash.
if (scriptDirectory.indexOf('blob:') !== 0) {
scriptDirectory = scriptDirectory.substr(0, scriptDirectory.replace(/[?#].*/, "").lastIndexOf('/')+1);
} else {
scriptDirectory = '';
}
if (!(typeof window == 'object' || typeof importScripts == 'function')) throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)');
// Differentiate the Web Worker from the Node Worker case, as reading must
// be done differently.
{
// include: web_or_worker_shell_read.js
read_ = (url) => {
var xhr = new XMLHttpRequest();
xhr.open('GET', url, false);
xhr.send(null);
return xhr.responseText;
}
if (ENVIRONMENT_IS_WORKER) {
readBinary = (url) => {
var xhr = new XMLHttpRequest();
xhr.open('GET', url, false);
xhr.responseType = 'arraybuffer';
xhr.send(null);
return new Uint8Array(/** @type{!ArrayBuffer} */(xhr.response));
};
}
readAsync = (url, onload, onerror) => {
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = 'arraybuffer';
xhr.onload = () => {
if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0
onload(xhr.response);
return;
}
onerror();
};
xhr.onerror = onerror;
xhr.send(null);
}
// end include: web_or_worker_shell_read.js
}
setWindowTitle = (title) => document.title = title;
} else
{
throw new Error('environment detection error');
}
var out = Module['print'] || console.log.bind(console);
var err = Module['printErr'] || console.error.bind(console);
// Merge back in the overrides
Object.assign(Module, moduleOverrides);
// Free the object hierarchy contained in the overrides, this lets the GC
// reclaim data used e.g. in memoryInitializerRequest, which is a large typed array.
moduleOverrides = null;
checkIncomingModuleAPI();
// Emit code to handle expected values on the Module object. This applies Module.x
// to the proper local x. This has two benefits: first, we only emit it if it is
// expected to arrive, and second, by using a local everywhere else that can be
// minified.
if (Module['arguments']) arguments_ = Module['arguments'];legacyModuleProp('arguments', 'arguments_');
if (Module['thisProgram']) thisProgram = Module['thisProgram'];legacyModuleProp('thisProgram', 'thisProgram');
if (Module['quit']) quit_ = Module['quit'];legacyModuleProp('quit', 'quit_');
// perform assertions in shell.js after we set up out() and err(), as otherwise if an assertion fails it cannot print the message
// Assertions on removed incoming Module JS APIs.
assert(typeof Module['memoryInitializerPrefixURL'] == 'undefined', 'Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead');
assert(typeof Module['pthreadMainPrefixURL'] == 'undefined', 'Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead');
assert(typeof Module['cdInitializerPrefixURL'] == 'undefined', 'Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead');
assert(typeof Module['filePackagePrefixURL'] == 'undefined', 'Module.filePackagePrefixURL option was removed, use Module.locateFile instead');
assert(typeof Module['read'] == 'undefined', 'Module.read option was removed (modify read_ in JS)');
assert(typeof Module['readAsync'] == 'undefined', 'Module.readAsync option was removed (modify readAsync in JS)');
assert(typeof Module['readBinary'] == 'undefined', 'Module.readBinary option was removed (modify readBinary in JS)');
assert(typeof Module['setWindowTitle'] == 'undefined', 'Module.setWindowTitle option was removed (modify setWindowTitle in JS)');
assert(typeof Module['TOTAL_MEMORY'] == 'undefined', 'Module.TOTAL_MEMORY has been renamed Module.INITIAL_MEMORY');
legacyModuleProp('asm', 'wasmExports');
legacyModuleProp('read', 'read_');
legacyModuleProp('readAsync', 'readAsync');
legacyModuleProp('readBinary', 'readBinary');
legacyModuleProp('setWindowTitle', 'setWindowTitle');
var IDBFS = 'IDBFS is no longer included by default; build with -lidbfs.js';
var PROXYFS = 'PROXYFS is no longer included by default; build with -lproxyfs.js';
var WORKERFS = 'WORKERFS is no longer included by default; build with -lworkerfs.js';
var FETCHFS = 'FETCHFS is no longer included by default; build with -lfetchfs.js';
var ICASEFS = 'ICASEFS is no longer included by default; build with -licasefs.js';
var JSFILEFS = 'JSFILEFS is no longer included by default; build with -ljsfilefs.js';
var OPFS = 'OPFS is no longer included by default; build with -lopfs.js';
var NODEFS = 'NODEFS is no longer included by default; build with -lnodefs.js';
assert(!ENVIRONMENT_IS_WORKER, "worker environment detected but not enabled at build time. Add 'worker' to `-sENVIRONMENT` to enable.");
assert(!ENVIRONMENT_IS_NODE, "node environment detected but not enabled at build time. Add 'node' to `-sENVIRONMENT` to enable.");
assert(!ENVIRONMENT_IS_SHELL, "shell environment detected but not enabled at build time. Add 'shell' to `-sENVIRONMENT` to enable.");
// end include: shell.js
// include: preamble.js
// === Preamble library stuff ===
// Documentation for the public APIs defined in this file must be updated in:
// site/source/docs/api_reference/preamble.js.rst
// A prebuilt local version of the documentation is available at:
// site/build/text/docs/api_reference/preamble.js.txt
// You can also build docs locally as HTML or other formats in site/
// An online HTML version (which may be of a different version of Emscripten)
// is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html
var wasmBinary;
if (Module['wasmBinary']) wasmBinary = Module['wasmBinary'];legacyModuleProp('wasmBinary', 'wasmBinary');
var noExitRuntime = Module['noExitRuntime'] || true;legacyModuleProp('noExitRuntime', 'noExitRuntime');
if (typeof WebAssembly != 'object') {
abort('no native wasm support detected');
}
// Wasm globals
var wasmMemory;
//========================================
// Runtime essentials
//========================================
// whether we are quitting the application. no code should run after this.
// set in exit() and abort()
var ABORT = false;
// set by exit() and abort(). Passed to 'onExit' handler.
// NOTE: This is also used as the process return code code in shell environments
// but only when noExitRuntime is false.
var EXITSTATUS;
/** @type {function(*, string=)} */
function assert(condition, text) {
if (!condition) {
abort('Assertion failed' + (text ? ': ' + text : ''));
}
}
// We used to include malloc/free by default in the past. Show a helpful error in
// builds with assertions.
// Memory management
var HEAP,
/** @type {!Int8Array} */
HEAP8,
/** @type {!Uint8Array} */
HEAPU8,
/** @type {!Int16Array} */
HEAP16,
/** @type {!Uint16Array} */
HEAPU16,
/** @type {!Int32Array} */
HEAP32,
/** @type {!Uint32Array} */
HEAPU32,
/** @type {!Float32Array} */
HEAPF32,
/** @type {!Float64Array} */
HEAPF64;
function updateMemoryViews() {
var b = wasmMemory.buffer;
Module['HEAP8'] = HEAP8 = new Int8Array(b);
Module['HEAP16'] = HEAP16 = new Int16Array(b);
Module['HEAPU8'] = HEAPU8 = new Uint8Array(b);
Module['HEAPU16'] = HEAPU16 = new Uint16Array(b);
Module['HEAP32'] = HEAP32 = new Int32Array(b);
Module['HEAPU32'] = HEAPU32 = new Uint32Array(b);
Module['HEAPF32'] = HEAPF32 = new Float32Array(b);
Module['HEAPF64'] = HEAPF64 = new Float64Array(b);
}
assert(!Module['STACK_SIZE'], 'STACK_SIZE can no longer be set at runtime. Use -sSTACK_SIZE at link time')
assert(typeof Int32Array != 'undefined' && typeof Float64Array !== 'undefined' && Int32Array.prototype.subarray != undefined && Int32Array.prototype.set != undefined,
'JS engine does not provide full typed array support');
// If memory is defined in wasm, the user can't provide it, or set INITIAL_MEMORY
assert(!Module['wasmMemory'], 'Use of `wasmMemory` detected. Use -sIMPORTED_MEMORY to define wasmMemory externally');
assert(!Module['INITIAL_MEMORY'], 'Detected runtime INITIAL_MEMORY setting. Use -sIMPORTED_MEMORY to define wasmMemory dynamically');
// include: runtime_init_table.js
// In regular non-RELOCATABLE mode the table is exported
// from the wasm module and this will be assigned once
// the exports are available.
var wasmTable;
// end include: runtime_init_table.js
// include: runtime_stack_check.js
// Initializes the stack cookie. Called at the startup of main and at the startup of each thread in pthreads mode.
function writeStackCookie() {
var max = _emscripten_stack_get_end();
assert((max & 3) == 0);
// If the stack ends at address zero we write our cookies 4 bytes into the
// stack. This prevents interference with SAFE_HEAP and ASAN which also
// monitor writes to address zero.
if (max == 0) {
max += 4;
}
// The stack grow downwards towards _emscripten_stack_get_end.
// We write cookies to the final two words in the stack and detect if they are
// ever overwritten.
HEAPU32[((max)>>2)] = 0x02135467;checkInt32(0x02135467);
HEAPU32[(((max)+(4))>>2)] = 0x89BACDFE;checkInt32(0x89BACDFE);
// Also test the global address 0 for integrity.
HEAPU32[((0)>>2)] = 1668509029;checkInt32(1668509029);
}
function checkStackCookie() {
if (ABORT) return;
var max = _emscripten_stack_get_end();
// See writeStackCookie().
if (max == 0) {
max += 4;
}
var cookie1 = HEAPU32[((max)>>2)];
var cookie2 = HEAPU32[(((max)+(4))>>2)];
if (cookie1 != 0x02135467 || cookie2 != 0x89BACDFE) {
abort(`Stack overflow! Stack cookie has been overwritten at ${ptrToString(max)}, expected hex dwords 0x89BACDFE and 0x2135467, but received ${ptrToString(cookie2)} ${ptrToString(cookie1)}`);
}
// Also test the global address 0 for integrity.
if (HEAPU32[((0)>>2)] != 0x63736d65 /* 'emsc' */) {
abort('Runtime error: The application has corrupted its heap memory area (address zero)!');
}
}
// end include: runtime_stack_check.js
// include: runtime_assertions.js
// Endianness check
(function() {
var h16 = new Int16Array(1);
var h8 = new Int8Array(h16.buffer);
h16[0] = 0x6373;
if (h8[0] !== 0x73 || h8[1] !== 0x63) throw 'Runtime error: expected the system to be little-endian! (Run with -sSUPPORT_BIG_ENDIAN to bypass)';
})();
// end include: runtime_assertions.js
var __ATPRERUN__ = []; // functions called before the runtime is initialized
var __ATINIT__ = []; // functions called during startup
var __ATEXIT__ = []; // functions called during shutdown
var __ATPOSTRUN__ = []; // functions called after the main() is called
var runtimeInitialized = false;
var runtimeKeepaliveCounter = 0;
function keepRuntimeAlive() {
return noExitRuntime || runtimeKeepaliveCounter > 0;
}
function preRun() {
if (Module['preRun']) {
if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']];
while (Module['preRun'].length) {
addOnPreRun(Module['preRun'].shift());
}
}
callRuntimeCallbacks(__ATPRERUN__);
}
function initRuntime() {
assert(!runtimeInitialized);
runtimeInitialized = true;
checkStackCookie();
setStackLimits();
callRuntimeCallbacks(__ATINIT__);
}
function postRun() {
checkStackCookie();
if (Module['postRun']) {
if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']];
while (Module['postRun'].length) {
addOnPostRun(Module['postRun'].shift());
}
}
callRuntimeCallbacks(__ATPOSTRUN__);
}
function addOnPreRun(cb) {
__ATPRERUN__.unshift(cb);
}
function addOnInit(cb) {
__ATINIT__.unshift(cb);
}
function addOnExit(cb) {
}
function addOnPostRun(cb) {
__ATPOSTRUN__.unshift(cb);
}
// include: runtime_math.js
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/fround
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc
assert(Math.imul, 'This browser does not support Math.imul(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill');
assert(Math.fround, 'This browser does not support Math.fround(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill');
assert(Math.clz32, 'This browser does not support Math.clz32(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill');
assert(Math.trunc, 'This browser does not support Math.trunc(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill');
// end include: runtime_math.js
// A counter of dependencies for calling run(). If we need to
// do asynchronous work before running, increment this and
// decrement it. Incrementing must happen in a place like
// Module.preRun (used by emcc to add file preloading).
// Note that you can add dependencies in preRun, even though
// it happens right before run - run will be postponed until
// the dependencies are met.
var runDependencies = 0;
var runDependencyWatcher = null;
var dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled
var runDependencyTracking = {};
function getUniqueRunDependency(id) {
var orig = id;
while (1) {
if (!runDependencyTracking[id]) return id;
id = orig + Math.random();
}
}
function addRunDependency(id) {
runDependencies++;
if (Module['monitorRunDependencies']) {
Module['monitorRunDependencies'](runDependencies);
}
if (id) {
assert(!runDependencyTracking[id]);
runDependencyTracking[id] = 1;
if (runDependencyWatcher === null && typeof setInterval != 'undefined') {
// Check for missing dependencies every few seconds
runDependencyWatcher = setInterval(() => {
if (ABORT) {
clearInterval(runDependencyWatcher);
runDependencyWatcher = null;
return;
}
var shown = false;
for (var dep in runDependencyTracking) {
if (!shown) {
shown = true;
err('still waiting on run dependencies:');
}
err(`dependency: ${dep}`);
}
if (shown) {
err('(end of list)');
}
}, 10000);
}
} else {
err('warning: run dependency added without ID');
}
}
function removeRunDependency(id) {
runDependencies--;
if (Module['monitorRunDependencies']) {
Module['monitorRunDependencies'](runDependencies);
}
if (id) {
assert(runDependencyTracking[id]);
delete runDependencyTracking[id];
} else {
err('warning: run dependency removed without ID');
}
if (runDependencies == 0) {
if (runDependencyWatcher !== null) {
clearInterval(runDependencyWatcher);
runDependencyWatcher = null;
}
if (dependenciesFulfilled) {
var callback = dependenciesFulfilled;
dependenciesFulfilled = null;
callback(); // can add another dependenciesFulfilled
}
}
}
/** @param {string|number=} what */
function abort(what) {
if (Module['onAbort']) {
Module['onAbort'](what);
}
what = 'Aborted(' + what + ')';
// TODO(sbc): Should we remove printing and leave it up to whoever
// catches the exception?
err(what);
ABORT = true;
EXITSTATUS = 1;
// Use a wasm runtime error, because a JS error might be seen as a foreign
// exception, which means we'd run destructors on it. We need the error to
// simply make the program stop.
// FIXME This approach does not work in Wasm EH because it currently does not assume
// all RuntimeErrors are from traps; it decides whether a RuntimeError is from
// a trap or not based on a hidden field within the object. So at the moment
// we don't have a way of throwing a wasm trap from JS. TODO Make a JS API that
// allows this in the wasm spec.
// Suppress closure compiler warning here. Closure compiler's builtin extern
// defintion for WebAssembly.RuntimeError claims it takes no arguments even
// though it can.
// TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure gets fixed.
/** @suppress {checkTypes} */
var e = new WebAssembly.RuntimeError(what);
readyPromiseReject(e);
// Throw the error whether or not MODULARIZE is set because abort is used
// in code paths apart from instantiation where an exception is expected
// to be thrown when abort is called.
throw e;
}
// include: memoryprofiler.js
// end include: memoryprofiler.js
// show errors on likely calls to FS when it was not included
var FS = {
error() {
abort('Filesystem support (FS) was not included. The problem is that you are using files from JS, but files were not used from C/C++, so filesystem support was not auto-included. You can force-include filesystem support with -sFORCE_FILESYSTEM');
},
init() { FS.error() },
createDataFile() { FS.error() },
createPreloadedFile() { FS.error() },
createLazyFile() { FS.error() },
open() { FS.error() },
mkdev() { FS.error() },
registerDevice() { FS.error() },
analyzePath() { FS.error() },
ErrnoError() { FS.error() },
};
Module['FS_createDataFile'] = FS.createDataFile;
Module['FS_createPreloadedFile'] = FS.createPreloadedFile;
// include: URIUtils.js
// Prefix of data URIs emitted by SINGLE_FILE and related options.
var dataURIPrefix = 'data:application/octet-stream;base64,';
// Indicates whether filename is a base64 data URI.
function isDataURI(filename) {
// Prefix of data URIs emitted by SINGLE_FILE and related options.
return filename.startsWith(dataURIPrefix);
}
// Indicates whether filename is delivered via file protocol (as opposed to http/https)
function isFileURI(filename) {
return filename.startsWith('file://');
}
// end include: URIUtils.js
function createExportWrapper(name) {
return function() {
assert(runtimeInitialized, `native function \`${name}\` called before runtime initialization`);
var f = wasmExports[name];
assert(f, `exported native function \`${name}\` not found`);
return f.apply(null, arguments);
};
}
// include: runtime_exceptions.js
// end include: runtime_exceptions.js
var wasmBinaryFile;
wasmBinaryFile = 'webgpu_wasm.wasm';
if (!isDataURI(wasmBinaryFile)) {
wasmBinaryFile = locateFile(wasmBinaryFile);
}
function getBinarySync(file) {
if (file == wasmBinaryFile && wasmBinary) {
return new Uint8Array(wasmBinary);
}
if (readBinary) {
return readBinary(file);
}
throw "both async and sync fetching of the wasm failed";
}
function getBinaryPromise(binaryFile) {
// If we don't have the binary yet, try to load it asynchronously.
// Fetch has some additional restrictions over XHR, like it can't be used on a file:// url.
// See https://github.com/github/fetch/pull/92#issuecomment-140665932
// Cordova or Electron apps are typically loaded from a file:// url.
// So use fetch if it is available and the url is not a file, otherwise fall back to XHR.
if (!wasmBinary
&& (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) {
if (typeof fetch == 'function'
) {
return fetch(binaryFile, { credentials: 'same-origin' }).then((response) => {
if (!response['ok']) {
throw "failed to load wasm binary file at '" + binaryFile + "'";
}
return response['arrayBuffer']();
}).catch(() => getBinarySync(binaryFile));
}
}
// Otherwise, getBinarySync should be able to get it synchronously
return Promise.resolve().then(() => getBinarySync(binaryFile));
}
function instantiateArrayBuffer(binaryFile, imports, receiver) {
return getBinaryPromise(binaryFile).then((binary) => {
return WebAssembly.instantiate(binary, imports);
}).then((instance) => {
return instance;
}).then(receiver, (reason) => {
err(`failed to asynchronously prepare wasm: ${reason}`);
// Warn on some common problems.
if (isFileURI(wasmBinaryFile)) {
err(`warning: Loading from a file URI (${wasmBinaryFile}) is not supported in most browsers. See https://emscripten.org/docs/getting_started/FAQ.html#how-do-i-run-a-local-webserver-for-testing-why-does-my-program-stall-in-downloading-or-preparing`);
}
abort(reason);
});
}
function instantiateAsync(binary, binaryFile, imports, callback) {
if (!binary &&
typeof WebAssembly.instantiateStreaming == 'function' &&
!isDataURI(binaryFile) &&
typeof fetch == 'function') {
return fetch(binaryFile, { credentials: 'same-origin' }).then((response) => {
// Suppress closure warning here since the upstream definition for
// instantiateStreaming only allows Promise<Repsponse> rather than
// an actual Response.
// TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure is fixed.
/** @suppress {checkTypes} */
var result = WebAssembly.instantiateStreaming(response, imports);
return result.then(
callback,
function(reason) {
// We expect the most common failure cause to be a bad MIME type for the binary,
// in which case falling back to ArrayBuffer instantiation should work.
err(`wasm streaming compile failed: ${reason}`);
err('falling back to ArrayBuffer instantiation');
return instantiateArrayBuffer(binaryFile, imports, callback);
});
});
}
return instantiateArrayBuffer(binaryFile, imports, callback);
}
// Create the wasm instance.
// Receives the wasm imports, returns the exports.
function createWasm() {
// prepare imports
var info = {
'env': wasmImports,
'wasi_snapshot_preview1': wasmImports,
};
// Load the wasm module and create an instance of using native support in the JS engine.
// handle a generated wasm instance, receiving its exports and
// performing other necessary setup
/** @param {WebAssembly.Module=} module*/
function receiveInstance(instance, module) {
var exports = instance.exports;
wasmExports = exports;
wasmMemory = wasmExports['memory'];
assert(wasmMemory, "memory not found in wasm exports");
// This assertion doesn't hold when emscripten is run in --post-link
// mode.
// TODO(sbc): Read INITIAL_MEMORY out of the wasm file in post-link mode.
//assert(wasmMemory.buffer.byteLength === 16777216);
updateMemoryViews();
wasmTable = wasmExports['__indirect_function_table'];
assert(wasmTable, "table not found in wasm exports");
addOnInit(wasmExports['__wasm_call_ctors']);
removeRunDependency('wasm-instantiate');
return exports;
}
// wait for the pthread pool (if any)
addRunDependency('wasm-instantiate');
// Prefer streaming instantiation if available.
// Async compilation can be confusing when an error on the page overwrites Module
// (for example, if the order of elements is wrong, and the one defining Module is
// later), so we save Module and check it later.
var trueModule = Module;
function receiveInstantiationResult(result) {
// 'result' is a ResultObject object which has both the module and instance.
// receiveInstance() will swap in the exports (to Module.asm) so they can be called
assert(Module === trueModule, 'the Module object should not be replaced during async compilation - perhaps the order of HTML elements is wrong?');
trueModule = null;
// TODO: Due to Closure regression https://github.com/google/closure-compiler/issues/3193, the above line no longer optimizes out down to the following line.
// When the regression is fixed, can restore the above PTHREADS-enabled path.
receiveInstance(result['instance']);
}
// User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback
// to manually instantiate the Wasm module themselves. This allows pages to
// run the instantiation parallel to any other async startup actions they are
// performing.
// Also pthreads and wasm workers initialize the wasm instance through this
// path.
if (Module['instantiateWasm']) {
try {
return Module['instantiateWasm'](info, receiveInstance);
} catch(e) {
err(`Module.instantiateWasm callback failed with error: ${e}`);
// If instantiation fails, reject the module ready promise.
readyPromiseReject(e);
}
}
// If instantiation fails, reject the module ready promise.
instantiateAsync(wasmBinary, wasmBinaryFile, info, receiveInstantiationResult).catch(readyPromiseReject);
return {}; // no exports yet; we'll fill them in later
}
// Globals used by JS i64 conversions (see makeSetValue)
var tempDouble;
var tempI64;
// include: runtime_debug.js
function legacyModuleProp(prop, newName, incomming=true) {
if (!Object.getOwnPropertyDescriptor(Module, prop)) {
Object.defineProperty(Module, prop, {
configurable: true,
get() {
let extra = incomming ? ' (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)' : '';
abort(`\`Module.${prop}\` has been replaced by \`${newName}\`` + extra);
}
});
}
}
function ignoredModuleProp(prop) {
if (Object.getOwnPropertyDescriptor(Module, prop)) {
abort(`\`Module.${prop}\` was supplied but \`${prop}\` not included in INCOMING_MODULE_JS_API`);
}
}
// forcing the filesystem exports a few things by default
function isExportedByForceFilesystem(name) {
return name === 'FS_createPath' ||
name === 'FS_createDataFile' ||
name === 'FS_createPreloadedFile' ||
name === 'FS_unlink' ||
name === 'addRunDependency' ||
// The old FS has some functionality that WasmFS lacks.
name === 'FS_createLazyFile' ||
name === 'FS_createDevice' ||
name === 'removeRunDependency';
}
function missingGlobal(sym, msg) {
if (typeof globalThis !== 'undefined') {
Object.defineProperty(globalThis, sym, {
configurable: true,
get() {
warnOnce('`' + sym + '` is not longer defined by emscripten. ' + msg);
return undefined;
}
});
}
}
missingGlobal('buffer', 'Please use HEAP8.buffer or wasmMemory.buffer');
missingGlobal('asm', 'Please use wasmExports instead');
function missingLibrarySymbol(sym) {
if (typeof globalThis !== 'undefined' && !Object.getOwnPropertyDescriptor(globalThis, sym)) {
Object.defineProperty(globalThis, sym, {
configurable: true,
get() {
// Can't `abort()` here because it would break code that does runtime
// checks. e.g. `if (typeof SDL === 'undefined')`.
var msg = '`' + sym + '` is a library symbol and not included by default; add it to your library.js __deps or to DEFAULT_LIBRARY_FUNCS_TO_INCLUDE on the command line';
// DEFAULT_LIBRARY_FUNCS_TO_INCLUDE requires the name as it appears in
// library.js, which means $name for a JS name with no prefix, or name
// for a JS name like _name.
var librarySymbol = sym;
if (!librarySymbol.startsWith('_')) {
librarySymbol = '$' + sym;
}
msg += " (e.g. -sDEFAULT_LIBRARY_FUNCS_TO_INCLUDE='" + librarySymbol + "')";
if (isExportedByForceFilesystem(sym)) {
msg += '. Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you';
}
warnOnce(msg);
return undefined;
}
});
}
// Any symbol that is not included from the JS libary is also (by definition)
// not exported on the Module object.
unexportedRuntimeSymbol(sym);
}
function unexportedRuntimeSymbol(sym) {
if (!Object.getOwnPropertyDescriptor(Module, sym)) {
Object.defineProperty(Module, sym, {
configurable: true,
get() {
var msg = "'" + sym + "' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the Emscripten FAQ)";
if (isExportedByForceFilesystem(sym)) {
msg += '. Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you';
}
abort(msg);
}
});
}
}
var MAX_UINT8 = (2 ** 8) - 1;
var MAX_UINT16 = (2 ** 16) - 1;
var MAX_UINT32 = (2 ** 32) - 1;
var MAX_UINT53 = (2 ** 53) - 1;
var MAX_UINT64 = (2 ** 64) - 1;
var MIN_INT8 = - (2 ** ( 8 - 1)) + 1;
var MIN_INT16 = - (2 ** (16 - 1)) + 1;
var MIN_INT32 = - (2 ** (32 - 1)) + 1;
var MIN_INT53 = - (2 ** (53 - 1)) + 1;
var MIN_INT64 = - (2 ** (64 - 1)) + 1;
function checkInt(value, bits, min, max) {
assert(Number.isInteger(Number(value)), "attempt to write non-integer (" + value + ") into integer heap");
assert(value <= max, "value (" + value + ") too large to write as " + bits +"-bit value");
assert(value >= min, "value (" + value + ") too small to write as " + bits +"-bit value");
}
var checkInt1 = (value) => checkInt(value, 1, 1);
var checkInt8 = (value) => checkInt(value, 8, MIN_INT8, MAX_UINT8);
var checkInt16 = (value) => checkInt(value, 16, MIN_INT16, MAX_UINT16);
var checkInt32 = (value) => checkInt(value, 32, MIN_INT32, MAX_UINT32);
var checkInt53 = (value) => checkInt(value, 53, MIN_INT53, MAX_UINT53);
var checkInt64 = (value) => checkInt(value, 64, MIN_INT64, MAX_UINT64);
// Used by XXXXX_DEBUG settings to output debug messages.
function dbg(text) {
// TODO(sbc): Make this configurable somehow. Its not always convenient for
// logging to show up as warnings.
console.warn.apply(console, arguments);
}
// end include: runtime_debug.js
// === Body ===
// end include: preamble.js
/** @constructor */
function ExitStatus(status) {
this.name = 'ExitStatus';
this.message = `Program terminated with exit(${status})`;
this.status = status;
}
var callRuntimeCallbacks = (callbacks) => {
while (callbacks.length > 0) {
// Pass the module as the first argument.
callbacks.shift()(Module);
}
};
/**
* @param {number} ptr
* @param {string} type
*/
function getValue(ptr, type = 'i8') {
if (type.endsWith('*')) type = '*';
switch (type) {
case 'i1': return HEAP8[((ptr)>>0)];
case 'i8': return HEAP8[((ptr)>>0)];
case 'i16': return HEAP16[((ptr)>>1)];
case 'i32': return HEAP32[((ptr)>>2)];
case 'i64': abort('to do getValue(i64) use WASM_BIGINT');
case 'float': return HEAPF32[((ptr)>>2)];
case 'double': return HEAPF64[((ptr)>>3)];
case '*': return HEAPU32[((ptr)>>2)];
default: abort(`invalid type for getValue: ${type}`);
}
}
var ptrToString = (ptr) => {
assert(typeof ptr === 'number');
// With CAN_ADDRESS_2GB or MEMORY64, pointers are already unsigned.
ptr >>>= 0;
return '0x' + ptr.toString(16).padStart(8, '0');
};
var setStackLimits = () => {
var stackLow = _emscripten_stack_get_base();
var stackHigh = _emscripten_stack_get_end();
___set_stack_limits(stackLow, stackHigh);
};
/**
* @param {number} ptr
* @param {number} value
* @param {string} type
*/
function setValue(ptr, value, type = 'i8') {
if (type.endsWith('*')) type = '*';
switch (type) {
case 'i1': HEAP8[((ptr)>>0)] = value;checkInt8(value); break;
case 'i8': HEAP8[((ptr)>>0)] = value;checkInt8(value); break;
case 'i16': HEAP16[((ptr)>>1)] = value;checkInt16(value); break;
case 'i32': HEAP32[((ptr)>>2)] = value;checkInt32(value); break;
case 'i64': abort('to do setValue(i64) use WASM_BIGINT');
case 'float': HEAPF32[((ptr)>>2)] = value; break;
case 'double': HEAPF64[((ptr)>>3)] = value; break;
case '*': HEAPU32[((ptr)>>2)] = value; break;
default: abort(`invalid type for setValue: ${type}`);
}
}
var warnOnce = (text) => {
if (!warnOnce.shown) warnOnce.shown = {};
if (!warnOnce.shown[text]) {
warnOnce.shown[text] = 1;
err(text);
}
};
var ___handle_stack_overflow = (requested) => {
var base = _emscripten_stack_get_base();
var end = _emscripten_stack_get_end();
abort(`stack overflow (Attempt to set SP to ${ptrToString(requested)}` +
`, with stack limits [${ptrToString(end)} - ${ptrToString(base)}` +
']). If you require more stack space build with -sSTACK_SIZE=<bytes>');
};
var structRegistrations = {
};
var runDestructors = (destructors) => {
while (destructors.length) {
var ptr = destructors.pop();
var del = destructors.pop();
del(ptr);
}
};
function simpleReadValueFromPointer(pointer) {
return this['fromWireType'](HEAP32[((pointer)>>2)]);
}
var awaitingDependencies = {
};
var registeredTypes = {
};
var typeDependencies = {
};
var InternalError = undefined;
var throwInternalError = (message) => { throw new InternalError(message); };
var whenDependentTypesAreResolved = (myTypes, dependentTypes, getTypeConverters) => {
myTypes.forEach(function(type) {
typeDependencies[type] = dependentTypes;
});
function onComplete(typeConverters) {
var myTypeConverters = getTypeConverters(typeConverters);
if (myTypeConverters.length !== myTypes.length) {
throwInternalError('Mismatched type converter count');
}
for (var i = 0; i < myTypes.length; ++i) {
registerType(myTypes[i], myTypeConverters[i]);
}
}
var typeConverters = new Array(dependentTypes.length);
var unregisteredTypes = [];
var registered = 0;
dependentTypes.forEach((dt, i) => {
if (registeredTypes.hasOwnProperty(dt)) {
typeConverters[i] = registeredTypes[dt];
} else {
unregisteredTypes.push(dt);
if (!awaitingDependencies.hasOwnProperty(dt)) {
awaitingDependencies[dt] = [];
}
awaitingDependencies[dt].push(() => {
typeConverters[i] = registeredTypes[dt];
++registered;
if (registered === unregisteredTypes.length) {
onComplete(typeConverters);
}
});
}
});
if (0 === unregisteredTypes.length) {
onComplete(typeConverters);
}
};
var __embind_finalize_value_object = (structType) => {
var reg = structRegistrations[structType];
delete structRegistrations[structType];
var rawConstructor = reg.rawConstructor;
var rawDestructor = reg.rawDestructor;
var fieldRecords = reg.fields;
var fieldTypes = fieldRecords.map((field) => field.getterReturnType).
concat(fieldRecords.map((field) => field.setterArgumentType));
whenDependentTypesAreResolved([structType], fieldTypes, (fieldTypes) => {
var fields = {};
fieldRecords.forEach((field, i) => {
var fieldName = field.fieldName;
var getterReturnType = fieldTypes[i];
var getter = field.getter;
var getterContext = field.getterContext;
var setterArgumentType = fieldTypes[i + fieldRecords.length];
var setter = field.setter;
var setterContext = field.setterContext;
fields[fieldName] = {
read: (ptr) => {
return getterReturnType['fromWireType'](
getter(getterContext, ptr));
},
write: (ptr, o) => {
var destructors = [];
setter(setterContext, ptr, setterArgumentType['toWireType'](destructors, o));
runDestructors(destructors);
}
};
});
return [{
name: reg.name,
'fromWireType': (ptr) => {
var rv = {};
for (var i in fields) {
rv[i] = fields[i].read(ptr);
}
rawDestructor(ptr);
return rv;
},
'toWireType': (destructors, o) => {
// todo: Here we have an opportunity for -O3 level "unsafe" optimizations:
// assume all fields are present without checking.
for (var fieldName in fields) {
if (!(fieldName in o)) {
throw new TypeError(`Missing field: "${fieldName}"`);
}
}
var ptr = rawConstructor();
for (fieldName in fields) {
fields[fieldName].write(ptr, o[fieldName]);
}
if (destructors !== null) {
destructors.push(rawDestructor, ptr);
}
return ptr;
},
'argPackAdvance': GenericWireTypeSize,
'readValueFromPointer': simpleReadValueFromPointer,
destructorFunction: rawDestructor,
}];
});
};
var __embind_register_bigint = (primitiveType, name, size, minRange, maxRange) => {};
var embind_init_charCodes = () => {
var codes = new Array(256);
for (var i = 0; i < 256; ++i) {
codes[i] = String.fromCharCode(i);
}
embind_charCodes = codes;
};
var embind_charCodes = undefined;
var readLatin1String = (ptr) => {
var ret = "";
var c = ptr;
while (HEAPU8[c]) {
ret += embind_charCodes[HEAPU8[c++]];
}
return ret;
};
var BindingError = undefined;
var throwBindingError = (message) => { throw new BindingError(message); };
/** @param {Object=} options */
function sharedRegisterType(rawType, registeredInstance, options = {}) {
var name = registeredInstance.name;
if (!rawType) {
throwBindingError(`type "${name}" must have a positive integer typeid pointer`);
}
if (registeredTypes.hasOwnProperty(rawType)) {
if (options.ignoreDuplicateRegistrations) {
return;
} else {
throwBindingError(`Cannot register type '${name}' twice`);
}
}
registeredTypes[rawType] = registeredInstance;
delete typeDependencies[rawType];
if (awaitingDependencies.hasOwnProperty(rawType)) {
var callbacks = awaitingDependencies[rawType];
delete awaitingDependencies[rawType];
callbacks.forEach((cb) => cb());
}
}
/** @param {Object=} options */
function registerType(rawType, registeredInstance, options = {}) {
if (!('argPackAdvance' in registeredInstance)) {
throw new TypeError('registerType registeredInstance requires argPackAdvance');
}
return sharedRegisterType(rawType, registeredInstance, options);
}
var GenericWireTypeSize = 8;
var __embind_register_bool = (rawType, name, trueValue, falseValue) => {
name = readLatin1String(name);
registerType(rawType, {
name,
'fromWireType': function(wt) {
// ambiguous emscripten ABI: sometimes return values are
// true or false, and sometimes integers (0 or 1)
return !!wt;
},
'toWireType': function(destructors, o) {
return o ? trueValue : falseValue;
},
'argPackAdvance': GenericWireTypeSize,
'readValueFromPointer': function(pointer) {
return this['fromWireType'](HEAPU8[pointer]);
},
destructorFunction: null, // This type does not need a destructor
});
};
function ClassHandle_isAliasOf(other) {
if (!(this instanceof ClassHandle)) {
return false;
}
if (!(other instanceof ClassHandle)) {
return false;
}
var leftClass = this.$$.ptrType.registeredClass;
var left = this.$$.ptr;
var rightClass = other.$$.ptrType.registeredClass;
var right = other.$$.ptr;
while (leftClass.baseClass) {
left = leftClass.upcast(left);
leftClass = leftClass.baseClass;
}
while (rightClass.baseClass) {
right = rightClass.upcast(right);
rightClass = rightClass.baseClass;
}
return leftClass === rightClass && left === right;
}
var shallowCopyInternalPointer = (o) => {
return {
count: o.count,
deleteScheduled: o.deleteScheduled,
preservePointerOnDelete: o.preservePointerOnDelete,
ptr: o.ptr,
ptrType: o.ptrType,
smartPtr: o.smartPtr,
smartPtrType: o.smartPtrType,
};
};
var throwInstanceAlreadyDeleted = (obj) => {
function getInstanceTypeName(handle) {
return handle.$$.ptrType.registeredClass.name;
}
throwBindingError(getInstanceTypeName(obj) + ' instance already deleted');
};
var finalizationRegistry = false;
var detachFinalizer = (handle) => {};
var runDestructor = ($$) => {
if ($$.smartPtr) {
$$.smartPtrType.rawDestructor($$.smartPtr);
} else {
$$.ptrType.registeredClass.rawDestructor($$.ptr);
}
};
var releaseClassHandle = ($$) => {
$$.count.value -= 1;
var toDelete = 0 === $$.count.value;
if (toDelete) {
runDestructor($$);
}
};
var downcastPointer = (ptr, ptrClass, desiredClass) => {
if (ptrClass === desiredClass) {
return ptr;
}
if (undefined === desiredClass.baseClass) {
return null; // no conversion
}
var rv = downcastPointer(ptr, ptrClass, desiredClass.baseClass);
if (rv === null) {
return null;
}
return desiredClass.downcast(rv);
};
var registeredPointers = {
};
var getInheritedInstanceCount = () => {
return Object.keys(registeredInstances).length;
};
var getLiveInheritedInstances = () => {
var rv = [];
for (var k in registeredInstances) {
if (registeredInstances.hasOwnProperty(k)) {
rv.push(registeredInstances[k]);
}
}
return rv;
};
var deletionQueue = [];
var flushPendingDeletes = () => {
while (deletionQueue.length) {
var obj = deletionQueue.pop();
obj.$$.deleteScheduled = false;
obj['delete']();
}
};
var delayFunction = undefined;
var setDelayFunction = (fn) => {
delayFunction = fn;
if (deletionQueue.length && delayFunction) {
delayFunction(flushPendingDeletes);
}
};
var init_embind = () => {
Module['getInheritedInstanceCount'] = getInheritedInstanceCount;
Module['getLiveInheritedInstances'] = getLiveInheritedInstances;
Module['flushPendingDeletes'] = flushPendingDeletes;
Module['setDelayFunction'] = setDelayFunction;
};
var registeredInstances = {
};
var getBasestPointer = (class_, ptr) => {
if (ptr === undefined) {
throwBindingError('ptr should not be undefined');
}
while (class_.baseClass) {
ptr = class_.upcast(ptr);
class_ = class_.baseClass;
}
return ptr;
};
var getInheritedInstance = (class_, ptr) => {
ptr = getBasestPointer(class_, ptr);
return registeredInstances[ptr];
};
var makeClassHandle = (prototype, record) => {
if (!record.ptrType || !record.ptr) {
throwInternalError('makeClassHandle requires ptr and ptrType');
}
var hasSmartPtrType = !!record.smartPtrType;
var hasSmartPtr = !!record.smartPtr;
if (hasSmartPtrType !== hasSmartPtr) {
throwInternalError('Both smartPtrType and smartPtr must be specified');
}
record.count = { value: 1 };
return attachFinalizer(Object.create(prototype, {
$$: {
value: record,
},
}));
};
function RegisteredPointer_fromWireType(ptr) {
// ptr is a raw pointer (or a raw smartpointer)
// rawPointer is a maybe-null raw pointer
var rawPointer = this.getPointee(ptr);
if (!rawPointer) {
this.destructor(ptr);
return null;
}
var registeredInstance = getInheritedInstance(this.registeredClass, rawPointer);
if (undefined !== registeredInstance) {
// JS object has been neutered, time to repopulate it
if (0 === registeredInstance.$$.count.value) {
registeredInstance.$$.ptr = rawPointer;
registeredInstance.$$.smartPtr = ptr;
return registeredInstance['clone']();
} else {
// else, just increment reference count on existing object
// it already has a reference to the smart pointer
var rv = registeredInstance['clone']();
this.destructor(ptr);
return rv;
}
}
function makeDefaultHandle() {
if (this.isSmartPointer) {
return makeClassHandle(this.registeredClass.instancePrototype, {
ptrType: this.pointeeType,
ptr: rawPointer,
smartPtrType: this,
smartPtr: ptr,
});
} else {
return makeClassHandle(this.registeredClass.instancePrototype, {
ptrType: this,
ptr,
});
}
}
var actualType = this.registeredClass.getActualType(rawPointer);
var registeredPointerRecord = registeredPointers[actualType];
if (!registeredPointerRecord) {
return makeDefaultHandle.call(this);
}
var toType;
if (this.isConst) {
toType = registeredPointerRecord.constPointerType;
} else {
toType = registeredPointerRecord.pointerType;
}
var dp = downcastPointer(
rawPointer,
this.registeredClass,
toType.registeredClass);
if (dp === null) {
return makeDefaultHandle.call(this);
}
if (this.isSmartPointer) {
return makeClassHandle(toType.registeredClass.instancePrototype, {
ptrType: toType,
ptr: dp,
smartPtrType: this,
smartPtr: ptr,
});
} else {
return makeClassHandle(toType.registeredClass.instancePrototype, {
ptrType: toType,
ptr: dp,
});
}
}
var attachFinalizer = (handle) => {
if ('undefined' === typeof FinalizationRegistry) {
attachFinalizer = (handle) => handle;
return handle;
}
// If the running environment has a FinalizationRegistry (see
// https://github.com/tc39/proposal-weakrefs), then attach finalizers
// for class handles. We check for the presence of FinalizationRegistry
// at run-time, not build-time.
finalizationRegistry = new FinalizationRegistry((info) => {
console.warn(info.leakWarning.stack.replace(/^Error: /, ''));
releaseClassHandle(info.$$);
});
attachFinalizer = (handle) => {
var $$ = handle.$$;
var hasSmartPtr = !!$$.smartPtr;
if (hasSmartPtr) {
// We should not call the destructor on raw pointers in case other code expects the pointee to live
var info = { $$: $$ };
// Create a warning as an Error instance in advance so that we can store
// the current stacktrace and point to it when / if a leak is detected.
// This is more useful than the empty stacktrace of `FinalizationRegistry`
// callback.
var cls = $$.ptrType.registeredClass;
info.leakWarning = new Error(`Embind found a leaked C++ instance ${cls.name} <${ptrToString($$.ptr)}>.\n` +
"We'll free it automatically in this case, but this functionality is not reliable across various environments.\n" +
"Make sure to invoke .delete() manually once you're done with the instance instead.\n" +
"Originally allocated"); // `.stack` will add "at ..." after this sentence
if ('captureStackTrace' in Error) {
Error.captureStackTrace(info.leakWarning, RegisteredPointer_fromWireType);
}
finalizationRegistry.register(handle, info, handle);
}
return handle;
};
detachFinalizer = (handle) => finalizationRegistry.unregister(handle);
return attachFinalizer(handle);
};
function ClassHandle_clone() {
if (!this.$$.ptr) {
throwInstanceAlreadyDeleted(this);
}
if (this.$$.preservePointerOnDelete) {
this.$$.count.value += 1;
return this;
} else {
var clone = attachFinalizer(Object.create(Object.getPrototypeOf(this), {
$$: {
value: shallowCopyInternalPointer(this.$$),
}
}));
clone.$$.count.value += 1;
clone.$$.deleteScheduled = false;
return clone;
}
}
function ClassHandle_delete() {
if (!this.$$.ptr) {
throwInstanceAlreadyDeleted(this);
}
if (this.$$.deleteScheduled && !this.$$.preservePointerOnDelete) {
throwBindingError('Object already scheduled for deletion');
}
detachFinalizer(this);
releaseClassHandle(this.$$);
if (!this.$$.preservePointerOnDelete) {
this.$$.smartPtr = undefined;
this.$$.ptr = undefined;
}
}
function ClassHandle_isDeleted() {
return !this.$$.ptr;
}
function ClassHandle_deleteLater() {
if (!this.$$.ptr) {
throwInstanceAlreadyDeleted(this);
}
if (this.$$.deleteScheduled && !this.$$.preservePointerOnDelete) {
throwBindingError('Object already scheduled for deletion');
}
deletionQueue.push(this);
if (deletionQueue.length === 1 && delayFunction) {
delayFunction(flushPendingDeletes);
}
this.$$.deleteScheduled = true;
return this;
}
var init_ClassHandle = () => {
ClassHandle.prototype['isAliasOf'] = ClassHandle_isAliasOf;
ClassHandle.prototype['clone'] = ClassHandle_clone;
ClassHandle.prototype['delete'] = ClassHandle_delete;
ClassHandle.prototype['isDeleted'] = ClassHandle_isDeleted;
ClassHandle.prototype['deleteLater'] = ClassHandle_deleteLater;
};
/** @constructor */
function ClassHandle() {
}
var char_0 = 48;
var char_9 = 57;
var makeLegalFunctionName = (name) => {
if (undefined === name) {
return '_unknown';
}
name = name.replace(/[^a-zA-Z0-9_]/g, '$');
var f = name.charCodeAt(0);
if (f >= char_0 && f <= char_9) {
return `_${name}`;
}
return name;
};
function createNamedFunction(name, body) {
name = makeLegalFunctionName(name);
// Use an abject with a computed property name to create a new function with
// a name specified at runtime, but without using `new Function` or `eval`.
return {
[name]: function() {
return body.apply(this, arguments);
}
}[name];
}
var ensureOverloadTable = (proto, methodName, humanName) => {
if (undefined === proto[methodName].overloadTable) {
var prevFunc = proto[methodName];
// Inject an overload resolver function that routes to the appropriate overload based on the number of arguments.
proto[methodName] = function() {
// TODO This check can be removed in -O3 level "unsafe" optimizations.
if (!proto[methodName].overloadTable.hasOwnProperty(arguments.length)) {
throwBindingError(`Function '${humanName}' called with an invalid number of arguments (${arguments.length}) - expects one of (${proto[methodName].overloadTable})!`);
}
return proto[methodName].overloadTable[arguments.length].apply(this, arguments);
};
// Move the previous function into the overload table.
proto[methodName].overloadTable = [];
proto[methodName].overloadTable[prevFunc.argCount] = prevFunc;
}
};
/** @param {number=} numArguments */
var exposePublicSymbol = (name, value, numArguments) => {
if (Module.hasOwnProperty(name)) {
if (undefined === numArguments || (undefined !== Module[name].overloadTable && undefined !== Module[name].overloadTable[numArguments])) {
throwBindingError(`Cannot register public name '${name}' twice`);
}
// We are exposing a function with the same name as an existing function. Create an overload table and a function selector
// that routes between the two.
ensureOverloadTable(Module, name, name);
if (Module.hasOwnProperty(numArguments)) {
throwBindingError(`Cannot register multiple overloads of a function with the same number of arguments (${numArguments})!`);
}
// Add the new function into the overload table.
Module[name].overloadTable[numArguments] = value;
}
else {
Module[name] = value;
if (undefined !== numArguments) {
Module[name].numArguments = numArguments;
}
}
};
/** @constructor */
function RegisteredClass(name,
constructor,
instancePrototype,
rawDestructor,
baseClass,
getActualType,
upcast,
downcast) {
this.name = name;
this.constructor = constructor;
this.instancePrototype = instancePrototype;
this.rawDestructor = rawDestructor;
this.baseClass = baseClass;
this.getActualType = getActualType;
this.upcast = upcast;
this.downcast = downcast;
this.pureVirtualFunctions = [];
}
var upcastPointer = (ptr, ptrClass, desiredClass) => {
while (ptrClass !== desiredClass) {
if (!ptrClass.upcast) {
throwBindingError(`Expected null or instance of ${desiredClass.name}, got an instance of ${ptrClass.name}`);
}
ptr = ptrClass.upcast(ptr);
ptrClass = ptrClass.baseClass;
}
return ptr;
};
function constNoSmartPtrRawPointerToWireType(destructors, handle) {
if (handle === null) {
if (this.isReference) {
throwBindingError(`null is not a valid ${this.name}`);
}
return 0;
}
if (!handle.$$) {
throwBindingError(`Cannot pass "${embindRepr(handle)}" as a ${this.name}`);
}
if (!handle.$$.ptr) {
throwBindingError(`Cannot pass deleted object as a pointer of type ${this.name}`);
}
var handleClass = handle.$$.ptrType.registeredClass;
var ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass);
return ptr;
}
function genericPointerToWireType(destructors, handle) {
var ptr;
if (handle === null) {
if (this.isReference) {
throwBindingError(`null is not a valid ${this.name}`);
}
if (this.isSmartPointer) {
ptr = this.rawConstructor();
if (destructors !== null) {
destructors.push(this.rawDestructor, ptr);
}
return ptr;
} else {
return 0;
}
}
if (!handle.$$) {
throwBindingError(`Cannot pass "${embindRepr(handle)}" as a ${this.name}`);
}
if (!handle.$$.ptr) {
throwBindingError(`Cannot pass deleted object as a pointer of type ${this.name}`);
}
if (!this.isConst && handle.$$.ptrType.isConst) {
throwBindingError(`Cannot convert argument of type ${(handle.$$.smartPtrType ? handle.$$.smartPtrType.name : handle.$$.ptrType.name)} to parameter type ${this.name}`);
}
var handleClass = handle.$$.ptrType.registeredClass;
ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass);
if (this.isSmartPointer) {
// TODO: this is not strictly true
// We could support BY_EMVAL conversions from raw pointers to smart pointers
// because the smart pointer can hold a reference to the handle
if (undefined === handle.$$.smartPtr) {
throwBindingError('Passing raw pointer to smart pointer is illegal');
}
switch (this.sharingPolicy) {
case 0: // NONE
// no upcasting
if (handle.$$.smartPtrType === this) {
ptr = handle.$$.smartPtr;
} else {
throwBindingError(`Cannot convert argument of type ${(handle.$$.smartPtrType ? handle.$$.smartPtrType.name : handle.$$.ptrType.name)} to parameter type ${this.name}`);
}
break;
case 1: // INTRUSIVE
ptr = handle.$$.smartPtr;
break;
case 2: // BY_EMVAL
if (handle.$$.smartPtrType === this) {
ptr = handle.$$.smartPtr;
} else {
var clonedHandle = handle['clone']();
ptr = this.rawShare(
ptr,
Emval.toHandle(() => clonedHandle['delete']())
);
if (destructors !== null) {
destructors.push(this.rawDestructor, ptr);
}
}
break;
default:
throwBindingError('Unsupporting sharing policy');
}
}
return ptr;
}
function nonConstNoSmartPtrRawPointerToWireType(destructors, handle) {
if (handle === null) {
if (this.isReference) {
throwBindingError(`null is not a valid ${this.name}`);
}
return 0;
}
if (!handle.$$) {
throwBindingError(`Cannot pass "${embindRepr(handle)}" as a ${this.name}`);
}
if (!handle.$$.ptr) {
throwBindingError(`Cannot pass deleted object as a pointer of type ${this.name}`);
}
if (handle.$$.ptrType.isConst) {
throwBindingError(`Cannot convert argument of type ${handle.$$.ptrType.name} to parameter type ${this.name}`);
}
var handleClass = handle.$$.ptrType.registeredClass;
var ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass);
return ptr;
}
function readPointer(pointer) {
return this['fromWireType'](HEAPU32[((pointer)>>2)]);
}
function RegisteredPointer_getPointee(ptr) {
if (this.rawGetPointee) {
ptr = this.rawGetPointee(ptr);
}
return ptr;
}
function RegisteredPointer_destructor(ptr) {
if (this.rawDestructor) {
this.rawDestructor(ptr);
}
}
var RegisteredPointer_deleteObject = (handle) => {
if (handle !== null) {
handle['delete']();
}
};
var init_RegisteredPointer = () => {
RegisteredPointer.prototype.getPointee = RegisteredPointer_getPointee;
RegisteredPointer.prototype.destructor = RegisteredPointer_destructor;
RegisteredPointer.prototype['argPackAdvance'] = GenericWireTypeSize;
RegisteredPointer.prototype['readValueFromPointer'] = readPointer;
RegisteredPointer.prototype['deleteObject'] = RegisteredPointer_deleteObject;
RegisteredPointer.prototype['fromWireType'] = RegisteredPointer_fromWireType;
};
/** @constructor
@param {*=} pointeeType,
@param {*=} sharingPolicy,
@param {*=} rawGetPointee,
@param {*=} rawConstructor,
@param {*=} rawShare,
@param {*=} rawDestructor,
*/
function RegisteredPointer(
name,
registeredClass,
isReference,
isConst,
// smart pointer properties
isSmartPointer,
pointeeType,
sharingPolicy,
rawGetPointee,
rawConstructor,
rawShare,
rawDestructor
) {
this.name = name;
this.registeredClass = registeredClass;
this.isReference = isReference;
this.isConst = isConst;
// smart pointer properties
this.isSmartPointer = isSmartPointer;
this.pointeeType = pointeeType;
this.sharingPolicy = sharingPolicy;
this.rawGetPointee = rawGetPointee;
this.rawConstructor = rawConstructor;
this.rawShare = rawShare;
this.rawDestructor = rawDestructor;
if (!isSmartPointer && registeredClass.baseClass === undefined) {
if (isConst) {
this['toWireType'] = constNoSmartPtrRawPointerToWireType;
this.destructorFunction = null;
} else {
this['toWireType'] = nonConstNoSmartPtrRawPointerToWireType;
this.destructorFunction = null;
}
} else {
this['toWireType'] = genericPointerToWireType;
// Here we must leave this.destructorFunction undefined, since whether genericPointerToWireType returns
// a pointer that needs to be freed up is runtime-dependent, and cannot be evaluated at registration time.
// TODO: Create an alternative mechanism that allows removing the use of var destructors = []; array in
// craftInvokerFunction altogether.
}
}
/** @param {number=} numArguments */
var replacePublicSymbol = (name, value, numArguments) => {
if (!Module.hasOwnProperty(name)) {
throwInternalError('Replacing nonexistant public symbol');
}
// If there's an overload table for this symbol, replace the symbol in the overload table instead.
if (undefined !== Module[name].overloadTable && undefined !== numArguments) {
Module[name].overloadTable[numArguments] = value;
}
else {
Module[name] = value;
Module[name].argCount = numArguments;
}
};
var dynCallLegacy = (sig, ptr, args) => {
assert(('dynCall_' + sig) in Module, `bad function pointer type - dynCall function not found for sig '${sig}'`);
if (args && args.length) {
// j (64-bit integer) must be passed in as two numbers [low 32, high 32].
assert(args.length === sig.substring(1).replace(/j/g, '--').length);
} else {
assert(sig.length == 1);
}
var f = Module['dynCall_' + sig];
return args && args.length ? f.apply(null, [ptr].concat(args)) : f.call(null, ptr);
};
var wasmTableMirror = [];
var getWasmTableEntry = (funcPtr) => {
var func = wasmTableMirror[funcPtr];
if (!func) {
if (funcPtr >= wasmTableMirror.length) wasmTableMirror.length = funcPtr + 1;
wasmTableMirror[funcPtr] = func = wasmTable.get(funcPtr);
}
assert(wasmTable.get(funcPtr) == func, "JavaScript-side Wasm function table mirror is out of date!");
return func;
};
/** @param {Object=} args */
var dynCall = (sig, ptr, args) => {
// Without WASM_BIGINT support we cannot directly call function with i64 as
// part of thier signature, so we rely the dynCall functions generated by
// wasm-emscripten-finalize
if (sig.includes('j')) {
return dynCallLegacy(sig, ptr, args);
}
assert(getWasmTableEntry(ptr), `missing table entry in dynCall: ${ptr}`);
var rtn = getWasmTableEntry(ptr).apply(null, args);
return rtn;
};
var getDynCaller = (sig, ptr) => {
assert(sig.includes('j') || sig.includes('p'), 'getDynCaller should only be called with i64 sigs')
var argCache = [];
return function() {
argCache.length = 0;
Object.assign(argCache, arguments);
return dynCall(sig, ptr, argCache);
};
};
var embind__requireFunction = (signature, rawFunction) => {
signature = readLatin1String(signature);
function makeDynCaller() {
if (signature.includes('j')) {
return getDynCaller(signature, rawFunction);
}
return getWasmTableEntry(rawFunction);
}
var fp = makeDynCaller();
if (typeof fp != "function") {
throwBindingError(`unknown function pointer with signature ${signature}: ${rawFunction}`);
}
return fp;
};
var extendError = (baseErrorType, errorName) => {
var errorClass = createNamedFunction(errorName, function(message) {
this.name = errorName;
this.message = message;
var stack = (new Error(message)).stack;
if (stack !== undefined) {
this.stack = this.toString() + '\n' +
stack.replace(/^Error(:[^\n]*)?\n/, '');
}
});
errorClass.prototype = Object.create(baseErrorType.prototype);
errorClass.prototype.constructor = errorClass;
errorClass.prototype.toString = function() {
if (this.message === undefined) {
return this.name;
} else {
return `${this.name}: ${this.message}`;
}
};
return errorClass;
};
var UnboundTypeError = undefined;
var getTypeName = (type) => {
var ptr = ___getTypeName(type);
var rv = readLatin1String(ptr);
_free(ptr);
return rv;
};
var throwUnboundTypeError = (message, types) => {
var unboundTypes = [];
var seen = {};
function visit(type) {
if (seen[type]) {
return;
}
if (registeredTypes[type]) {
return;
}
if (typeDependencies[type]) {
typeDependencies[type].forEach(visit);
return;
}
unboundTypes.push(type);
seen[type] = true;
}
types.forEach(visit);
throw new UnboundTypeError(`${message}: ` + unboundTypes.map(getTypeName).join([', ']));
};
var __embind_register_class = (rawType,
rawPointerType,
rawConstPointerType,
baseClassRawType,
getActualTypeSignature,
getActualType,
upcastSignature,
upcast,
downcastSignature,
downcast,
name,
destructorSignature,
rawDestructor) => {
name = readLatin1String(name);
getActualType = embind__requireFunction(getActualTypeSignature, getActualType);
if (upcast) {
upcast = embind__requireFunction(upcastSignature, upcast);
}
if (downcast) {
downcast = embind__requireFunction(downcastSignature, downcast);
}
rawDestructor = embind__requireFunction(destructorSignature, rawDestructor);
var legalFunctionName = makeLegalFunctionName(name);
exposePublicSymbol(legalFunctionName, function() {
// this code cannot run if baseClassRawType is zero
throwUnboundTypeError(`Cannot construct ${name} due to unbound types`, [baseClassRawType]);
});
whenDependentTypesAreResolved(
[rawType, rawPointerType, rawConstPointerType],
baseClassRawType ? [baseClassRawType] : [],
function(base) {
base = base[0];
var baseClass;
var basePrototype;
if (baseClassRawType) {
baseClass = base.registeredClass;
basePrototype = baseClass.instancePrototype;
} else {
basePrototype = ClassHandle.prototype;
}
var constructor = createNamedFunction(legalFunctionName, function() {
if (Object.getPrototypeOf(this) !== instancePrototype) {
throw new BindingError("Use 'new' to construct " + name);
}
if (undefined === registeredClass.constructor_body) {
throw new BindingError(name + " has no accessible constructor");
}
var body = registeredClass.constructor_body[arguments.length];
if (undefined === body) {
throw new BindingError(`Tried to invoke ctor of ${name} with invalid number of parameters (${arguments.length}) - expected (${Object.keys(registeredClass.constructor_body).toString()}) parameters instead!`);
}
return body.apply(this, arguments);
});
var instancePrototype = Object.create(basePrototype, {
constructor: { value: constructor },
});
constructor.prototype = instancePrototype;
var registeredClass = new RegisteredClass(name,
constructor,
instancePrototype,
rawDestructor,
baseClass,
getActualType,
upcast,
downcast);
if (registeredClass.baseClass) {
// Keep track of class hierarchy. Used to allow sub-classes to inherit class functions.
if (registeredClass.baseClass.__derivedClasses === undefined) {
registeredClass.baseClass.__derivedClasses = [];
}
registeredClass.baseClass.__derivedClasses.push(registeredClass);
}
var referenceConverter = new RegisteredPointer(name,
registeredClass,
true,
false,
false);
var pointerConverter = new RegisteredPointer(name + '*',
registeredClass,
false,
false,
false);
var constPointerConverter = new RegisteredPointer(name + ' const*',
registeredClass,
false,
true,
false);
registeredPointers[rawType] = {
pointerType: pointerConverter,
constPointerType: constPointerConverter
};
replacePublicSymbol(legalFunctionName, constructor);
return [referenceConverter, pointerConverter, constPointerConverter];
}
);
};
function newFunc(constructor, argumentList) {
if (!(constructor instanceof Function)) {
throw new TypeError(`new_ called with constructor type ${typeof(constructor)} which is not a function`);
}
/*
* Previously, the following line was just:
* function dummy() {};
* Unfortunately, Chrome was preserving 'dummy' as the object's name, even
* though at creation, the 'dummy' has the correct constructor name. Thus,
* objects created with IMVU.new would show up in the debugger as 'dummy',
* which isn't very helpful. Using IMVU.createNamedFunction addresses the
* issue. Doublely-unfortunately, there's no way to write a test for this
* behavior. -NRD 2013.02.22
*/
var dummy = createNamedFunction(constructor.name || 'unknownFunctionName', function(){});
dummy.prototype = constructor.prototype;
var obj = new dummy;
var r = constructor.apply(obj, argumentList);
return (r instanceof Object) ? r : obj;
}
function craftInvokerFunction(humanName, argTypes, classType, cppInvokerFunc, cppTargetFunc, /** boolean= */ isAsync) {
// humanName: a human-readable string name for the function to be generated.
// argTypes: An array that contains the embind type objects for all types in the function signature.
// argTypes[0] is the type object for the function return value.
// argTypes[1] is the type object for function this object/class type, or null if not crafting an invoker for a class method.
// argTypes[2...] are the actual function parameters.
// classType: The embind type object for the class to be bound, or null if this is not a method of a class.
// cppInvokerFunc: JS Function object to the C++-side function that interops into C++ code.
// cppTargetFunc: Function pointer (an integer to FUNCTION_TABLE) to the target C++ function the cppInvokerFunc will end up calling.
// isAsync: Optional. If true, returns an async function. Async bindings are only supported with JSPI.
var argCount = argTypes.length;
if (argCount < 2) {
throwBindingError("argTypes array size mismatch! Must at least get return value and 'this' types!");
}
assert(!isAsync, 'Async bindings are only supported with JSPI.');
var isClassMethodFunc = (argTypes[1] !== null && classType !== null);
// Free functions with signature "void function()" do not need an invoker that marshalls between wire types.
// TODO: This omits argument count check - enable only at -O3 or similar.
// if (ENABLE_UNSAFE_OPTS && argCount == 2 && argTypes[0].name == "void" && !isClassMethodFunc) {
// return FUNCTION_TABLE[fn];
// }
// Determine if we need to use a dynamic stack to store the destructors for the function parameters.
// TODO: Remove this completely once all function invokers are being dynamically generated.
var needsDestructorStack = false;
for (var i = 1; i < argTypes.length; ++i) { // Skip return value at index 0 - it's not deleted here.
if (argTypes[i] !== null && argTypes[i].destructorFunction === undefined) { // The type does not define a destructor function - must use dynamic stack
needsDestructorStack = true;
break;
}
}
var returns = (argTypes[0].name !== "void");
var argsList = "";
var argsListWired = "";
for (var i = 0; i < argCount - 2; ++i) {
argsList += (i!==0?", ":"")+"arg"+i;
argsListWired += (i!==0?", ":"")+"arg"+i+"Wired";
}
var invokerFnBody = `
return function ${makeLegalFunctionName(humanName)}(${argsList}) {
if (arguments.length !== ${argCount - 2}) {
throwBindingError('function ${humanName} called with ' + arguments.length + ' arguments, expected ${argCount - 2}');
}`;
if (needsDestructorStack) {
invokerFnBody += "var destructors = [];\n";
}
var dtorStack = needsDestructorStack ? "destructors" : "null";
var args1 = ["throwBindingError", "invoker", "fn", "runDestructors", "retType", "classParam"];
var args2 = [throwBindingError, cppInvokerFunc, cppTargetFunc, runDestructors, argTypes[0], argTypes[1]];
if (isClassMethodFunc) {
invokerFnBody += "var thisWired = classParam.toWireType("+dtorStack+", this);\n";
}
for (var i = 0; i < argCount - 2; ++i) {
invokerFnBody += "var arg"+i+"Wired = argType"+i+".toWireType("+dtorStack+", arg"+i+"); // "+argTypes[i+2].name+"\n";
args1.push("argType"+i);
args2.push(argTypes[i+2]);
}
if (isClassMethodFunc) {
argsListWired = "thisWired" + (argsListWired.length > 0 ? ", " : "") + argsListWired;
}
invokerFnBody +=
(returns || isAsync ? "var rv = ":"") + "invoker(fn"+(argsListWired.length>0?", ":"")+argsListWired+");\n";
if (needsDestructorStack) {
invokerFnBody += "runDestructors(destructors);\n";
} else {
for (var i = isClassMethodFunc?1:2; i < argTypes.length; ++i) { // Skip return value at index 0 - it's not deleted here. Also skip class type if not a method.
var paramName = (i === 1 ? "thisWired" : ("arg"+(i - 2)+"Wired"));
if (argTypes[i].destructorFunction !== null) {
invokerFnBody += paramName+"_dtor("+paramName+"); // "+argTypes[i].name+"\n";
args1.push(paramName+"_dtor");
args2.push(argTypes[i].destructorFunction);
}
}
}
if (returns) {
invokerFnBody += "var ret = retType.fromWireType(rv);\n" +
"return ret;\n";
} else {
}
invokerFnBody += "}\n";
args1.push(invokerFnBody);
return newFunc(Function, args1).apply(null, args2);
}
var heap32VectorToArray = (count, firstElement) => {
var array = [];
for (var i = 0; i < count; i++) {
// TODO(https://github.com/emscripten-core/emscripten/issues/17310):
// Find a way to hoist the `>> 2` or `>> 3` out of this loop.
array.push(HEAPU32[(((firstElement)+(i * 4))>>2)]);
}
return array;
};
var __embind_register_class_class_function = (rawClassType,
methodName,
argCount,
rawArgTypesAddr,
invokerSignature,
rawInvoker,
fn,
isAsync) => {
var rawArgTypes = heap32VectorToArray(argCount, rawArgTypesAddr);
methodName = readLatin1String(methodName);
rawInvoker = embind__requireFunction(invokerSignature, rawInvoker);
whenDependentTypesAreResolved([], [rawClassType], function(classType) {
classType = classType[0];
var humanName = `${classType.name}.${methodName}`;
function unboundTypesHandler() {
throwUnboundTypeError(`Cannot call ${humanName} due to unbound types`, rawArgTypes);
}
if (methodName.startsWith("@@")) {
methodName = Symbol[methodName.substring(2)];
}
var proto = classType.registeredClass.constructor;
if (undefined === proto[methodName]) {
// This is the first function to be registered with this name.
unboundTypesHandler.argCount = argCount-1;
proto[methodName] = unboundTypesHandler;
} else {
// There was an existing function with the same name registered. Set up
// a function overload routing table.
ensureOverloadTable(proto, methodName, humanName);
proto[methodName].overloadTable[argCount-1] = unboundTypesHandler;
}
whenDependentTypesAreResolved([], rawArgTypes, function(argTypes) {
// Replace the initial unbound-types-handler stub with the proper
// function. If multiple overloads are registered, the function handlers
// go into an overload table.
var invokerArgsArray = [argTypes[0] /* return value */, null /* no class 'this'*/].concat(argTypes.slice(1) /* actual params */);
var func = craftInvokerFunction(humanName, invokerArgsArray, null /* no class 'this'*/, rawInvoker, fn, isAsync);
if (undefined === proto[methodName].overloadTable) {
func.argCount = argCount-1;
proto[methodName] = func;
} else {
proto[methodName].overloadTable[argCount-1] = func;
}
if (classType.registeredClass.__derivedClasses) {
for (const derivedClass of classType.registeredClass.__derivedClasses) {
if (!derivedClass.constructor.hasOwnProperty(methodName)) {
// TODO: Add support for overloads
derivedClass.constructor[methodName] = func;
}
}
}
return [];
});
return [];
});
};
var __embind_register_class_constructor = (
rawClassType,
argCount,
rawArgTypesAddr,
invokerSignature,
invoker,
rawConstructor
) => {
assert(argCount > 0);
var rawArgTypes = heap32VectorToArray(argCount, rawArgTypesAddr);
invoker = embind__requireFunction(invokerSignature, invoker);
var args = [rawConstructor];
var destructors = [];
whenDependentTypesAreResolved([], [rawClassType], function(classType) {
classType = classType[0];
var humanName = `constructor ${classType.name}`;
if (undefined === classType.registeredClass.constructor_body) {
classType.registeredClass.constructor_body = [];
}
if (undefined !== classType.registeredClass.constructor_body[argCount - 1]) {
throw new BindingError(`Cannot register multiple constructors with identical number of parameters (${argCount-1}) for class '${classType.name}'! Overload resolution is currently only performed using the parameter count, not actual type info!`);
}
classType.registeredClass.constructor_body[argCount - 1] = () => {
throwUnboundTypeError(`Cannot construct ${classType.name} due to unbound types`, rawArgTypes);
};
whenDependentTypesAreResolved([], rawArgTypes, (argTypes) => {
// Insert empty slot for context type (argTypes[1]).
argTypes.splice(1, 0, null);
classType.registeredClass.constructor_body[argCount - 1] = craftInvokerFunction(humanName, argTypes, null, invoker, rawConstructor);
return [];
});
return [];
});
};
var __embind_register_class_function = (rawClassType,
methodName,
argCount,
rawArgTypesAddr, // [ReturnType, ThisType, Args...]
invokerSignature,
rawInvoker,
context,
isPureVirtual,
isAsync) => {
var rawArgTypes = heap32VectorToArray(argCount, rawArgTypesAddr);
methodName = readLatin1String(methodName);
rawInvoker = embind__requireFunction(invokerSignature, rawInvoker);
whenDependentTypesAreResolved([], [rawClassType], function(classType) {
classType = classType[0];
var humanName = `${classType.name}.${methodName}`;
if (methodName.startsWith("@@")) {
methodName = Symbol[methodName.substring(2)];
}
if (isPureVirtual) {
classType.registeredClass.pureVirtualFunctions.push(methodName);
}
function unboundTypesHandler() {
throwUnboundTypeError(`Cannot call ${humanName} due to unbound types`, rawArgTypes);
}
var proto = classType.registeredClass.instancePrototype;
var method = proto[methodName];
if (undefined === method || (undefined === method.overloadTable && method.className !== classType.name && method.argCount === argCount - 2)) {
// This is the first overload to be registered, OR we are replacing a
// function in the base class with a function in the derived class.
unboundTypesHandler.argCount = argCount - 2;
unboundTypesHandler.className = classType.name;
proto[methodName] = unboundTypesHandler;
} else {
// There was an existing function with the same name registered. Set up
// a function overload routing table.
ensureOverloadTable(proto, methodName, humanName);
proto[methodName].overloadTable[argCount - 2] = unboundTypesHandler;
}
whenDependentTypesAreResolved([], rawArgTypes, function(argTypes) {
var memberFunction = craftInvokerFunction(humanName, argTypes, classType, rawInvoker, context, isAsync);
// Replace the initial unbound-handler-stub function with the appropriate member function, now that all types
// are resolved. If multiple overloads are registered for this function, the function goes into an overload table.
if (undefined === proto[methodName].overloadTable) {
// Set argCount in case an overload is registered later
memberFunction.argCount = argCount - 2;
proto[methodName] = memberFunction;
} else {
proto[methodName].overloadTable[argCount - 2] = memberFunction;
}
return [];
});
return [];
});
};
var validateThis = (this_, classType, humanName) => {
if (!(this_ instanceof Object)) {
throwBindingError(`${humanName} with invalid "this": ${this_}`);
}
if (!(this_ instanceof classType.registeredClass.constructor)) {
throwBindingError(`${humanName} incompatible with "this" of type ${this_.constructor.name}`);
}
if (!this_.$$.ptr) {
throwBindingError(`cannot call emscripten binding method ${humanName} on deleted object`);
}
// todo: kill this
return upcastPointer(this_.$$.ptr,
this_.$$.ptrType.registeredClass,
classType.registeredClass);
};
var __embind_register_class_property = (classType,
fieldName,
getterReturnType,
getterSignature,
getter,
getterContext,
setterArgumentType,
setterSignature,
setter,
setterContext) => {
fieldName = readLatin1String(fieldName);
getter = embind__requireFunction(getterSignature, getter);
whenDependentTypesAreResolved([], [classType], function(classType) {
classType = classType[0];
var humanName = `${classType.name}.${fieldName}`;
var desc = {
get() {
throwUnboundTypeError(`Cannot access ${humanName} due to unbound types`, [getterReturnType, setterArgumentType]);
},
enumerable: true,
configurable: true
};
if (setter) {
desc.set = () => throwUnboundTypeError(`Cannot access ${humanName} due to unbound types`, [getterReturnType, setterArgumentType]);
} else {
desc.set = (v) => throwBindingError(humanName + ' is a read-only property');
}
Object.defineProperty(classType.registeredClass.instancePrototype, fieldName, desc);
whenDependentTypesAreResolved(
[],
(setter ? [getterReturnType, setterArgumentType] : [getterReturnType]),
function(types) {
var getterReturnType = types[0];
var desc = {
get() {
var ptr = validateThis(this, classType, humanName + ' getter');
return getterReturnType['fromWireType'](getter(getterContext, ptr));
},
enumerable: true
};
if (setter) {
setter = embind__requireFunction(setterSignature, setter);
var setterArgumentType = types[1];
desc.set = function(v) {
var ptr = validateThis(this, classType, humanName + ' setter');
var destructors = [];
setter(setterContext, ptr, setterArgumentType['toWireType'](destructors, v));
runDestructors(destructors);
};
}
Object.defineProperty(classType.registeredClass.instancePrototype, fieldName, desc);
return [];
});
return [];
});
};
function handleAllocatorInit() {
Object.assign(HandleAllocator.prototype, /** @lends {HandleAllocator.prototype} */ {
get(id) {
assert(this.allocated[id] !== undefined, `invalid handle: ${id}`);
return this.allocated[id];
},
has(id) {
return this.allocated[id] !== undefined;
},
allocate(handle) {
var id = this.freelist.pop() || this.allocated.length;
this.allocated[id] = handle;
return id;
},
free(id) {
assert(this.allocated[id] !== undefined);
// Set the slot to `undefined` rather than using `delete` here since
// apparently arrays with holes in them can be less efficient.
this.allocated[id] = undefined;
this.freelist.push(id);
}
});
}
/** @constructor */
function HandleAllocator() {
// Reserve slot 0 so that 0 is always an invalid handle
this.allocated = [undefined];
this.freelist = [];
}
var emval_handles = new HandleAllocator();;
var __emval_decref = (handle) => {
if (handle >= emval_handles.reserved && 0 === --emval_handles.get(handle).refcount) {
emval_handles.free(handle);
}
};
var count_emval_handles = () => {
var count = 0;
for (var i = emval_handles.reserved; i < emval_handles.allocated.length; ++i) {
if (emval_handles.allocated[i] !== undefined) {
++count;
}
}
return count;
};
var init_emval = () => {
// reserve some special values. These never get de-allocated.
// The HandleAllocator takes care of reserving zero.
emval_handles.allocated.push(
{value: undefined},
{value: null},
{value: true},
{value: false},
);
emval_handles.reserved = emval_handles.allocated.length
Module['count_emval_handles'] = count_emval_handles;
};
var Emval = {
toValue:(handle) => {
if (!handle) {
throwBindingError('Cannot use deleted val. handle = ' + handle);
}
return emval_handles.get(handle).value;
},
toHandle:(value) => {
switch (value) {
case undefined: return 1;
case null: return 2;
case true: return 3;
case false: return 4;
default:{
return emval_handles.allocate({refcount: 1, value: value});
}
}
},
};
var __embind_register_emval = (rawType, name) => {
name = readLatin1String(name);
registerType(rawType, {
name,
'fromWireType': (handle) => {
var rv = Emval.toValue(handle);
__emval_decref(handle);
return rv;
},
'toWireType': (destructors, value) => Emval.toHandle(value),
'argPackAdvance': GenericWireTypeSize,
'readValueFromPointer': simpleReadValueFromPointer,
destructorFunction: null, // This type does not need a destructor
// TODO: do we need a deleteObject here? write a test where
// emval is passed into JS via an interface
});
};
var embindRepr = (v) => {
if (v === null) {
return 'null';
}
var t = typeof v;
if (t === 'object' || t === 'array' || t === 'function') {
return v.toString();
} else {
return '' + v;
}
};
var floatReadValueFromPointer = (name, width) => {
switch (width) {
case 4: return function(pointer) {
return this['fromWireType'](HEAPF32[((pointer)>>2)]);
};
case 8: return function(pointer) {
return this['fromWireType'](HEAPF64[((pointer)>>3)]);
};
default:
throw new TypeError(`invalid float width (${width}): ${name}`);
}
};
var __embind_register_float = (rawType, name, size) => {
name = readLatin1String(name);
registerType(rawType, {
name,
'fromWireType': (value) => value,
'toWireType': (destructors, value) => {
if (typeof value != "number" && typeof value != "boolean") {
throw new TypeError(`Cannot convert ${embindRepr(value)} to ${this.name}`);
}
// The VM will perform JS to Wasm value conversion, according to the spec:
// https://www.w3.org/TR/wasm-js-api-1/#towebassemblyvalue
return value;
},
'argPackAdvance': GenericWireTypeSize,
'readValueFromPointer': floatReadValueFromPointer(name, size),
destructorFunction: null, // This type does not need a destructor
});
};
var integerReadValueFromPointer = (name, width, signed) => {
// integers are quite common, so generate very specialized functions
switch (width) {
case 1: return signed ?
(pointer) => HEAP8[((pointer)>>0)] :
(pointer) => HEAPU8[((pointer)>>0)];
case 2: return signed ?
(pointer) => HEAP16[((pointer)>>1)] :
(pointer) => HEAPU16[((pointer)>>1)]
case 4: return signed ?
(pointer) => HEAP32[((pointer)>>2)] :
(pointer) => HEAPU32[((pointer)>>2)]
default:
throw new TypeError(`invalid integer width (${width}): ${name}`);
}
};
var __embind_register_integer = (primitiveType, name, size, minRange, maxRange) => {
name = readLatin1String(name);
// LLVM doesn't have signed and unsigned 32-bit types, so u32 literals come
// out as 'i32 -1'. Always treat those as max u32.
if (maxRange === -1) {
maxRange = 4294967295;
}
var fromWireType = (value) => value;
if (minRange === 0) {
var bitshift = 32 - 8*size;
fromWireType = (value) => (value << bitshift) >>> bitshift;
}
var isUnsignedType = (name.includes('unsigned'));
var checkAssertions = (value, toTypeName) => {
if (typeof value != "number" && typeof value != "boolean") {
throw new TypeError(`Cannot convert "${embindRepr(value)}" to ${toTypeName}`);
}
if (value < minRange || value > maxRange) {
throw new TypeError(`Passing a number "${embindRepr(value)}" from JS side to C/C++ side to an argument of type "${name}", which is outside the valid range [${minRange}, ${maxRange}]!`);
}
}
var toWireType;
if (isUnsignedType) {
toWireType = function(destructors, value) {
checkAssertions(value, this.name);
return value >>> 0;
}
} else {
toWireType = function(destructors, value) {
checkAssertions(value, this.name);
// The VM will perform JS to Wasm value conversion, according to the spec:
// https://www.w3.org/TR/wasm-js-api-1/#towebassemblyvalue
return value;
}
}
registerType(primitiveType, {
name,
'fromWireType': fromWireType,
'toWireType': toWireType,
'argPackAdvance': GenericWireTypeSize,
'readValueFromPointer': integerReadValueFromPointer(name, size, minRange !== 0),
destructorFunction: null, // This type does not need a destructor
});
};
var __embind_register_memory_view = (rawType, dataTypeIndex, name) => {
var typeMapping = [
Int8Array,
Uint8Array,
Int16Array,
Uint16Array,
Int32Array,
Uint32Array,
Float32Array,
Float64Array,
];
var TA = typeMapping[dataTypeIndex];
function decodeMemoryView(handle) {
var size = HEAPU32[((handle)>>2)];
var data = HEAPU32[(((handle)+(4))>>2)];
return new TA(HEAP8.buffer, data, size);
}
name = readLatin1String(name);
registerType(rawType, {
name,
'fromWireType': decodeMemoryView,
'argPackAdvance': GenericWireTypeSize,
'readValueFromPointer': decodeMemoryView,
}, {
ignoreDuplicateRegistrations: true,
});
};
var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
assert(typeof str === 'string');
// Parameter maxBytesToWrite is not optional. Negative values, 0, null,
// undefined and false each don't write out any bytes.
if (!(maxBytesToWrite > 0))
return 0;
var startIdx = outIdx;
var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator.
for (var i = 0; i < str.length; ++i) {
// Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code
// unit, not a Unicode code point of the character! So decode
// UTF16->UTF32->UTF8.
// See http://unicode.org/faq/utf_bom.html#utf16-3
// For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description
// and https://www.ietf.org/rfc/rfc2279.txt
// and https://tools.ietf.org/html/rfc3629
var u = str.charCodeAt(i); // possibly a lead surrogate
if (u >= 0xD800 && u <= 0xDFFF) {
var u1 = str.charCodeAt(++i);
u = 0x10000 + ((u & 0x3FF) << 10) | (u1 & 0x3FF);
}
if (u <= 0x7F) {
if (outIdx >= endIdx) break;
heap[outIdx++] = u;
} else if (u <= 0x7FF) {
if (outIdx + 1 >= endIdx) break;
heap[outIdx++] = 0xC0 | (u >> 6);
heap[outIdx++] = 0x80 | (u & 63);
} else if (u <= 0xFFFF) {
if (outIdx + 2 >= endIdx) break;
heap[outIdx++] = 0xE0 | (u >> 12);
heap[outIdx++] = 0x80 | ((u >> 6) & 63);
heap[outIdx++] = 0x80 | (u & 63);
} else {
if (outIdx + 3 >= endIdx) break;
if (u > 0x10FFFF) warnOnce('Invalid Unicode code point ' + ptrToString(u) + ' encountered when serializing a JS string to a UTF-8 string in wasm memory! (Valid unicode code points should be in range 0-0x10FFFF).');
heap[outIdx++] = 0xF0 | (u >> 18);
heap[outIdx++] = 0x80 | ((u >> 12) & 63);
heap[outIdx++] = 0x80 | ((u >> 6) & 63);
heap[outIdx++] = 0x80 | (u & 63);
}
}
// Null-terminate the pointer to the buffer.
heap[outIdx] = 0;
return outIdx - startIdx;
};
var stringToUTF8 = (str, outPtr, maxBytesToWrite) => {
assert(typeof maxBytesToWrite == 'number', 'stringToUTF8(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!');
return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite);
};
var lengthBytesUTF8 = (str) => {
var len = 0;
for (var i = 0; i < str.length; ++i) {
// Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code
// unit, not a Unicode code point of the character! So decode
// UTF16->UTF32->UTF8.
// See http://unicode.org/faq/utf_bom.html#utf16-3
var c = str.charCodeAt(i); // possibly a lead surrogate
if (c <= 0x7F) {
len++;
} else if (c <= 0x7FF) {
len += 2;
} else if (c >= 0xD800 && c <= 0xDFFF) {
len += 4; ++i;
} else {
len += 3;
}
}
return len;
};
var UTF8Decoder = typeof TextDecoder != 'undefined' ? new TextDecoder('utf8') : undefined;
/**
* Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given
* array that contains uint8 values, returns a copy of that string as a
* Javascript String object.
* heapOrArray is either a regular array, or a JavaScript typed array view.
* @param {number} idx
* @param {number=} maxBytesToRead
* @return {string}
*/
var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => {
var endIdx = idx + maxBytesToRead;
var endPtr = idx;
// TextDecoder needs to know the byte length in advance, it doesn't stop on
// null terminator by itself. Also, use the length info to avoid running tiny
// strings through TextDecoder, since .subarray() allocates garbage.
// (As a tiny code save trick, compare endPtr against endIdx using a negation,
// so that undefined means Infinity)
while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr;
if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) {
return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr));
}
var str = '';
// If building with TextDecoder, we have already computed the string length
// above, so test loop end condition against that
while (idx < endPtr) {
// For UTF8 byte structure, see:
// http://en.wikipedia.org/wiki/UTF-8#Description
// https://www.ietf.org/rfc/rfc2279.txt
// https://tools.ietf.org/html/rfc3629
var u0 = heapOrArray[idx++];
if (!(u0 & 0x80)) { str += String.fromCharCode(u0); continue; }
var u1 = heapOrArray[idx++] & 63;
if ((u0 & 0xE0) == 0xC0) { str += String.fromCharCode(((u0 & 31) << 6) | u1); continue; }
var u2 = heapOrArray[idx++] & 63;
if ((u0 & 0xF0) == 0xE0) {
u0 = ((u0 & 15) << 12) | (u1 << 6) | u2;
} else {
if ((u0 & 0xF8) != 0xF0) warnOnce('Invalid UTF-8 leading byte ' + ptrToString(u0) + ' encountered when deserializing a UTF-8 string in wasm memory to a JS string!');
u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63);
}
if (u0 < 0x10000) {
str += String.fromCharCode(u0);
} else {
var ch = u0 - 0x10000;
str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF));
}
}
return str;
};
/**
* Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the
* emscripten HEAP, returns a copy of that string as a Javascript String object.
*
* @param {number} ptr
* @param {number=} maxBytesToRead - An optional length that specifies the
* maximum number of bytes to read. You can omit this parameter to scan the
* string until the first 0 byte. If maxBytesToRead is passed, and the string
* at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the
* string will cut short at that byte index (i.e. maxBytesToRead will not
* produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing
* frequent uses of UTF8ToString() with and without maxBytesToRead may throw
* JS JIT optimizations off, so it is worth to consider consistently using one
* @return {string}
*/
var UTF8ToString = (ptr, maxBytesToRead) => {
assert(typeof ptr == 'number');
return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : '';
};
var __embind_register_std_string = (rawType, name) => {
name = readLatin1String(name);
var stdStringIsUTF8
//process only std::string bindings with UTF8 support, in contrast to e.g. std::basic_string<unsigned char>
= (name === "std::string");
registerType(rawType, {
name,
'fromWireType': (value) => {
var length = HEAPU32[((value)>>2)];
var payload = value + 4;
var str;
if (stdStringIsUTF8) {
var decodeStartPtr = payload;
// Looping here to support possible embedded '0' bytes
for (var i = 0; i <= length; ++i) {
var currentBytePtr = payload + i;
if (i == length || HEAPU8[currentBytePtr] == 0) {
var maxRead = currentBytePtr - decodeStartPtr;
var stringSegment = UTF8ToString(decodeStartPtr, maxRead);
if (str === undefined) {
str = stringSegment;
} else {
str += String.fromCharCode(0);
str += stringSegment;
}
decodeStartPtr = currentBytePtr + 1;
}
}
} else {
var a = new Array(length);
for (var i = 0; i < length; ++i) {
a[i] = String.fromCharCode(HEAPU8[payload + i]);
}
str = a.join('');
}
_free(value);
return str;
},
'toWireType': (destructors, value) => {
if (value instanceof ArrayBuffer) {
value = new Uint8Array(value);
}
var length;
var valueIsOfTypeString = (typeof value == 'string');
if (!(valueIsOfTypeString || value instanceof Uint8Array || value instanceof Uint8ClampedArray || value instanceof Int8Array)) {
throwBindingError('Cannot pass non-string to std::string');
}
if (stdStringIsUTF8 && valueIsOfTypeString) {
length = lengthBytesUTF8(value);
} else {
length = value.length;
}
// assumes 4-byte alignment
var base = _malloc(4 + length + 1);
var ptr = base + 4;
HEAPU32[((base)>>2)] = length;checkInt32(length);
if (stdStringIsUTF8 && valueIsOfTypeString) {
stringToUTF8(value, ptr, length + 1);
} else {
if (valueIsOfTypeString) {
for (var i = 0; i < length; ++i) {
var charCode = value.charCodeAt(i);
if (charCode > 255) {
_free(ptr);
throwBindingError('String has UTF-16 code units that do not fit in 8 bits');
}
HEAPU8[ptr + i] = charCode;
}
} else {
for (var i = 0; i < length; ++i) {
HEAPU8[ptr + i] = value[i];
}
}
}
if (destructors !== null) {
destructors.push(_free, base);
}
return base;
},
'argPackAdvance': GenericWireTypeSize,
'readValueFromPointer': readPointer,
destructorFunction: (ptr) => _free(ptr),
});
};
var UTF16Decoder = typeof TextDecoder != 'undefined' ? new TextDecoder('utf-16le') : undefined;;
var UTF16ToString = (ptr, maxBytesToRead) => {
assert(ptr % 2 == 0, 'Pointer passed to UTF16ToString must be aligned to two bytes!');
var endPtr = ptr;
// TextDecoder needs to know the byte length in advance, it doesn't stop on
// null terminator by itself.
// Also, use the length info to avoid running tiny strings through
// TextDecoder, since .subarray() allocates garbage.
var idx = endPtr >> 1;
var maxIdx = idx + maxBytesToRead / 2;
// If maxBytesToRead is not passed explicitly, it will be undefined, and this
// will always evaluate to true. This saves on code size.
while (!(idx >= maxIdx) && HEAPU16[idx]) ++idx;
endPtr = idx << 1;
if (endPtr - ptr > 32 && UTF16Decoder)
return UTF16Decoder.decode(HEAPU8.subarray(ptr, endPtr));
// Fallback: decode without UTF16Decoder
var str = '';
// If maxBytesToRead is not passed explicitly, it will be undefined, and the
// for-loop's condition will always evaluate to true. The loop is then
// terminated on the first null char.
for (var i = 0; !(i >= maxBytesToRead / 2); ++i) {
var codeUnit = HEAP16[(((ptr)+(i*2))>>1)];
if (codeUnit == 0) break;
// fromCharCode constructs a character from a UTF-16 code unit, so we can
// pass the UTF16 string right through.
str += String.fromCharCode(codeUnit);
}
return str;
};
var stringToUTF16 = (str, outPtr, maxBytesToWrite) => {
assert(outPtr % 2 == 0, 'Pointer passed to stringToUTF16 must be aligned to two bytes!');
assert(typeof maxBytesToWrite == 'number', 'stringToUTF16(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!');
// Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed.
if (maxBytesToWrite === undefined) {
maxBytesToWrite = 0x7FFFFFFF;
}
if (maxBytesToWrite < 2) return 0;
maxBytesToWrite -= 2; // Null terminator.
var startPtr = outPtr;
var numCharsToWrite = (maxBytesToWrite < str.length*2) ? (maxBytesToWrite / 2) : str.length;
for (var i = 0; i < numCharsToWrite; ++i) {
// charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP.
var codeUnit = str.charCodeAt(i); // possibly a lead surrogate
HEAP16[((outPtr)>>1)] = codeUnit;checkInt16(codeUnit);
outPtr += 2;
}
// Null-terminate the pointer to the HEAP.
HEAP16[((outPtr)>>1)] = 0;checkInt16(0);
return outPtr - startPtr;
};
var lengthBytesUTF16 = (str) => {
return str.length*2;
};
var UTF32ToString = (ptr, maxBytesToRead) => {
assert(ptr % 4 == 0, 'Pointer passed to UTF32ToString must be aligned to four bytes!');
var i = 0;
var str = '';
// If maxBytesToRead is not passed explicitly, it will be undefined, and this
// will always evaluate to true. This saves on code size.
while (!(i >= maxBytesToRead / 4)) {
var utf32 = HEAP32[(((ptr)+(i*4))>>2)];
if (utf32 == 0) break;
++i;
// Gotcha: fromCharCode constructs a character from a UTF-16 encoded code (pair), not from a Unicode code point! So encode the code point to UTF-16 for constructing.
// See http://unicode.org/faq/utf_bom.html#utf16-3
if (utf32 >= 0x10000) {
var ch = utf32 - 0x10000;
str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF));
} else {
str += String.fromCharCode(utf32);
}
}
return str;
};
var stringToUTF32 = (str, outPtr, maxBytesToWrite) => {
assert(outPtr % 4 == 0, 'Pointer passed to stringToUTF32 must be aligned to four bytes!');
assert(typeof maxBytesToWrite == 'number', 'stringToUTF32(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!');
// Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed.
if (maxBytesToWrite === undefined) {
maxBytesToWrite = 0x7FFFFFFF;
}
if (maxBytesToWrite < 4) return 0;
var startPtr = outPtr;
var endPtr = startPtr + maxBytesToWrite - 4;
for (var i = 0; i < str.length; ++i) {
// Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap.
// See http://unicode.org/faq/utf_bom.html#utf16-3
var codeUnit = str.charCodeAt(i); // possibly a lead surrogate
if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) {
var trailSurrogate = str.charCodeAt(++i);
codeUnit = 0x10000 + ((codeUnit & 0x3FF) << 10) | (trailSurrogate & 0x3FF);
}
HEAP32[((outPtr)>>2)] = codeUnit;checkInt32(codeUnit);
outPtr += 4;
if (outPtr + 4 > endPtr) break;
}
// Null-terminate the pointer to the HEAP.
HEAP32[((outPtr)>>2)] = 0;checkInt32(0);
return outPtr - startPtr;
};
var lengthBytesUTF32 = (str) => {
var len = 0;
for (var i = 0; i < str.length; ++i) {
// Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap.
// See http://unicode.org/faq/utf_bom.html#utf16-3
var codeUnit = str.charCodeAt(i);
if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) ++i; // possibly a lead surrogate, so skip over the tail surrogate.
len += 4;
}
return len;
};
var __embind_register_std_wstring = (rawType, charSize, name) => {
name = readLatin1String(name);
var decodeString, encodeString, getHeap, lengthBytesUTF, shift;
if (charSize === 2) {
decodeString = UTF16ToString;
encodeString = stringToUTF16;
lengthBytesUTF = lengthBytesUTF16;
getHeap = () => HEAPU16;
shift = 1;
} else if (charSize === 4) {
decodeString = UTF32ToString;
encodeString = stringToUTF32;
lengthBytesUTF = lengthBytesUTF32;
getHeap = () => HEAPU32;
shift = 2;
}
registerType(rawType, {
name,
'fromWireType': (value) => {
// Code mostly taken from _embind_register_std_string fromWireType
var length = HEAPU32[((value)>>2)];
var HEAP = getHeap();
var str;
var decodeStartPtr = value + 4;
// Looping here to support possible embedded '0' bytes
for (var i = 0; i <= length; ++i) {
var currentBytePtr = value + 4 + i * charSize;
if (i == length || HEAP[currentBytePtr >> shift] == 0) {
var maxReadBytes = currentBytePtr - decodeStartPtr;
var stringSegment = decodeString(decodeStartPtr, maxReadBytes);
if (str === undefined) {
str = stringSegment;
} else {
str += String.fromCharCode(0);
str += stringSegment;
}
decodeStartPtr = currentBytePtr + charSize;
}
}
_free(value);
return str;
},
'toWireType': (destructors, value) => {
if (!(typeof value == 'string')) {
throwBindingError(`Cannot pass non-string to C++ string type ${name}`);
}
// assumes 4-byte alignment
var length = lengthBytesUTF(value);
var ptr = _malloc(4 + length + charSize);
HEAPU32[ptr >> 2] = length >> shift;
encodeString(value, ptr + 4, length + charSize);
if (destructors !== null) {
destructors.push(_free, ptr);
}
return ptr;
},
'argPackAdvance': GenericWireTypeSize,
'readValueFromPointer': simpleReadValueFromPointer,
destructorFunction: (ptr) => _free(ptr),
});
};
var __embind_register_value_object = (
rawType,
name,
constructorSignature,
rawConstructor,
destructorSignature,
rawDestructor
) => {
structRegistrations[rawType] = {
name: readLatin1String(name),
rawConstructor: embind__requireFunction(constructorSignature, rawConstructor),
rawDestructor: embind__requireFunction(destructorSignature, rawDestructor),
fields: [],
};
};
var __embind_register_value_object_field = (
structType,
fieldName,
getterReturnType,
getterSignature,
getter,
getterContext,
setterArgumentType,
setterSignature,
setter,
setterContext
) => {
structRegistrations[structType].fields.push({
fieldName: readLatin1String(fieldName),
getterReturnType,
getter: embind__requireFunction(getterSignature, getter),
getterContext,
setterArgumentType,
setter: embind__requireFunction(setterSignature, setter),
setterContext,
});
};
var __embind_register_void = (rawType, name) => {
name = readLatin1String(name);
registerType(rawType, {
isVoid: true, // void return values can be optimized out sometimes
name,
'argPackAdvance': 0,
'fromWireType': () => undefined,
// TODO: assert if anything else is given?
'toWireType': (destructors, o) => undefined,
});
};
var requireRegisteredType = (rawType, humanName) => {
var impl = registeredTypes[rawType];
if (undefined === impl) {
throwBindingError(humanName + " has unknown type " + getTypeName(rawType));
}
return impl;
};
var __emval_as = (handle, returnType, destructorsRef) => {
handle = Emval.toValue(handle);
returnType = requireRegisteredType(returnType, 'emval::as');
var destructors = [];
var rd = Emval.toHandle(destructors);
HEAPU32[((destructorsRef)>>2)] = rd;
return returnType['toWireType'](destructors, handle);
};
var emval_allocateDestructors = (destructorsRef) => {
var destructors = [];
HEAPU32[((destructorsRef)>>2)] = Emval.toHandle(destructors);
return destructors;
};
var emval_symbols = {
};
var getStringOrSymbol = (address) => {
var symbol = emval_symbols[address];
if (symbol === undefined) {
return readLatin1String(address);
}
return symbol;
};
var emval_methodCallers = [];
var __emval_call_void_method = (caller, handle, methodName, args) => {
caller = emval_methodCallers[caller];
handle = Emval.toValue(handle);
methodName = getStringOrSymbol(methodName);
caller(handle, methodName, null, args);
};
var emval_addMethodCaller = (caller) => {
var id = emval_methodCallers.length;
emval_methodCallers.push(caller);
return id;
};
var emval_lookupTypes = (argCount, argTypes) => {
var a = new Array(argCount);
for (var i = 0; i < argCount; ++i) {
a[i] = requireRegisteredType(HEAPU32[(((argTypes)+(i * 4))>>2)],
"parameter " + i);
}
return a;
};
var emval_registeredMethods = [];
var __emval_get_method_caller = (argCount, argTypes) => {
var types = emval_lookupTypes(argCount, argTypes);
var retType = types[0];
var signatureName = retType.name + "_$" + types.slice(1).map(function (t) { return t.name; }).join("_") + "$";
var returnId = emval_registeredMethods[signatureName];
if (returnId !== undefined) {
return returnId;
}
var params = ["retType"];
var args = [retType];
var argsList = ""; // 'arg0, arg1, arg2, ... , argN'
for (var i = 0; i < argCount - 1; ++i) {
argsList += (i !== 0 ? ", " : "") + "arg" + i;
params.push("argType" + i);
args.push(types[1 + i]);
}
var functionName = makeLegalFunctionName("methodCaller_" + signatureName);
var functionBody =
"return function " + functionName + "(handle, name, destructors, args) {\n";
var offset = 0;
for (var i = 0; i < argCount - 1; ++i) {
functionBody +=
" var arg" + i + " = argType" + i + ".readValueFromPointer(args" + (offset ? ("+"+offset) : "") + ");\n";
offset += types[i + 1]['argPackAdvance'];
}
functionBody +=
" var rv = handle[name](" + argsList + ");\n";
for (var i = 0; i < argCount - 1; ++i) {
if (types[i + 1]['deleteObject']) {
functionBody +=
" argType" + i + ".deleteObject(arg" + i + ");\n";
}
}
if (!retType.isVoid) {
functionBody +=
" return retType.toWireType(destructors, rv);\n";
}
functionBody +=
"};\n";
params.push(functionBody);
var invokerFunction = newFunc(Function, params).apply(null, args);
returnId = emval_addMethodCaller(invokerFunction);
emval_registeredMethods[signatureName] = returnId;
return returnId;
};
var __emval_get_property = (handle, key) => {
handle = Emval.toValue(handle);
key = Emval.toValue(key);
return Emval.toHandle(handle[key]);
};
var __emval_incref = (handle) => {
if (handle > 4) {
emval_handles.get(handle).refcount += 1;
}
};
var __emval_new_array = () => {
return Emval.toHandle([]);
};
var __emval_new_cstring = (v) => {
return Emval.toHandle(getStringOrSymbol(v));
};
var __emval_run_destructors = (handle) => {
var destructors = Emval.toValue(handle);
runDestructors(destructors);
__emval_decref(handle);
};
var __emval_set_property = (handle, key, value) => {
handle = Emval.toValue(handle);
key = Emval.toValue(key);
value = Emval.toValue(value);
handle[key] = value;
};
var __emval_take_value = (type, arg) => {
type = requireRegisteredType(type, '_emval_take_value');
var v = type['readValueFromPointer'](arg);
return Emval.toHandle(v);
};
var _abort = () => {
abort('native code called abort()');
};
var _emscripten_memcpy_big = (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num);
var getHeapMax = () =>
// Stay one Wasm page short of 4GB: while e.g. Chrome is able to allocate
// full 4GB Wasm memories, the size will wrap back to 0 bytes in Wasm side
// for any code that deals with heap sizes, which would require special
// casing all heap size related code to treat 0 specially.
2147483648;
var _emscripten_get_now;
// Modern environment where performance.now() is supported:
// N.B. a shorter form "_emscripten_get_now = performance.now;" is
// unfortunately not allowed even in current browsers (e.g. FF Nightly 75).
_emscripten_get_now = () => performance.now();
;
var growMemory = (size) => {
var b = wasmMemory.buffer;
var pages = (size - b.byteLength + 65535) / 65536;
try {
// round size grow request up to wasm page size (fixed 64KB per spec)
wasmMemory.grow(pages); // .grow() takes a delta compared to the previous size
updateMemoryViews();
return 1 /*success*/;
} catch(e) {
err(`growMemory: Attempted to grow heap from ${b.byteLength} bytes to ${size} bytes, but got error: ${e}`);
}
// implicit 0 return to save code size (caller will cast "undefined" into 0
// anyhow)
};
var _emscripten_resize_heap = (requestedSize) => {
var oldSize = HEAPU8.length;
// With CAN_ADDRESS_2GB or MEMORY64, pointers are already unsigned.
requestedSize >>>= 0;
// With multithreaded builds, races can happen (another thread might increase the size
// in between), so return a failure, and let the caller retry.
assert(requestedSize > oldSize);
// Memory resize rules:
// 1. Always increase heap size to at least the requested size, rounded up
// to next page multiple.
// 2a. If MEMORY_GROWTH_LINEAR_STEP == -1, excessively resize the heap
// geometrically: increase the heap size according to
// MEMORY_GROWTH_GEOMETRIC_STEP factor (default +20%), At most
// overreserve by MEMORY_GROWTH_GEOMETRIC_CAP bytes (default 96MB).
// 2b. If MEMORY_GROWTH_LINEAR_STEP != -1, excessively resize the heap
// linearly: increase the heap size by at least
// MEMORY_GROWTH_LINEAR_STEP bytes.
// 3. Max size for the heap is capped at 2048MB-WASM_PAGE_SIZE, or by
// MAXIMUM_MEMORY, or by ASAN limit, depending on which is smallest
// 4. If we were unable to allocate as much memory, it may be due to
// over-eager decision to excessively reserve due to (3) above.
// Hence if an allocation fails, cut down on the amount of excess
// growth, in an attempt to succeed to perform a smaller allocation.
// A limit is set for how much we can grow. We should not exceed that
// (the wasm binary specifies it, so if we tried, we'd fail anyhow).
var maxHeapSize = getHeapMax();
if (requestedSize > maxHeapSize) {
err(`Cannot enlarge memory, requested ${requestedSize} bytes, but the limit is ${maxHeapSize} bytes!`);
return false;
}
var alignUp = (x, multiple) => x + (multiple - x % multiple) % multiple;
// Loop through potential heap size increases. If we attempt a too eager
// reservation that fails, cut down on the attempted size and reserve a
// smaller bump instead. (max 3 times, chosen somewhat arbitrarily)
for (var cutDown = 1; cutDown <= 4; cutDown *= 2) {
var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); // ensure geometric growth
// but limit overreserving (default to capping at +96MB overgrowth at most)
overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296 );
var newSize = Math.min(maxHeapSize, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536));
var t0 = _emscripten_get_now();
var replacement = growMemory(newSize);
var t1 = _emscripten_get_now();
dbg(`Heap resize call from ${oldSize} to ${newSize} took ${(t1 - t0)} msecs. Success: ${!!replacement}`);
if (replacement) {
return true;
}
}
err(`Failed to grow the heap from ${oldSize} bytes to ${newSize} bytes, not enough memory!`);
return false;
};
var withStackSave = (f) => {
var stack = stackSave();
var ret = f();
stackRestore(stack);
return ret;
};
var stringToUTF8OnStack = (str) => {
var size = lengthBytesUTF8(str) + 1;
var ret = stackAlloc(size);
stringToUTF8(str, ret, size);
return ret;
};
var WebGPU = {
errorCallback:(callback, type, message, userdata) => {
withStackSave(() => {
var messagePtr = stringToUTF8OnStack(message);
getWasmTableEntry(callback)(type, messagePtr, userdata);
});
},
initManagers:() => {
if (WebGPU.mgrDevice) return;
/** @constructor */
function Manager() {
this.objects = {};
this.nextId = 1;
this.create = function(object, wrapper = {}) {
var id = this.nextId++;
assert(typeof this.objects[id] == 'undefined');
wrapper.refcount = 1;
wrapper.object = object;
this.objects[id] = wrapper;
return id;
};
this.get = function(id) {
if (!id) return undefined;
var o = this.objects[id];
assert(typeof o != "undefined");
return o.object;
};
this.reference = function(id) {
var o = this.objects[id];
assert(typeof o != "undefined");
o.refcount++;
};
this.release = function(id) {
var o = this.objects[id];
assert(typeof o != "undefined");
assert(o.refcount > 0);
o.refcount--;
if (o.refcount <= 0) {
delete this.objects[id];
}
};
}
WebGPU.mgrSurface = WebGPU.mgrSurface || new Manager();
WebGPU.mgrSwapChain = WebGPU.mgrSwapChain || new Manager();
WebGPU.mgrAdapter = WebGPU.mgrAdapter || new Manager();
// TODO: Release() the device's default queue when the device is freed.
WebGPU.mgrDevice = WebGPU.mgrDevice || new Manager();
WebGPU.mgrQueue = WebGPU.mgrQueue || new Manager();
WebGPU.mgrCommandBuffer = WebGPU.mgrCommandBuffer || new Manager();
WebGPU.mgrCommandEncoder = WebGPU.mgrCommandEncoder || new Manager();
WebGPU.mgrRenderPassEncoder = WebGPU.mgrRenderPassEncoder || new Manager();
WebGPU.mgrComputePassEncoder = WebGPU.mgrComputePassEncoder || new Manager();
WebGPU.mgrBindGroup = WebGPU.mgrBindGroup || new Manager();
WebGPU.mgrBuffer = WebGPU.mgrBuffer || new Manager();
WebGPU.mgrSampler = WebGPU.mgrSampler || new Manager();
WebGPU.mgrTexture = WebGPU.mgrTexture || new Manager();
WebGPU.mgrTextureView = WebGPU.mgrTextureView || new Manager();
WebGPU.mgrQuerySet = WebGPU.mgrQuerySet || new Manager();
WebGPU.mgrBindGroupLayout = WebGPU.mgrBindGroupLayout || new Manager();
WebGPU.mgrPipelineLayout = WebGPU.mgrPipelineLayout || new Manager();
WebGPU.mgrRenderPipeline = WebGPU.mgrRenderPipeline || new Manager();
WebGPU.mgrComputePipeline = WebGPU.mgrComputePipeline || new Manager();
WebGPU.mgrShaderModule = WebGPU.mgrShaderModule || new Manager();
WebGPU.mgrRenderBundleEncoder = WebGPU.mgrRenderBundleEncoder || new Manager();
WebGPU.mgrRenderBundle = WebGPU.mgrRenderBundle || new Manager();
},
makeColor:(ptr) => {
return {
"r": HEAPF64[((ptr)>>3)],
"g": HEAPF64[(((ptr)+(8))>>3)],
"b": HEAPF64[(((ptr)+(16))>>3)],
"a": HEAPF64[(((ptr)+(24))>>3)],
};
},
makeExtent3D:(ptr) => {
return {
"width": HEAPU32[((ptr)>>2)],
"height": HEAPU32[(((ptr)+(4))>>2)],
"depthOrArrayLayers": HEAPU32[(((ptr)+(8))>>2)],
};
},
makeOrigin3D:(ptr) => {
return {
"x": HEAPU32[((ptr)>>2)],
"y": HEAPU32[(((ptr)+(4))>>2)],
"z": HEAPU32[(((ptr)+(8))>>2)],
};
},
makeImageCopyTexture:(ptr) => {
assert(ptr);assert(HEAPU32[((ptr)>>2)] === 0);
return {
"texture": WebGPU.mgrTexture.get(
HEAPU32[(((ptr)+(4))>>2)]),
"mipLevel": HEAPU32[(((ptr)+(8))>>2)],
"origin": WebGPU.makeOrigin3D(ptr + 12),
"aspect": WebGPU.TextureAspect[HEAPU32[(((ptr)+(24))>>2)]],
};
},
makeTextureDataLayout:(ptr) => {
assert(ptr);assert(HEAPU32[((ptr)>>2)] === 0);
var bytesPerRow = HEAPU32[(((ptr)+(16))>>2)];
var rowsPerImage = HEAPU32[(((ptr)+(20))>>2)];
return {
"offset": HEAPU32[((((ptr + 4))+(8))>>2)] * 0x100000000 + HEAPU32[(((ptr)+(8))>>2)],
"bytesPerRow": bytesPerRow === 4294967295 ? undefined : bytesPerRow,
"rowsPerImage": rowsPerImage === 4294967295 ? undefined : rowsPerImage,
};
},
makeImageCopyBuffer:(ptr) => {
assert(ptr);assert(HEAPU32[((ptr)>>2)] === 0);
var layoutPtr = ptr + 8;
var bufferCopyView = WebGPU.makeTextureDataLayout(layoutPtr);
bufferCopyView["buffer"] = WebGPU.mgrBuffer.get(
HEAPU32[(((ptr)+(32))>>2)]);
return bufferCopyView;
},
makePipelineConstants:(constantCount, constantsPtr) => {
if (!constantCount) return;
var constants = {};
for (var i = 0; i < constantCount; ++i) {
var entryPtr = constantsPtr + 16 * i;
var key = UTF8ToString(HEAPU32[(((entryPtr)+(4))>>2)]);
constants[key] = HEAPF64[(((entryPtr)+(8))>>3)];
}
return constants;
},
makePipelineLayout:(layoutPtr) => {
if (!layoutPtr) return 'auto';
return WebGPU.mgrPipelineLayout.get(layoutPtr);
},
makeProgrammableStageDescriptor:(ptr) => {
if (!ptr) return undefined;
assert(ptr);assert(HEAPU32[((ptr)>>2)] === 0);
return {
"module": WebGPU.mgrShaderModule.get(
HEAPU32[(((ptr)+(4))>>2)]),
"entryPoint": UTF8ToString(
HEAPU32[(((ptr)+(8))>>2)]),
"constants": WebGPU.makePipelineConstants(
HEAPU32[(((ptr)+(12))>>2)],
HEAPU32[(((ptr)+(16))>>2)]),
};
},
DeviceLostReason:{
undefined:0,
destroyed:1,
},
PreferredFormat:{
rgba8unorm:18,
bgra8unorm:23,
},
BufferMapState:["unmapped","pending","mapped"],
AddressMode:["repeat","mirror-repeat","clamp-to-edge"],
BlendFactor:["zero","one","src","one-minus-src","src-alpha","one-minus-src-alpha","dst","one-minus-dst","dst-alpha","one-minus-dst-alpha","src-alpha-saturated","constant","one-minus-constant"],
BlendOperation:["add","subtract","reverse-subtract","min","max"],
BufferBindingType:[,"uniform","storage","read-only-storage"],
CompareFunction:[,"never","less","less-equal","greater","greater-equal","equal","not-equal","always"],
CompilationInfoRequestStatus:["success","error","device-lost","unknown"],
ComputePassTimestampLocation:["beginning","end"],
CullMode:["none","front","back"],
ErrorFilter:["validation","out-of-memory","internal"],
FeatureName:[,"depth-clip-control","depth32float-stencil8","timestamp-query","pipeline-statistics-query","texture-compression-bc","texture-compression-etc2","texture-compression-astc","indirect-first-instance","shader-f16","rg11b10ufloat-renderable","bgra8unorm-storage","float32filterable"],
FilterMode:["nearest","linear"],
FrontFace:["ccw","cw"],
IndexFormat:[,"uint16","uint32"],
LoadOp:[,"clear","load"],
MipmapFilterMode:["nearest","linear"],
PipelineStatisticName:["vertex-shader-invocations","clipper-invocations","clipper-primitives-out","fragment-shader-invocations","compute-shader-invocations"],
PowerPreference:[,"low-power","high-performance"],
PrimitiveTopology:["point-list","line-list","line-strip","triangle-list","triangle-strip"],
QueryType:["occlusion","pipeline-statistics","timestamp"],
RenderPassTimestampLocation:["beginning","end"],
SamplerBindingType:[,"filtering","non-filtering","comparison"],
StencilOperation:["keep","zero","replace","invert","increment-clamp","decrement-clamp","increment-wrap","decrement-wrap"],
StorageTextureAccess:[,"write-only"],
StoreOp:[,"store","discard"],
TextureAspect:["all","stencil-only","depth-only"],
TextureDimension:["1d","2d","3d"],
TextureFormat:[,"r8unorm","r8snorm","r8uint","r8sint","r16uint","r16sint","r16float","rg8unorm","rg8snorm","rg8uint","rg8sint","r32float","r32uint","r32sint","rg16uint","rg16sint","rg16float","rgba8unorm","rgba8unorm-srgb","rgba8snorm","rgba8uint","rgba8sint","bgra8unorm","bgra8unorm-srgb","rgb10a2unorm","rg11b10ufloat","rgb9e5ufloat","rg32float","rg32uint","rg32sint","rgba16uint","rgba16sint","rgba16float","rgba32float","rgba32uint","rgba32sint","stencil8","depth16unorm","depth24plus","depth24plus-stencil8","depth32float","depth32float-stencil8","bc1-rgba-unorm","bc1-rgba-unorm-srgb","bc2-rgba-unorm","bc2-rgba-unorm-srgb","bc3-rgba-unorm","bc3-rgba-unorm-srgb","bc4-r-unorm","bc4-r-snorm","bc5-rg-unorm","bc5-rg-snorm","bc6h-rgb-ufloat","bc6h-rgb-float","bc7-rgba-unorm","bc7-rgba-unorm-srgb","etc2-rgb8unorm","etc2-rgb8unorm-srgb","etc2-rgb8a1unorm","etc2-rgb8a1unorm-srgb","etc2-rgba8unorm","etc2-rgba8unorm-srgb","eac-r11unorm","eac-r11snorm","eac-rg11unorm","eac-rg11snorm","astc-4x4-unorm","astc-4x4-unorm-srgb","astc-5x4-unorm","astc-5x4-unorm-srgb","astc-5x5-unorm","astc-5x5-unorm-srgb","astc-6x5-unorm","astc-6x5-unorm-srgb","astc-6x6-unorm","astc-6x6-unorm-srgb","astc-8x5-unorm","astc-8x5-unorm-srgb","astc-8x6-unorm","astc-8x6-unorm-srgb","astc-8x8-unorm","astc-8x8-unorm-srgb","astc-10x5-unorm","astc-10x5-unorm-srgb","astc-10x6-unorm","astc-10x6-unorm-srgb","astc-10x8-unorm","astc-10x8-unorm-srgb","astc-10x10-unorm","astc-10x10-unorm-srgb","astc-12x10-unorm","astc-12x10-unorm-srgb","astc-12x12-unorm","astc-12x12-unorm-srgb"],
TextureSampleType:[,"float","unfilterable-float","depth","sint","uint"],
TextureViewDimension:[,"1d","2d","2d-array","cube","cube-array","3d"],
VertexFormat:[,"uint8x2","uint8x4","sint8x2","sint8x4","unorm8x2","unorm8x4","snorm8x2","snorm8x4","uint16x2","uint16x4","sint16x2","sint16x4","unorm16x2","unorm16x4","snorm16x2","snorm16x4","float16x2","float16x4","float32","float32x2","float32x3","float32x4","uint32","uint32x2","uint32x3","uint32x4","sint32","sint32x2","sint32x3","sint32x4"],
VertexStepMode:["vertex","instance",],
FeatureNameString2Enum:{
undefined:"0",
'depth-clip-control':"1",
'depth32float-stencil8':"2",
'timestamp-query':"3",
'pipeline-statistics-query':"4",
'texture-compression-bc':"5",
'texture-compression-etc2':"6",
'texture-compression-astc':"7",
'indirect-first-instance':"8",
'shader-f16':"9",
'rg11b10ufloat-renderable':"10",
'bgra8unorm-storage':"11",
float32filterable:"12",
},
};
var _emscripten_webgpu_get_device = () => {
assert(Module['preinitializedWebGPUDevice']);
if (WebGPU.preinitializedDeviceId === undefined) {
var device = Module['preinitializedWebGPUDevice'];
var deviceWrapper = { queueId: WebGPU.mgrQueue.create(device["queue"]) };
WebGPU.preinitializedDeviceId = WebGPU.mgrDevice.create(device, deviceWrapper);
}
WebGPU.mgrDevice.reference(WebGPU.preinitializedDeviceId);
return WebGPU.preinitializedDeviceId;
};
var ENV = {
};
var getExecutableName = () => {
return thisProgram || './this.program';
};
var getEnvStrings = () => {
if (!getEnvStrings.strings) {
// Default values.
// Browser language detection #8751
var lang = ((typeof navigator == 'object' && navigator.languages && navigator.languages[0]) || 'C').replace('-', '_') + '.UTF-8';
var env = {
'USER': 'web_user',
'LOGNAME': 'web_user',
'PATH': '/',
'PWD': '/',
'HOME': '/home/web_user',
'LANG': lang,
'_': getExecutableName()
};
// Apply the user-provided values, if any.
for (var x in ENV) {
// x is a key in ENV; if ENV[x] is undefined, that means it was
// explicitly set to be so. We allow user code to do that to
// force variables with default values to remain unset.
if (ENV[x] === undefined) delete env[x];
else env[x] = ENV[x];
}
var strings = [];
for (var x in env) {
strings.push(`${x}=${env[x]}`);
}
getEnvStrings.strings = strings;
}
return getEnvStrings.strings;
};
var stringToAscii = (str, buffer) => {
for (var i = 0; i < str.length; ++i) {
assert(str.charCodeAt(i) === (str.charCodeAt(i) & 0xff));
HEAP8[((buffer++)>>0)] = str.charCodeAt(i);checkInt8(str.charCodeAt(i));
}
// Null-terminate the string
HEAP8[((buffer)>>0)] = 0;checkInt8(0);
};
var SYSCALLS = {
varargs:undefined,
get() {
assert(SYSCALLS.varargs != undefined);
var ret = HEAP32[((SYSCALLS.varargs)>>2)];
SYSCALLS.varargs += 4;
return ret;
},
getp() { return SYSCALLS.get() },
getStr(ptr) {
var ret = UTF8ToString(ptr);
return ret;
},
};
var _environ_get = (__environ, environ_buf) => {
var bufSize = 0;
getEnvStrings().forEach((string, i) => {
var ptr = environ_buf + bufSize;
HEAPU32[(((__environ)+(i*4))>>2)] = ptr;checkInt32(ptr);
stringToAscii(string, ptr);
bufSize += string.length + 1;
});
return 0;
};
var _environ_sizes_get = (penviron_count, penviron_buf_size) => {
var strings = getEnvStrings();
HEAPU32[((penviron_count)>>2)] = strings.length;checkInt32(strings.length);
var bufSize = 0;
strings.forEach((string) => bufSize += string.length + 1);
HEAPU32[((penviron_buf_size)>>2)] = bufSize;checkInt32(bufSize);
return 0;
};
var _fd_close = (fd) => {
abort('fd_close called without SYSCALLS_REQUIRE_FILESYSTEM');
};
var convertI32PairToI53Checked = (lo, hi) => {
assert(lo == (lo >>> 0) || lo == (lo|0)); // lo should either be a i32 or a u32
assert(hi === (hi|0)); // hi should be a i32
return ((hi + 0x200000) >>> 0 < 0x400001 - !!lo) ? (lo >>> 0) + hi * 4294967296 : NaN;
};
function _fd_seek(fd,offset_low, offset_high,whence,newOffset) {
var offset = convertI32PairToI53Checked(offset_low, offset_high);;
return 70;
;
}
var printCharBuffers = [null,[],[]];
var printChar = (stream, curr) => {
var buffer = printCharBuffers[stream];
assert(buffer);
if (curr === 0 || curr === 10) {
(stream === 1 ? out : err)(UTF8ArrayToString(buffer, 0));
buffer.length = 0;
} else {
buffer.push(curr);
}
};
var flush_NO_FILESYSTEM = () => {
// flush anything remaining in the buffers during shutdown
_fflush(0);
if (printCharBuffers[1].length) printChar(1, 10);
if (printCharBuffers[2].length) printChar(2, 10);
};
var _fd_write = (fd, iov, iovcnt, pnum) => {
// hack to support printf in SYSCALLS_REQUIRE_FILESYSTEM=0
var num = 0;
for (var i = 0; i < iovcnt; i++) {
var ptr = HEAPU32[((iov)>>2)];
var len = HEAPU32[(((iov)+(4))>>2)];
iov += 8;
for (var j = 0; j < len; j++) {
printChar(fd, HEAPU8[ptr+j]);
}
num += len;
}
HEAPU32[((pnum)>>2)] = num;checkInt32(num);
return 0;
};
var _wgpuAdapterGetProperties = (adapterId, properties) => {
assert(properties);assert(HEAPU32[((properties)>>2)] === 0);
HEAP32[(((properties)+(4))>>2)] = 0;checkInt32(0);
HEAP32[(((properties)+(8))>>2)] = 0;checkInt32(0);
HEAP32[(((properties)+(12))>>2)] = 0;checkInt32(0);
HEAP32[(((properties)+(16))>>2)] = 0;checkInt32(0);
HEAP32[(((properties)+(20))>>2)] = 0;checkInt32(0);
HEAP32[(((properties)+(24))>>2)] = 0;checkInt32(0);
HEAP32[(((properties)+(28))>>2)] = 3;checkInt32(3);
HEAP32[(((properties)+(32))>>2)] = 1;checkInt32(1);
HEAP32[(((properties)+(36))>>2)] = 0;checkInt32(0);
};
var _wgpuAdapterHasFeature = (adapterId, featureEnumValue) => {
var adapter = WebGPU.mgrAdapter.get(adapterId);
return adapter.features.has(WebGPU.FeatureName[featureEnumValue]);
};
var _wgpuAdapterRelease = (id) => WebGPU.mgrAdapter.release(id);
var _wgpuBindGroupRelease = (id) => WebGPU.mgrBindGroup.release(id);
var _wgpuBufferDestroy = (bufferId) => {
var bufferWrapper = WebGPU.mgrBuffer.objects[bufferId];
assert(typeof bufferWrapper != "undefined");
if (bufferWrapper.onUnmap) {
for (var i = 0; i < bufferWrapper.onUnmap.length; ++i) {
bufferWrapper.onUnmap[i]();
}
bufferWrapper.onUnmap = undefined;
}
WebGPU.mgrBuffer.get(bufferId)["destroy"]();
};
var _wgpuBufferGetMappedRange = (bufferId, offset, size) => {
var bufferWrapper = WebGPU.mgrBuffer.objects[bufferId];
assert(typeof bufferWrapper != "undefined");
if (size === 0) warnOnce('getMappedRange size=0 no longer means WGPU_WHOLE_MAP_SIZE');
if (size == -1) size = undefined;
if (bufferWrapper.mapMode !== 2) {
abort("GetMappedRange called, but buffer not mapped for writing");
// TODO(kainino0x): Somehow inject a validation error?
return 0;
}
var mapped;
try {
mapped = bufferWrapper.object["getMappedRange"](offset, size);
} catch (ex) {
err(`wgpuBufferGetMappedRange(${offset}, ${size}) failed: ${ex}`);
// TODO(kainino0x): Somehow inject a validation error?
return 0;
}
var data = _memalign(16, mapped.byteLength);
HEAPU8.fill(0, data, mapped.byteLength);
bufferWrapper.onUnmap.push(() => {
new Uint8Array(mapped).set(HEAPU8.subarray(data, data + mapped.byteLength));
_free(data);
});
return data;
};
var _wgpuBufferRelease = (id) => WebGPU.mgrBuffer.release(id);
var _wgpuBufferUnmap = (bufferId) => {
var bufferWrapper = WebGPU.mgrBuffer.objects[bufferId];
assert(typeof bufferWrapper != "undefined");
if (!bufferWrapper.onUnmap) {
// Already unmapped
return;
}
for (var i = 0; i < bufferWrapper.onUnmap.length; ++i) {
bufferWrapper.onUnmap[i]();
}
bufferWrapper.onUnmap = undefined;
bufferWrapper.object["unmap"]();
};
var _wgpuCommandBufferRelease = (id) => WebGPU.mgrCommandBuffer.release(id);
var _wgpuCommandEncoderBeginComputePass = (encoderId, descriptor) => {
var desc;
function makeComputePassTimestampWrite(twPtr) {
return {
"querySet": WebGPU.mgrQuerySet.get(
HEAPU32[((twPtr)>>2)]),
"queryIndex": HEAPU32[(((twPtr)+(4))>>2)],
"location": WebGPU.ComputePassTimestampLocation[
HEAPU32[(((twPtr)+(8))>>2)]],
};
}
function makeComputePassTimestampWrites(count, twPtr) {
var timestampWrites = [];
for (var i = 0; i < count; ++i) {
timestampWrites.push(makeComputePassTimestampWrite(twPtr + 12 * i));
}
return timestampWrites;
}
if (descriptor) {
assert(descriptor);assert(HEAPU32[((descriptor)>>2)] === 0);
desc = {};
var labelPtr = HEAPU32[(((descriptor)+(4))>>2)];
if (labelPtr) desc["label"] = UTF8ToString(labelPtr);
var timestampWriteCount = HEAPU32[(((descriptor)+(8))>>2)];
if (timestampWriteCount) {
desc["timestampWrites"] = makeComputePassTimestampWrites(
timestampWriteCount,
HEAPU32[(((descriptor)+(12))>>2)]);
}
}
var commandEncoder = WebGPU.mgrCommandEncoder.get(encoderId);
return WebGPU.mgrComputePassEncoder.create(commandEncoder["beginComputePass"](desc));
};
var _wgpuCommandEncoderBeginRenderPass = (encoderId, descriptor) => {
assert(descriptor);
function makeColorAttachment(caPtr) {
var viewPtr = HEAPU32[(((caPtr)+(4))>>2)];
if (viewPtr === 0) {
// view could be undefined.
return undefined;
}
var loadOpInt = HEAPU32[(((caPtr)+(12))>>2)];
assert(loadOpInt !== 0);
var storeOpInt = HEAPU32[(((caPtr)+(16))>>2)];
assert(storeOpInt !== 0);
var clearValue = WebGPU.makeColor(caPtr + 24);
return {
"view": WebGPU.mgrTextureView.get(viewPtr),
"resolveTarget": WebGPU.mgrTextureView.get(
HEAPU32[(((caPtr)+(8))>>2)]),
"clearValue": clearValue,
"loadOp": WebGPU.LoadOp[loadOpInt],
"storeOp": WebGPU.StoreOp[storeOpInt],
};
}
function makeColorAttachments(count, caPtr) {
var attachments = [];
for (var i = 0; i < count; ++i) {
attachments.push(makeColorAttachment(caPtr + 56 * i));
}
return attachments;
}
function makeDepthStencilAttachment(dsaPtr) {
if (dsaPtr === 0) return undefined;
return {
"view": WebGPU.mgrTextureView.get(
HEAPU32[((dsaPtr)>>2)]),
"depthClearValue": HEAPF32[(((dsaPtr)+(12))>>2)],
"depthLoadOp": WebGPU.LoadOp[
HEAPU32[(((dsaPtr)+(4))>>2)]],
"depthStoreOp": WebGPU.StoreOp[
HEAPU32[(((dsaPtr)+(8))>>2)]],
"depthReadOnly": (HEAP8[(((dsaPtr)+(16))>>0)] !== 0),
"stencilClearValue": HEAPU32[(((dsaPtr)+(28))>>2)],
"stencilLoadOp": WebGPU.LoadOp[
HEAPU32[(((dsaPtr)+(20))>>2)]],
"stencilStoreOp": WebGPU.StoreOp[
HEAPU32[(((dsaPtr)+(24))>>2)]],
"stencilReadOnly": (HEAP8[(((dsaPtr)+(32))>>0)] !== 0),
};
}
function makeRenderPassTimestampWrite(twPtr) {
return {
"querySet": WebGPU.mgrQuerySet.get(
HEAPU32[((twPtr)>>2)]),
"queryIndex": HEAPU32[(((twPtr)+(4))>>2)],
"location": WebGPU.RenderPassTimestampLocation[
HEAPU32[(((twPtr)+(8))>>2)]],
};
}
function makeRenderPassTimestampWrites(count, twPtr) {
var timestampWrites = [];
for (var i = 0; i < count; ++i) {
timestampWrites.push(makeRenderPassTimestampWrite(twPtr + 12 * i));
}
return timestampWrites;
}
function makeRenderPassDescriptor(descriptor) {
assert(descriptor);
var nextInChainPtr = HEAPU32[((descriptor)>>2)];
var maxDrawCount = undefined;
if (nextInChainPtr !== 0) {
var sType = HEAPU32[(((nextInChainPtr)+(4))>>2)];
assert(sType === 15);
assert(0 === HEAPU32[((nextInChainPtr)>>2)]);
var renderPassDescriptorMaxDrawCount = nextInChainPtr;
assert(renderPassDescriptorMaxDrawCount);assert(HEAPU32[((renderPassDescriptorMaxDrawCount)>>2)] === 0);
maxDrawCount = HEAPU32[((((renderPassDescriptorMaxDrawCount + 4))+(8))>>2)] * 0x100000000 + HEAPU32[(((renderPassDescriptorMaxDrawCount)+(8))>>2)];
}
var desc = {
"label": undefined,
"colorAttachments": makeColorAttachments(
HEAPU32[(((descriptor)+(8))>>2)],
HEAPU32[(((descriptor)+(12))>>2)]),
"depthStencilAttachment": makeDepthStencilAttachment(
HEAPU32[(((descriptor)+(16))>>2)]),
"occlusionQuerySet": WebGPU.mgrQuerySet.get(
HEAPU32[(((descriptor)+(20))>>2)]),
"maxDrawCount": maxDrawCount,
};
var labelPtr = HEAPU32[(((descriptor)+(4))>>2)];
if (labelPtr) desc["label"] = UTF8ToString(labelPtr);
var timestampWriteCount = HEAPU32[(((descriptor)+(24))>>2)];
if (timestampWriteCount) {
desc["timestampWrites"] = makeRenderPassTimestampWrites(
timestampWriteCount,
HEAPU32[(((descriptor)+(28))>>2)]);
}
return desc;
}
var desc = makeRenderPassDescriptor(descriptor);
var commandEncoder = WebGPU.mgrCommandEncoder.get(encoderId);
return WebGPU.mgrRenderPassEncoder.create(commandEncoder["beginRenderPass"](desc));
};
function _wgpuCommandEncoderCopyBufferToBuffer(encoderId,srcId,srcOffset_low, srcOffset_high,dstId,dstOffset_low, dstOffset_high,size_low, size_high) {
var srcOffset = convertI32PairToI53Checked(srcOffset_low, srcOffset_high);;
var dstOffset = convertI32PairToI53Checked(dstOffset_low, dstOffset_high);;
var size = convertI32PairToI53Checked(size_low, size_high);;
var commandEncoder = WebGPU.mgrCommandEncoder.get(encoderId);
var src = WebGPU.mgrBuffer.get(srcId);
var dst = WebGPU.mgrBuffer.get(dstId);
commandEncoder["copyBufferToBuffer"](src, srcOffset, dst, dstOffset, size);
;
}
var _wgpuCommandEncoderCopyBufferToTexture = (encoderId, srcPtr, dstPtr, copySizePtr) => {
var commandEncoder = WebGPU.mgrCommandEncoder.get(encoderId);
var copySize = WebGPU.makeExtent3D(copySizePtr);
commandEncoder["copyBufferToTexture"](
WebGPU.makeImageCopyBuffer(srcPtr), WebGPU.makeImageCopyTexture(dstPtr), copySize);
};
var _wgpuCommandEncoderCopyTextureToTexture = (encoderId, srcPtr, dstPtr, copySizePtr) => {
var commandEncoder = WebGPU.mgrCommandEncoder.get(encoderId);
var copySize = WebGPU.makeExtent3D(copySizePtr);
commandEncoder["copyTextureToTexture"](
WebGPU.makeImageCopyTexture(srcPtr), WebGPU.makeImageCopyTexture(dstPtr), copySize);
};
var _wgpuCommandEncoderFinish = (encoderId, descriptor) => {
// TODO: Use the descriptor.
var commandEncoder = WebGPU.mgrCommandEncoder.get(encoderId);
return WebGPU.mgrCommandBuffer.create(commandEncoder["finish"]());
};
var _wgpuCommandEncoderRelease = (id) => WebGPU.mgrCommandEncoder.release(id);
var _wgpuComputePassEncoderDispatchWorkgroups = (passId, x, y, z) => {
var pass = WebGPU.mgrComputePassEncoder.get(passId);
pass["dispatchWorkgroups"](x, y, z);
};
function _wgpuComputePassEncoderDispatchWorkgroupsIndirect(passId,indirectBufferId,indirectOffset_low, indirectOffset_high) {
var indirectOffset = convertI32PairToI53Checked(indirectOffset_low, indirectOffset_high);;
var indirectBuffer = WebGPU.mgrBuffer.get(indirectBufferId);
var pass = WebGPU.mgrComputePassEncoder.get(passId);
pass["dispatchWorkgroupsIndirect"](indirectBuffer, indirectOffset);
;
}
var _wgpuComputePassEncoderEnd = (passId) => {
var pass = WebGPU.mgrComputePassEncoder.get(passId);
pass["end"]();
};
var _wgpuComputePassEncoderRelease = (id) => WebGPU.mgrComputePassEncoder.release(id);
var _wgpuComputePassEncoderSetBindGroup = (passId, groupIndex, groupId, dynamicOffsetCount, dynamicOffsetsPtr) => {
var pass = WebGPU.mgrComputePassEncoder.get(passId);
var group = WebGPU.mgrBindGroup.get(groupId);
if (dynamicOffsetCount == 0) {
pass["setBindGroup"](groupIndex, group);
} else {
var offsets = [];
for (var i = 0; i < dynamicOffsetCount; i++, dynamicOffsetsPtr += 4) {
offsets.push(HEAPU32[((dynamicOffsetsPtr)>>2)]);
}
pass["setBindGroup"](groupIndex, group, offsets);
}
};
var _wgpuComputePassEncoderSetPipeline = (passId, pipelineId) => {
var pass = WebGPU.mgrComputePassEncoder.get(passId);
var pipeline = WebGPU.mgrComputePipeline.get(pipelineId);
pass["setPipeline"](pipeline);
};
var _wgpuComputePipelineRelease = (id) => WebGPU.mgrComputePipeline.release(id);
var _wgpuCreateInstance = (descriptor) => 1;
var readI53FromI64 = (ptr) => {
return HEAPU32[((ptr)>>2)] + HEAP32[(((ptr)+(4))>>2)] * 4294967296;
};
var _wgpuDeviceCreateBindGroup = (deviceId, descriptor) => {
assert(descriptor);assert(HEAPU32[((descriptor)>>2)] === 0);
function makeEntry(entryPtr) {
assert(entryPtr);
var bufferId = HEAPU32[(((entryPtr)+(8))>>2)];
var samplerId = HEAPU32[(((entryPtr)+(32))>>2)];
var textureViewId = HEAPU32[(((entryPtr)+(36))>>2)];
assert((bufferId !== 0) + (samplerId !== 0) + (textureViewId !== 0) === 1);
var binding = HEAPU32[(((entryPtr)+(4))>>2)];
if (bufferId) {
var size = readI53FromI64((entryPtr)+(24));
if (size == -1) size = undefined;
return {
"binding": binding,
"resource": {
"buffer": WebGPU.mgrBuffer.get(bufferId),
"offset": HEAPU32[((((entryPtr + 4))+(16))>>2)] * 0x100000000 + HEAPU32[(((entryPtr)+(16))>>2)],
"size": size
},
};
} else if (samplerId) {
return {
"binding": binding,
"resource": WebGPU.mgrSampler.get(samplerId),
};
} else {
return {
"binding": binding,
"resource": WebGPU.mgrTextureView.get(textureViewId),
};
}
}
function makeEntries(count, entriesPtrs) {
var entries = [];
for (var i = 0; i < count; ++i) {
entries.push(makeEntry(entriesPtrs +
40 * i));
}
return entries;
}
var desc = {
"label": undefined,
"layout": WebGPU.mgrBindGroupLayout.get(
HEAPU32[(((descriptor)+(8))>>2)]),
"entries": makeEntries(
HEAPU32[(((descriptor)+(12))>>2)],
HEAPU32[(((descriptor)+(16))>>2)]
),
};
var labelPtr = HEAPU32[(((descriptor)+(4))>>2)];
if (labelPtr) desc["label"] = UTF8ToString(labelPtr);
var device = WebGPU.mgrDevice.get(deviceId);
return WebGPU.mgrBindGroup.create(device["createBindGroup"](desc));
};
var _wgpuDeviceCreateBindGroupLayout = (deviceId, descriptor) => {
assert(descriptor);assert(HEAPU32[((descriptor)>>2)] === 0);
function makeBufferEntry(entryPtr) {
assert(entryPtr);
var typeInt =
HEAPU32[(((entryPtr)+(4))>>2)];
if (!typeInt) return undefined;
return {
"type": WebGPU.BufferBindingType[typeInt],
"hasDynamicOffset":
(HEAP8[(((entryPtr)+(8))>>0)] !== 0),
"minBindingSize":
HEAPU32[((((entryPtr + 4))+(16))>>2)] * 0x100000000 + HEAPU32[(((entryPtr)+(16))>>2)],
};
}
function makeSamplerEntry(entryPtr) {
assert(entryPtr);
var typeInt =
HEAPU32[(((entryPtr)+(4))>>2)];
if (!typeInt) return undefined;
return {
"type": WebGPU.SamplerBindingType[typeInt],
};
}
function makeTextureEntry(entryPtr) {
assert(entryPtr);
var sampleTypeInt =
HEAPU32[(((entryPtr)+(4))>>2)];
if (!sampleTypeInt) return undefined;
return {
"sampleType": WebGPU.TextureSampleType[sampleTypeInt],
"viewDimension": WebGPU.TextureViewDimension[
HEAPU32[(((entryPtr)+(8))>>2)]],
"multisampled":
(HEAP8[(((entryPtr)+(12))>>0)] !== 0),
};
}
function makeStorageTextureEntry(entryPtr) {
assert(entryPtr);
var accessInt =
HEAPU32[(((entryPtr)+(4))>>2)]
if (!accessInt) return undefined;
return {
"access": WebGPU.StorageTextureAccess[accessInt],
"format": WebGPU.TextureFormat[
HEAPU32[(((entryPtr)+(8))>>2)]],
"viewDimension": WebGPU.TextureViewDimension[
HEAPU32[(((entryPtr)+(12))>>2)]],
};
}
function makeEntry(entryPtr) {
assert(entryPtr);
return {
"binding":
HEAPU32[(((entryPtr)+(4))>>2)],
"visibility":
HEAPU32[(((entryPtr)+(8))>>2)],
"buffer": makeBufferEntry(entryPtr + 16),
"sampler": makeSamplerEntry(entryPtr + 40),
"texture": makeTextureEntry(entryPtr + 48),
"storageTexture": makeStorageTextureEntry(entryPtr + 64),
};
}
function makeEntries(count, entriesPtrs) {
var entries = [];
for (var i = 0; i < count; ++i) {
entries.push(makeEntry(entriesPtrs +
80 * i));
}
return entries;
}
var desc = {
"entries": makeEntries(
HEAPU32[(((descriptor)+(8))>>2)],
HEAPU32[(((descriptor)+(12))>>2)]
),
};
var labelPtr = HEAPU32[(((descriptor)+(4))>>2)];
if (labelPtr) desc["label"] = UTF8ToString(labelPtr);
var device = WebGPU.mgrDevice.get(deviceId);
return WebGPU.mgrBindGroupLayout.create(device["createBindGroupLayout"](desc));
};
var _wgpuDeviceCreateBuffer = (deviceId, descriptor) => {
assert(descriptor);assert(HEAPU32[((descriptor)>>2)] === 0);
var mappedAtCreation = (HEAP8[(((descriptor)+(24))>>0)] !== 0);
var desc = {
"label": undefined,
"usage": HEAPU32[(((descriptor)+(8))>>2)],
"size": HEAPU32[((((descriptor + 4))+(16))>>2)] * 0x100000000 + HEAPU32[(((descriptor)+(16))>>2)],
"mappedAtCreation": mappedAtCreation,
};
var labelPtr = HEAPU32[(((descriptor)+(4))>>2)];
if (labelPtr) desc["label"] = UTF8ToString(labelPtr);
var device = WebGPU.mgrDevice.get(deviceId);
var bufferWrapper = {};
var id = WebGPU.mgrBuffer.create(device["createBuffer"](desc), bufferWrapper);
if (mappedAtCreation) {
bufferWrapper.mapMode = 2;
bufferWrapper.onUnmap = [];
}
return id;
};
var _wgpuDeviceCreateCommandEncoder = (deviceId, descriptor) => {
var desc;
if (descriptor) {
assert(descriptor);assert(HEAPU32[((descriptor)>>2)] === 0);
desc = {
"label": undefined,
};
var labelPtr = HEAPU32[(((descriptor)+(4))>>2)];
if (labelPtr) desc["label"] = UTF8ToString(labelPtr);
}
var device = WebGPU.mgrDevice.get(deviceId);
return WebGPU.mgrCommandEncoder.create(device["createCommandEncoder"](desc));
};
var _wgpuDeviceCreateComputePipeline = (deviceId, descriptor) => {
assert(descriptor);assert(HEAPU32[((descriptor)>>2)] === 0);
var desc = {
"label": undefined,
"layout": WebGPU.makePipelineLayout(
HEAPU32[(((descriptor)+(8))>>2)]),
"compute": WebGPU.makeProgrammableStageDescriptor(
descriptor + 12),
};
var labelPtr = HEAPU32[(((descriptor)+(4))>>2)];
if (labelPtr) desc["label"] = UTF8ToString(labelPtr);
var device = WebGPU.mgrDevice.get(deviceId);
return WebGPU.mgrComputePipeline.create(device["createComputePipeline"](desc));
};
var _wgpuDeviceCreatePipelineLayout = (deviceId, descriptor) => {
assert(descriptor);assert(HEAPU32[((descriptor)>>2)] === 0);
var bglCount = HEAPU32[(((descriptor)+(8))>>2)];
var bglPtr = HEAPU32[(((descriptor)+(12))>>2)];
var bgls = [];
for (var i = 0; i < bglCount; ++i) {
bgls.push(WebGPU.mgrBindGroupLayout.get(
HEAPU32[(((bglPtr)+(4 * i))>>2)]));
}
var desc = {
"label": undefined,
"bindGroupLayouts": bgls,
};
var labelPtr = HEAPU32[(((descriptor)+(4))>>2)];
if (labelPtr) desc["label"] = UTF8ToString(labelPtr);
var device = WebGPU.mgrDevice.get(deviceId);
return WebGPU.mgrPipelineLayout.create(device["createPipelineLayout"](desc));
};
var _wgpuDeviceCreateRenderPipeline = (deviceId, descriptor) => {
assert(descriptor);assert(HEAPU32[((descriptor)>>2)] === 0);
function makePrimitiveState(rsPtr) {
if (!rsPtr) return undefined;
assert(rsPtr);assert(HEAPU32[((rsPtr)>>2)] === 0);
return {
"topology": WebGPU.PrimitiveTopology[
HEAPU32[(((rsPtr)+(4))>>2)]],
"stripIndexFormat": WebGPU.IndexFormat[
HEAPU32[(((rsPtr)+(8))>>2)]],
"frontFace": WebGPU.FrontFace[
HEAPU32[(((rsPtr)+(12))>>2)]],
"cullMode": WebGPU.CullMode[
HEAPU32[(((rsPtr)+(16))>>2)]],
};
}
function makeBlendComponent(bdPtr) {
if (!bdPtr) return undefined;
return {
"operation": WebGPU.BlendOperation[
HEAPU32[((bdPtr)>>2)]],
"srcFactor": WebGPU.BlendFactor[
HEAPU32[(((bdPtr)+(4))>>2)]],
"dstFactor": WebGPU.BlendFactor[
HEAPU32[(((bdPtr)+(8))>>2)]],
};
}
function makeBlendState(bsPtr) {
if (!bsPtr) return undefined;
assert(bsPtr);assert(HEAPU32[((bsPtr)>>2)] === 0);
return {
"alpha": makeBlendComponent(bsPtr + 12),
"color": makeBlendComponent(bsPtr + 0),
};
}
function makeColorState(csPtr) {
assert(csPtr);assert(HEAPU32[((csPtr)>>2)] === 0);
var formatInt = HEAPU32[(((csPtr)+(4))>>2)];
return formatInt === 0 ? undefined : {
"format": WebGPU.TextureFormat[formatInt],
"blend": makeBlendState(HEAPU32[(((csPtr)+(8))>>2)]),
"writeMask": HEAPU32[(((csPtr)+(12))>>2)],
};
}
function makeColorStates(count, csArrayPtr) {
var states = [];
for (var i = 0; i < count; ++i) {
states.push(makeColorState(csArrayPtr + 16 * i));
}
return states;
}
function makeStencilStateFace(ssfPtr) {
assert(ssfPtr);
return {
"compare": WebGPU.CompareFunction[
HEAPU32[((ssfPtr)>>2)]],
"failOp": WebGPU.StencilOperation[
HEAPU32[(((ssfPtr)+(4))>>2)]],
"depthFailOp": WebGPU.StencilOperation[
HEAPU32[(((ssfPtr)+(8))>>2)]],
"passOp": WebGPU.StencilOperation[
HEAPU32[(((ssfPtr)+(12))>>2)]],
};
}
function makeDepthStencilState(dssPtr) {
if (!dssPtr) return undefined;
assert(dssPtr);
return {
"format": WebGPU.TextureFormat[
HEAPU32[(((dssPtr)+(4))>>2)]],
"depthWriteEnabled": (HEAP8[(((dssPtr)+(8))>>0)] !== 0),
"depthCompare": WebGPU.CompareFunction[
HEAPU32[(((dssPtr)+(12))>>2)]],
"stencilFront": makeStencilStateFace(dssPtr + 16),
"stencilBack": makeStencilStateFace(dssPtr + 32),
"stencilReadMask": HEAPU32[(((dssPtr)+(48))>>2)],
"stencilWriteMask": HEAPU32[(((dssPtr)+(52))>>2)],
"depthBias": HEAP32[(((dssPtr)+(56))>>2)],
"depthBiasSlopeScale": HEAPF32[(((dssPtr)+(60))>>2)],
"depthBiasClamp": HEAPF32[(((dssPtr)+(64))>>2)],
};
}
function makeVertexAttribute(vaPtr) {
assert(vaPtr);
return {
"format": WebGPU.VertexFormat[
HEAPU32[((vaPtr)>>2)]],
"offset": HEAPU32[((((vaPtr + 4))+(8))>>2)] * 0x100000000 + HEAPU32[(((vaPtr)+(8))>>2)],
"shaderLocation": HEAPU32[(((vaPtr)+(16))>>2)],
};
}
function makeVertexAttributes(count, vaArrayPtr) {
var vas = [];
for (var i = 0; i < count; ++i) {
vas.push(makeVertexAttribute(vaArrayPtr + i * 24));
}
return vas;
}
function makeVertexBuffer(vbPtr) {
if (!vbPtr) return undefined;
var stepModeInt = HEAPU32[(((vbPtr)+(8))>>2)];
return stepModeInt === 2 ? null : {
"arrayStride": HEAPU32[(((vbPtr + 4))>>2)] * 0x100000000 + HEAPU32[((vbPtr)>>2)],
"stepMode": WebGPU.VertexStepMode[stepModeInt],
"attributes": makeVertexAttributes(
HEAPU32[(((vbPtr)+(12))>>2)],
HEAPU32[(((vbPtr)+(16))>>2)]),
};
}
function makeVertexBuffers(count, vbArrayPtr) {
if (!count) return undefined;
var vbs = [];
for (var i = 0; i < count; ++i) {
vbs.push(makeVertexBuffer(vbArrayPtr + i * 24));
}
return vbs;
}
function makeVertexState(viPtr) {
if (!viPtr) return undefined;
assert(viPtr);assert(HEAPU32[((viPtr)>>2)] === 0);
return {
"module": WebGPU.mgrShaderModule.get(
HEAPU32[(((viPtr)+(4))>>2)]),
"entryPoint": UTF8ToString(
HEAPU32[(((viPtr)+(8))>>2)]),
"constants": WebGPU.makePipelineConstants(
HEAPU32[(((viPtr)+(12))>>2)],
HEAPU32[(((viPtr)+(16))>>2)]),
"buffers": makeVertexBuffers(
HEAPU32[(((viPtr)+(20))>>2)],
HEAPU32[(((viPtr)+(24))>>2)]),
};
}
function makeMultisampleState(msPtr) {
if (!msPtr) return undefined;
assert(msPtr);assert(HEAPU32[((msPtr)>>2)] === 0);
return {
"count": HEAPU32[(((msPtr)+(4))>>2)],
"mask": HEAPU32[(((msPtr)+(8))>>2)],
"alphaToCoverageEnabled": (HEAP8[(((msPtr)+(12))>>0)] !== 0),
};
}
function makeFragmentState(fsPtr) {
if (!fsPtr) return undefined;
assert(fsPtr);assert(HEAPU32[((fsPtr)>>2)] === 0);
return {
"module": WebGPU.mgrShaderModule.get(
HEAPU32[(((fsPtr)+(4))>>2)]),
"entryPoint": UTF8ToString(
HEAPU32[(((fsPtr)+(8))>>2)]),
"constants": WebGPU.makePipelineConstants(
HEAPU32[(((fsPtr)+(12))>>2)],
HEAPU32[(((fsPtr)+(16))>>2)]),
"targets": makeColorStates(
HEAPU32[(((fsPtr)+(20))>>2)],
HEAPU32[(((fsPtr)+(24))>>2)]),
};
}
var desc = {
"label": undefined,
"layout": WebGPU.makePipelineLayout(
HEAPU32[(((descriptor)+(8))>>2)]),
"vertex": makeVertexState(
descriptor + 12),
"primitive": makePrimitiveState(
descriptor + 40),
"depthStencil": makeDepthStencilState(
HEAPU32[(((descriptor)+(60))>>2)]),
"multisample": makeMultisampleState(
descriptor + 64),
"fragment": makeFragmentState(
HEAPU32[(((descriptor)+(80))>>2)]),
};
var labelPtr = HEAPU32[(((descriptor)+(4))>>2)];
if (labelPtr) desc["label"] = UTF8ToString(labelPtr);
var device = WebGPU.mgrDevice.get(deviceId);
return WebGPU.mgrRenderPipeline.create(device["createRenderPipeline"](desc));
};
var _wgpuDeviceCreateSampler = (deviceId, descriptor) => {
assert(descriptor);assert(HEAPU32[((descriptor)>>2)] === 0);
var desc = {
"label": undefined,
"addressModeU": WebGPU.AddressMode[
HEAPU32[(((descriptor)+(8))>>2)]],
"addressModeV": WebGPU.AddressMode[
HEAPU32[(((descriptor)+(12))>>2)]],
"addressModeW": WebGPU.AddressMode[
HEAPU32[(((descriptor)+(16))>>2)]],
"magFilter": WebGPU.FilterMode[
HEAPU32[(((descriptor)+(20))>>2)]],
"minFilter": WebGPU.FilterMode[
HEAPU32[(((descriptor)+(24))>>2)]],
"mipmapFilter": WebGPU.MipmapFilterMode[
HEAPU32[(((descriptor)+(28))>>2)]],
"lodMinClamp": HEAPF32[(((descriptor)+(32))>>2)],
"lodMaxClamp": HEAPF32[(((descriptor)+(36))>>2)],
"compare": WebGPU.CompareFunction[
HEAPU32[(((descriptor)+(40))>>2)]],
};
var labelPtr = HEAPU32[(((descriptor)+(4))>>2)];
if (labelPtr) desc["label"] = UTF8ToString(labelPtr);
var device = WebGPU.mgrDevice.get(deviceId);
return WebGPU.mgrSampler.create(device["createSampler"](desc));
};
var _wgpuDeviceCreateShaderModule = (deviceId, descriptor) => {
assert(descriptor);
var nextInChainPtr = HEAPU32[((descriptor)>>2)];
assert(nextInChainPtr !== 0);
var sType = HEAPU32[(((nextInChainPtr)+(4))>>2)];
var desc = {
"label": undefined,
"code": "",
};
var labelPtr = HEAPU32[(((descriptor)+(4))>>2)];
if (labelPtr) desc["label"] = UTF8ToString(labelPtr);
switch (sType) {
case 5: {
var count = HEAPU32[(((nextInChainPtr)+(8))>>2)];
var start = HEAPU32[(((nextInChainPtr)+(12))>>2)];
desc["code"] = HEAPU32.subarray(start >> 2, (start >> 2) + count);
break;
}
case 6: {
var sourcePtr = HEAPU32[(((nextInChainPtr)+(8))>>2)];
if (sourcePtr) {
desc["code"] = UTF8ToString(sourcePtr);
}
break;
}
default: abort('unrecognized ShaderModule sType');
}
var device = WebGPU.mgrDevice.get(deviceId);
return WebGPU.mgrShaderModule.create(device["createShaderModule"](desc));
};
var _wgpuDeviceCreateSwapChain = (deviceId, surfaceId, descriptor) => {
assert(descriptor);assert(HEAPU32[((descriptor)>>2)] === 0);
var device = WebGPU.mgrDevice.get(deviceId);
var context = WebGPU.mgrSurface.get(surfaceId);
assert(2 ===
HEAPU32[(((descriptor)+(24))>>2)]);
var canvasSize = [
HEAPU32[(((descriptor)+(16))>>2)],
HEAPU32[(((descriptor)+(20))>>2)]
];
if (canvasSize[0] !== 0) {
context["canvas"]["width"] = canvasSize[0];
}
if (canvasSize[1] !== 0) {
context["canvas"]["height"] = canvasSize[1];
}
var configuration = {
"device": device,
"format": WebGPU.TextureFormat[
HEAPU32[(((descriptor)+(12))>>2)]],
"usage": HEAPU32[(((descriptor)+(8))>>2)],
"alphaMode": "opaque",
};
context["configure"](configuration);
return WebGPU.mgrSwapChain.create(context);
};
var _wgpuDeviceCreateTexture = (deviceId, descriptor) => {
assert(descriptor);assert(HEAPU32[((descriptor)>>2)] === 0);
var desc = {
"label": undefined,
"size": WebGPU.makeExtent3D(descriptor + 16),
"mipLevelCount": HEAPU32[(((descriptor)+(32))>>2)],
"sampleCount": HEAPU32[(((descriptor)+(36))>>2)],
"dimension": WebGPU.TextureDimension[
HEAPU32[(((descriptor)+(12))>>2)]],
"format": WebGPU.TextureFormat[
HEAPU32[(((descriptor)+(28))>>2)]],
"usage": HEAPU32[(((descriptor)+(8))>>2)],
};
var labelPtr = HEAPU32[(((descriptor)+(4))>>2)];
if (labelPtr) desc["label"] = UTF8ToString(labelPtr);
var viewFormatCount = HEAPU32[(((descriptor)+(40))>>2)];
if (viewFormatCount) {
var viewFormatsPtr = HEAPU32[(((descriptor)+(44))>>2)];
desc["viewFormats"] = Array.from(HEAP32.subarray(viewFormatsPtr >> 2, (viewFormatsPtr >> 2) + viewFormatCount),
function(format) { return WebGPU.TextureFormat[format]; });
}
var device = WebGPU.mgrDevice.get(deviceId);
return WebGPU.mgrTexture.create(device["createTexture"](desc));
};
var _wgpuDeviceGetQueue = (deviceId) => {
var queueId = WebGPU.mgrDevice.objects[deviceId].queueId;
assert(queueId, 'wgpuDeviceGetQueue: queue was missing or null');
// Returns a new reference to the existing queue.
WebGPU.mgrQueue.reference(queueId);
return queueId;
};
var _wgpuDeviceRelease = (id) => WebGPU.mgrDevice.release(id);
var maybeCStringToJsString = (cString) => {
// "cString > 2" checks if the input is a number, and isn't of the special
// values we accept here, EMSCRIPTEN_EVENT_TARGET_* (which map to 0, 1, 2).
// In other words, if cString > 2 then it's a pointer to a valid place in
// memory, and points to a C string.
return cString > 2 ? UTF8ToString(cString) : cString;
};
var specialHTMLTargets = [0, document, window];
var findEventTarget = (target) => {
target = maybeCStringToJsString(target);
var domElement = specialHTMLTargets[target] || document.querySelector(target);
return domElement;
};
var findCanvasEventTarget = (target) => findEventTarget(target);
var _wgpuInstanceCreateSurface = (instanceId, descriptor) => {
assert(descriptor);
assert(instanceId === 1, "WGPUInstance must be created by wgpuCreateInstance");
var nextInChainPtr = HEAPU32[((descriptor)>>2)];
assert(nextInChainPtr !== 0);
assert(4 ===
HEAPU32[(((nextInChainPtr)+(4))>>2)]);
var descriptorFromCanvasHTMLSelector = nextInChainPtr;
assert(descriptorFromCanvasHTMLSelector);assert(HEAPU32[((descriptorFromCanvasHTMLSelector)>>2)] === 0);
var selectorPtr = HEAPU32[(((descriptorFromCanvasHTMLSelector)+(8))>>2)];
assert(selectorPtr);
var canvas = findCanvasEventTarget(selectorPtr);
var context = canvas.getContext('webgpu');
assert(context);
if (!context) return 0;
var labelPtr = HEAPU32[(((descriptor)+(4))>>2)];
if (labelPtr) context.surfaceLabelWebGPU = UTF8ToString(labelPtr);
return WebGPU.mgrSurface.create(context);
};
var _wgpuInstanceRelease = (instance) => {};
var handleException = (e) => {
// Certain exception types we do not treat as errors since they are used for
// internal control flow.
// 1. ExitStatus, which is thrown by exit()
// 2. "unwind", which is thrown by emscripten_unwind_to_js_event_loop() and others
// that wish to return to JS event loop.
if (e instanceof ExitStatus || e == 'unwind') {
return EXITSTATUS;
}
checkStackCookie();
if (e instanceof WebAssembly.RuntimeError) {
if (_emscripten_stack_get_current() <= 0) {
err('Stack overflow detected. You can try increasing -sSTACK_SIZE (currently set to 65536)');
}
}
quit_(1, e);
};
var _proc_exit = (code) => {
EXITSTATUS = code;
if (!keepRuntimeAlive()) {
if (Module['onExit']) Module['onExit'](code);
ABORT = true;
}
quit_(code, new ExitStatus(code));
};
/** @suppress {duplicate } */
/** @param {boolean|number=} implicit */
var exitJS = (status, implicit) => {
EXITSTATUS = status;
checkUnflushedContent();
// if exit() was called explicitly, warn the user if the runtime isn't actually being shut down
if (keepRuntimeAlive() && !implicit) {
var msg = `program exited (with status: ${status}), but keepRuntimeAlive() is set (counter=${runtimeKeepaliveCounter}) due to an async operation, so halting execution but not exiting the runtime or preventing further async execution (you can use emscripten_force_exit, if you want to force a true shutdown)`;
readyPromiseReject(msg);
err(msg);
}
_proc_exit(status);
};
var _exit = exitJS;
var maybeExit = () => {
if (!keepRuntimeAlive()) {
try {
_exit(EXITSTATUS);
} catch (e) {
handleException(e);
}
}
};
var callUserCallback = (func) => {
if (ABORT) {
err('user callback triggered after runtime exited or application aborted. Ignoring.');
return;
}
try {
func();
maybeExit();
} catch (e) {
handleException(e);
}
};
var _wgpuInstanceRequestAdapter = (instanceId, options, callback, userdata) => {
assert(instanceId === 1, "WGPUInstance must be created by wgpuCreateInstance");
var opts;
if (options) {
assert(options);assert(HEAPU32[((options)>>2)] === 0);
opts = {
"powerPreference": WebGPU.PowerPreference[
HEAPU32[(((options)+(8))>>2)]],
"forceFallbackAdapter":
(HEAP8[(((options)+(16))>>0)] !== 0),
};
}
if (!('gpu' in navigator)) {
withStackSave(() => {
var messagePtr = stringToUTF8OnStack('WebGPU not available on this browser (navigator.gpu is not available)');
getWasmTableEntry(callback)(1, 0, messagePtr, userdata);
});
return;
}
navigator["gpu"]["requestAdapter"](opts).then((adapter) => {
callUserCallback(() => {
if (adapter) {
var adapterId = WebGPU.mgrAdapter.create(adapter);
getWasmTableEntry(callback)(0, adapterId, 0, userdata);
} else {
withStackSave(() => {
var messagePtr = stringToUTF8OnStack('WebGPU not available on this system (requestAdapter returned null)');
getWasmTableEntry(callback)(1, 0, messagePtr, userdata);
});
}
});
}, (ex) => {
callUserCallback(() => {
withStackSave(() => {
var messagePtr = stringToUTF8OnStack(ex.message);
getWasmTableEntry(callback)(2, 0, messagePtr, userdata);
});
});
});
};
var _wgpuPipelineLayoutRelease = (id) => WebGPU.mgrPipelineLayout.release(id);
var _wgpuQuerySetDestroy = (querySetId) => WebGPU.mgrQuerySet.get(querySetId)["destroy"]();
var _wgpuQuerySetRelease = (id) => WebGPU.mgrQuerySet.release(id);
var _wgpuQueueOnSubmittedWorkDone = function(queueId,signalValue_low, signalValue_high,callback,userdata) {
var signalValue = convertI32PairToI53Checked(signalValue_low, signalValue_high);;
var queue = WebGPU.mgrQueue.get(queueId);
assert(signalValue == 0, 'signalValue not supported, must be 0');
queue["onSubmittedWorkDone"]().then(() => {
callUserCallback(() => {
getWasmTableEntry(callback)(0, userdata);
});
}, () => {
callUserCallback(() => {
getWasmTableEntry(callback)(1, userdata);
});
});
;
};
var _wgpuQueueRelease = (id) => WebGPU.mgrQueue.release(id);
var _wgpuQueueSubmit = (queueId, commandCount, commands) => {
assert(commands % 4 === 0);
var queue = WebGPU.mgrQueue.get(queueId);
var cmds = Array.from(HEAP32.subarray(commands >> 2, (commands >> 2) + commandCount),
function(id) { return WebGPU.mgrCommandBuffer.get(id); });
queue["submit"](cmds);
};
function _wgpuQueueWriteBuffer(queueId,bufferId,bufferOffset_low, bufferOffset_high,data,size) {
var bufferOffset = convertI32PairToI53Checked(bufferOffset_low, bufferOffset_high);;
var queue = WebGPU.mgrQueue.get(queueId);
var buffer = WebGPU.mgrBuffer.get(bufferId);
// There is a size limitation for ArrayBufferView. Work around by passing in a subarray
// instead of the whole heap. crbug.com/1201109
var subarray = HEAPU8.subarray(data, data + size);
queue["writeBuffer"](buffer, bufferOffset, subarray, 0, size);
;
}
var _wgpuQueueWriteTexture = (queueId,
destinationPtr, data, dataSize, dataLayoutPtr, writeSizePtr) => {
var queue = WebGPU.mgrQueue.get(queueId);
var destination = WebGPU.makeImageCopyTexture(destinationPtr);
var dataLayout = WebGPU.makeTextureDataLayout(dataLayoutPtr);
var writeSize = WebGPU.makeExtent3D(writeSizePtr);
// This subarray isn't strictly necessary, but helps work around an issue
// where Chromium makes a copy of the entire heap. crbug.com/1134457
var subarray = HEAPU8.subarray(data, data + dataSize);
queue["writeTexture"](destination, subarray, dataLayout, writeSize);
};
var _wgpuRenderPassEncoderDraw = (passId, vertexCount, instanceCount, firstVertex, firstInstance) => {
var pass = WebGPU.mgrRenderPassEncoder.get(passId);
pass["draw"](vertexCount, instanceCount, firstVertex, firstInstance);
};
var _wgpuRenderPassEncoderDrawIndexed = (passId, indexCount, instanceCount, firstIndex, baseVertex, firstInstance) => {
var pass = WebGPU.mgrRenderPassEncoder.get(passId);
pass["drawIndexed"](indexCount, instanceCount, firstIndex, baseVertex, firstInstance);
};
function _wgpuRenderPassEncoderDrawIndexedIndirect(passId,indirectBufferId,indirectOffset_low, indirectOffset_high) {
var indirectOffset = convertI32PairToI53Checked(indirectOffset_low, indirectOffset_high);;
var indirectBuffer = WebGPU.mgrBuffer.get(indirectBufferId);
var pass = WebGPU.mgrRenderPassEncoder.get(passId);
pass["drawIndexedIndirect"](indirectBuffer, indirectOffset);
;
}
function _wgpuRenderPassEncoderDrawIndirect(passId,indirectBufferId,indirectOffset_low, indirectOffset_high) {
var indirectOffset = convertI32PairToI53Checked(indirectOffset_low, indirectOffset_high);;
var indirectBuffer = WebGPU.mgrBuffer.get(indirectBufferId);
var pass = WebGPU.mgrRenderPassEncoder.get(passId);
pass["drawIndirect"](indirectBuffer, indirectOffset);
;
}
var _wgpuRenderPassEncoderEnd = (encoderId) => {
var encoder = WebGPU.mgrRenderPassEncoder.get(encoderId);
encoder["end"]();
};
var _wgpuRenderPassEncoderRelease = (id) => WebGPU.mgrRenderPassEncoder.release(id);
var _wgpuRenderPassEncoderSetBindGroup = (passId, groupIndex, groupId, dynamicOffsetCount, dynamicOffsetsPtr) => {
var pass = WebGPU.mgrRenderPassEncoder.get(passId);
var group = WebGPU.mgrBindGroup.get(groupId);
if (dynamicOffsetCount == 0) {
pass["setBindGroup"](groupIndex, group);
} else {
var offsets = [];
for (var i = 0; i < dynamicOffsetCount; i++, dynamicOffsetsPtr += 4) {
offsets.push(HEAPU32[((dynamicOffsetsPtr)>>2)]);
}
pass["setBindGroup"](groupIndex, group, offsets);
}
};
var _wgpuRenderPassEncoderSetBlendConstant = (passId, colorPtr) => {
var pass = WebGPU.mgrRenderPassEncoder.get(passId);
var color = WebGPU.makeColor(colorPtr);
pass["setBlendConstant"](color);
};
function _wgpuRenderPassEncoderSetIndexBuffer(passId,bufferId,format,offset_low, offset_high,size_low, size_high) {
var offset = convertI32PairToI53Checked(offset_low, offset_high);;
var size = convertI32PairToI53Checked(size_low, size_high);;
var pass = WebGPU.mgrRenderPassEncoder.get(passId);
var buffer = WebGPU.mgrBuffer.get(bufferId);
pass["setIndexBuffer"](buffer, WebGPU.IndexFormat[format], offset, size);
;
}
var _wgpuRenderPassEncoderSetLabel = (passId, labelPtr) => {
var pass = WebGPU.mgrRenderPassEncoder.get(passId);
pass.label = UTF8ToString(labelPtr);
};
var _wgpuRenderPassEncoderSetPipeline = (passId, pipelineId) => {
var pass = WebGPU.mgrRenderPassEncoder.get(passId);
var pipeline = WebGPU.mgrRenderPipeline.get(pipelineId);
pass["setPipeline"](pipeline);
};
var _wgpuRenderPassEncoderSetScissorRect = (passId, x, y, w, h) => {
var pass = WebGPU.mgrRenderPassEncoder.get(passId);
pass["setScissorRect"](x, y, w, h);
};
var _wgpuRenderPassEncoderSetStencilReference = (passId, reference) => {
var pass = WebGPU.mgrRenderPassEncoder.get(passId);
pass["setStencilReference"](reference);
};
function _wgpuRenderPassEncoderSetVertexBuffer(passId,slot,bufferId,offset_low, offset_high,size_low, size_high) {
var offset = convertI32PairToI53Checked(offset_low, offset_high);;
var size = convertI32PairToI53Checked(size_low, size_high);;
var pass = WebGPU.mgrRenderPassEncoder.get(passId);
var buffer = WebGPU.mgrBuffer.get(bufferId);
pass["setVertexBuffer"](slot, buffer, offset, size);
;
}
var _wgpuRenderPassEncoderSetViewport = (passId, x, y, w, h, minDepth, maxDepth) => {
var pass = WebGPU.mgrRenderPassEncoder.get(passId);
pass["setViewport"](x, y, w, h, minDepth, maxDepth);
};
var _wgpuRenderPipelineRelease = (id) => WebGPU.mgrRenderPipeline.release(id);
var _wgpuSamplerRelease = (id) => WebGPU.mgrSampler.release(id);
var _wgpuShaderModuleRelease = (id) => WebGPU.mgrShaderModule.release(id);
var _wgpuSurfaceRelease = (id) => WebGPU.mgrSurface.release(id);
var _wgpuSwapChainGetCurrentTextureView = (swapChainId) => {
var context = WebGPU.mgrSwapChain.get(swapChainId);
return WebGPU.mgrTextureView.create(context["getCurrentTexture"]()["createView"]());
};
var _wgpuSwapChainRelease = (id) => WebGPU.mgrSwapChain.release(id);
var _wgpuTextureCreateView = (textureId, descriptor) => {
var desc;
if (descriptor) {
assert(descriptor);assert(HEAPU32[((descriptor)>>2)] === 0);
var mipLevelCount = HEAPU32[(((descriptor)+(20))>>2)];
var arrayLayerCount = HEAPU32[(((descriptor)+(28))>>2)];
desc = {
"format": WebGPU.TextureFormat[
HEAPU32[(((descriptor)+(8))>>2)]],
"dimension": WebGPU.TextureViewDimension[
HEAPU32[(((descriptor)+(12))>>2)]],
"baseMipLevel": HEAPU32[(((descriptor)+(16))>>2)],
"mipLevelCount": mipLevelCount === 4294967295 ? undefined : mipLevelCount,
"baseArrayLayer": HEAPU32[(((descriptor)+(24))>>2)],
"arrayLayerCount": arrayLayerCount === 4294967295 ? undefined : arrayLayerCount,
"aspect": WebGPU.TextureAspect[
HEAPU32[(((descriptor)+(32))>>2)]],
};
var labelPtr = HEAPU32[(((descriptor)+(4))>>2)];
if (labelPtr) desc["label"] = UTF8ToString(labelPtr);
}
var texture = WebGPU.mgrTexture.get(textureId);
return WebGPU.mgrTextureView.create(texture["createView"](desc));
};
var _wgpuTextureDestroy = (textureId) => WebGPU.mgrTexture.get(textureId)["destroy"]();
var _wgpuTextureRelease = (id) => WebGPU.mgrTexture.release(id);
var _wgpuTextureViewRelease = (id) => WebGPU.mgrTextureView.release(id);
InternalError = Module['InternalError'] = class InternalError extends Error { constructor(message) { super(message); this.name = 'InternalError'; }};
embind_init_charCodes();
BindingError = Module['BindingError'] = class BindingError extends Error { constructor(message) { super(message); this.name = 'BindingError'; }};
init_ClassHandle();
init_embind();;
init_RegisteredPointer();
UnboundTypeError = Module['UnboundTypeError'] = extendError(Error, 'UnboundTypeError');;
handleAllocatorInit();
init_emval();;
WebGPU.initManagers();;
function checkIncomingModuleAPI() {
ignoredModuleProp('fetchSettings');
}
var wasmImports = {
__handle_stack_overflow: ___handle_stack_overflow,
_embind_finalize_value_object: __embind_finalize_value_object,
_embind_register_bigint: __embind_register_bigint,
_embind_register_bool: __embind_register_bool,
_embind_register_class: __embind_register_class,
_embind_register_class_class_function: __embind_register_class_class_function,
_embind_register_class_constructor: __embind_register_class_constructor,
_embind_register_class_function: __embind_register_class_function,
_embind_register_class_property: __embind_register_class_property,
_embind_register_emval: __embind_register_emval,
_embind_register_float: __embind_register_float,
_embind_register_integer: __embind_register_integer,
_embind_register_memory_view: __embind_register_memory_view,
_embind_register_std_string: __embind_register_std_string,
_embind_register_std_wstring: __embind_register_std_wstring,
_embind_register_value_object: __embind_register_value_object,
_embind_register_value_object_field: __embind_register_value_object_field,
_embind_register_void: __embind_register_void,
_emval_as: __emval_as,
_emval_call_void_method: __emval_call_void_method,
_emval_decref: __emval_decref,
_emval_get_method_caller: __emval_get_method_caller,
_emval_get_property: __emval_get_property,
_emval_incref: __emval_incref,
_emval_new_array: __emval_new_array,
_emval_new_cstring: __emval_new_cstring,
_emval_run_destructors: __emval_run_destructors,
_emval_set_property: __emval_set_property,
_emval_take_value: __emval_take_value,
abort: _abort,
emscripten_memcpy_big: _emscripten_memcpy_big,
emscripten_resize_heap: _emscripten_resize_heap,
emscripten_webgpu_get_device: _emscripten_webgpu_get_device,
environ_get: _environ_get,
environ_sizes_get: _environ_sizes_get,
fd_close: _fd_close,
fd_seek: _fd_seek,
fd_write: _fd_write,
wgpuAdapterGetProperties: _wgpuAdapterGetProperties,
wgpuAdapterHasFeature: _wgpuAdapterHasFeature,
wgpuAdapterRelease: _wgpuAdapterRelease,
wgpuBindGroupRelease: _wgpuBindGroupRelease,
wgpuBufferDestroy: _wgpuBufferDestroy,
wgpuBufferGetMappedRange: _wgpuBufferGetMappedRange,
wgpuBufferRelease: _wgpuBufferRelease,
wgpuBufferUnmap: _wgpuBufferUnmap,
wgpuCommandBufferRelease: _wgpuCommandBufferRelease,
wgpuCommandEncoderBeginComputePass: _wgpuCommandEncoderBeginComputePass,
wgpuCommandEncoderBeginRenderPass: _wgpuCommandEncoderBeginRenderPass,
wgpuCommandEncoderCopyBufferToBuffer: _wgpuCommandEncoderCopyBufferToBuffer,
wgpuCommandEncoderCopyBufferToTexture: _wgpuCommandEncoderCopyBufferToTexture,
wgpuCommandEncoderCopyTextureToTexture: _wgpuCommandEncoderCopyTextureToTexture,
wgpuCommandEncoderFinish: _wgpuCommandEncoderFinish,
wgpuCommandEncoderRelease: _wgpuCommandEncoderRelease,
wgpuComputePassEncoderDispatchWorkgroups: _wgpuComputePassEncoderDispatchWorkgroups,
wgpuComputePassEncoderDispatchWorkgroupsIndirect: _wgpuComputePassEncoderDispatchWorkgroupsIndirect,
wgpuComputePassEncoderEnd: _wgpuComputePassEncoderEnd,
wgpuComputePassEncoderRelease: _wgpuComputePassEncoderRelease,
wgpuComputePassEncoderSetBindGroup: _wgpuComputePassEncoderSetBindGroup,
wgpuComputePassEncoderSetPipeline: _wgpuComputePassEncoderSetPipeline,
wgpuComputePipelineRelease: _wgpuComputePipelineRelease,
wgpuCreateInstance: _wgpuCreateInstance,
wgpuDeviceCreateBindGroup: _wgpuDeviceCreateBindGroup,
wgpuDeviceCreateBindGroupLayout: _wgpuDeviceCreateBindGroupLayout,
wgpuDeviceCreateBuffer: _wgpuDeviceCreateBuffer,
wgpuDeviceCreateCommandEncoder: _wgpuDeviceCreateCommandEncoder,
wgpuDeviceCreateComputePipeline: _wgpuDeviceCreateComputePipeline,
wgpuDeviceCreatePipelineLayout: _wgpuDeviceCreatePipelineLayout,
wgpuDeviceCreateRenderPipeline: _wgpuDeviceCreateRenderPipeline,
wgpuDeviceCreateSampler: _wgpuDeviceCreateSampler,
wgpuDeviceCreateShaderModule: _wgpuDeviceCreateShaderModule,
wgpuDeviceCreateSwapChain: _wgpuDeviceCreateSwapChain,
wgpuDeviceCreateTexture: _wgpuDeviceCreateTexture,
wgpuDeviceGetQueue: _wgpuDeviceGetQueue,
wgpuDeviceRelease: _wgpuDeviceRelease,
wgpuInstanceCreateSurface: _wgpuInstanceCreateSurface,
wgpuInstanceRelease: _wgpuInstanceRelease,
wgpuInstanceRequestAdapter: _wgpuInstanceRequestAdapter,
wgpuPipelineLayoutRelease: _wgpuPipelineLayoutRelease,
wgpuQuerySetDestroy: _wgpuQuerySetDestroy,
wgpuQuerySetRelease: _wgpuQuerySetRelease,
wgpuQueueOnSubmittedWorkDone: _wgpuQueueOnSubmittedWorkDone,
wgpuQueueRelease: _wgpuQueueRelease,
wgpuQueueSubmit: _wgpuQueueSubmit,
wgpuQueueWriteBuffer: _wgpuQueueWriteBuffer,
wgpuQueueWriteTexture: _wgpuQueueWriteTexture,
wgpuRenderPassEncoderDraw: _wgpuRenderPassEncoderDraw,
wgpuRenderPassEncoderDrawIndexed: _wgpuRenderPassEncoderDrawIndexed,
wgpuRenderPassEncoderDrawIndexedIndirect: _wgpuRenderPassEncoderDrawIndexedIndirect,
wgpuRenderPassEncoderDrawIndirect: _wgpuRenderPassEncoderDrawIndirect,
wgpuRenderPassEncoderEnd: _wgpuRenderPassEncoderEnd,
wgpuRenderPassEncoderRelease: _wgpuRenderPassEncoderRelease,
wgpuRenderPassEncoderSetBindGroup: _wgpuRenderPassEncoderSetBindGroup,
wgpuRenderPassEncoderSetBlendConstant: _wgpuRenderPassEncoderSetBlendConstant,
wgpuRenderPassEncoderSetIndexBuffer: _wgpuRenderPassEncoderSetIndexBuffer,
wgpuRenderPassEncoderSetLabel: _wgpuRenderPassEncoderSetLabel,
wgpuRenderPassEncoderSetPipeline: _wgpuRenderPassEncoderSetPipeline,
wgpuRenderPassEncoderSetScissorRect: _wgpuRenderPassEncoderSetScissorRect,
wgpuRenderPassEncoderSetStencilReference: _wgpuRenderPassEncoderSetStencilReference,
wgpuRenderPassEncoderSetVertexBuffer: _wgpuRenderPassEncoderSetVertexBuffer,
wgpuRenderPassEncoderSetViewport: _wgpuRenderPassEncoderSetViewport,
wgpuRenderPipelineRelease: _wgpuRenderPipelineRelease,
wgpuSamplerRelease: _wgpuSamplerRelease,
wgpuShaderModuleRelease: _wgpuShaderModuleRelease,
wgpuSurfaceRelease: _wgpuSurfaceRelease,
wgpuSwapChainGetCurrentTextureView: _wgpuSwapChainGetCurrentTextureView,
wgpuSwapChainRelease: _wgpuSwapChainRelease,
wgpuTextureCreateView: _wgpuTextureCreateView,
wgpuTextureDestroy: _wgpuTextureDestroy,
wgpuTextureRelease: _wgpuTextureRelease,
wgpuTextureViewRelease: _wgpuTextureViewRelease
};
var wasmExports = createWasm();
var ___wasm_call_ctors = createExportWrapper('__wasm_call_ctors');
var _malloc = createExportWrapper('malloc');
var _free = createExportWrapper('free');
var _fflush = Module['_fflush'] = createExportWrapper('fflush');
var ___errno_location = createExportWrapper('__errno_location');
var ___getTypeName = createExportWrapper('__getTypeName');
var __embind_initialize_bindings = Module['__embind_initialize_bindings'] = createExportWrapper('_embind_initialize_bindings');
var _memalign = createExportWrapper('memalign');
var setTempRet0 = createExportWrapper('setTempRet0');
var _emscripten_stack_init = () => (_emscripten_stack_init = wasmExports['emscripten_stack_init'])();
var _emscripten_stack_get_free = () => (_emscripten_stack_get_free = wasmExports['emscripten_stack_get_free'])();
var _emscripten_stack_get_base = () => (_emscripten_stack_get_base = wasmExports['emscripten_stack_get_base'])();
var _emscripten_stack_get_end = () => (_emscripten_stack_get_end = wasmExports['emscripten_stack_get_end'])();
var stackSave = createExportWrapper('stackSave');
var stackRestore = createExportWrapper('stackRestore');
var stackAlloc = createExportWrapper('stackAlloc');
var _emscripten_stack_get_current = () => (_emscripten_stack_get_current = wasmExports['emscripten_stack_get_current'])();
var ___set_stack_limits = Module['___set_stack_limits'] = createExportWrapper('__set_stack_limits');
var dynCall_jii = Module['dynCall_jii'] = createExportWrapper('dynCall_jii');
var dynCall_viij = Module['dynCall_viij'] = createExportWrapper('dynCall_viij');
var dynCall_jiji = Module['dynCall_jiji'] = createExportWrapper('dynCall_jiji');
// include: postamble.js
// === Auto-generated postamble setup entry stuff ===
var missingLibrarySymbols = [
'writeI53ToI64',
'writeI53ToI64Clamped',
'writeI53ToI64Signaling',
'writeI53ToU64Clamped',
'writeI53ToU64Signaling',
'readI53FromU64',
'convertI32PairToI53',
'convertU32PairToI53',
'zeroMemory',
'isLeapYear',
'ydayFromDate',
'arraySum',
'addDays',
'setErrNo',
'inetPton4',
'inetNtop4',
'inetPton6',
'inetNtop6',
'readSockaddr',
'writeSockaddr',
'getHostByName',
'initRandomFill',
'randomFill',
'getCallstack',
'emscriptenLog',
'convertPCtoSourceLocation',
'readEmAsmArgs',
'jstoi_q',
'jstoi_s',
'listenOnce',
'autoResumeAudioContext',
'runtimeKeepalivePush',
'runtimeKeepalivePop',
'safeSetTimeout',
'asmjsMangle',
'asyncLoad',
'alignMemory',
'mmapAlloc',
'getNativeTypeSize',
'STACK_SIZE',
'STACK_ALIGN',
'POINTER_SIZE',
'ASSERTIONS',
'getCFunc',
'ccall',
'cwrap',
'uleb128Encode',
'sigToWasmTypes',
'generateFuncType',
'convertJsFunctionToWasm',
'getEmptyTableSlot',
'updateTableMap',
'getFunctionAddress',
'addFunction',
'removeFunction',
'reallyNegative',
'unSign',
'strLen',
'reSign',
'formatString',
'intArrayFromString',
'intArrayToString',
'AsciiToString',
'stringToNewUTF8',
'writeArrayToMemory',
'registerKeyEventCallback',
'getBoundingClientRect',
'fillMouseEventData',
'registerMouseEventCallback',
'registerWheelEventCallback',
'registerUiEventCallback',
'registerFocusEventCallback',
'fillDeviceOrientationEventData',
'registerDeviceOrientationEventCallback',
'fillDeviceMotionEventData',
'registerDeviceMotionEventCallback',
'screenOrientation',
'fillOrientationChangeEventData',
'registerOrientationChangeEventCallback',
'fillFullscreenChangeEventData',
'registerFullscreenChangeEventCallback',
'JSEvents_requestFullscreen',
'JSEvents_resizeCanvasForFullscreen',
'registerRestoreOldStyle',
'hideEverythingExceptGivenElement',
'restoreHiddenElements',
'setLetterbox',
'softFullscreenResizeWebGLRenderTarget',
'doRequestFullscreen',
'fillPointerlockChangeEventData',
'registerPointerlockChangeEventCallback',
'registerPointerlockErrorEventCallback',
'requestPointerLock',
'fillVisibilityChangeEventData',
'registerVisibilityChangeEventCallback',
'registerTouchEventCallback',
'fillGamepadEventData',
'registerGamepadEventCallback',
'registerBeforeUnloadEventCallback',
'fillBatteryEventData',
'battery',
'registerBatteryEventCallback',
'setCanvasElementSize',
'getCanvasElementSize',
'demangle',
'demangleAll',
'jsStackTrace',
'stackTrace',
'checkWasiClock',
'wasiRightsToMuslOFlags',
'wasiOFlagsToMuslOFlags',
'createDyncallWrapper',
'setImmediateWrapped',
'clearImmediateWrapped',
'polyfillSetImmediate',
'getPromise',
'makePromise',
'idsToPromises',
'makePromiseCallback',
'setMainLoop',
'getSocketFromFD',
'getSocketAddress',
'FS_createPreloadedFile',
'FS_modeStringToFlags',
'FS_getMode',
'FS_stdin_getChar',
'_setNetworkCallback',
'heapObjectForWebGLType',
'heapAccessShiftForWebGLHeap',
'webgl_enable_ANGLE_instanced_arrays',
'webgl_enable_OES_vertex_array_object',
'webgl_enable_WEBGL_draw_buffers',
'webgl_enable_WEBGL_multi_draw',
'emscriptenWebGLGet',
'computeUnpackAlignedImageSize',
'colorChannelsInGlTextureFormat',
'emscriptenWebGLGetTexPixelData',
'__glGenObject',
'emscriptenWebGLGetUniform',
'webglGetUniformLocation',
'webglPrepareUniformLocationsBeforeFirstUse',
'webglGetLeftBracePos',
'emscriptenWebGLGetVertexAttrib',
'__glGetActiveAttribOrUniform',
'writeGLArray',
'registerWebGlEventCallback',
'runAndAbortIfError',
'SDL_unicode',
'SDL_ttfContext',
'SDL_audio',
'GLFW_Window',
'ALLOC_NORMAL',
'ALLOC_STACK',
'allocate',
'writeStringToMemory',
'writeAsciiToMemory',
'registerInheritedInstance',
'unregisterInheritedInstance',
'enumReadValueFromPointer',
'craftEmvalAllocator',
'emval_get_global',
];
missingLibrarySymbols.forEach(missingLibrarySymbol)
var unexportedSymbols = [
'run',
'addOnPreRun',
'addOnInit',
'addOnPreMain',
'addOnExit',
'addOnPostRun',
'addRunDependency',
'removeRunDependency',
'FS_createFolder',
'FS_createPath',
'FS_createDataFile',
'FS_createLazyFile',
'FS_createLink',
'FS_createDevice',
'FS_readFile',
'FS_unlink',
'out',
'err',
'callMain',
'abort',
'keepRuntimeAlive',
'wasmMemory',
'wasmTable',
'wasmExports',
'stackAlloc',
'stackSave',
'stackRestore',
'getTempRet0',
'setTempRet0',
'writeStackCookie',
'checkStackCookie',
'readI53FromI64',
'convertI32PairToI53Checked',
'ptrToString',
'exitJS',
'getHeapMax',
'growMemory',
'ENV',
'setStackLimits',
'MONTH_DAYS_REGULAR',
'MONTH_DAYS_LEAP',
'MONTH_DAYS_REGULAR_CUMULATIVE',
'MONTH_DAYS_LEAP_CUMULATIVE',
'ERRNO_CODES',
'ERRNO_MESSAGES',
'DNS',
'Protocols',
'Sockets',
'timers',
'warnOnce',
'UNWIND_CACHE',
'readEmAsmArgsArray',
'getExecutableName',
'dynCallLegacy',
'getDynCaller',
'dynCall',
'handleException',
'callUserCallback',
'maybeExit',
'handleAllocatorInit',
'HandleAllocator',
'freeTableIndexes',
'functionsInTableMap',
'setValue',
'getValue',
'PATH',
'PATH_FS',
'UTF8Decoder',
'UTF8ArrayToString',
'UTF8ToString',
'stringToUTF8Array',
'stringToUTF8',
'lengthBytesUTF8',
'stringToAscii',
'UTF16Decoder',
'UTF16ToString',
'stringToUTF16',
'lengthBytesUTF16',
'UTF32ToString',
'stringToUTF32',
'lengthBytesUTF32',
'stringToUTF8OnStack',
'JSEvents',
'specialHTMLTargets',
'maybeCStringToJsString',
'findEventTarget',
'findCanvasEventTarget',
'currentFullscreenStrategy',
'restoreOldWindowedStyle',
'ExitStatus',
'getEnvStrings',
'flush_NO_FILESYSTEM',
'promiseMap',
'Browser',
'wget',
'SYSCALLS',
'preloadPlugins',
'FS_stdin_getChar_buffer',
'FS',
'MEMFS',
'TTY',
'PIPEFS',
'SOCKFS',
'tempFixedLengthArray',
'miniTempWebGLFloatBuffers',
'miniTempWebGLIntBuffers',
'GL',
'emscripten_webgl_power_preferences',
'AL',
'GLUT',
'EGL',
'GLEW',
'IDBStore',
'SDL',
'SDL_gfx',
'GLFW',
'WebGPU',
'JsValStore',
'allocateUTF8',
'allocateUTF8OnStack',
'InternalError',
'BindingError',
'throwInternalError',
'throwBindingError',
'registeredTypes',
'awaitingDependencies',
'typeDependencies',
'tupleRegistrations',
'structRegistrations',
'sharedRegisterType',
'whenDependentTypesAreResolved',
'embind_charCodes',
'embind_init_charCodes',
'readLatin1String',
'getTypeName',
'heap32VectorToArray',
'requireRegisteredType',
'UnboundTypeError',
'PureVirtualError',
'GenericWireTypeSize',
'init_embind',
'throwUnboundTypeError',
'ensureOverloadTable',
'exposePublicSymbol',
'replacePublicSymbol',
'extendError',
'createNamedFunction',
'embindRepr',
'registeredInstances',
'getBasestPointer',
'getInheritedInstance',
'getInheritedInstanceCount',
'getLiveInheritedInstances',
'registeredPointers',
'registerType',
'integerReadValueFromPointer',
'floatReadValueFromPointer',
'simpleReadValueFromPointer',
'readPointer',
'runDestructors',
'newFunc',
'craftInvokerFunction',
'embind__requireFunction',
'genericPointerToWireType',
'constNoSmartPtrRawPointerToWireType',
'nonConstNoSmartPtrRawPointerToWireType',
'init_RegisteredPointer',
'RegisteredPointer',
'RegisteredPointer_getPointee',
'RegisteredPointer_destructor',
'RegisteredPointer_deleteObject',
'RegisteredPointer_fromWireType',
'runDestructor',
'releaseClassHandle',
'finalizationRegistry',
'detachFinalizer_deps',
'detachFinalizer',
'attachFinalizer',
'makeClassHandle',
'init_ClassHandle',
'ClassHandle',
'ClassHandle_isAliasOf',
'throwInstanceAlreadyDeleted',
'ClassHandle_clone',
'ClassHandle_delete',
'deletionQueue',
'ClassHandle_isDeleted',
'ClassHandle_deleteLater',
'flushPendingDeletes',
'delayFunction',
'setDelayFunction',
'RegisteredClass',
'shallowCopyInternalPointer',
'downcastPointer',
'upcastPointer',
'validateThis',
'char_0',
'char_9',
'makeLegalFunctionName',
'emval_handles',
'emval_symbols',
'init_emval',
'count_emval_handles',
'getStringOrSymbol',
'Emval',
'emval_newers',
'emval_lookupTypes',
'emval_allocateDestructors',
'emval_methodCallers',
'emval_addMethodCaller',
'emval_registeredMethods',
];
unexportedSymbols.forEach(unexportedRuntimeSymbol);
var calledRun;
dependenciesFulfilled = function runCaller() {
// If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false)
if (!calledRun) run();
if (!calledRun) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled
};
function stackCheckInit() {
// This is normally called automatically during __wasm_call_ctors but need to
// get these values before even running any of the ctors so we call it redundantly
// here.
_emscripten_stack_init();
// TODO(sbc): Move writeStackCookie to native to to avoid this.
writeStackCookie();
}
function run() {
if (runDependencies > 0) {
return;
}
stackCheckInit();
preRun();
// a preRun added a dependency, run will be called later
if (runDependencies > 0) {
return;
}
function doRun() {
// run may have just been called through dependencies being fulfilled just in this very frame,
// or while the async setStatus time below was happening
if (calledRun) return;
calledRun = true;
Module['calledRun'] = true;
if (ABORT) return;
initRuntime();
readyPromiseResolve(Module);
if (Module['onRuntimeInitialized']) Module['onRuntimeInitialized']();
assert(!Module['_main'], 'compiled without a main, but one is present. if you added it from JS, use Module["onRuntimeInitialized"]');
postRun();
}
if (Module['setStatus']) {
Module['setStatus']('Running...');
setTimeout(function() {
setTimeout(function() {
Module['setStatus']('');
}, 1);
doRun();
}, 1);
} else
{
doRun();
}
checkStackCookie();
}
function checkUnflushedContent() {
// Compiler settings do not allow exiting the runtime, so flushing
// the streams is not possible. but in ASSERTIONS mode we check
// if there was something to flush, and if so tell the user they
// should request that the runtime be exitable.
// Normally we would not even include flush() at all, but in ASSERTIONS
// builds we do so just for this check, and here we see if there is any
// content to flush, that is, we check if there would have been
// something a non-ASSERTIONS build would have not seen.
// How we flush the streams depends on whether we are in SYSCALLS_REQUIRE_FILESYSTEM=0
// mode (which has its own special function for this; otherwise, all
// the code is inside libc)
var oldOut = out;
var oldErr = err;
var has = false;
out = err = (x) => {
has = true;
}
try { // it doesn't matter if it fails
flush_NO_FILESYSTEM();
} catch(e) {}
out = oldOut;
err = oldErr;
if (has) {
warnOnce('stdio streams had content in them that was not flushed. you should set EXIT_RUNTIME to 1 (see the Emscripten FAQ), or make sure to emit a newline when you printf etc.');
warnOnce('(this may also be due to not including full filesystem support - try building with -sFORCE_FILESYSTEM)');
}
}
if (Module['preInit']) {
if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']];
while (Module['preInit'].length > 0) {
Module['preInit'].pop()();
}
}
run();
// end include: postamble.js
return moduleArg.ready
}
);
})();
export default wasmDevice;