diff --git a/README.md b/README.md index 02d7e8e..a824245 100644 --- a/README.md +++ b/README.md @@ -68,6 +68,41 @@ if (debug) { } ``` +## Development + +Clone the repo and install it locally. + +```bash +npm ci +npm run start +``` + +Now open the browser to `http://localhost:8080/test/timeout=0&src=true` + +### Testing with three.js + +If you have the [three.js repo](https://github.com/mrdoob/three.js) +install along side in a folder named `three.js` as in + +``` ++-somefolder + +-webgpu-dev-extension + +-three.js +``` + +Then `npm run test-threejs` will attempt to each of the three.js webgpu +examples and inject the helper. Ideally there should be no errors. + +You can skip the first N tests with `-- --skip-count=` (the first `--` is required). + +### `show-errors.js` + +`show-errors/show-errors.js` is also generated by the build. + +show-errors.js wraps calls to `pushErrorScope` and `popErrorScope` around every +method of `GPUDevice` and `GPUQueue`. It is used in the +[webgpu-dev-extension](https://github.com/greggman/webgpu-dev-extension). + ## License [MIT](LICENSE.md) diff --git a/dist/0.x/webgpu-debug-helper.js b/dist/0.x/webgpu-debug-helper.js index f8d4989..dd97d98 100644 --- a/dist/0.x/webgpu-debug-helper.js +++ b/dist/0.x/webgpu-debug-helper.js @@ -1,2112 +1,248 @@ -/* webgpu-debug-helper@0.1.2, license MIT */ +/* webgpu-debug-helper@0.1.4, license MIT */ (function (factory) { typeof define === 'function' && define.amd ? define(factory) : factory(); })((function () { 'use strict'; - // exported from the WebGPU CTS by adding the following line to src/webgpu/format_info.ts - // - // console.log(JSON.stringify(kAllTextureFormatInfo, null, 2)); - /** `kDepthStencilFormatResolvedAspect[format][aspect]` returns the aspect-specific format for a - * depth-stencil format, or `undefined` if the format doesn't have the aspect. + const s_objToDevice = new WeakMap(); + + /* eslint-disable no-inner-declarations */ + if (typeof GPUDevice !== 'undefined') { + const deviceToErrorScopeStack = new WeakMap(); + const origPushErrorScope = GPUDevice.prototype.pushErrorScope; + const origPopErrorScope = GPUDevice.prototype.popErrorScope; + function errorWrapper(device, fnName, origFn, ...args) { + const stack = new Error(); + origPushErrorScope.call(device, 'validation'); + const result = origFn.call(this, ...args); + const errorScopeStack = deviceToErrorScopeStack.get(device); + const currentErrorScope = errorScopeStack.findLast(scope => scope.filter === 'validation'); + const promise = origPopErrorScope.call(device) + .then(error => { + // If there was a currentErrorScope when we added pushed then remove our promise + if (currentErrorScope) { + const ndx = currentErrorScope.errors.indexOf(promise); + if (ndx) { + currentErrorScope.errors.splice(ndx, 1); + } + } + else { + // there was no currentErrorScope so emit the error + if (error) { + device.dispatchEvent(new GPUUncapturedErrorEvent('uncapturederror', { error })); + } + } + // show it + if (error) { + console.error('WebGPU ERROR in:', fnName, args); + console.error(error.message); + console.error(stack.stack); + } + // return it (as a promise) + return error; + }); + if (currentErrorScope) { + currentErrorScope.errors.push(promise); + } + return result; + } + function addErrorWrapper(api, fnName) { + const origFn = api.prototype[fnName]; + api.prototype[fnName] = function (...args) { + return errorWrapper.call(this, this, fnName.toString(), origFn, ...args); + }; + } + function addErrorWrapperWithDevice(api, fnName) { + const origFn = api.prototype[fnName]; + api.prototype[fnName] = function (...args) { + const device = s_objToDevice.get(this); + return errorWrapper.call(this, device, fnName.toString(), origFn, ...args); + }; + } + /** + * given a class returns all the method names. + */ + function getAPIFunctionNames(api) { + return Object.entries(Object.getOwnPropertyDescriptors(api.prototype)) + .filter(([, info]) => info.enumerable && typeof info.value === 'function') + .map(([name]) => name); + } + const skip = new Set([ + 'pushErrorScope', + 'popErrorScope', + 'destroy', + ]); + getAPIFunctionNames(GPUDevice) + .filter(n => !skip.has(n)) + .forEach(n => addErrorWrapper(GPUDevice, n)); + getAPIFunctionNames(GPUQueue) + .forEach(n => addErrorWrapperWithDevice(GPUQueue, n)); + GPUDevice.prototype.pushErrorScope = (function (origFn) { + return function (filter) { + origFn.call(this, filter); + const errorScopeStack = deviceToErrorScopeStack.get(this); + errorScopeStack.push({ filter, errors: [] }); + }; + })(GPUDevice.prototype.pushErrorScope); + GPUDevice.prototype.popErrorScope = (function (origFn) { + return async function () { + const errorScopeStack = deviceToErrorScopeStack.get(this); + const errorScope = errorScopeStack.pop(); + if (errorScope === undefined) { + throw new DOMException('popErrorScope called on empty error scope stack', 'OperationError'); + } + const errPromise = origFn.call(this); + return errorScope.errors.pop() ?? errPromise; + }; + })(GPUDevice.prototype.popErrorScope); + GPUAdapter.prototype.requestDevice = (function (origFn) { + return async function (...args) { + const device = await origFn.call(this, ...args); + if (device) { + device.addEventListener('uncapturederror', function (e) { + console.error(e.error.message); + }); + deviceToErrorScopeStack.set(device, []); + s_objToDevice.set(device.queue, device); + } + return device; + }; + })(GPUAdapter.prototype.requestDevice); + } + + /* webgpu-utils@1.8.2, license MIT */ + function keysOf(obj) { + return Object.keys(obj); + } + + const createTypeDefs = (defs) => defs; + const b = createTypeDefs({ + i32: { numElements: 1, align: 4, size: 4, type: 'i32', View: Int32Array }, + u32: { numElements: 1, align: 4, size: 4, type: 'u32', View: Uint32Array }, + f32: { numElements: 1, align: 4, size: 4, type: 'f32', View: Float32Array }, + f16: { numElements: 1, align: 2, size: 2, type: 'u16', View: Uint16Array }, + vec2f: { numElements: 2, align: 8, size: 8, type: 'f32', View: Float32Array }, + vec2i: { numElements: 2, align: 8, size: 8, type: 'i32', View: Int32Array }, + vec2u: { numElements: 2, align: 8, size: 8, type: 'u32', View: Uint32Array }, + vec2h: { numElements: 2, align: 4, size: 4, type: 'u16', View: Uint16Array }, + vec3i: { numElements: 3, align: 16, size: 12, type: 'i32', View: Int32Array }, + vec3u: { numElements: 3, align: 16, size: 12, type: 'u32', View: Uint32Array }, + vec3f: { numElements: 3, align: 16, size: 12, type: 'f32', View: Float32Array }, + vec3h: { numElements: 3, align: 8, size: 6, type: 'u16', View: Uint16Array }, + vec4i: { numElements: 4, align: 16, size: 16, type: 'i32', View: Int32Array }, + vec4u: { numElements: 4, align: 16, size: 16, type: 'u32', View: Uint32Array }, + vec4f: { numElements: 4, align: 16, size: 16, type: 'f32', View: Float32Array }, + vec4h: { numElements: 4, align: 8, size: 8, type: 'u16', View: Uint16Array }, + // AlignOf(vecR) SizeOf(array) + mat2x2f: { numElements: 4, align: 8, size: 16, type: 'f32', View: Float32Array }, + mat2x2h: { numElements: 4, align: 4, size: 8, type: 'u16', View: Uint16Array }, + mat3x2f: { numElements: 6, align: 8, size: 24, type: 'f32', View: Float32Array }, + mat3x2h: { numElements: 6, align: 4, size: 12, type: 'u16', View: Uint16Array }, + mat4x2f: { numElements: 8, align: 8, size: 32, type: 'f32', View: Float32Array }, + mat4x2h: { numElements: 8, align: 4, size: 16, type: 'u16', View: Uint16Array }, + mat2x3f: { numElements: 8, align: 16, size: 32, pad: [3, 1], type: 'f32', View: Float32Array }, + mat2x3h: { numElements: 8, align: 8, size: 16, pad: [3, 1], type: 'u16', View: Uint16Array }, + mat3x3f: { numElements: 12, align: 16, size: 48, pad: [3, 1], type: 'f32', View: Float32Array }, + mat3x3h: { numElements: 12, align: 8, size: 24, pad: [3, 1], type: 'u16', View: Uint16Array }, + mat4x3f: { numElements: 16, align: 16, size: 64, pad: [3, 1], type: 'f32', View: Float32Array }, + mat4x3h: { numElements: 16, align: 8, size: 32, pad: [3, 1], type: 'u16', View: Uint16Array }, + mat2x4f: { numElements: 8, align: 16, size: 32, type: 'f32', View: Float32Array }, + mat2x4h: { numElements: 8, align: 8, size: 16, type: 'u16', View: Uint16Array }, + mat3x4f: { numElements: 12, align: 16, size: 48, pad: [3, 1], type: 'f32', View: Float32Array }, + mat3x4h: { numElements: 12, align: 8, size: 24, pad: [3, 1], type: 'u16', View: Uint16Array }, + mat4x4f: { numElements: 16, align: 16, size: 64, type: 'f32', View: Float32Array }, + mat4x4h: { numElements: 16, align: 8, size: 32, type: 'u16', View: Uint16Array }, + // Note: At least as of WGSL V1 you can not create a bool for uniform or storage. + // You can only create one in an internal struct. But, this code generates + // views of structs and it needs to not fail if the struct has a bool + bool: { numElements: 0, align: 1, size: 0, type: 'bool', View: Uint32Array }, + }); + const kWGSLTypeInfo = createTypeDefs({ + ...b, + 'atomic': b.i32, + 'atomic': b.u32, + 'vec2': b.vec2i, + 'vec2': b.vec2u, + 'vec2': b.vec2f, + 'vec2': b.vec2h, + 'vec3': b.vec3i, + 'vec3': b.vec3u, + 'vec3': b.vec3f, + 'vec3': b.vec3h, + 'vec4': b.vec4i, + 'vec4': b.vec4u, + 'vec4': b.vec4f, + 'vec4': b.vec4h, + 'mat2x2': b.mat2x2f, + 'mat2x2': b.mat2x2h, + 'mat3x2': b.mat3x2f, + 'mat3x2': b.mat3x2h, + 'mat4x2': b.mat4x2f, + 'mat4x2': b.mat4x2h, + 'mat2x3': b.mat2x3f, + 'mat2x3': b.mat2x3h, + 'mat3x3': b.mat3x3f, + 'mat3x3': b.mat3x3h, + 'mat4x3': b.mat4x3f, + 'mat4x3': b.mat4x3h, + 'mat2x4': b.mat2x4f, + 'mat2x4': b.mat2x4h, + 'mat3x4': b.mat3x4f, + 'mat3x4': b.mat3x4h, + 'mat4x4': b.mat4x4f, + 'mat4x4': b.mat4x4h, + }); + const kWGSLTypes = keysOf(kWGSLTypeInfo); + + /** + * Set which intrinsic types to make views for. + * + * Example: + * + * Given a an array of intrinsics like this + * `array` + * + * The default is to create a single `Float32Array(4 * 200)` + * because creating 200 `Float32Array` views is not usually + * what you want. + * + * If you do want individual views then you'd call + * `setIntrinsicsToView(['vec3f'])` and now you get + * an array of 200 `Float32Array`s. + * + * Note: `setIntrinsicsToView` always sets ALL types. The list you + * pass it is the types you want views created for, all other types + * will be reset to do the default. In other words + * + * ```js + * setIntrinsicsToView(['vec3f']) + * setIntrinsicsToView(['vec2f']) + * ``` + * + * Only `vec2f` will have views created. `vec3f` has been reset to the default by + * the second call + * + * You can pass in `true` as the 2nd parameter to make it set which types + * to flatten and all others will be set to have views created. For example + * to expand all types would be `setIntrinsicsToView([], true)`. To expand + * all except `f32` would be `setIntrinsicsToView(['f32'], true)`. + * + * To reset all types to the default call it with no arguments + * + * @param types array of types to make views for + * @param flatten whether to flatten or expand the specified types. */ - const kDepthStencilFormatResolvedAspect = { - // kUnsizedDepthStencilFormats - depth24plus: { - all: 'depth24plus', - 'depth-only': 'depth24plus', - 'stencil-only': undefined, - }, - 'depth24plus-stencil8': { - all: 'depth24plus-stencil8', - 'depth-only': 'depth24plus', - 'stencil-only': 'stencil8', - }, - // kSizedDepthStencilFormats - depth16unorm: { - all: 'depth16unorm', - 'depth-only': 'depth16unorm', - 'stencil-only': undefined, - }, - depth32float: { - all: 'depth32float', - 'depth-only': 'depth32float', - 'stencil-only': undefined, - }, - 'depth32float-stencil8': { - all: 'depth32float-stencil8', - 'depth-only': 'depth32float', - 'stencil-only': 'stencil8', - }, - stencil8: { - all: 'stencil8', - 'depth-only': undefined, - 'stencil-only': 'stencil8', - }, - }; - function getDepthStencilFormatResolvedAspect(format, aspect) { - const info = kDepthStencilFormatResolvedAspect[format]; - return info ? info[aspect] : undefined; - } - const kAllTextureFormatInfo = { - "r8unorm": { - "blockWidth": 1, - "blockHeight": 1, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 1 - }, - "colorRender": { - "blend": true, - "resolve": true, - "byteCost": 1, - "alignment": 1 - }, - "multisample": true, - "bytesPerBlock": 1 - }, - "r8snorm": { - "blockWidth": 1, - "blockHeight": 1, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 1 - }, - "multisample": false, - "bytesPerBlock": 1 - }, - "r8uint": { - "blockWidth": 1, - "blockHeight": 1, - "color": { - "type": "uint", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 1 - }, - "colorRender": { - "blend": false, - "resolve": false, - "byteCost": 1, - "alignment": 1 - }, - "multisample": true, - "bytesPerBlock": 1 - }, - "r8sint": { - "blockWidth": 1, - "blockHeight": 1, - "color": { - "type": "sint", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 1 - }, - "colorRender": { - "blend": false, - "resolve": false, - "byteCost": 1, - "alignment": 1 - }, - "multisample": true, - "bytesPerBlock": 1 - }, - "rg8unorm": { - "blockWidth": 1, - "blockHeight": 1, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 2 - }, - "colorRender": { - "blend": true, - "resolve": true, - "byteCost": 2, - "alignment": 1 - }, - "multisample": true, - "bytesPerBlock": 2 - }, - "rg8snorm": { - "blockWidth": 1, - "blockHeight": 1, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 2 - }, - "multisample": false, - "bytesPerBlock": 2 - }, - "rg8uint": { - "blockWidth": 1, - "blockHeight": 1, - "color": { - "type": "uint", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 2 - }, - "colorRender": { - "blend": false, - "resolve": false, - "byteCost": 2, - "alignment": 1 - }, - "multisample": true, - "bytesPerBlock": 2 - }, - "rg8sint": { - "blockWidth": 1, - "blockHeight": 1, - "color": { - "type": "sint", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 2 - }, - "colorRender": { - "blend": false, - "resolve": false, - "byteCost": 2, - "alignment": 1 - }, - "multisample": true, - "bytesPerBlock": 2 - }, - "rgba8unorm": { - "blockWidth": 1, - "blockHeight": 1, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": true, - "readWriteStorage": false, - "bytes": 4 - }, - "colorRender": { - "blend": true, - "resolve": true, - "byteCost": 8, - "alignment": 1 - }, - "multisample": true, - "baseFormat": "rgba8unorm", - "bytesPerBlock": 4 - }, - "rgba8unorm-srgb": { - "blockWidth": 1, - "blockHeight": 1, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 4 - }, - "colorRender": { - "blend": true, - "resolve": true, - "byteCost": 8, - "alignment": 1 - }, - "multisample": true, - "baseFormat": "rgba8unorm", - "bytesPerBlock": 4 - }, - "rgba8snorm": { - "blockWidth": 1, - "blockHeight": 1, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": true, - "readWriteStorage": false, - "bytes": 4 - }, - "multisample": false, - "bytesPerBlock": 4 - }, - "rgba8uint": { - "blockWidth": 1, - "blockHeight": 1, - "color": { - "type": "uint", - "copySrc": true, - "copyDst": true, - "storage": true, - "readWriteStorage": false, - "bytes": 4 - }, - "colorRender": { - "blend": false, - "resolve": false, - "byteCost": 4, - "alignment": 1 - }, - "multisample": true, - "bytesPerBlock": 4 - }, - "rgba8sint": { - "blockWidth": 1, - "blockHeight": 1, - "color": { - "type": "sint", - "copySrc": true, - "copyDst": true, - "storage": true, - "readWriteStorage": false, - "bytes": 4 - }, - "colorRender": { - "blend": false, - "resolve": false, - "byteCost": 4, - "alignment": 1 - }, - "multisample": true, - "bytesPerBlock": 4 - }, - "bgra8unorm": { - "blockWidth": 1, - "blockHeight": 1, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 4 - }, - "colorRender": { - "blend": true, - "resolve": true, - "byteCost": 8, - "alignment": 1 - }, - "multisample": true, - "baseFormat": "bgra8unorm", - "bytesPerBlock": 4 - }, - "bgra8unorm-srgb": { - "blockWidth": 1, - "blockHeight": 1, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 4 - }, - "colorRender": { - "blend": true, - "resolve": true, - "byteCost": 8, - "alignment": 1 - }, - "multisample": true, - "baseFormat": "bgra8unorm", - "bytesPerBlock": 4 - }, - "r16uint": { - "blockWidth": 1, - "blockHeight": 1, - "color": { - "type": "uint", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 2 - }, - "colorRender": { - "blend": false, - "resolve": false, - "byteCost": 2, - "alignment": 2 - }, - "multisample": true, - "bytesPerBlock": 2 - }, - "r16sint": { - "blockWidth": 1, - "blockHeight": 1, - "color": { - "type": "sint", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 2 - }, - "colorRender": { - "blend": false, - "resolve": false, - "byteCost": 2, - "alignment": 2 - }, - "multisample": true, - "bytesPerBlock": 2 - }, - "r16float": { - "blockWidth": 1, - "blockHeight": 1, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 2 - }, - "colorRender": { - "blend": true, - "resolve": true, - "byteCost": 2, - "alignment": 2 - }, - "multisample": true, - "bytesPerBlock": 2 - }, - "rg16uint": { - "blockWidth": 1, - "blockHeight": 1, - "color": { - "type": "uint", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 4 - }, - "colorRender": { - "blend": false, - "resolve": false, - "byteCost": 4, - "alignment": 2 - }, - "multisample": true, - "bytesPerBlock": 4 - }, - "rg16sint": { - "blockWidth": 1, - "blockHeight": 1, - "color": { - "type": "sint", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 4 - }, - "colorRender": { - "blend": false, - "resolve": false, - "byteCost": 4, - "alignment": 2 - }, - "multisample": true, - "bytesPerBlock": 4 - }, - "rg16float": { - "blockWidth": 1, - "blockHeight": 1, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 4 - }, - "colorRender": { - "blend": true, - "resolve": true, - "byteCost": 4, - "alignment": 2 - }, - "multisample": true, - "bytesPerBlock": 4 - }, - "rgba16uint": { - "blockWidth": 1, - "blockHeight": 1, - "color": { - "type": "uint", - "copySrc": true, - "copyDst": true, - "storage": true, - "readWriteStorage": false, - "bytes": 8 - }, - "colorRender": { - "blend": false, - "resolve": false, - "byteCost": 8, - "alignment": 2 - }, - "multisample": true, - "bytesPerBlock": 8 - }, - "rgba16sint": { - "blockWidth": 1, - "blockHeight": 1, - "color": { - "type": "sint", - "copySrc": true, - "copyDst": true, - "storage": true, - "readWriteStorage": false, - "bytes": 8 - }, - "colorRender": { - "blend": false, - "resolve": false, - "byteCost": 8, - "alignment": 2 - }, - "multisample": true, - "bytesPerBlock": 8 - }, - "rgba16float": { - "blockWidth": 1, - "blockHeight": 1, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": true, - "readWriteStorage": false, - "bytes": 8 - }, - "colorRender": { - "blend": true, - "resolve": true, - "byteCost": 8, - "alignment": 2 - }, - "multisample": true, - "bytesPerBlock": 8 - }, - "r32uint": { - "blockWidth": 1, - "blockHeight": 1, - "color": { - "type": "uint", - "copySrc": true, - "copyDst": true, - "storage": true, - "readWriteStorage": true, - "bytes": 4 - }, - "colorRender": { - "blend": false, - "resolve": false, - "byteCost": 4, - "alignment": 4 - }, - "multisample": false, - "bytesPerBlock": 4 - }, - "r32sint": { - "blockWidth": 1, - "blockHeight": 1, - "color": { - "type": "sint", - "copySrc": true, - "copyDst": true, - "storage": true, - "readWriteStorage": true, - "bytes": 4 - }, - "colorRender": { - "blend": false, - "resolve": false, - "byteCost": 4, - "alignment": 4 - }, - "multisample": false, - "bytesPerBlock": 4 - }, - "r32float": { - "blockWidth": 1, - "blockHeight": 1, - "color": { - "type": "unfilterable-float", - "copySrc": true, - "copyDst": true, - "storage": true, - "readWriteStorage": true, - "bytes": 4 - }, - "colorRender": { - "blend": false, - "resolve": false, - "byteCost": 4, - "alignment": 4 - }, - "multisample": true, - "bytesPerBlock": 4 - }, - "rg32uint": { - "blockWidth": 1, - "blockHeight": 1, - "color": { - "type": "uint", - "copySrc": true, - "copyDst": true, - "storage": true, - "readWriteStorage": false, - "bytes": 8 - }, - "colorRender": { - "blend": false, - "resolve": false, - "byteCost": 8, - "alignment": 4 - }, - "multisample": false, - "bytesPerBlock": 8 - }, - "rg32sint": { - "blockWidth": 1, - "blockHeight": 1, - "color": { - "type": "sint", - "copySrc": true, - "copyDst": true, - "storage": true, - "readWriteStorage": false, - "bytes": 8 - }, - "colorRender": { - "blend": false, - "resolve": false, - "byteCost": 8, - "alignment": 4 - }, - "multisample": false, - "bytesPerBlock": 8 - }, - "rg32float": { - "blockWidth": 1, - "blockHeight": 1, - "color": { - "type": "unfilterable-float", - "copySrc": true, - "copyDst": true, - "storage": true, - "readWriteStorage": false, - "bytes": 8 - }, - "colorRender": { - "blend": false, - "resolve": false, - "byteCost": 8, - "alignment": 4 - }, - "multisample": false, - "bytesPerBlock": 8 - }, - "rgba32uint": { - "blockWidth": 1, - "blockHeight": 1, - "color": { - "type": "uint", - "copySrc": true, - "copyDst": true, - "storage": true, - "readWriteStorage": false, - "bytes": 16 - }, - "colorRender": { - "blend": false, - "resolve": false, - "byteCost": 16, - "alignment": 4 - }, - "multisample": false, - "bytesPerBlock": 16 - }, - "rgba32sint": { - "blockWidth": 1, - "blockHeight": 1, - "color": { - "type": "sint", - "copySrc": true, - "copyDst": true, - "storage": true, - "readWriteStorage": false, - "bytes": 16 - }, - "colorRender": { - "blend": false, - "resolve": false, - "byteCost": 16, - "alignment": 4 - }, - "multisample": false, - "bytesPerBlock": 16 - }, - "rgba32float": { - "blockWidth": 1, - "blockHeight": 1, - "color": { - "type": "unfilterable-float", - "copySrc": true, - "copyDst": true, - "storage": true, - "readWriteStorage": false, - "bytes": 16 - }, - "colorRender": { - "blend": false, - "resolve": false, - "byteCost": 16, - "alignment": 4 - }, - "multisample": false, - "bytesPerBlock": 16 - }, - "rgb10a2uint": { - "blockWidth": 1, - "blockHeight": 1, - "color": { - "type": "uint", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 4 - }, - "colorRender": { - "blend": false, - "resolve": false, - "byteCost": 8, - "alignment": 4 - }, - "multisample": true, - "bytesPerBlock": 4 - }, - "rgb10a2unorm": { - "blockWidth": 1, - "blockHeight": 1, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 4 - }, - "colorRender": { - "blend": true, - "resolve": true, - "byteCost": 8, - "alignment": 4 - }, - "multisample": true, - "bytesPerBlock": 4 - }, - "rg11b10ufloat": { - "blockWidth": 1, - "blockHeight": 1, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 4 - }, - "multisample": false, - "bytesPerBlock": 4 - }, - "rgb9e5ufloat": { - "blockWidth": 1, - "blockHeight": 1, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 4 - }, - "multisample": false, - "bytesPerBlock": 4 - }, - "stencil8": { - "blockWidth": 1, - "blockHeight": 1, - "stencil": { - "type": "uint", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 1 - }, - "multisample": true, - "bytesPerBlock": 1 - }, - "depth16unorm": { - "blockWidth": 1, - "blockHeight": 1, - "depth": { - "type": "depth", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 2 - }, - "multisample": true, - "bytesPerBlock": 2 - }, - "depth32float": { - "blockWidth": 1, - "blockHeight": 1, - "depth": { - "type": "depth", - "copySrc": true, - "copyDst": false, - "storage": false, - "readWriteStorage": false, - "bytes": 4 - }, - "multisample": true, - "bytesPerBlock": 4 - }, - "depth24plus": { - "blockWidth": 1, - "blockHeight": 1, - "depth": { - "type": "depth", - "copySrc": false, - "copyDst": false, - "storage": false, - "readWriteStorage": false - }, - "multisample": true - }, - "depth24plus-stencil8": { - "blockWidth": 1, - "blockHeight": 1, - "depth": { - "type": "depth", - "copySrc": false, - "copyDst": false, - "storage": false, - "readWriteStorage": false - }, - "stencil": { - "type": "uint", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 1 - }, - "multisample": true - }, - "depth32float-stencil8": { - "blockWidth": 1, - "blockHeight": 1, - "depth": { - "type": "depth", - "copySrc": true, - "copyDst": false, - "storage": false, - "readWriteStorage": false, - "bytes": 4 - }, - "stencil": { - "type": "uint", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 1 - }, - "multisample": true, - "feature": "depth32float-stencil8" - }, - "bc1-rgba-unorm": { - "blockWidth": 4, - "blockHeight": 4, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 8 - }, - "multisample": false, - "feature": "texture-compression-bc", - "baseFormat": "bc1-rgba-unorm", - "bytesPerBlock": 8 - }, - "bc1-rgba-unorm-srgb": { - "blockWidth": 4, - "blockHeight": 4, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 8 - }, - "multisample": false, - "feature": "texture-compression-bc", - "baseFormat": "bc1-rgba-unorm", - "bytesPerBlock": 8 - }, - "bc2-rgba-unorm": { - "blockWidth": 4, - "blockHeight": 4, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-bc", - "baseFormat": "bc2-rgba-unorm", - "bytesPerBlock": 16 - }, - "bc2-rgba-unorm-srgb": { - "blockWidth": 4, - "blockHeight": 4, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-bc", - "baseFormat": "bc2-rgba-unorm", - "bytesPerBlock": 16 - }, - "bc3-rgba-unorm": { - "blockWidth": 4, - "blockHeight": 4, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-bc", - "baseFormat": "bc3-rgba-unorm", - "bytesPerBlock": 16 - }, - "bc3-rgba-unorm-srgb": { - "blockWidth": 4, - "blockHeight": 4, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-bc", - "baseFormat": "bc3-rgba-unorm", - "bytesPerBlock": 16 - }, - "bc4-r-unorm": { - "blockWidth": 4, - "blockHeight": 4, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 8 - }, - "multisample": false, - "feature": "texture-compression-bc", - "bytesPerBlock": 8 - }, - "bc4-r-snorm": { - "blockWidth": 4, - "blockHeight": 4, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 8 - }, - "multisample": false, - "feature": "texture-compression-bc", - "bytesPerBlock": 8 - }, - "bc5-rg-unorm": { - "blockWidth": 4, - "blockHeight": 4, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-bc", - "bytesPerBlock": 16 - }, - "bc5-rg-snorm": { - "blockWidth": 4, - "blockHeight": 4, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-bc", - "bytesPerBlock": 16 - }, - "bc6h-rgb-ufloat": { - "blockWidth": 4, - "blockHeight": 4, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-bc", - "bytesPerBlock": 16 - }, - "bc6h-rgb-float": { - "blockWidth": 4, - "blockHeight": 4, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-bc", - "bytesPerBlock": 16 - }, - "bc7-rgba-unorm": { - "blockWidth": 4, - "blockHeight": 4, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-bc", - "baseFormat": "bc7-rgba-unorm", - "bytesPerBlock": 16 - }, - "bc7-rgba-unorm-srgb": { - "blockWidth": 4, - "blockHeight": 4, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-bc", - "baseFormat": "bc7-rgba-unorm", - "bytesPerBlock": 16 - }, - "etc2-rgb8unorm": { - "blockWidth": 4, - "blockHeight": 4, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 8 - }, - "multisample": false, - "feature": "texture-compression-etc2", - "baseFormat": "etc2-rgb8unorm", - "bytesPerBlock": 8 - }, - "etc2-rgb8unorm-srgb": { - "blockWidth": 4, - "blockHeight": 4, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 8 - }, - "multisample": false, - "feature": "texture-compression-etc2", - "baseFormat": "etc2-rgb8unorm", - "bytesPerBlock": 8 - }, - "etc2-rgb8a1unorm": { - "blockWidth": 4, - "blockHeight": 4, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 8 - }, - "multisample": false, - "feature": "texture-compression-etc2", - "baseFormat": "etc2-rgb8a1unorm", - "bytesPerBlock": 8 - }, - "etc2-rgb8a1unorm-srgb": { - "blockWidth": 4, - "blockHeight": 4, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 8 - }, - "multisample": false, - "feature": "texture-compression-etc2", - "baseFormat": "etc2-rgb8a1unorm", - "bytesPerBlock": 8 - }, - "etc2-rgba8unorm": { - "blockWidth": 4, - "blockHeight": 4, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-etc2", - "baseFormat": "etc2-rgba8unorm", - "bytesPerBlock": 16 - }, - "etc2-rgba8unorm-srgb": { - "blockWidth": 4, - "blockHeight": 4, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-etc2", - "baseFormat": "etc2-rgba8unorm", - "bytesPerBlock": 16 - }, - "eac-r11unorm": { - "blockWidth": 4, - "blockHeight": 4, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 8 - }, - "multisample": false, - "feature": "texture-compression-etc2", - "bytesPerBlock": 8 - }, - "eac-r11snorm": { - "blockWidth": 4, - "blockHeight": 4, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 8 - }, - "multisample": false, - "feature": "texture-compression-etc2", - "bytesPerBlock": 8 - }, - "eac-rg11unorm": { - "blockWidth": 4, - "blockHeight": 4, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-etc2", - "bytesPerBlock": 16 - }, - "eac-rg11snorm": { - "blockWidth": 4, - "blockHeight": 4, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-etc2", - "bytesPerBlock": 16 - }, - "astc-4x4-unorm": { - "blockWidth": 4, - "blockHeight": 4, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-astc", - "baseFormat": "astc-4x4-unorm", - "bytesPerBlock": 16 - }, - "astc-4x4-unorm-srgb": { - "blockWidth": 4, - "blockHeight": 4, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-astc", - "baseFormat": "astc-4x4-unorm", - "bytesPerBlock": 16 - }, - "astc-5x4-unorm": { - "blockWidth": 5, - "blockHeight": 4, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-astc", - "baseFormat": "astc-5x4-unorm", - "bytesPerBlock": 16 - }, - "astc-5x4-unorm-srgb": { - "blockWidth": 5, - "blockHeight": 4, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-astc", - "baseFormat": "astc-5x4-unorm", - "bytesPerBlock": 16 - }, - "astc-5x5-unorm": { - "blockWidth": 5, - "blockHeight": 5, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-astc", - "baseFormat": "astc-5x5-unorm", - "bytesPerBlock": 16 - }, - "astc-5x5-unorm-srgb": { - "blockWidth": 5, - "blockHeight": 5, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-astc", - "baseFormat": "astc-5x5-unorm", - "bytesPerBlock": 16 - }, - "astc-6x5-unorm": { - "blockWidth": 6, - "blockHeight": 5, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-astc", - "baseFormat": "astc-6x5-unorm", - "bytesPerBlock": 16 - }, - "astc-6x5-unorm-srgb": { - "blockWidth": 6, - "blockHeight": 5, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-astc", - "baseFormat": "astc-6x5-unorm", - "bytesPerBlock": 16 - }, - "astc-6x6-unorm": { - "blockWidth": 6, - "blockHeight": 6, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-astc", - "baseFormat": "astc-6x6-unorm", - "bytesPerBlock": 16 - }, - "astc-6x6-unorm-srgb": { - "blockWidth": 6, - "blockHeight": 6, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-astc", - "baseFormat": "astc-6x6-unorm", - "bytesPerBlock": 16 - }, - "astc-8x5-unorm": { - "blockWidth": 8, - "blockHeight": 5, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-astc", - "baseFormat": "astc-8x5-unorm", - "bytesPerBlock": 16 - }, - "astc-8x5-unorm-srgb": { - "blockWidth": 8, - "blockHeight": 5, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-astc", - "baseFormat": "astc-8x5-unorm", - "bytesPerBlock": 16 - }, - "astc-8x6-unorm": { - "blockWidth": 8, - "blockHeight": 6, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-astc", - "baseFormat": "astc-8x6-unorm", - "bytesPerBlock": 16 - }, - "astc-8x6-unorm-srgb": { - "blockWidth": 8, - "blockHeight": 6, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-astc", - "baseFormat": "astc-8x6-unorm", - "bytesPerBlock": 16 - }, - "astc-8x8-unorm": { - "blockWidth": 8, - "blockHeight": 8, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-astc", - "baseFormat": "astc-8x8-unorm", - "bytesPerBlock": 16 - }, - "astc-8x8-unorm-srgb": { - "blockWidth": 8, - "blockHeight": 8, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-astc", - "baseFormat": "astc-8x8-unorm", - "bytesPerBlock": 16 - }, - "astc-10x5-unorm": { - "blockWidth": 10, - "blockHeight": 5, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-astc", - "baseFormat": "astc-10x5-unorm", - "bytesPerBlock": 16 - }, - "astc-10x5-unorm-srgb": { - "blockWidth": 10, - "blockHeight": 5, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-astc", - "baseFormat": "astc-10x5-unorm", - "bytesPerBlock": 16 - }, - "astc-10x6-unorm": { - "blockWidth": 10, - "blockHeight": 6, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-astc", - "baseFormat": "astc-10x6-unorm", - "bytesPerBlock": 16 - }, - "astc-10x6-unorm-srgb": { - "blockWidth": 10, - "blockHeight": 6, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-astc", - "baseFormat": "astc-10x6-unorm", - "bytesPerBlock": 16 - }, - "astc-10x8-unorm": { - "blockWidth": 10, - "blockHeight": 8, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-astc", - "baseFormat": "astc-10x8-unorm", - "bytesPerBlock": 16 - }, - "astc-10x8-unorm-srgb": { - "blockWidth": 10, - "blockHeight": 8, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-astc", - "baseFormat": "astc-10x8-unorm", - "bytesPerBlock": 16 - }, - "astc-10x10-unorm": { - "blockWidth": 10, - "blockHeight": 10, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-astc", - "baseFormat": "astc-10x10-unorm", - "bytesPerBlock": 16 - }, - "astc-10x10-unorm-srgb": { - "blockWidth": 10, - "blockHeight": 10, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-astc", - "baseFormat": "astc-10x10-unorm", - "bytesPerBlock": 16 - }, - "astc-12x10-unorm": { - "blockWidth": 12, - "blockHeight": 10, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-astc", - "baseFormat": "astc-12x10-unorm", - "bytesPerBlock": 16 - }, - "astc-12x10-unorm-srgb": { - "blockWidth": 12, - "blockHeight": 10, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-astc", - "baseFormat": "astc-12x10-unorm", - "bytesPerBlock": 16 - }, - "astc-12x12-unorm": { - "blockWidth": 12, - "blockHeight": 12, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-astc", - "baseFormat": "astc-12x12-unorm", - "bytesPerBlock": 16 - }, - "astc-12x12-unorm-srgb": { - "blockWidth": 12, - "blockHeight": 12, - "color": { - "type": "float", - "copySrc": true, - "copyDst": true, - "storage": false, - "readWriteStorage": false, - "bytes": 16 - }, - "multisample": false, - "feature": "texture-compression-astc", - "baseFormat": "astc-12x12-unorm", - "bytesPerBlock": 16 - } - }; - - function bitmaskToString(bitNames, mask) { - const names = []; - for (const [k, v] of Object.entries(bitNames)) { - if (mask & v) { - names.push(k); - } - } - return names.join('|'); - } - function bufferUsageToString(mask) { - return bitmaskToString(GPUBufferUsage, mask); - } - function textureUsageToString(mask) { - return bitmaskToString(GPUTextureUsage, mask); - } - function unreachable(msg) { - throw Error(`unreachable: ${''}`); - } - function roundUp(v, align) { - return Math.ceil(v / align) * align; - } - function trimNulls(a) { - const ndx = a.findLastIndex(v => v !== null); - return a.slice(0, ndx + 1); - } - function reifyGPUOrigin3D(e) { - e = e || []; - const d = e; - if (typeof d.x === 'number' || typeof d.y === 'number' || typeof d.z === 'number') { - return [ - d.x ?? 0, - d.y ?? 0, - d.z ?? 0, - ]; - } - const a = [...e]; - return [ - a[0] ?? 0, - a[1] ?? 0, - a[2] ?? 0, - ]; - } - function reifyGPUExtent3D(e) { - const d = e; - if (typeof d.width === 'number') { - return [ - d.width, - d.height ?? 1, - d.depthOrArrayLayers ?? 1, - ]; - } - const a = [...e]; - return [ - a[0], - a[1] ?? 1, - a[2] ?? 1, - ]; - } - function logicalMipLevelSpecificTextureExtent(texture, mipLevel) { - switch (texture.dimension) { - case '1d': - return [ - Math.max(1, texture.width >> mipLevel), - 1, - 1, - ]; - case '2d': - return [ - Math.max(1, texture.width >> mipLevel), - Math.max(1, texture.height >> mipLevel), - texture.depthOrArrayLayers, - ]; - case '3d': - return [ - Math.max(1, texture.width >> mipLevel), - Math.max(1, texture.height >> mipLevel), - Math.max(1, texture.depthOrArrayLayers >> mipLevel), - ]; - default: - unreachable(); - return []; - } - } - function physicalMipLevelSpecificTextureExtent(texture, mipLevel) { - const { blockWidth, blockHeight, } = kAllTextureFormatInfo[texture.format]; - const [width, height, depthOrArrayLayers] = logicalMipLevelSpecificTextureExtent(texture, mipLevel); - switch (texture.dimension) { - case '1d': - return [ - roundUp(width, blockWidth), - 1, - 1, - ]; - case '2d': - case '3d': - return [ - roundUp(width, blockWidth), - roundUp(height, blockHeight), - depthOrArrayLayers, - ]; - default: - unreachable(); - return []; - } - } - - function getProperties(o) { - const keyValues = []; - for (const k in o) { - const v = o[k]; - if (typeof v !== 'function') { - if (o instanceof GPUBuffer && k === 'usage') { - keyValues.push(`${k}: ${v} (${bufferUsageToString(v)})`); - } - else if (o instanceof GPUTexture && k === 'usage') { - keyValues.push(`${k}: ${v} (${textureUsageToString(v)})`); - } - else { - keyValues.push(`${k}: ${JSON.stringify(v)}`); - } - } - } - return keyValues.join(', '); - } - function objToString(o) { - return `${o.constructor.name}(${o.label}){${getProperties(o)}}`; - } - function emitError(msg, objs = []) { - throw new Error(`${msg}\n${(objs).map(o => objToString(o)).join('\n')}`); - } - function assert$1(condition, msg, resources) { - if (!condition) { - const lines = (resources || []).map(r => ` ${objToString(r)}`).join('\n'); - const m = msg ? (typeof msg === 'string' ? msg : msg()) : ''; - emitError(`${m}${lines ? `\n${lines}` : ''}`); - } - } - - /** - * Adds a wrapper function to a class method that gets called before the actual function - */ - function wrapFunctionBefore(API, fnName, fn) { - const origFn = API.prototype[fnName]; - API.prototype[fnName] = function (...args) { - fn.call(this, args); - return origFn.call(this, ...args); - }; - } - /** - * Adds a wrapper function to a class method that gets called after the actual function - */ - function wrapFunctionAfter(API, fnName, fn) { - const origFn = API.prototype[fnName]; - API.prototype[fnName] = function (...args) { - const result = origFn.call(this, ...args); - fn.call(this, result, args); - return result; - }; - } - /** - * Adds a wrapper function to an async class method that gets called after the actual function - */ - function wrapAsyncFunctionAfter(API, fnName, fn) { - const origFn = API.prototype[fnName]; - API.prototype[fnName] = async function (...args) { - const result = await origFn.call(this, ...args); - fn.call(this, result, args); - return result; - }; - } - - const s_objToDevice = new WeakMap(); - const s_destroyedResource = new WeakSet(); - function assertNotDestroyed(obj) { - assert$1(!s_destroyedResource.has(obj), () => `${objToString(obj)} is destroyed`); - } - wrapFunctionBefore(GPUBuffer, 'destroy', function () { - s_destroyedResource.add(this); - }); - wrapFunctionBefore(GPUTexture, 'destroy', function () { - s_destroyedResource.add(this); - }); - wrapFunctionBefore(GPUQuerySet, 'destroy', function () { - s_destroyedResource.add(this); - }); - wrapFunctionBefore(GPUDevice, 'destroy', function () { - s_destroyedResource.add(this); - }); - const s_bindGroupToInfo = new WeakMap(); - - const deviceToErrorScopeStack = new WeakMap(); - const origPushErrorScope = GPUDevice.prototype.pushErrorScope; - const origPopErrorScope = GPUDevice.prototype.popErrorScope; - function errorWrapper(device, fnName, origFn, ...args) { - const stack = new Error(); - origPushErrorScope.call(device, 'validation'); - const result = origFn.call(this, ...args); - const errorScopeStack = deviceToErrorScopeStack.get(device); - const currentErrorScope = errorScopeStack.findLast(scope => scope.filter === 'validation'); - const promise = origPopErrorScope.call(device) - .then(error => { - // If there was a currentErrorScope when we added pushed then remove our promise - if (currentErrorScope) { - const ndx = currentErrorScope.errors.indexOf(promise); - if (ndx) { - currentErrorScope.errors.splice(ndx, 1); - } - } - else { - // there was no currentErrorScope so emit the error - if (error) { - device.dispatchEvent(new GPUUncapturedErrorEvent('uncapturederror', { error })); - } - } - // show it - if (error) { - console.error('WebGPU ERROR in:', fnName, args); - console.error(error.message); - console.error(stack.stack); - } - // return it (as a promise) - return error; - }); - if (currentErrorScope) { - currentErrorScope.errors.push(promise); - } - return result; - } - function addErrorWrapper(api, fnName) { - const origFn = api.prototype[fnName]; - api.prototype[fnName] = function (...args) { - return errorWrapper.call(this, this, fnName.toString(), origFn, ...args); - }; - } - function addErrorWrapperWithDevice(api, fnName) { - const origFn = api.prototype[fnName]; - api.prototype[fnName] = function (...args) { - const device = s_objToDevice.get(this); - return errorWrapper.call(this, device, fnName.toString(), origFn, ...args); - }; - } - /** - * given a class returns all the method names. - */ - function getAPIFunctionNames(api) { - return Object.entries(Object.getOwnPropertyDescriptors(api.prototype)) - .filter(([, info]) => info.enumerable && typeof info.value === 'function') - .map(([name]) => name); - } - const skip = new Set([ - 'pushErrorScope', - 'popErrorScope', - 'destroy', - ]); - getAPIFunctionNames(GPUDevice) - .filter(n => !skip.has(n)) - .forEach(n => addErrorWrapper(GPUDevice, n)); - getAPIFunctionNames(GPUQueue) - .forEach(n => addErrorWrapperWithDevice(GPUQueue, n)); - GPUDevice.prototype.pushErrorScope = (function (origFn) { - return function (filter) { - origFn.call(this, filter); - const errorScopeStack = deviceToErrorScopeStack.get(this); - errorScopeStack.push({ filter, errors: [] }); - }; - })(GPUDevice.prototype.pushErrorScope); - GPUDevice.prototype.popErrorScope = (function (origFn) { - return function () { - const errorScopeStack = deviceToErrorScopeStack.get(this); - const errorScope = errorScopeStack.pop(); - if (errorScope === undefined) { - throw new DOMException('popErrorScope called on empty error scope stack', 'OperationError'); - } - const errPromise = origFn.call(this); - return errorScope.errors.pop() ?? errPromise; - }; - })(GPUDevice.prototype.popErrorScope); - GPUAdapter.prototype.requestDevice = (function (origFn) { - return async function (...args) { - const device = await origFn.call(this, ...args); - if (device) { - device.addEventListener('uncapturederror', function (e) { - console.error(e.error.message); - }); - deviceToErrorScopeStack.set(device, []); - s_objToDevice.set(device.queue, device); - } - return device; - }; - })(GPUAdapter.prototype.requestDevice); - - /* webgpu-utils@1.8.2, license MIT */ - function keysOf(obj) { - return Object.keys(obj); - } - - const createTypeDefs = (defs) => defs; - const b = createTypeDefs({ - i32: { numElements: 1, align: 4, size: 4, type: 'i32', View: Int32Array }, - u32: { numElements: 1, align: 4, size: 4, type: 'u32', View: Uint32Array }, - f32: { numElements: 1, align: 4, size: 4, type: 'f32', View: Float32Array }, - f16: { numElements: 1, align: 2, size: 2, type: 'u16', View: Uint16Array }, - vec2f: { numElements: 2, align: 8, size: 8, type: 'f32', View: Float32Array }, - vec2i: { numElements: 2, align: 8, size: 8, type: 'i32', View: Int32Array }, - vec2u: { numElements: 2, align: 8, size: 8, type: 'u32', View: Uint32Array }, - vec2h: { numElements: 2, align: 4, size: 4, type: 'u16', View: Uint16Array }, - vec3i: { numElements: 3, align: 16, size: 12, type: 'i32', View: Int32Array }, - vec3u: { numElements: 3, align: 16, size: 12, type: 'u32', View: Uint32Array }, - vec3f: { numElements: 3, align: 16, size: 12, type: 'f32', View: Float32Array }, - vec3h: { numElements: 3, align: 8, size: 6, type: 'u16', View: Uint16Array }, - vec4i: { numElements: 4, align: 16, size: 16, type: 'i32', View: Int32Array }, - vec4u: { numElements: 4, align: 16, size: 16, type: 'u32', View: Uint32Array }, - vec4f: { numElements: 4, align: 16, size: 16, type: 'f32', View: Float32Array }, - vec4h: { numElements: 4, align: 8, size: 8, type: 'u16', View: Uint16Array }, - // AlignOf(vecR) SizeOf(array) - mat2x2f: { numElements: 4, align: 8, size: 16, type: 'f32', View: Float32Array }, - mat2x2h: { numElements: 4, align: 4, size: 8, type: 'u16', View: Uint16Array }, - mat3x2f: { numElements: 6, align: 8, size: 24, type: 'f32', View: Float32Array }, - mat3x2h: { numElements: 6, align: 4, size: 12, type: 'u16', View: Uint16Array }, - mat4x2f: { numElements: 8, align: 8, size: 32, type: 'f32', View: Float32Array }, - mat4x2h: { numElements: 8, align: 4, size: 16, type: 'u16', View: Uint16Array }, - mat2x3f: { numElements: 8, align: 16, size: 32, pad: [3, 1], type: 'f32', View: Float32Array }, - mat2x3h: { numElements: 8, align: 8, size: 16, pad: [3, 1], type: 'u16', View: Uint16Array }, - mat3x3f: { numElements: 12, align: 16, size: 48, pad: [3, 1], type: 'f32', View: Float32Array }, - mat3x3h: { numElements: 12, align: 8, size: 24, pad: [3, 1], type: 'u16', View: Uint16Array }, - mat4x3f: { numElements: 16, align: 16, size: 64, pad: [3, 1], type: 'f32', View: Float32Array }, - mat4x3h: { numElements: 16, align: 8, size: 32, pad: [3, 1], type: 'u16', View: Uint16Array }, - mat2x4f: { numElements: 8, align: 16, size: 32, type: 'f32', View: Float32Array }, - mat2x4h: { numElements: 8, align: 8, size: 16, type: 'u16', View: Uint16Array }, - mat3x4f: { numElements: 12, align: 16, size: 48, pad: [3, 1], type: 'f32', View: Float32Array }, - mat3x4h: { numElements: 12, align: 8, size: 24, pad: [3, 1], type: 'u16', View: Uint16Array }, - mat4x4f: { numElements: 16, align: 16, size: 64, type: 'f32', View: Float32Array }, - mat4x4h: { numElements: 16, align: 8, size: 32, type: 'u16', View: Uint16Array }, - // Note: At least as of WGSL V1 you can not create a bool for uniform or storage. - // You can only create one in an internal struct. But, this code generates - // views of structs and it needs to not fail if the struct has a bool - bool: { numElements: 0, align: 1, size: 0, type: 'bool', View: Uint32Array }, - }); - const kWGSLTypeInfo = createTypeDefs({ - ...b, - 'atomic': b.i32, - 'atomic': b.u32, - 'vec2': b.vec2i, - 'vec2': b.vec2u, - 'vec2': b.vec2f, - 'vec2': b.vec2h, - 'vec3': b.vec3i, - 'vec3': b.vec3u, - 'vec3': b.vec3f, - 'vec3': b.vec3h, - 'vec4': b.vec4i, - 'vec4': b.vec4u, - 'vec4': b.vec4f, - 'vec4': b.vec4h, - 'mat2x2': b.mat2x2f, - 'mat2x2': b.mat2x2h, - 'mat3x2': b.mat3x2f, - 'mat3x2': b.mat3x2h, - 'mat4x2': b.mat4x2f, - 'mat4x2': b.mat4x2h, - 'mat2x3': b.mat2x3f, - 'mat2x3': b.mat2x3h, - 'mat3x3': b.mat3x3f, - 'mat3x3': b.mat3x3h, - 'mat4x3': b.mat4x3f, - 'mat4x3': b.mat4x3h, - 'mat2x4': b.mat2x4f, - 'mat2x4': b.mat2x4h, - 'mat3x4': b.mat3x4f, - 'mat3x4': b.mat3x4h, - 'mat4x4': b.mat4x4f, - 'mat4x4': b.mat4x4h, - }); - const kWGSLTypes = keysOf(kWGSLTypeInfo); - - /** - * Set which intrinsic types to make views for. - * - * Example: - * - * Given a an array of intrinsics like this - * `array` - * - * The default is to create a single `Float32Array(4 * 200)` - * because creating 200 `Float32Array` views is not usually - * what you want. - * - * If you do want individual views then you'd call - * `setIntrinsicsToView(['vec3f'])` and now you get - * an array of 200 `Float32Array`s. - * - * Note: `setIntrinsicsToView` always sets ALL types. The list you - * pass it is the types you want views created for, all other types - * will be reset to do the default. In other words - * - * ```js - * setIntrinsicsToView(['vec3f']) - * setIntrinsicsToView(['vec2f']) - * ``` - * - * Only `vec2f` will have views created. `vec3f` has been reset to the default by - * the second call - * - * You can pass in `true` as the 2nd parameter to make it set which types - * to flatten and all others will be set to have views created. For example - * to expand all types would be `setIntrinsicsToView([], true)`. To expand - * all except `f32` would be `setIntrinsicsToView(['f32'], true)`. - * - * To reset all types to the default call it with no arguments - * - * @param types array of types to make views for - * @param flatten whether to flatten or expand the specified types. - */ - function setIntrinsicsToView(types = [], flatten) { - // we need to track what we've viewed because for example `vec3f` references - // the same info as `vec3` so we'd set one and reset the other. - const visited = new Set(); - for (const type of kWGSLTypes) { - const info = kWGSLTypeInfo[type]; - if (!visited.has(info)) { - visited.add(info); - info.flatten = types.includes(type) ? flatten : !flatten; - } - } + function setIntrinsicsToView(types = [], flatten) { + // we need to track what we've viewed because for example `vec3f` references + // the same info as `vec3` so we'd set one and reset the other. + const visited = new Set(); + for (const type of kWGSLTypes) { + const info = kWGSLTypeInfo[type]; + if (!visited.has(info)) { + visited.add(info); + info.flatten = types.includes(type) ? flatten : !flatten; + } + } } setIntrinsicsToView(); @@ -6086,487 +4222,2304 @@ } return null; } - _isUniformVar(node) { - return node instanceof Var && node.storage == "uniform"; + _isUniformVar(node) { + return node instanceof Var && node.storage == "uniform"; + } + _isStorageVar(node) { + return node instanceof Var && node.storage == "storage"; + } + _isTextureVar(node) { + return (node instanceof Var && + node.type !== null && + WgslReflect._textureTypes.indexOf(node.type.name) != -1); + } + _isSamplerVar(node) { + return (node instanceof Var && + node.type !== null && + WgslReflect._samplerTypes.indexOf(node.type.name) != -1); + } + _getAttribute(node, name) { + const obj = node; + if (!obj || !obj["attributes"]) { + return null; + } + const attrs = obj["attributes"]; + for (let a of attrs) { + if (a.name == name) { + return a; + } + } + return null; + } + _getAttributeNum(attributes, name, defaultValue) { + if (attributes === null) { + return defaultValue; + } + for (let a of attributes) { + if (a.name == name) { + let v = a !== null && a.value !== null ? a.value : defaultValue; + if (v instanceof Array) { + v = v[0]; + } + if (typeof v === "number") { + return v; + } + if (typeof v === "string") { + return parseInt(v); + } + return defaultValue; + } + } + return defaultValue; + } + _roundUp(k, n) { + return Math.ceil(n / k) * k; + } + } + // Type AlignOf(T) Sizeof(T) + // i32, u32, or f32 4 4 + // atomic 4 4 + // vec2 8 8 + // vec3 16 12 + // vec4 16 16 + // mat2x2 8 16 + // mat3x2 8 24 + // mat4x2 8 32 + // mat2x3 16 32 + // mat3x3 16 48 + // mat4x3 16 64 + // mat2x4 16 32 + // mat3x4 16 48 + // mat4x4 16 64 + WgslReflect._typeInfo = { + f16: { align: 2, size: 2 }, + i32: { align: 4, size: 4 }, + u32: { align: 4, size: 4 }, + f32: { align: 4, size: 4 }, + atomic: { align: 4, size: 4 }, + vec2: { align: 8, size: 8 }, + vec3: { align: 16, size: 12 }, + vec4: { align: 16, size: 16 }, + mat2x2: { align: 8, size: 16 }, + mat3x2: { align: 8, size: 24 }, + mat4x2: { align: 8, size: 32 }, + mat2x3: { align: 16, size: 32 }, + mat3x3: { align: 16, size: 48 }, + mat4x3: { align: 16, size: 64 }, + mat2x4: { align: 16, size: 32 }, + mat3x4: { align: 16, size: 48 }, + mat4x4: { align: 16, size: 64 }, + }; + WgslReflect._textureTypes = TokenTypes.any_texture_type.map((t) => { + return t.name; + }); + WgslReflect._samplerTypes = TokenTypes.sampler_type.map((t) => { + return t.name; + }); + + function getEntryPointForStage(defs, stage, stageFlags) { + const { entryPoint: entryPointName } = stage; + if (entryPointName) { + const ep = defs.entryPoints[entryPointName]; + return (ep && ep.stage === stageFlags) ? ep : undefined; + } + return Object.values(defs.entryPoints).filter(ep => ep.stage === stageFlags)[0]; + } + function getStageResources(defs, stage, stageFlags) { + if (!stage) { + return []; + } + const entryPoint = getEntryPointForStage(defs, stage, stageFlags); + return entryPoint?.resources || []; + } + const byBinding = (a, b) => Math.sign(a.binding - b.binding); + /** + * Gets GPUBindGroupLayoutDescriptors for the given pipeline. + * + * Important: Assumes you pipeline is valid (it doesn't check for errors). + * + * Note: In WebGPU some layouts must be specified manually. For example an unfiltered-float + * sampler can not be derived since it is unknown at compile time pipeline creation time + * which texture you'll use. + * + * MAINTENANCE_TODO: Add example + * + * @param defs ShaderDataDefinitions or an array of ShaderDataDefinitions as + * returned from @link {makeShaderDataDefinitions}. If an array more than 1 + * definition it's assumed the vertex shader is in the first and the fragment + * shader in the second. + * @param desc A PipelineDescriptor. You should be able to pass in the same object you passed + * to `createRenderPipeline` or `createComputePipeline`. + * @returns An array of GPUBindGroupLayoutDescriptors which you can pass, one at a time, to + * `createBindGroupLayout`. Note: the array will be sparse if there are gaps in group + * numbers. Note: Each GPUBindGroupLayoutDescriptor.entries will be sorted by binding. + */ + function makeBindGroupLayoutDescriptors(defs, desc) { + defs = Array.isArray(defs) ? defs : [defs]; + const resources = [ + ...getStageResources(defs[0], desc.vertex, GPUShaderStage.VERTEX), + ...getStageResources(defs[defs.length - 1], desc.fragment, GPUShaderStage.FRAGMENT), + ...getStageResources(defs[0], desc.compute, GPUShaderStage.COMPUTE), + ]; + const bindGroupLayoutDescriptorsByGroupByBinding = []; + for (const resource of resources) { + const bindingsToBindGroupEntry = bindGroupLayoutDescriptorsByGroupByBinding[resource.group] || new Map(); + bindGroupLayoutDescriptorsByGroupByBinding[resource.group] = bindingsToBindGroupEntry; + // Should we error here if the 2 don't match? + const entry = bindingsToBindGroupEntry.get(resource.entry.binding); + bindingsToBindGroupEntry.set(resource.entry.binding, { + ...resource.entry, + visibility: resource.entry.visibility | (entry?.visibility || 0), + }); + } + const descriptors = bindGroupLayoutDescriptorsByGroupByBinding.map(v => ({ entries: [...v.values()].sort(byBinding) })); + for (let i = 0; i < descriptors.length; ++i) { + if (!descriptors[i]) { + descriptors[i] = { entries: [] }; + } + } + return descriptors; + } + function getNamedVariables(reflect, variables) { + return Object.fromEntries(variables.map(v => { + const typeDefinition = addVariableType(reflect, v, 0); + return [ + v.name, + { + typeDefinition, + group: v.group, + binding: v.binding, + size: typeDefinition.size, + }, + ]; + })); + } + function makeStructDefinition(reflect, structInfo, offset) { + // StructDefinition + const fields = Object.fromEntries(structInfo.members.map(m => { + return [ + m.name, + { + offset: m.offset, + type: addType(reflect, m.type, 0), + }, + ]; + })); + return { + fields, + size: structInfo.size, + offset, + }; + } + function getTextureSampleType(type) { + if (type.name.includes('depth')) { + return 'depth'; + } + // unfiltered-float + switch (type.format?.name) { + case 'f32': return 'float'; + case 'i32': return 'sint'; + case 'u32': return 'uint'; + default: + throw new Error('unknown texture sample type'); } - _isStorageVar(node) { - return node instanceof Var && node.storage == "storage"; + } + function getViewDimension(type) { + if (type.name.includes('2d_array')) { + return '2d-array'; } - _isTextureVar(node) { - return (node instanceof Var && - node.type !== null && - WgslReflect._textureTypes.indexOf(node.type.name) != -1); + if (type.name.includes('cube_array')) { + return 'cube-array'; } - _isSamplerVar(node) { - return (node instanceof Var && - node.type !== null && - WgslReflect._samplerTypes.indexOf(node.type.name) != -1); + if (type.name.includes('3d')) { + return '3d'; } - _getAttribute(node, name) { - const obj = node; - if (!obj || !obj["attributes"]) { - return null; - } - const attrs = obj["attributes"]; - for (let a of attrs) { - if (a.name == name) { - return a; + if (type.name.includes('1d')) { + return '1d'; + } + if (type.name.includes('cube')) { + return 'cube'; + } + return '2d'; + } + function getStorageTextureAccess(type) { + switch (type.access) { + case 'read': return 'read-only'; + case 'write': return 'write-only'; + case 'read_write': return 'read-write'; + default: + throw new Error('unknonw storage texture access'); + } + } + function getSamplerType(type) { + // "non-filtering" can only be specified manually. + return type.name.endsWith('_comparison') + ? 'comparison' + : 'filtering'; + } + function getBindGroupLayoutEntry(resource, visibility) { + const { binding, access, type } = resource; + switch (resource.resourceType) { + case ResourceType.Uniform: + return { + binding, + visibility, + buffer: {}, + }; + case ResourceType.Storage: + return { + binding, + visibility, + buffer: { + type: (access === '' || access === 'read') ? 'read-only-storage' : 'storage', + }, + }; + case ResourceType.Texture: { + if (type.name === 'texture_external') { + return { + binding, + visibility, + externalTexture: {}, + }; } + const multisampled = type.name.includes('multisampled'); + return { + binding, + visibility, + texture: { + sampleType: getTextureSampleType(type), + viewDimension: getViewDimension(type), + multisampled, + }, + }; } - return null; + case ResourceType.Sampler: + return { + binding, + visibility, + sampler: { + type: getSamplerType(type), + }, + }; + case ResourceType.StorageTexture: + return { + binding, + visibility, + storageTexture: { + access: getStorageTextureAccess(type), + format: type.format.name, + viewDimension: getViewDimension(type), + }, + }; + default: + throw new Error('unknown resource type'); } - _getAttributeNum(attributes, name, defaultValue) { - if (attributes === null) { - return defaultValue; - } - for (let a of attributes) { - if (a.name == name) { - let v = a !== null && a.value !== null ? a.value : defaultValue; - if (v instanceof Array) { - v = v[0]; - } - if (typeof v === "number") { - return v; - } - if (typeof v === "string") { - return parseInt(v); - } - return defaultValue; + } + function addEntryPoints(funcInfos, stage) { + const entryPoints = {}; + for (const info of funcInfos) { + entryPoints[info.name] = { + stage, + resources: info.resources.map(resource => { + const { name, group } = resource; + return { + name, + group, + entry: getBindGroupLayoutEntry(resource, stage), + }; + }), + }; + } + return entryPoints; + } + /** + * Given a WGSL shader, returns data definitions for structures, + * uniforms, and storage buffers + * + * Example: + * + * ```js + * const code = ` + * struct MyStruct { + * color: vec4f, + * brightness: f32, + * kernel: array, + * }; + * @group(0) @binding(0) var myUniforms: MyUniforms; + * `; + * const defs = makeShaderDataDefinitions(code); + * const myUniformValues = makeStructuredView(defs.uniforms.myUniforms); + * + * myUniformValues.set({ + * color: [1, 0, 1, 1], + * brightness: 0.8, + * kernel: [ + * 1, 0, -1, + * 2, 0, -2, + * 1, 0, -1, + * ], + * }); + * device.queue.writeBuffer(uniformBuffer, 0, myUniformValues.arrayBuffer); + * ``` + * + * @param code WGSL shader. Note: it is not required for this to be a complete shader + * @returns definitions of the structures by name. Useful for passing to {@link makeStructuredView} + */ + function makeShaderDataDefinitions(code) { + const reflect = new WgslReflect(code); + const structs = Object.fromEntries(reflect.structs.map(structInfo => { + return [structInfo.name, makeStructDefinition(reflect, structInfo, 0)]; + })); + const uniforms = getNamedVariables(reflect, reflect.uniforms); + const storages = getNamedVariables(reflect, reflect.storage.filter(v => v.resourceType === ResourceType.Storage)); + const storageTextures = getNamedVariables(reflect, reflect.storage.filter(v => v.resourceType === ResourceType.StorageTexture)); + const textures = getNamedVariables(reflect, reflect.textures.filter(v => v.type.name !== 'texture_external')); + const externalTextures = getNamedVariables(reflect, reflect.textures.filter(v => v.type.name === 'texture_external')); + const samplers = getNamedVariables(reflect, reflect.samplers); + const entryPoints = { + ...addEntryPoints(reflect.entry.vertex, GPUShaderStage.VERTEX), + ...addEntryPoints(reflect.entry.fragment, GPUShaderStage.FRAGMENT), + ...addEntryPoints(reflect.entry.compute, GPUShaderStage.COMPUTE), + }; + return { + externalTextures, + samplers, + structs, + storages, + storageTextures, + textures, + uniforms, + entryPoints, + }; + } + function assert$1(cond, msg = '') { + if (!cond) { + throw new Error(msg); + } + } + /* + write down what I want for a given type + + struct VSUniforms { + foo: u32, + }; + @group(4) @binding(1) var uni1: f32; + @group(3) @binding(2) var uni2: array; + @group(2) @binding(3) var uni3: VSUniforms; + @group(1) @binding(4) var uni4: array; + + uni1: { + type: 'f32', + numElements: undefined + }, + uni2: { + type: 'array', + elementType: 'f32' + numElements: 5, + }, + uni3: { + type: 'struct', + fields: { + foo: { + type: 'f32', + numElements: undefined + } + }, + }, + uni4: { + type: 'array', + elementType: + fields: { + foo: { + type: 'f32', + numElements: undefined } - } - return defaultValue; - } - _roundUp(k, n) { - return Math.ceil(n / k) * k; - } - } - // Type AlignOf(T) Sizeof(T) - // i32, u32, or f32 4 4 - // atomic 4 4 - // vec2 8 8 - // vec3 16 12 - // vec4 16 16 - // mat2x2 8 16 - // mat3x2 8 24 - // mat4x2 8 32 - // mat2x3 16 32 - // mat3x3 16 48 - // mat4x3 16 64 - // mat2x4 16 32 - // mat3x4 16 48 - // mat4x4 16 64 - WgslReflect._typeInfo = { - f16: { align: 2, size: 2 }, - i32: { align: 4, size: 4 }, - u32: { align: 4, size: 4 }, - f32: { align: 4, size: 4 }, - atomic: { align: 4, size: 4 }, - vec2: { align: 8, size: 8 }, - vec3: { align: 16, size: 12 }, - vec4: { align: 16, size: 16 }, - mat2x2: { align: 8, size: 16 }, - mat3x2: { align: 8, size: 24 }, - mat4x2: { align: 8, size: 32 }, - mat2x3: { align: 16, size: 32 }, - mat3x3: { align: 16, size: 48 }, - mat4x3: { align: 16, size: 64 }, - mat2x4: { align: 16, size: 32 }, - mat3x4: { align: 16, size: 48 }, - mat4x4: { align: 16, size: 64 }, - }; - WgslReflect._textureTypes = TokenTypes.any_texture_type.map((t) => { - return t.name; - }); - WgslReflect._samplerTypes = TokenTypes.sampler_type.map((t) => { - return t.name; - }); + }, + fields: { + foo: { + type: 'f32', + numElements: undefined + } + }, + ... + ] - function getEntryPointForStage(defs, stage, stageFlags) { - const { entryPoint: entryPointName } = stage; - if (entryPointName) { - const ep = defs.entryPoints[entryPointName]; - return (ep && ep.stage === stageFlags) ? ep : undefined; + */ + function addVariableType(reflect, v, offset) { + switch (v.resourceType) { + case ResourceType.Uniform: + case ResourceType.Storage: + case ResourceType.StorageTexture: + return addType(reflect, v.type, offset); + default: + return { + size: 0, + type: v.type.name, + }; } - return Object.values(defs.entryPoints).filter(ep => ep.stage === stageFlags)[0]; } - function getStageResources(defs, stage, stageFlags) { - if (!stage) { - return []; + function addType(reflect, typeInfo, offset) { + if (typeInfo.isArray) { + assert$1(!typeInfo.isStruct, 'struct array is invalid'); + assert$1(!typeInfo.isStruct, 'template array is invalid'); + const arrayInfo = typeInfo; + // ArrayDefinition + return { + size: arrayInfo.size, + elementType: addType(reflect, arrayInfo.format, offset), + numElements: arrayInfo.count, + }; + } + else if (typeInfo.isStruct) { + assert$1(!typeInfo.isTemplate, 'template struct is invalid'); + const structInfo = typeInfo; + return makeStructDefinition(reflect, structInfo, offset); + } + else { + // template is like vec4 or mat4x4 + const asTemplateInfo = typeInfo; + const type = typeInfo.isTemplate + ? `${asTemplateInfo.name}<${asTemplateInfo.format.name}>` + : typeInfo.name; + // IntrinsicDefinition + return { + size: typeInfo.size, + type: type, + }; } - const entryPoint = getEntryPointForStage(defs, stage, stageFlags); - return entryPoint?.resources || []; } - const byBinding = (a, b) => Math.sign(a.binding - b.binding); - /** - * Gets GPUBindGroupLayoutDescriptors for the given pipeline. - * - * Important: Assumes you pipeline is valid (it doesn't check for errors). - * - * Note: In WebGPU some layouts must be specified manually. For example an unfiltered-float - * sampler can not be derived since it is unknown at compile time pipeline creation time - * which texture you'll use. - * - * MAINTENANCE_TODO: Add example - * - * @param defs ShaderDataDefinitions or an array of ShaderDataDefinitions as - * returned from @link {makeShaderDataDefinitions}. If an array more than 1 - * definition it's assumed the vertex shader is in the first and the fragment - * shader in the second. - * @param desc A PipelineDescriptor. You should be able to pass in the same object you passed - * to `createRenderPipeline` or `createComputePipeline`. - * @returns An array of GPUBindGroupLayoutDescriptors which you can pass, one at a time, to - * `createBindGroupLayout`. Note: the array will be sparse if there are gaps in group - * numbers. Note: Each GPUBindGroupLayoutDescriptor.entries will be sorted by binding. + + const kTypedArrayToAttribFormat = new Map([ + [Int8Array, { formats: ['sint8', 'snorm8'], defaultForType: 1 }], + [Uint8Array, { formats: ['uint8', 'unorm8'], defaultForType: 1 }], + [Int16Array, { formats: ['sint16', 'snorm16'], defaultForType: 1 }], + [Uint16Array, { formats: ['uint16', 'unorm16'], defaultForType: 1 }], + [Int32Array, { formats: ['sint32', 'snorm32'], defaultForType: 0 }], + [Uint32Array, { formats: ['uint32', 'unorm32'], defaultForType: 0 }], + [Float32Array, { formats: ['float32', 'float32'], defaultForType: 0 }], + // TODO: Add Float16Array + ]); + new Map([...kTypedArrayToAttribFormat.entries()].map(([Type, { formats: [s1, s2] }]) => [[s1, Type], [s2, Type]]).flat()); + + // exported from the WebGPU CTS by adding the following line to src/webgpu/format_info.ts + // + // console.log(JSON.stringify(kAllTextureFormatInfo, null, 2)); + /** `kDepthStencilFormatResolvedAspect[format][aspect]` returns the aspect-specific format for a + * depth-stencil format, or `undefined` if the format doesn't have the aspect. */ - function makeBindGroupLayoutDescriptors(defs, desc) { - defs = Array.isArray(defs) ? defs : [defs]; - const resources = [ - ...getStageResources(defs[0], desc.vertex, GPUShaderStage.VERTEX), - ...getStageResources(defs[defs.length - 1], desc.fragment, GPUShaderStage.FRAGMENT), - ...getStageResources(defs[0], desc.compute, GPUShaderStage.COMPUTE), - ]; - const bindGroupLayoutDescriptorsByGroupByBinding = []; - for (const resource of resources) { - const bindingsToBindGroupEntry = bindGroupLayoutDescriptorsByGroupByBinding[resource.group] || new Map(); - bindGroupLayoutDescriptorsByGroupByBinding[resource.group] = bindingsToBindGroupEntry; - // Should we error here if the 2 don't match? - const entry = bindingsToBindGroupEntry.get(resource.entry.binding); - bindingsToBindGroupEntry.set(resource.entry.binding, { - ...resource.entry, - visibility: resource.entry.visibility | (entry?.visibility || 0), - }); + const kDepthStencilFormatResolvedAspect = { + // kUnsizedDepthStencilFormats + depth24plus: { + all: 'depth24plus', + 'depth-only': 'depth24plus', + 'stencil-only': undefined, + }, + 'depth24plus-stencil8': { + all: 'depth24plus-stencil8', + 'depth-only': 'depth24plus', + 'stencil-only': 'stencil8', + }, + // kSizedDepthStencilFormats + depth16unorm: { + all: 'depth16unorm', + 'depth-only': 'depth16unorm', + 'stencil-only': undefined, + }, + depth32float: { + all: 'depth32float', + 'depth-only': 'depth32float', + 'stencil-only': undefined, + }, + 'depth32float-stencil8': { + all: 'depth32float-stencil8', + 'depth-only': 'depth32float', + 'stencil-only': 'stencil8', + }, + stencil8: { + all: 'stencil8', + 'depth-only': undefined, + 'stencil-only': 'stencil8', + }, + }; + function getDepthStencilFormatResolvedAspect(format, aspect) { + const info = kDepthStencilFormatResolvedAspect[format]; + return info ? info[aspect] : undefined; + } + const kAllTextureFormatInfo = { + "r8unorm": { + "blockWidth": 1, + "blockHeight": 1, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 1 + }, + "colorRender": { + "blend": true, + "resolve": true, + "byteCost": 1, + "alignment": 1 + }, + "multisample": true, + "bytesPerBlock": 1 + }, + "r8snorm": { + "blockWidth": 1, + "blockHeight": 1, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 1 + }, + "multisample": false, + "bytesPerBlock": 1 + }, + "r8uint": { + "blockWidth": 1, + "blockHeight": 1, + "color": { + "type": "uint", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 1 + }, + "colorRender": { + "blend": false, + "resolve": false, + "byteCost": 1, + "alignment": 1 + }, + "multisample": true, + "bytesPerBlock": 1 + }, + "r8sint": { + "blockWidth": 1, + "blockHeight": 1, + "color": { + "type": "sint", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 1 + }, + "colorRender": { + "blend": false, + "resolve": false, + "byteCost": 1, + "alignment": 1 + }, + "multisample": true, + "bytesPerBlock": 1 + }, + "rg8unorm": { + "blockWidth": 1, + "blockHeight": 1, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 2 + }, + "colorRender": { + "blend": true, + "resolve": true, + "byteCost": 2, + "alignment": 1 + }, + "multisample": true, + "bytesPerBlock": 2 + }, + "rg8snorm": { + "blockWidth": 1, + "blockHeight": 1, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 2 + }, + "multisample": false, + "bytesPerBlock": 2 + }, + "rg8uint": { + "blockWidth": 1, + "blockHeight": 1, + "color": { + "type": "uint", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 2 + }, + "colorRender": { + "blend": false, + "resolve": false, + "byteCost": 2, + "alignment": 1 + }, + "multisample": true, + "bytesPerBlock": 2 + }, + "rg8sint": { + "blockWidth": 1, + "blockHeight": 1, + "color": { + "type": "sint", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 2 + }, + "colorRender": { + "blend": false, + "resolve": false, + "byteCost": 2, + "alignment": 1 + }, + "multisample": true, + "bytesPerBlock": 2 + }, + "rgba8unorm": { + "blockWidth": 1, + "blockHeight": 1, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": true, + "readWriteStorage": false, + "bytes": 4 + }, + "colorRender": { + "blend": true, + "resolve": true, + "byteCost": 8, + "alignment": 1 + }, + "multisample": true, + "baseFormat": "rgba8unorm", + "bytesPerBlock": 4 + }, + "rgba8unorm-srgb": { + "blockWidth": 1, + "blockHeight": 1, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 4 + }, + "colorRender": { + "blend": true, + "resolve": true, + "byteCost": 8, + "alignment": 1 + }, + "multisample": true, + "baseFormat": "rgba8unorm", + "bytesPerBlock": 4 + }, + "rgba8snorm": { + "blockWidth": 1, + "blockHeight": 1, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": true, + "readWriteStorage": false, + "bytes": 4 + }, + "multisample": false, + "bytesPerBlock": 4 + }, + "rgba8uint": { + "blockWidth": 1, + "blockHeight": 1, + "color": { + "type": "uint", + "copySrc": true, + "copyDst": true, + "storage": true, + "readWriteStorage": false, + "bytes": 4 + }, + "colorRender": { + "blend": false, + "resolve": false, + "byteCost": 4, + "alignment": 1 + }, + "multisample": true, + "bytesPerBlock": 4 + }, + "rgba8sint": { + "blockWidth": 1, + "blockHeight": 1, + "color": { + "type": "sint", + "copySrc": true, + "copyDst": true, + "storage": true, + "readWriteStorage": false, + "bytes": 4 + }, + "colorRender": { + "blend": false, + "resolve": false, + "byteCost": 4, + "alignment": 1 + }, + "multisample": true, + "bytesPerBlock": 4 + }, + "bgra8unorm": { + "blockWidth": 1, + "blockHeight": 1, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 4 + }, + "colorRender": { + "blend": true, + "resolve": true, + "byteCost": 8, + "alignment": 1 + }, + "multisample": true, + "baseFormat": "bgra8unorm", + "bytesPerBlock": 4 + }, + "bgra8unorm-srgb": { + "blockWidth": 1, + "blockHeight": 1, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 4 + }, + "colorRender": { + "blend": true, + "resolve": true, + "byteCost": 8, + "alignment": 1 + }, + "multisample": true, + "baseFormat": "bgra8unorm", + "bytesPerBlock": 4 + }, + "r16uint": { + "blockWidth": 1, + "blockHeight": 1, + "color": { + "type": "uint", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 2 + }, + "colorRender": { + "blend": false, + "resolve": false, + "byteCost": 2, + "alignment": 2 + }, + "multisample": true, + "bytesPerBlock": 2 + }, + "r16sint": { + "blockWidth": 1, + "blockHeight": 1, + "color": { + "type": "sint", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 2 + }, + "colorRender": { + "blend": false, + "resolve": false, + "byteCost": 2, + "alignment": 2 + }, + "multisample": true, + "bytesPerBlock": 2 + }, + "r16float": { + "blockWidth": 1, + "blockHeight": 1, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 2 + }, + "colorRender": { + "blend": true, + "resolve": true, + "byteCost": 2, + "alignment": 2 + }, + "multisample": true, + "bytesPerBlock": 2 + }, + "rg16uint": { + "blockWidth": 1, + "blockHeight": 1, + "color": { + "type": "uint", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 4 + }, + "colorRender": { + "blend": false, + "resolve": false, + "byteCost": 4, + "alignment": 2 + }, + "multisample": true, + "bytesPerBlock": 4 + }, + "rg16sint": { + "blockWidth": 1, + "blockHeight": 1, + "color": { + "type": "sint", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 4 + }, + "colorRender": { + "blend": false, + "resolve": false, + "byteCost": 4, + "alignment": 2 + }, + "multisample": true, + "bytesPerBlock": 4 + }, + "rg16float": { + "blockWidth": 1, + "blockHeight": 1, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 4 + }, + "colorRender": { + "blend": true, + "resolve": true, + "byteCost": 4, + "alignment": 2 + }, + "multisample": true, + "bytesPerBlock": 4 + }, + "rgba16uint": { + "blockWidth": 1, + "blockHeight": 1, + "color": { + "type": "uint", + "copySrc": true, + "copyDst": true, + "storage": true, + "readWriteStorage": false, + "bytes": 8 + }, + "colorRender": { + "blend": false, + "resolve": false, + "byteCost": 8, + "alignment": 2 + }, + "multisample": true, + "bytesPerBlock": 8 + }, + "rgba16sint": { + "blockWidth": 1, + "blockHeight": 1, + "color": { + "type": "sint", + "copySrc": true, + "copyDst": true, + "storage": true, + "readWriteStorage": false, + "bytes": 8 + }, + "colorRender": { + "blend": false, + "resolve": false, + "byteCost": 8, + "alignment": 2 + }, + "multisample": true, + "bytesPerBlock": 8 + }, + "rgba16float": { + "blockWidth": 1, + "blockHeight": 1, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": true, + "readWriteStorage": false, + "bytes": 8 + }, + "colorRender": { + "blend": true, + "resolve": true, + "byteCost": 8, + "alignment": 2 + }, + "multisample": true, + "bytesPerBlock": 8 + }, + "r32uint": { + "blockWidth": 1, + "blockHeight": 1, + "color": { + "type": "uint", + "copySrc": true, + "copyDst": true, + "storage": true, + "readWriteStorage": true, + "bytes": 4 + }, + "colorRender": { + "blend": false, + "resolve": false, + "byteCost": 4, + "alignment": 4 + }, + "multisample": false, + "bytesPerBlock": 4 + }, + "r32sint": { + "blockWidth": 1, + "blockHeight": 1, + "color": { + "type": "sint", + "copySrc": true, + "copyDst": true, + "storage": true, + "readWriteStorage": true, + "bytes": 4 + }, + "colorRender": { + "blend": false, + "resolve": false, + "byteCost": 4, + "alignment": 4 + }, + "multisample": false, + "bytesPerBlock": 4 + }, + "r32float": { + "blockWidth": 1, + "blockHeight": 1, + "color": { + "type": "unfilterable-float", + "copySrc": true, + "copyDst": true, + "storage": true, + "readWriteStorage": true, + "bytes": 4 + }, + "colorRender": { + "blend": false, + "resolve": false, + "byteCost": 4, + "alignment": 4 + }, + "multisample": true, + "bytesPerBlock": 4 + }, + "rg32uint": { + "blockWidth": 1, + "blockHeight": 1, + "color": { + "type": "uint", + "copySrc": true, + "copyDst": true, + "storage": true, + "readWriteStorage": false, + "bytes": 8 + }, + "colorRender": { + "blend": false, + "resolve": false, + "byteCost": 8, + "alignment": 4 + }, + "multisample": false, + "bytesPerBlock": 8 + }, + "rg32sint": { + "blockWidth": 1, + "blockHeight": 1, + "color": { + "type": "sint", + "copySrc": true, + "copyDst": true, + "storage": true, + "readWriteStorage": false, + "bytes": 8 + }, + "colorRender": { + "blend": false, + "resolve": false, + "byteCost": 8, + "alignment": 4 + }, + "multisample": false, + "bytesPerBlock": 8 + }, + "rg32float": { + "blockWidth": 1, + "blockHeight": 1, + "color": { + "type": "unfilterable-float", + "copySrc": true, + "copyDst": true, + "storage": true, + "readWriteStorage": false, + "bytes": 8 + }, + "colorRender": { + "blend": false, + "resolve": false, + "byteCost": 8, + "alignment": 4 + }, + "multisample": false, + "bytesPerBlock": 8 + }, + "rgba32uint": { + "blockWidth": 1, + "blockHeight": 1, + "color": { + "type": "uint", + "copySrc": true, + "copyDst": true, + "storage": true, + "readWriteStorage": false, + "bytes": 16 + }, + "colorRender": { + "blend": false, + "resolve": false, + "byteCost": 16, + "alignment": 4 + }, + "multisample": false, + "bytesPerBlock": 16 + }, + "rgba32sint": { + "blockWidth": 1, + "blockHeight": 1, + "color": { + "type": "sint", + "copySrc": true, + "copyDst": true, + "storage": true, + "readWriteStorage": false, + "bytes": 16 + }, + "colorRender": { + "blend": false, + "resolve": false, + "byteCost": 16, + "alignment": 4 + }, + "multisample": false, + "bytesPerBlock": 16 + }, + "rgba32float": { + "blockWidth": 1, + "blockHeight": 1, + "color": { + "type": "unfilterable-float", + "copySrc": true, + "copyDst": true, + "storage": true, + "readWriteStorage": false, + "bytes": 16 + }, + "colorRender": { + "blend": false, + "resolve": false, + "byteCost": 16, + "alignment": 4 + }, + "multisample": false, + "bytesPerBlock": 16 + }, + "rgb10a2uint": { + "blockWidth": 1, + "blockHeight": 1, + "color": { + "type": "uint", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 4 + }, + "colorRender": { + "blend": false, + "resolve": false, + "byteCost": 8, + "alignment": 4 + }, + "multisample": true, + "bytesPerBlock": 4 + }, + "rgb10a2unorm": { + "blockWidth": 1, + "blockHeight": 1, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 4 + }, + "colorRender": { + "blend": true, + "resolve": true, + "byteCost": 8, + "alignment": 4 + }, + "multisample": true, + "bytesPerBlock": 4 + }, + "rg11b10ufloat": { + "blockWidth": 1, + "blockHeight": 1, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 4 + }, + "multisample": false, + "bytesPerBlock": 4 + }, + "rgb9e5ufloat": { + "blockWidth": 1, + "blockHeight": 1, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 4 + }, + "multisample": false, + "bytesPerBlock": 4 + }, + "stencil8": { + "blockWidth": 1, + "blockHeight": 1, + "stencil": { + "type": "uint", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 1 + }, + "multisample": true, + "bytesPerBlock": 1 + }, + "depth16unorm": { + "blockWidth": 1, + "blockHeight": 1, + "depth": { + "type": "depth", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 2 + }, + "multisample": true, + "bytesPerBlock": 2 + }, + "depth32float": { + "blockWidth": 1, + "blockHeight": 1, + "depth": { + "type": "depth", + "copySrc": true, + "copyDst": false, + "storage": false, + "readWriteStorage": false, + "bytes": 4 + }, + "multisample": true, + "bytesPerBlock": 4 + }, + "depth24plus": { + "blockWidth": 1, + "blockHeight": 1, + "depth": { + "type": "depth", + "copySrc": false, + "copyDst": false, + "storage": false, + "readWriteStorage": false + }, + "multisample": true + }, + "depth24plus-stencil8": { + "blockWidth": 1, + "blockHeight": 1, + "depth": { + "type": "depth", + "copySrc": false, + "copyDst": false, + "storage": false, + "readWriteStorage": false + }, + "stencil": { + "type": "uint", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 1 + }, + "multisample": true + }, + "depth32float-stencil8": { + "blockWidth": 1, + "blockHeight": 1, + "depth": { + "type": "depth", + "copySrc": true, + "copyDst": false, + "storage": false, + "readWriteStorage": false, + "bytes": 4 + }, + "stencil": { + "type": "uint", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 1 + }, + "multisample": true, + "feature": "depth32float-stencil8" + }, + "bc1-rgba-unorm": { + "blockWidth": 4, + "blockHeight": 4, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 8 + }, + "multisample": false, + "feature": "texture-compression-bc", + "baseFormat": "bc1-rgba-unorm", + "bytesPerBlock": 8 + }, + "bc1-rgba-unorm-srgb": { + "blockWidth": 4, + "blockHeight": 4, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 8 + }, + "multisample": false, + "feature": "texture-compression-bc", + "baseFormat": "bc1-rgba-unorm", + "bytesPerBlock": 8 + }, + "bc2-rgba-unorm": { + "blockWidth": 4, + "blockHeight": 4, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-bc", + "baseFormat": "bc2-rgba-unorm", + "bytesPerBlock": 16 + }, + "bc2-rgba-unorm-srgb": { + "blockWidth": 4, + "blockHeight": 4, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-bc", + "baseFormat": "bc2-rgba-unorm", + "bytesPerBlock": 16 + }, + "bc3-rgba-unorm": { + "blockWidth": 4, + "blockHeight": 4, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-bc", + "baseFormat": "bc3-rgba-unorm", + "bytesPerBlock": 16 + }, + "bc3-rgba-unorm-srgb": { + "blockWidth": 4, + "blockHeight": 4, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-bc", + "baseFormat": "bc3-rgba-unorm", + "bytesPerBlock": 16 + }, + "bc4-r-unorm": { + "blockWidth": 4, + "blockHeight": 4, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 8 + }, + "multisample": false, + "feature": "texture-compression-bc", + "bytesPerBlock": 8 + }, + "bc4-r-snorm": { + "blockWidth": 4, + "blockHeight": 4, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 8 + }, + "multisample": false, + "feature": "texture-compression-bc", + "bytesPerBlock": 8 + }, + "bc5-rg-unorm": { + "blockWidth": 4, + "blockHeight": 4, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-bc", + "bytesPerBlock": 16 + }, + "bc5-rg-snorm": { + "blockWidth": 4, + "blockHeight": 4, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-bc", + "bytesPerBlock": 16 + }, + "bc6h-rgb-ufloat": { + "blockWidth": 4, + "blockHeight": 4, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-bc", + "bytesPerBlock": 16 + }, + "bc6h-rgb-float": { + "blockWidth": 4, + "blockHeight": 4, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-bc", + "bytesPerBlock": 16 + }, + "bc7-rgba-unorm": { + "blockWidth": 4, + "blockHeight": 4, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-bc", + "baseFormat": "bc7-rgba-unorm", + "bytesPerBlock": 16 + }, + "bc7-rgba-unorm-srgb": { + "blockWidth": 4, + "blockHeight": 4, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-bc", + "baseFormat": "bc7-rgba-unorm", + "bytesPerBlock": 16 + }, + "etc2-rgb8unorm": { + "blockWidth": 4, + "blockHeight": 4, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 8 + }, + "multisample": false, + "feature": "texture-compression-etc2", + "baseFormat": "etc2-rgb8unorm", + "bytesPerBlock": 8 + }, + "etc2-rgb8unorm-srgb": { + "blockWidth": 4, + "blockHeight": 4, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 8 + }, + "multisample": false, + "feature": "texture-compression-etc2", + "baseFormat": "etc2-rgb8unorm", + "bytesPerBlock": 8 + }, + "etc2-rgb8a1unorm": { + "blockWidth": 4, + "blockHeight": 4, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 8 + }, + "multisample": false, + "feature": "texture-compression-etc2", + "baseFormat": "etc2-rgb8a1unorm", + "bytesPerBlock": 8 + }, + "etc2-rgb8a1unorm-srgb": { + "blockWidth": 4, + "blockHeight": 4, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 8 + }, + "multisample": false, + "feature": "texture-compression-etc2", + "baseFormat": "etc2-rgb8a1unorm", + "bytesPerBlock": 8 + }, + "etc2-rgba8unorm": { + "blockWidth": 4, + "blockHeight": 4, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-etc2", + "baseFormat": "etc2-rgba8unorm", + "bytesPerBlock": 16 + }, + "etc2-rgba8unorm-srgb": { + "blockWidth": 4, + "blockHeight": 4, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-etc2", + "baseFormat": "etc2-rgba8unorm", + "bytesPerBlock": 16 + }, + "eac-r11unorm": { + "blockWidth": 4, + "blockHeight": 4, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 8 + }, + "multisample": false, + "feature": "texture-compression-etc2", + "bytesPerBlock": 8 + }, + "eac-r11snorm": { + "blockWidth": 4, + "blockHeight": 4, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 8 + }, + "multisample": false, + "feature": "texture-compression-etc2", + "bytesPerBlock": 8 + }, + "eac-rg11unorm": { + "blockWidth": 4, + "blockHeight": 4, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-etc2", + "bytesPerBlock": 16 + }, + "eac-rg11snorm": { + "blockWidth": 4, + "blockHeight": 4, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-etc2", + "bytesPerBlock": 16 + }, + "astc-4x4-unorm": { + "blockWidth": 4, + "blockHeight": 4, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-astc", + "baseFormat": "astc-4x4-unorm", + "bytesPerBlock": 16 + }, + "astc-4x4-unorm-srgb": { + "blockWidth": 4, + "blockHeight": 4, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-astc", + "baseFormat": "astc-4x4-unorm", + "bytesPerBlock": 16 + }, + "astc-5x4-unorm": { + "blockWidth": 5, + "blockHeight": 4, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-astc", + "baseFormat": "astc-5x4-unorm", + "bytesPerBlock": 16 + }, + "astc-5x4-unorm-srgb": { + "blockWidth": 5, + "blockHeight": 4, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-astc", + "baseFormat": "astc-5x4-unorm", + "bytesPerBlock": 16 + }, + "astc-5x5-unorm": { + "blockWidth": 5, + "blockHeight": 5, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-astc", + "baseFormat": "astc-5x5-unorm", + "bytesPerBlock": 16 + }, + "astc-5x5-unorm-srgb": { + "blockWidth": 5, + "blockHeight": 5, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-astc", + "baseFormat": "astc-5x5-unorm", + "bytesPerBlock": 16 + }, + "astc-6x5-unorm": { + "blockWidth": 6, + "blockHeight": 5, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-astc", + "baseFormat": "astc-6x5-unorm", + "bytesPerBlock": 16 + }, + "astc-6x5-unorm-srgb": { + "blockWidth": 6, + "blockHeight": 5, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-astc", + "baseFormat": "astc-6x5-unorm", + "bytesPerBlock": 16 + }, + "astc-6x6-unorm": { + "blockWidth": 6, + "blockHeight": 6, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-astc", + "baseFormat": "astc-6x6-unorm", + "bytesPerBlock": 16 + }, + "astc-6x6-unorm-srgb": { + "blockWidth": 6, + "blockHeight": 6, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-astc", + "baseFormat": "astc-6x6-unorm", + "bytesPerBlock": 16 + }, + "astc-8x5-unorm": { + "blockWidth": 8, + "blockHeight": 5, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-astc", + "baseFormat": "astc-8x5-unorm", + "bytesPerBlock": 16 + }, + "astc-8x5-unorm-srgb": { + "blockWidth": 8, + "blockHeight": 5, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-astc", + "baseFormat": "astc-8x5-unorm", + "bytesPerBlock": 16 + }, + "astc-8x6-unorm": { + "blockWidth": 8, + "blockHeight": 6, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-astc", + "baseFormat": "astc-8x6-unorm", + "bytesPerBlock": 16 + }, + "astc-8x6-unorm-srgb": { + "blockWidth": 8, + "blockHeight": 6, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-astc", + "baseFormat": "astc-8x6-unorm", + "bytesPerBlock": 16 + }, + "astc-8x8-unorm": { + "blockWidth": 8, + "blockHeight": 8, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-astc", + "baseFormat": "astc-8x8-unorm", + "bytesPerBlock": 16 + }, + "astc-8x8-unorm-srgb": { + "blockWidth": 8, + "blockHeight": 8, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-astc", + "baseFormat": "astc-8x8-unorm", + "bytesPerBlock": 16 + }, + "astc-10x5-unorm": { + "blockWidth": 10, + "blockHeight": 5, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-astc", + "baseFormat": "astc-10x5-unorm", + "bytesPerBlock": 16 + }, + "astc-10x5-unorm-srgb": { + "blockWidth": 10, + "blockHeight": 5, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-astc", + "baseFormat": "astc-10x5-unorm", + "bytesPerBlock": 16 + }, + "astc-10x6-unorm": { + "blockWidth": 10, + "blockHeight": 6, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-astc", + "baseFormat": "astc-10x6-unorm", + "bytesPerBlock": 16 + }, + "astc-10x6-unorm-srgb": { + "blockWidth": 10, + "blockHeight": 6, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-astc", + "baseFormat": "astc-10x6-unorm", + "bytesPerBlock": 16 + }, + "astc-10x8-unorm": { + "blockWidth": 10, + "blockHeight": 8, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-astc", + "baseFormat": "astc-10x8-unorm", + "bytesPerBlock": 16 + }, + "astc-10x8-unorm-srgb": { + "blockWidth": 10, + "blockHeight": 8, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-astc", + "baseFormat": "astc-10x8-unorm", + "bytesPerBlock": 16 + }, + "astc-10x10-unorm": { + "blockWidth": 10, + "blockHeight": 10, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-astc", + "baseFormat": "astc-10x10-unorm", + "bytesPerBlock": 16 + }, + "astc-10x10-unorm-srgb": { + "blockWidth": 10, + "blockHeight": 10, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-astc", + "baseFormat": "astc-10x10-unorm", + "bytesPerBlock": 16 + }, + "astc-12x10-unorm": { + "blockWidth": 12, + "blockHeight": 10, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-astc", + "baseFormat": "astc-12x10-unorm", + "bytesPerBlock": 16 + }, + "astc-12x10-unorm-srgb": { + "blockWidth": 12, + "blockHeight": 10, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-astc", + "baseFormat": "astc-12x10-unorm", + "bytesPerBlock": 16 + }, + "astc-12x12-unorm": { + "blockWidth": 12, + "blockHeight": 12, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-astc", + "baseFormat": "astc-12x12-unorm", + "bytesPerBlock": 16 + }, + "astc-12x12-unorm-srgb": { + "blockWidth": 12, + "blockHeight": 12, + "color": { + "type": "float", + "copySrc": true, + "copyDst": true, + "storage": false, + "readWriteStorage": false, + "bytes": 16 + }, + "multisample": false, + "feature": "texture-compression-astc", + "baseFormat": "astc-12x12-unorm", + "bytesPerBlock": 16 } - const descriptors = bindGroupLayoutDescriptorsByGroupByBinding.map(v => ({ entries: [...v.values()].sort(byBinding) })); - for (let i = 0; i < descriptors.length; ++i) { - if (!descriptors[i]) { - descriptors[i] = { entries: [] }; + }; + + function bitmaskToString(bitNames, mask) { + const names = []; + for (const [k, v] of Object.entries(bitNames)) { + if (mask & v) { + names.push(k); } } - return descriptors; + return names.join('|'); } - function getNamedVariables(reflect, variables) { - return Object.fromEntries(variables.map(v => { - const typeDefinition = addVariableType(reflect, v, 0); - return [ - v.name, - { - typeDefinition, - group: v.group, - binding: v.binding, - size: typeDefinition.size, - }, - ]; - })); + function bufferUsageToString(mask) { + return bitmaskToString(GPUBufferUsage, mask); } - function makeStructDefinition(reflect, structInfo, offset) { - // StructDefinition - const fields = Object.fromEntries(structInfo.members.map(m => { - return [ - m.name, - { - offset: m.offset, - type: addType(reflect, m.type, 0), - }, - ]; - })); - return { - fields, - size: structInfo.size, - offset, - }; + function textureUsageToString(mask) { + return bitmaskToString(GPUTextureUsage, mask); } - function getTextureSampleType(type) { - if (type.name.includes('depth')) { - return 'depth'; - } - // unfiltered-float - switch (type.format?.name) { - case 'f32': return 'float'; - case 'i32': return 'sint'; - case 'u32': return 'uint'; - default: - throw new Error('unknown texture sample type'); - } + function unreachable(msg) { + throw Error(`unreachable: ${''}`); } - function getViewDimension(type) { - if (type.name.includes('2d_array')) { - return '2d-array'; - } - if (type.name.includes('cube_array')) { - return 'cube-array'; - } - if (type.name.includes('3d')) { - return '3d'; - } - if (type.name.includes('1d')) { - return '1d'; - } - if (type.name.includes('cube')) { - return 'cube'; - } - return '2d'; + function roundUp(v, align) { + return Math.ceil(v / align) * align; } - function getStorageTextureAccess(type) { - switch (type.access) { - case 'read': return 'read-only'; - case 'write': return 'write-only'; - case 'read_write': return 'read-write'; - default: - throw new Error('unknonw storage texture access'); - } + function trimNulls(a) { + const ndx = a.findLastIndex(v => v !== null); + return a.slice(0, ndx + 1); } - function getSamplerType(type) { - // "non-filtering" can only be specified manually. - return type.name.endsWith('_comparison') - ? 'comparison' - : 'filtering'; + function reifyGPUOrigin3D(e) { + e = e || []; + const d = e; + if (typeof d.x === 'number' || typeof d.y === 'number' || typeof d.z === 'number') { + return [ + d.x ?? 0, + d.y ?? 0, + d.z ?? 0, + ]; + } + const a = [...e]; + return [ + a[0] ?? 0, + a[1] ?? 0, + a[2] ?? 0, + ]; } - function getBindGroupLayoutEntry(resource, visibility) { - const { binding, access, type } = resource; - switch (resource.resourceType) { - case ResourceType.Uniform: - return { - binding, - visibility, - buffer: {}, - }; - case ResourceType.Storage: - return { - binding, - visibility, - buffer: { - type: (access === '' || access === 'read') ? 'read-only-storage' : 'storage', - }, - }; - case ResourceType.Texture: { - if (type.name === 'texture_external') { - return { - binding, - visibility, - externalTexture: {}, - }; - } - const multisampled = type.name.includes('multisampled'); - return { - binding, - visibility, - texture: { - sampleType: getTextureSampleType(type), - viewDimension: getViewDimension(type), - multisampled, - }, - }; - } - case ResourceType.Sampler: - return { - binding, - visibility, - sampler: { - type: getSamplerType(type), - }, - }; - case ResourceType.StorageTexture: - return { - binding, - visibility, - storageTexture: { - access: getStorageTextureAccess(type), - format: type.format.name, - viewDimension: getViewDimension(type), - }, - }; - default: - throw new Error('unknown resource type'); + function reifyGPUExtent3D(e) { + const d = e; + if (typeof d.width === 'number') { + return [ + d.width, + d.height ?? 1, + d.depthOrArrayLayers ?? 1, + ]; } + const a = [...e]; + return [ + a[0], + a[1] ?? 1, + a[2] ?? 1, + ]; } - function addEntryPoints(funcInfos, stage) { - const entryPoints = {}; - for (const info of funcInfos) { - entryPoints[info.name] = { - stage, - resources: info.resources.map(resource => { - const { name, group } = resource; - return { - name, - group, - entry: getBindGroupLayoutEntry(resource, stage), - }; - }), - }; + function logicalMipLevelSpecificTextureExtent(texture, mipLevel) { + switch (texture.dimension) { + case '1d': + return [ + Math.max(1, texture.width >> mipLevel), + 1, + 1, + ]; + case '2d': + return [ + Math.max(1, texture.width >> mipLevel), + Math.max(1, texture.height >> mipLevel), + texture.depthOrArrayLayers, + ]; + case '3d': + return [ + Math.max(1, texture.width >> mipLevel), + Math.max(1, texture.height >> mipLevel), + Math.max(1, texture.depthOrArrayLayers >> mipLevel), + ]; + default: + unreachable(); + return []; } - return entryPoints; - } - /** - * Given a WGSL shader, returns data definitions for structures, - * uniforms, and storage buffers - * - * Example: - * - * ```js - * const code = ` - * struct MyStruct { - * color: vec4f, - * brightness: f32, - * kernel: array, - * }; - * @group(0) @binding(0) var myUniforms: MyUniforms; - * `; - * const defs = makeShaderDataDefinitions(code); - * const myUniformValues = makeStructuredView(defs.uniforms.myUniforms); - * - * myUniformValues.set({ - * color: [1, 0, 1, 1], - * brightness: 0.8, - * kernel: [ - * 1, 0, -1, - * 2, 0, -2, - * 1, 0, -1, - * ], - * }); - * device.queue.writeBuffer(uniformBuffer, 0, myUniformValues.arrayBuffer); - * ``` - * - * @param code WGSL shader. Note: it is not required for this to be a complete shader - * @returns definitions of the structures by name. Useful for passing to {@link makeStructuredView} - */ - function makeShaderDataDefinitions(code) { - const reflect = new WgslReflect(code); - const structs = Object.fromEntries(reflect.structs.map(structInfo => { - return [structInfo.name, makeStructDefinition(reflect, structInfo, 0)]; - })); - const uniforms = getNamedVariables(reflect, reflect.uniforms); - const storages = getNamedVariables(reflect, reflect.storage.filter(v => v.resourceType === ResourceType.Storage)); - const storageTextures = getNamedVariables(reflect, reflect.storage.filter(v => v.resourceType === ResourceType.StorageTexture)); - const textures = getNamedVariables(reflect, reflect.textures.filter(v => v.type.name !== 'texture_external')); - const externalTextures = getNamedVariables(reflect, reflect.textures.filter(v => v.type.name === 'texture_external')); - const samplers = getNamedVariables(reflect, reflect.samplers); - const entryPoints = { - ...addEntryPoints(reflect.entry.vertex, GPUShaderStage.VERTEX), - ...addEntryPoints(reflect.entry.fragment, GPUShaderStage.FRAGMENT), - ...addEntryPoints(reflect.entry.compute, GPUShaderStage.COMPUTE), - }; - return { - externalTextures, - samplers, - structs, - storages, - storageTextures, - textures, - uniforms, - entryPoints, - }; } - function assert(cond, msg = '') { - if (!cond) { - throw new Error(msg); + function physicalMipLevelSpecificTextureExtent(texture, mipLevel) { + const { blockWidth, blockHeight, } = kAllTextureFormatInfo[texture.format]; + const [width, height, depthOrArrayLayers] = logicalMipLevelSpecificTextureExtent(texture, mipLevel); + switch (texture.dimension) { + case '1d': + return [ + roundUp(width, blockWidth), + 1, + 1, + ]; + case '2d': + case '3d': + return [ + roundUp(width, blockWidth), + roundUp(height, blockHeight), + depthOrArrayLayers, + ]; + default: + unreachable(); + return []; } } - /* - write down what I want for a given type - - struct VSUniforms { - foo: u32, - }; - @group(4) @binding(1) var uni1: f32; - @group(3) @binding(2) var uni2: array; - @group(2) @binding(3) var uni3: VSUniforms; - @group(1) @binding(4) var uni4: array; - uni1: { - type: 'f32', - numElements: undefined - }, - uni2: { - type: 'array', - elementType: 'f32' - numElements: 5, - }, - uni3: { - type: 'struct', - fields: { - foo: { - type: 'f32', - numElements: undefined + function getProperties(o) { + const keyValues = []; + for (const k in o) { + const v = o[k]; + if (typeof v !== 'function') { + if (o instanceof GPUBuffer && k === 'usage') { + keyValues.push(`${k}: ${v} (${bufferUsageToString(v)})`); } - }, - }, - uni4: { - type: 'array', - elementType: - fields: { - foo: { - type: 'f32', - numElements: undefined + else if (o instanceof GPUTexture && k === 'usage') { + keyValues.push(`${k}: ${v} (${textureUsageToString(v)})`); } - }, - fields: { - foo: { - type: 'f32', - numElements: undefined + else { + keyValues.push(`${k}: ${JSON.stringify(v)}`); } - }, - ... - ] - - */ - function addVariableType(reflect, v, offset) { - switch (v.resourceType) { - case ResourceType.Uniform: - case ResourceType.Storage: - case ResourceType.StorageTexture: - return addType(reflect, v.type, offset); - default: - return { - size: 0, - type: v.type.name, - }; + } } + return keyValues.join(', '); } - function addType(reflect, typeInfo, offset) { - if (typeInfo.isArray) { - assert(!typeInfo.isStruct, 'struct array is invalid'); - assert(!typeInfo.isStruct, 'template array is invalid'); - const arrayInfo = typeInfo; - // ArrayDefinition - return { - size: arrayInfo.size, - elementType: addType(reflect, arrayInfo.format, offset), - numElements: arrayInfo.count, - }; - } - else if (typeInfo.isStruct) { - assert(!typeInfo.isTemplate, 'template struct is invalid'); - const structInfo = typeInfo; - return makeStructDefinition(reflect, structInfo, offset); - } - else { - // template is like vec4 or mat4x4 - const asTemplateInfo = typeInfo; - const type = typeInfo.isTemplate - ? `${asTemplateInfo.name}<${asTemplateInfo.format.name}>` - : typeInfo.name; - // IntrinsicDefinition - return { - size: typeInfo.size, - type: type, - }; + function objToString(o) { + return `${o.constructor.name}(${o.label}){${getProperties(o)}}`; + } + function emitError(msg, objs = []) { + throw new Error(`${msg}\n${(objs).map(o => objToString(o)).join('\n')}`); + } + function assert(condition, msg, resources) { + if (!condition) { + const lines = (resources || []).map(r => ` ${objToString(r)}`).join('\n'); + const m = msg ? (typeof msg === 'string' ? msg : msg()) : ''; + emitError(`${m}${lines ? `\n${lines}` : ''}`); } } - const kTypedArrayToAttribFormat = new Map([ - [Int8Array, { formats: ['sint8', 'snorm8'], defaultForType: 1 }], - [Uint8Array, { formats: ['uint8', 'unorm8'], defaultForType: 1 }], - [Int16Array, { formats: ['sint16', 'snorm16'], defaultForType: 1 }], - [Uint16Array, { formats: ['uint16', 'unorm16'], defaultForType: 1 }], - [Int32Array, { formats: ['sint32', 'snorm32'], defaultForType: 0 }], - [Uint32Array, { formats: ['uint32', 'unorm32'], defaultForType: 0 }], - [Float32Array, { formats: ['float32', 'float32'], defaultForType: 0 }], - // TODO: Add Float16Array - ]); - new Map([...kTypedArrayToAttribFormat.entries()].map(([Type, { formats: [s1, s2] }]) => [[s1, Type], [s2, Type]]).flat()); - function validateEncoderState(encoder, state) { - assert$1(state === 'open', () => `encoder state(${state}) is not "open"`, [encoder]); + assert(state === 'open', () => `encoder state(${state}) is not "open"`, [encoder]); } const s_commandEncoderToInfoMap = new WeakMap(); function createCommandEncoder(commandEncoder) { @@ -6574,7 +6527,7 @@ } function unlockCommandEncoder(commandEncoder) { const info = s_commandEncoderToInfoMap.get(commandEncoder); - assert$1(info.state === 'locked'); + assert(info.state === 'locked'); info.state = 'open'; } function lockCommandEncoder(commandEncoder) { @@ -6619,6 +6572,39 @@ // } //} + /** + * Adds a wrapper function to a class method that gets called before the actual function + */ + function wrapFunctionBefore(API, fnName, fn) { + const origFn = API.prototype[fnName]; + API.prototype[fnName] = function (...args) { + fn.call(this, args); + return origFn.call(this, ...args); + }; + } + /** + * Adds a wrapper function to a class method that gets called after the actual function + */ + function wrapFunctionAfter(API, fnName, fn) { + const origFn = API.prototype[fnName]; + API.prototype[fnName] = function (...args) { + const result = origFn.call(this, ...args); + fn.call(this, result, args); + return result; + }; + } + /** + * Adds a wrapper function to an async class method that gets called after the actual function + */ + function wrapAsyncFunctionAfter(API, fnName, fn) { + const origFn = API.prototype[fnName]; + API.prototype[fnName] = async function (...args) { + const result = await origFn.call(this, ...args); + fn.call(this, result, args); + return result; + }; + } + // A normal GPUPipelineDescriptor just has references to GPUBindGroupLayout objects // but we need the GPUBindGroupLayoutDescriptor for each. They don't exist for const s_bindGroupLayoutToBindGroupLayoutDescriptorPlus = new WeakMap(); @@ -6756,6 +6742,24 @@ s_renderPipelineToRenderPipelineDescriptor.set(pipeline, reifyRenderPipelineDescriptor(desc)); } + const s_destroyedResource = new WeakSet(); + function assertNotDestroyed(obj) { + assert(!s_destroyedResource.has(obj), () => `${objToString(obj)} is destroyed`); + } + wrapFunctionBefore(GPUBuffer, 'destroy', function () { + s_destroyedResource.add(this); + }); + wrapFunctionBefore(GPUTexture, 'destroy', function () { + s_destroyedResource.add(this); + }); + wrapFunctionBefore(GPUQuerySet, 'destroy', function () { + s_destroyedResource.add(this); + }); + wrapFunctionBefore(GPUDevice, 'destroy', function () { + s_destroyedResource.add(this); + }); + const s_bindGroupToInfo = new WeakMap(); + const s_textureViewToTexture = new WeakMap(); const s_textureViewToDesc = new WeakMap(); function resolveTextureAspect(format, aspect) { @@ -6841,20 +6845,20 @@ pipeline.group[${group}] requirements = ${JSON.stringify(bindGroupLayoutDescript // // //} function validateEncoderBindGroups(bindGroups, pipeline) { - assert$1(!!pipeline, 'no pipeline set'); + assert(!!pipeline, 'no pipeline set'); const device = s_objToDevice.get(pipeline); const reifiedPipelineDescriptor = s_pipelineToReifiedPipelineLayoutDescriptor.get(pipeline); reifiedPipelineDescriptor.bindGroupLayoutDescriptors.forEach((bindGroupLayoutDescriptor, group) => { const binding = bindGroups[group]; - assert$1(!!binding, () => `required bindGroup missing from group(${group})`); + assert(!!binding, () => `required bindGroup missing from group(${group})`); const bindGroupInfo = s_bindGroupToInfo.get(binding.bindGroup); - assert$1(bindGroupInfo.layoutPlus.signature === bindGroupLayoutDescriptor.signature, () => generateErrorMessageForMismatchedBindGroupLayouts(group, bindGroupInfo, bindGroupLayoutDescriptor)); + assert(bindGroupInfo.layoutPlus.signature === bindGroupLayoutDescriptor.signature, () => generateErrorMessageForMismatchedBindGroupLayouts(group, bindGroupInfo, bindGroupLayoutDescriptor)); for (const { binding, resource: bindingResource } of bindGroupInfo.entries) { const resource = getResourceFromBindingResource(bindingResource); if (resource instanceof GPUTexture || resource instanceof GPUBuffer) { assertNotDestroyed(resource); } - assert$1(s_objToDevice.get(resource) === device, () => `texture at binding(${binding}) group(${group}) is not from same device`, [resource]); + assert(s_objToDevice.get(resource) === device, () => `texture at binding(${binding}) group(${group}) is not from same device`, [resource]); } }); const bindGroupSpaceUsed = 0; @@ -6882,9 +6886,8 @@ pipeline.group[${group}] requirements = ${JSON.stringify(bindGroupLayoutDescript ]; function* forEachDynamicBinding(info) { let dynamicOffsetIndex = 0; - const layout = info.layoutPlus.bindGroupLayoutDescriptor; for (const entry of info.entries) { - const bindingDescriptor = layout.entries[entry.binding]; + const bindingDescriptor = info.layoutPlus.entriesById[entry.binding]; if (bindingDescriptor.buffer?.hasDynamicOffset) { const bufferBinding = entry.resource; const bufferLayout = bindingDescriptor.buffer; @@ -6905,27 +6908,27 @@ pipeline.group[${group}] requirements = ${JSON.stringify(bindGroupLayoutDescript dynamicOffsetDataStart = dynamicOffsetDataStart ?? 0; dynamicOffsetDataLength = dynamicOffsetDataLength ?? dynamicOffsetsArg.length; const dynamicOffsets = dynamicOffsetsArg.slice(dynamicOffsetDataStart, dynamicOffsetDataLength); - assert$1(dynamicOffsets.length === dynamicOffsetCount, `there must be the same number of dynamicOffsets(${dynamicOffsets.length}) as the layout requires (${dynamicOffsetCount})`); + assert(dynamicOffsets.length === dynamicOffsetCount, `there must be the same number of dynamicOffsets(${dynamicOffsets.length}) as the layout requires (${dynamicOffsetCount})`); const device = s_objToDevice.get(this); const maxIndex = device.limits.maxBindGroups; - assert$1(index >= 0, () => `index(${index}) must be >= 0`); - assert$1(index < maxIndex, () => `index(${index}) must be < device.limits.maxBindGroups(${maxIndex})`); + assert(index >= 0, () => `index(${index}) must be >= 0`); + assert(index < maxIndex, () => `index(${index}) must be < device.limits.maxBindGroups(${maxIndex})`); if (bindGroup) { - assert$1(device === s_objToDevice.get(bindGroup), () => `bindGroup must be from same device as ${parent.constructor.name}`, [bindGroup, parent]); + assert(device === s_objToDevice.get(bindGroup), () => `bindGroup must be from same device as ${parent.constructor.name}`, [bindGroup, parent]); // Validate resources are not destroyed const info = s_bindGroupToInfo.get(bindGroup); validateBindGroupResourcesNotDestroyed(info.entries); // Validate Dynamic Offsets for (const { bufferBinding, bufferLayout, dynamicOffsetIndex } of forEachDynamicBinding(info)) { const dynamicOffset = dynamicOffsets[dynamicOffsetIndex]; - assert$1((bufferBinding.offset || 0) + dynamicOffset + (bufferLayout.minBindingSize || 0) <= bufferBinding.buffer.size, 'dynamic offset is out of range'); + assert((bufferBinding.offset || 0) + dynamicOffset + (bufferLayout.minBindingSize || 0) <= bufferBinding.buffer.size, 'dynamic offset is out of range'); switch (bufferLayout.type) { case 'uniform': - assert$1(dynamicOffset % device.limits.minUniformBufferOffsetAlignment === 0, () => `dynamicOffset[${dynamicOffsetIndex}](${dynamicOffset}) used for a uniform buffer is not a multiple of device.limits.minUniformBufferOffsetAlignment(${device.limits.minUniformBufferOffsetAlignment})`); + assert(dynamicOffset % device.limits.minUniformBufferOffsetAlignment === 0, () => `dynamicOffset[${dynamicOffsetIndex}](${dynamicOffset}) used for a uniform buffer is not a multiple of device.limits.minUniformBufferOffsetAlignment(${device.limits.minUniformBufferOffsetAlignment})`); break; case 'storage': case 'read-only-storage': - assert$1(dynamicOffset % device.limits.minStorageBufferOffsetAlignment === 0, () => `dynamicOffset[${dynamicOffsetIndex}](${dynamicOffset}) used for a uniform buffer is not a multiple of device.limits.minStorageBufferOffsetAlignment(${device.limits.minStorageBufferOffsetAlignment})`); + assert(dynamicOffset % device.limits.minStorageBufferOffsetAlignment === 0, () => `dynamicOffset[${dynamicOffsetIndex}](${dynamicOffset}) used for a uniform buffer is not a multiple of device.limits.minStorageBufferOffsetAlignment(${device.limits.minStorageBufferOffsetAlignment})`); break; } } @@ -6954,7 +6957,7 @@ pipeline.group[${group}] requirements = ${JSON.stringify(bindGroupLayoutDescript buffers.forEach((buffer, slot) => { if (buffer) { const vertexBufferBinding = info.vertexBuffers[slot]; - assert$1(!!vertexBufferBinding, () => `no vertexBuffer in slot(${slot})`); + assert(!!vertexBufferBinding, () => `no vertexBuffer in slot(${slot})`); assertNotDestroyed(vertexBufferBinding.buffer); fn(slot, buffer, vertexBufferBinding); // don't need to check that vertex buffer is same device as was checked at setVertexBuffer @@ -6963,19 +6966,19 @@ pipeline.group[${group}] requirements = ${JSON.stringify(bindGroupLayoutDescript }); } // TODO: test! - assert$1(bindGroupSpaceUsed + vertexBufferSpaceUsed <= device.limits.maxBindGroupsPlusVertexBuffers, () => `bindGroupSpaceUsed(${bindGroupSpaceUsed}) + vertexBufferSpaceUsed(${vertexBufferSpaceUsed}) <= device.limits.maxBindGroupsPlusVertexBuffers(${device.limits.maxBindGroupsPlusVertexBuffers})`); + assert(bindGroupSpaceUsed + vertexBufferSpaceUsed <= device.limits.maxBindGroupsPlusVertexBuffers, () => `bindGroupSpaceUsed(${bindGroupSpaceUsed}) + vertexBufferSpaceUsed(${vertexBufferSpaceUsed}) <= device.limits.maxBindGroupsPlusVertexBuffers(${device.limits.maxBindGroupsPlusVertexBuffers})`); } function validateValidToDrawIndexed(mixin, info, fn) { - assert$1(!!info.indexBuffer, 'indexBuffer is not set'); + assert(!!info.indexBuffer, 'indexBuffer is not set'); const device = s_objToDevice.get(mixin); assertNotDestroyed(info.indexBuffer.buffer); - assert$1(device === s_objToDevice.get(info.indexBuffer.buffer), 'indexBuffer is not from same device'); + assert(device === s_objToDevice.get(info.indexBuffer.buffer), 'indexBuffer is not from same device'); validateValidToDraw(mixin, info, fn); const pipelineDescriptor = s_renderPipelineToRenderPipelineDescriptor.get(info.pipeline); switch (pipelineDescriptor.primitive?.topology) { case 'line-strip': case 'triangle-strip': - assert$1(info.indexFormat === pipelineDescriptor.primitive?.stripIndexFormat, () => `indexFormat(${info.indexFormat}) !== pipeline.primitive.stripIndexFormat(${pipelineDescriptor.primitive?.stripIndexFormat})`); + assert(info.indexFormat === pipelineDescriptor.primitive?.stripIndexFormat, () => `indexFormat(${info.indexFormat}) !== pipeline.primitive.stripIndexFormat(${pipelineDescriptor.primitive?.stripIndexFormat})`); } } function bufferSizeFromBufferBinding({ buffer, offset, size }) { @@ -7038,7 +7041,7 @@ pipeline.group[${group}] requirements = ${JSON.stringify(bindGroupLayoutDescript : firstVertex + vertexCount; if (strideCount !== 0) { const bytesNeeded = (strideCount - 1) * stride + lastStride; - assert$1(bytesNeeded <= bufferSize, () => `slot(${slot}) vertex buffer binding size ${bufferSize} is not large enough for bytes needed(${bytesNeeded})`); + assert(bytesNeeded <= bufferSize, () => `slot(${slot}) vertex buffer binding size ${bufferSize} is not large enough for bytes needed(${bytesNeeded})`); } }); }); @@ -7056,13 +7059,13 @@ pipeline.group[${group}] requirements = ${JSON.stringify(bindGroupLayoutDescript const strideCount = firstInstance + instanceCount; if (layout.stepMode === 'instance') { const bytesNeeded = (strideCount - 1) * stride + lastStride; - assert$1(bytesNeeded <= bufferSize, () => `slot(${slot}) vertex buffer binding size ${bufferSize} is not large enough for bytes needed(${bytesNeeded})`); + assert(bytesNeeded <= bufferSize, () => `slot(${slot}) vertex buffer binding size ${bufferSize} is not large enough for bytes needed(${bytesNeeded})`); } }); const bufferSize = bufferSizeFromBufferBinding(info.indexBuffer); const indexByteSize = info.indexFormat === 'uint16' ? 2 : 4; const bytesNeeded = firstIndex + indexCount * indexByteSize; - assert$1(bytesNeeded <= bufferSize, () => `indexBuffer bound size(${bufferSize}) is not large enough for bytesNeeded(${bytesNeeded})`); + assert(bytesNeeded <= bufferSize, () => `indexBuffer bound size(${bufferSize}) is not large enough for bytesNeeded(${bytesNeeded})`); }); const kIndirectDrawParametersSize = 16; wrapFunctionBefore(API, 'drawIndirect', function ([indirectBuffer, indirectOffset]) { @@ -7071,10 +7074,10 @@ pipeline.group[${group}] requirements = ${JSON.stringify(bindGroupLayoutDescript validateValidToDraw(this, info, () => { }); assertNotDestroyed(indirectBuffer); const device = s_objToDevice.get(this); - assert$1(device === s_objToDevice.get(indirectBuffer), 'indirectBuffer is not from same device', [indirectBuffer]); - assert$1(!!(indirectBuffer.usage & GPUBufferUsage.INDIRECT), () => `buffer(${bufferUsageToString(indirectBuffer.usage)}) must have usage INDIRECT`, [indirectBuffer, this]); - assert$1(indirectOffset + kIndirectDrawParametersSize <= indirectBuffer.size, `indirectOffset(${indirectOffset}) + sizeOfIndirectParameters(${kIndirectDrawParametersSize}) > indirectBuffer.size(${indirectBuffer.size})`, [indirectBuffer]); - assert$1(indirectOffset % 4 === 0, () => `indirectOffset(${indirectOffset}) is not multiple of 4`); + assert(device === s_objToDevice.get(indirectBuffer), 'indirectBuffer is not from same device', [indirectBuffer]); + assert(!!(indirectBuffer.usage & GPUBufferUsage.INDIRECT), () => `buffer(${bufferUsageToString(indirectBuffer.usage)}) must have usage INDIRECT`, [indirectBuffer, this]); + assert(indirectOffset + kIndirectDrawParametersSize <= indirectBuffer.size, `indirectOffset(${indirectOffset}) + sizeOfIndirectParameters(${kIndirectDrawParametersSize}) > indirectBuffer.size(${indirectBuffer.size})`, [indirectBuffer]); + assert(indirectOffset % 4 === 0, () => `indirectOffset(${indirectOffset}) is not multiple of 4`); }); const kIndirectDrawIndexedParametersSize = 20; wrapFunctionBefore(API, 'drawIndexedIndirect', function ([indirectBuffer, indirectOffset]) { @@ -7083,18 +7086,18 @@ pipeline.group[${group}] requirements = ${JSON.stringify(bindGroupLayoutDescript validateValidToDrawIndexed(this, info, () => { }); assertNotDestroyed(indirectBuffer); const device = s_objToDevice.get(this); - assert$1(device === s_objToDevice.get(indirectBuffer), 'indirectBuffer is not from same device', [indirectBuffer]); - assert$1(!!(indirectBuffer.usage & GPUBufferUsage.INDIRECT), () => `buffer(${bufferUsageToString(indirectBuffer.usage)}) must have usage INDIRECT`, [indirectBuffer, this]); - assert$1(indirectOffset + kIndirectDrawIndexedParametersSize <= indirectBuffer.size, `indirectOffset(${indirectOffset}) + sizeOfIndirectParameters(${kIndirectDrawIndexedParametersSize}) > indirectBuffer.size(${indirectBuffer.size})`, [indirectBuffer]); - assert$1(indirectOffset % 4 === 0, () => `indirectOffset(${indirectOffset}) is not multiple of 4`); + assert(device === s_objToDevice.get(indirectBuffer), 'indirectBuffer is not from same device', [indirectBuffer]); + assert(!!(indirectBuffer.usage & GPUBufferUsage.INDIRECT), () => `buffer(${bufferUsageToString(indirectBuffer.usage)}) must have usage INDIRECT`, [indirectBuffer, this]); + assert(indirectOffset + kIndirectDrawIndexedParametersSize <= indirectBuffer.size, `indirectOffset(${indirectOffset}) + sizeOfIndirectParameters(${kIndirectDrawIndexedParametersSize}) > indirectBuffer.size(${indirectBuffer.size})`, [indirectBuffer]); + assert(indirectOffset % 4 === 0, () => `indirectOffset(${indirectOffset}) is not multiple of 4`); }); wrapFunctionBefore(API, 'setPipeline', function ([pipeline]) { const info = s_renderPassToPassInfoMap.get(this); validateEncoderState(this, info.state); - assert$1(s_objToDevice.get(this) === s_objToDevice.get(pipeline), 'pipeline must be from same device as renderPassEncoder', [pipeline, this]); + assert(s_objToDevice.get(this) === s_objToDevice.get(pipeline), 'pipeline must be from same device as renderPassEncoder', [pipeline, this]); const pipelineDesc = s_renderPipelineToRenderPipelineDescriptor.get(pipeline); const passLayoutInfo = getRenderPassInfo(this); - assert$1(pipelineDesc.passLayoutInfo.passLayoutSignature === passLayoutInfo.passLayoutSignature, () => `pipeline is not compatible with ${this.constructor.name} + assert(pipelineDesc.passLayoutInfo.passLayoutSignature === passLayoutInfo.passLayoutSignature, () => `pipeline is not compatible with ${this.constructor.name} ${this.constructor.name} expects ${JSON.stringify(passLayoutInfo.renderPassLayout, null, 2)} @@ -7108,12 +7111,12 @@ pipeline is: ${JSON.stringify(pipelineDesc.passLayoutInfo.renderPassLayout, null const device = s_objToDevice.get(this); offset = offset ?? 0; size = size ?? Math.max(0, buffer.size - offset); - assert$1(device === s_objToDevice.get(buffer), 'buffer must be from the same device', [buffer, this]); + assert(device === s_objToDevice.get(buffer), 'buffer must be from the same device', [buffer, this]); assertNotDestroyed(buffer); - assert$1(!!(buffer.usage & GPUBufferUsage.INDEX), () => `buffer(${bufferUsageToString(buffer.usage)}) must have usage INDEX`, [buffer, this]); + assert(!!(buffer.usage & GPUBufferUsage.INDEX), () => `buffer(${bufferUsageToString(buffer.usage)}) must have usage INDEX`, [buffer, this]); const align = format === 'uint16' ? 2 : 4; - assert$1(offset % align === 0, () => `offset(${offset}) must be multiple of index format: ${format}`, [buffer, this]); - assert$1(offset + size <= buffer.size, () => `offset(${offset}) + size(${size}) is not <= buffer.size(${buffer.size})`, [buffer, this]); + assert(offset % align === 0, () => `offset(${offset}) must be multiple of index format: ${format}`, [buffer, this]); + assert(offset + size <= buffer.size, () => `offset(${offset}) + size(${size}) is not <= buffer.size(${buffer.size})`, [buffer, this]); info.indexBuffer = { buffer, offset, @@ -7129,17 +7132,17 @@ pipeline is: ${JSON.stringify(pipelineDesc.passLayoutInfo.renderPassLayout, null const bufferSize = buffer?.size || 0; offset = offset ?? 0; size = size ?? Math.max(0, bufferSize - offset); - assert$1(slot >= 0, () => `slot(${slot}) must be >= 0`, [this]); - assert$1(slot < maxSlot, () => `slot(${slot}) must be < device.limits.maxVertexBuffers(${maxSlot})`, [this]); - assert$1(offset % 4 === 0, () => `offset(${offset}) must be multiple of 4`, [this]); - assert$1(offset + size <= bufferSize, () => `offset(${offset}) + size(${size}) is not <= buffer.size(${bufferSize})`, [this, ...(buffer ? [buffer] : [])]); + assert(slot >= 0, () => `slot(${slot}) must be >= 0`, [this]); + assert(slot < maxSlot, () => `slot(${slot}) must be < device.limits.maxVertexBuffers(${maxSlot})`, [this]); + assert(offset % 4 === 0, () => `offset(${offset}) must be multiple of 4`, [this]); + assert(offset + size <= bufferSize, () => `offset(${offset}) + size(${size}) is not <= buffer.size(${bufferSize})`, [this, ...(buffer ? [buffer] : [])]); if (!buffer) { info.vertexBuffers[slot] = undefined; } else { - assert$1(device === s_objToDevice.get(buffer), 'buffer must be from the same device', [buffer, this]); + assert(device === s_objToDevice.get(buffer), 'buffer must be from the same device', [buffer, this]); assertNotDestroyed(buffer); - assert$1(!!(buffer.usage & GPUBufferUsage.VERTEX), () => `buffer(${bufferUsageToString(buffer.usage)}) must have usage VERTEX`, [buffer, this]); + assert(!!(buffer.usage & GPUBufferUsage.VERTEX), () => `buffer(${bufferUsageToString(buffer.usage)}) must have usage VERTEX`, [buffer, this]); info.vertexBuffers[slot] = { buffer, offset, @@ -7232,12 +7235,14 @@ pipeline is: ${JSON.stringify(pipelineDesc.passLayoutInfo.renderPassLayout, null } function bindGroupLayoutDescriptorToBindGroupLayoutDescriptorPlus(src, autoId) { const bindGroupLayoutDescriptor = { - entries: [...src.entries].map(reifyBindGroupLayoutEntry).sort((a, b) => a.binding - b.binding), + entries: [...src.entries].map(reifyBindGroupLayoutEntry), }; + const entriesById = Object.fromEntries(bindGroupLayoutDescriptor.entries.map(e => [e.binding, e])); const dynamicOffsetCount = bindGroupLayoutDescriptor.entries.reduce((a, v) => a + (v.buffer?.hasDynamicOffset ? 1 : 0), 0); const signature = `${JSON.stringify(bindGroupLayoutDescriptor)}${autoId ? `:autoId(${autoId})` : ''})`; return { bindGroupLayoutDescriptor, + entriesById, dynamicOffsetCount, signature, }; @@ -7286,7 +7291,7 @@ pipeline is: ${JSON.stringify(pipelineDesc.passLayoutInfo.renderPassLayout, null if (rb.buffer instanceof GPUBuffer) { const offset = rb.offset || 0; const size = rb.size || rb.buffer.size - offset; - assert$1(offset + size <= rb.buffer.size, () => `offset(${offset} + size(${size}) > buffer.size(${rb.buffer.size}))`, [rb.buffer]); + assert(offset + size <= rb.buffer.size, () => `offset(${offset} + size(${size}) > buffer.size(${rb.buffer.size}))`, [rb.buffer]); } entries.push({ binding, @@ -7375,12 +7380,12 @@ pipeline is: ${JSON.stringify(pipelineDesc.passLayoutInfo.renderPassLayout, null function validateTimestampWrites(device, timestampWrites) { const { querySet, beginningOfPassWriteIndex, endOfPassWriteIndex } = timestampWrites; assertNotDestroyed(querySet); - assert$1(s_objToDevice.get(querySet) === device, 'querySet not from same device', [querySet]); - assert$1(querySet.type === 'timestamp', () => `querySet.type(${querySet.type}) !== 'timestamp'`); - assert$1(beginningOfPassWriteIndex === undefined || beginningOfPassWriteIndex < querySet.count, () => `timestampWrites.beginningOfPassWriteIndex(${beginningOfPassWriteIndex}) is >= querySet.count(${querySet.count})`); - assert$1(endOfPassWriteIndex === undefined || endOfPassWriteIndex < querySet.count, () => `timestampWrites.endOfPassWriteIndex(${endOfPassWriteIndex}) is >= querySet.count(${querySet.count})`); - assert$1(beginningOfPassWriteIndex !== undefined || endOfPassWriteIndex !== undefined, () => `at least one of beginningOfPassWriteIndex(${beginningOfPassWriteIndex}) or endOfPassWriteIndex(${endOfPassWriteIndex})`); - assert$1(beginningOfPassWriteIndex !== endOfPassWriteIndex, () => `beginningOfPassWriteIndex(${beginningOfPassWriteIndex}) and endOfPassWriteIndex(${endOfPassWriteIndex}) may not be the same`); + assert(s_objToDevice.get(querySet) === device, 'querySet not from same device', [querySet]); + assert(querySet.type === 'timestamp', () => `querySet.type(${querySet.type}) !== 'timestamp'`); + assert(beginningOfPassWriteIndex === undefined || beginningOfPassWriteIndex < querySet.count, () => `timestampWrites.beginningOfPassWriteIndex(${beginningOfPassWriteIndex}) is >= querySet.count(${querySet.count})`); + assert(endOfPassWriteIndex === undefined || endOfPassWriteIndex < querySet.count, () => `timestampWrites.endOfPassWriteIndex(${endOfPassWriteIndex}) is >= querySet.count(${querySet.count})`); + assert(beginningOfPassWriteIndex !== undefined || endOfPassWriteIndex !== undefined, () => `at least one of beginningOfPassWriteIndex(${beginningOfPassWriteIndex}) or endOfPassWriteIndex(${endOfPassWriteIndex})`); + assert(beginningOfPassWriteIndex !== endOfPassWriteIndex, () => `beginningOfPassWriteIndex(${beginningOfPassWriteIndex}) and endOfPassWriteIndex(${endOfPassWriteIndex}) may not be the same`); } const s_computePassToPassInfoMap = new WeakMap(); @@ -7400,7 +7405,7 @@ pipeline is: ${JSON.stringify(pipelineDesc.passLayoutInfo.renderPassLayout, null wrapFunctionBefore(GPUComputePassEncoder, 'setPipeline', function ([pipeline]) { const info = s_computePassToPassInfoMap.get(this); validateEncoderState(this, info.state); - assert$1(s_objToDevice.get(info.commandEncoder) === s_objToDevice.get(pipeline), 'pipeline must be from same device as computePassEncoder', [this, info.commandEncoder]); + assert(s_objToDevice.get(info.commandEncoder) === s_objToDevice.get(pipeline), 'pipeline must be from same device as computePassEncoder', [this, info.commandEncoder]); info.pipeline = pipeline; }); wrapFunctionBefore(GPUComputePassEncoder, 'end', function () { @@ -7414,9 +7419,9 @@ pipeline is: ${JSON.stringify(pipelineDesc.passLayoutInfo.renderPassLayout, null validateEncoderState(this, info.state); validateEncoderBindGroups(info.bindGroups, info.pipeline); const device = s_objToDevice.get(this); - assert$1(workgroupCountX < device.limits.maxComputeWorkgroupsPerDimension, () => `workGroupCountX(${workgroupCountX} > device.limits.maxComputeWorkgroupsPerDimension(${device.limits.maxComputeWorkgroupsPerDimension})`); - assert$1(workgroupCountY < device.limits.maxComputeWorkgroupsPerDimension, () => `workGroupCountY(${workgroupCountY} > device.limits.maxComputeWorkgroupsPerDimension(${device.limits.maxComputeWorkgroupsPerDimension})`); - assert$1(workgroupCountZ < device.limits.maxComputeWorkgroupsPerDimension, () => `workGroupCountZ(${workgroupCountZ} > device.limits.maxComputeWorkgroupsPerDimension(${device.limits.maxComputeWorkgroupsPerDimension})`); + assert(workgroupCountX < device.limits.maxComputeWorkgroupsPerDimension, () => `workGroupCountX(${workgroupCountX} > device.limits.maxComputeWorkgroupsPerDimension(${device.limits.maxComputeWorkgroupsPerDimension})`); + assert(workgroupCountY < device.limits.maxComputeWorkgroupsPerDimension, () => `workGroupCountY(${workgroupCountY} > device.limits.maxComputeWorkgroupsPerDimension(${device.limits.maxComputeWorkgroupsPerDimension})`); + assert(workgroupCountZ < device.limits.maxComputeWorkgroupsPerDimension, () => `workGroupCountZ(${workgroupCountZ} > device.limits.maxComputeWorkgroupsPerDimension(${device.limits.maxComputeWorkgroupsPerDimension})`); }); const kIndirectDispatchWorkgroupsParametersSize = 12; wrapFunctionBefore(GPUComputePassEncoder, 'dispatchWorkgroupsIndirect', function ([indirectBuffer, indirectOffset]) { @@ -7425,10 +7430,10 @@ pipeline is: ${JSON.stringify(pipelineDesc.passLayoutInfo.renderPassLayout, null validateEncoderBindGroups(info.bindGroups, info.pipeline); assertNotDestroyed(indirectBuffer); const device = s_objToDevice.get(this); - assert$1(device === s_objToDevice.get(indirectBuffer), 'indirectBuffer is not from same device', [indirectBuffer]); - assert$1(!!(indirectBuffer.usage & GPUBufferUsage.INDIRECT), () => `buffer(${bufferUsageToString(indirectBuffer.usage)}) must have usage INDIRECT`, [indirectBuffer, this]); - assert$1(indirectOffset + kIndirectDispatchWorkgroupsParametersSize <= indirectBuffer.size, `indirectOffset(${indirectOffset}) + sizeOfIndirectParameters(${kIndirectDispatchWorkgroupsParametersSize}) > indirectBuffer.size(${indirectBuffer.size})`, [indirectBuffer]); - assert$1(indirectOffset % 4 === 0, () => `indirectOffset(${indirectOffset}) is not multiple of 4`); + assert(device === s_objToDevice.get(indirectBuffer), 'indirectBuffer is not from same device', [indirectBuffer]); + assert(!!(indirectBuffer.usage & GPUBufferUsage.INDIRECT), () => `buffer(${bufferUsageToString(indirectBuffer.usage)}) must have usage INDIRECT`, [indirectBuffer, this]); + assert(indirectOffset + kIndirectDispatchWorkgroupsParametersSize <= indirectBuffer.size, `indirectOffset(${indirectOffset}) + sizeOfIndirectParameters(${kIndirectDispatchWorkgroupsParametersSize}) > indirectBuffer.size(${indirectBuffer.size})`, [indirectBuffer]); + assert(indirectOffset % 4 === 0, () => `indirectOffset(${indirectOffset}) is not multiple of 4`); }); const s_renderPassToPassInfoMap = new WeakMap(); @@ -7453,7 +7458,7 @@ pipeline is: ${JSON.stringify(pipelineDesc.passLayoutInfo.renderPassLayout, null inUseDepthOrArrayLayers.set(layer, inUseMipLevels); for (let m = 0; m < fullView.mipLevelCount; ++m) { const mipLevel = m + fullView.baseMipLevel; - assert$1(!inUseMipLevels.has(mipLevel), () => `mipLevel(${mipLevel}) of layer(${layer}) is already in use`, [texture]); + assert(!inUseMipLevels.has(mipLevel), () => `mipLevel(${mipLevel}) of layer(${layer}) is already in use`, [texture]); inUseMipLevels.add(mipLevel); } } @@ -7461,21 +7466,21 @@ pipeline is: ${JSON.stringify(pipelineDesc.passLayoutInfo.renderPassLayout, null function validateViewAspectIsAllAspectsOfTexture(texture, aspect) { const { depth, stencil } = kAllTextureFormatInfo[texture.format]; if (depth && stencil) { - assert$1(aspect === 'all', 'aspect must be all for depth-stencil textures', [texture]); + assert(aspect === 'all', 'aspect must be all for depth-stencil textures', [texture]); } else if (depth) { - assert$1(aspect === 'all' || aspect === 'depth-only', 'aspect must be all or depth-only for depth textures', [texture]); + assert(aspect === 'all' || aspect === 'depth-only', 'aspect must be all or depth-only for depth textures', [texture]); } else if (stencil) { - assert$1(aspect === 'all' || aspect === 'stencil-only', 'aspect must be all or stencil-only for stencil textures', [texture]); + assert(aspect === 'all' || aspect === 'stencil-only', 'aspect must be all or stencil-only for stencil textures', [texture]); } } function validateRenderableTextureView(texture, viewDesc) { - assert$1((texture.usage & GPUTextureUsage.RENDER_ATTACHMENT) !== 0, () => `texture.usage(${textureUsageToString(texture.usage)}) is missing RENDER_ATTACHMENT`, [texture]); + assert((texture.usage & GPUTextureUsage.RENDER_ATTACHMENT) !== 0, () => `texture.usage(${textureUsageToString(texture.usage)}) is missing RENDER_ATTACHMENT`, [texture]); const { dimension, mipLevelCount, arrayLayerCount, aspect } = viewDesc; - assert$1(dimension === '2d' || dimension === '3d', () => `dimension(${dimension}) must be 2d or 3d`); - assert$1(mipLevelCount === 1, () => `mipLevelCount(${mipLevelCount}) must be 1`); - assert$1(arrayLayerCount === 1, () => `arrayLayerCount(${arrayLayerCount}) must be 1`); + assert(dimension === '2d' || dimension === '3d', () => `dimension(${dimension}) must be 2d or 3d`); + assert(mipLevelCount === 1, () => `mipLevelCount(${mipLevelCount}) must be 1`); + assert(arrayLayerCount === 1, () => `arrayLayerCount(${arrayLayerCount}) must be 1`); validateViewAspectIsAllAspectsOfTexture(texture, aspect); } function validateRenderPassColorAttachment(attachment, slot) { @@ -7484,28 +7489,28 @@ pipeline is: ${JSON.stringify(pipelineDesc.passLayoutInfo.renderPassLayout, null const renderTexture = s_textureViewToTexture.get(view); const formatInfo = kAllTextureFormatInfo[renderViewDesc.format]; validateRenderableTextureView(renderTexture, renderViewDesc); - assert$1(!!formatInfo.colorRender, () => `format(${renderViewDesc.format}) is not color renderable`); + assert(!!formatInfo.colorRender, () => `format(${renderViewDesc.format}) is not color renderable`); if (renderViewDesc.dimension === '3d') { - assert$1(!!depthSlice, () => `attachment(${slot})'s dimension is '3d' but depthSlice is missing`); + assert(!!depthSlice, () => `attachment(${slot})'s dimension is '3d' but depthSlice is missing`); const [, , d] = logicalMipLevelSpecificTextureExtent(renderTexture, renderViewDesc.baseMipLevel); - assert$1(depthSlice < d, () => `depthSlice(${depthSlice}) must be < depth(${d}) at mipLevel(${renderViewDesc.mipLevelCount}) of texture`, [renderTexture]); + assert(depthSlice < d, () => `depthSlice(${depthSlice}) must be < depth(${d}) at mipLevel(${renderViewDesc.mipLevelCount}) of texture`, [renderTexture]); } else { - assert$1(depthSlice === undefined, `attachment(${slot}) is not 3d so depthSlice must NOT be provided`); + assert(depthSlice === undefined, `attachment(${slot}) is not 3d so depthSlice must NOT be provided`); } if (resolveTarget) { const resolveViewDesc = s_textureViewToDesc.get(resolveTarget); const resolveTexture = s_textureViewToTexture.get(resolveTarget); const [tw, th] = logicalMipLevelSpecificTextureExtent(renderTexture, renderViewDesc.baseMipLevel); const [rw, rh] = logicalMipLevelSpecificTextureExtent(resolveTexture, resolveViewDesc.baseMipLevel); - assert$1(tw === rw && th === rh, () => `resolveTarget render extent(${rw}, ${rh}) != view render extent (${tw}, ${th})`); - assert$1(renderTexture.sampleCount > 1, 'resolveTarget is set so view texture must have sampleCount > 1', [renderTexture]); - assert$1(resolveTexture.sampleCount === 1, 'resolveTarget.sampleCount must be 1', [resolveTarget]); + assert(tw === rw && th === rh, () => `resolveTarget render extent(${rw}, ${rh}) != view render extent (${tw}, ${th})`); + assert(renderTexture.sampleCount > 1, 'resolveTarget is set so view texture must have sampleCount > 1', [renderTexture]); + assert(resolveTexture.sampleCount === 1, 'resolveTarget.sampleCount must be 1', [resolveTarget]); validateRenderableTextureView(resolveTexture, resolveViewDesc); - assert$1(resolveViewDesc.format === renderViewDesc.format, () => `resolveTarget.view.format(${resolveViewDesc.format}) must equal target.view.format(${renderViewDesc.format})`); - assert$1(resolveTexture.format === renderTexture.format, () => `resolve texture format(${resolveTexture.format}) must equal target texture format(${renderTexture.format})`); + assert(resolveViewDesc.format === renderViewDesc.format, () => `resolveTarget.view.format(${resolveViewDesc.format}) must equal target.view.format(${renderViewDesc.format})`); + assert(resolveTexture.format === renderTexture.format, () => `resolve texture format(${resolveTexture.format}) must equal target texture format(${renderTexture.format})`); const resolveFormatInfo = kAllTextureFormatInfo[resolveTexture.format]; - assert$1(!!resolveFormatInfo?.colorRender?.resolve, () => `resolve texture.format(${resolveTexture.format}) does not support resolving`); + assert(!!resolveFormatInfo?.colorRender?.resolve, () => `resolve texture.format(${resolveTexture.format}) does not support resolving`); } } wrapRenderCommandsMixin(GPURenderPassEncoder, s_renderPassToPassInfoMap, getRenderPassLayout); @@ -7541,14 +7546,14 @@ pipeline is: ${JSON.stringify(pipelineDesc.passLayoutInfo.renderPassLayout, null const { view } = attachment; const texture = s_textureViewToTexture.get(view); assertNotDestroyed(texture); - assert$1(s_objToDevice.get(texture) === device, 'texture is not from same device as command encoder', [texture, commandEncoder]); + assert(s_objToDevice.get(texture) === device, 'texture is not from same device as command encoder', [texture, commandEncoder]); const { sampleCount, format } = texture; const formatInfo = kAllTextureFormatInfo[format]; markTextureInUse(inuseTextures, texture, view); const { colorRender, depth, stencil } = formatInfo; checkRenderExtent(texture, view); if (isDepth) { - assert$1(!!depth || !!stencil, () => `format(${format}) is not a depth stencil format`); + assert(!!depth || !!stencil, () => `format(${format}) is not a depth stencil format`); depthStencilFormat = format; } else { @@ -7560,7 +7565,7 @@ pipeline is: ${JSON.stringify(pipelineDesc.passLayoutInfo.renderPassLayout, null passSampleCount = sampleCount; } else { - assert$1(sampleCount === passSampleCount, 'all attachments do not have the same sampleCount'); + assert(sampleCount === passSampleCount, 'all attachments do not have the same sampleCount'); } }; const { timestampWrites, colorAttachments, depthStencilAttachment, occlusionQuerySet } = desc; @@ -7568,16 +7573,16 @@ pipeline is: ${JSON.stringify(pipelineDesc.passLayoutInfo.renderPassLayout, null addView(colorAttachment); } addView(depthStencilAttachment, true); - assert$1(numAttachments > 0, 'there must be at least 1 colorAttachment or depthStencilAttachment'); - assert$1(numAttachments <= device.limits.maxColorAttachments, () => `numAttachments(${numAttachments}) > device.limits.maxColorAttachments(${device.limits.maxColorAttachments})`); - assert$1(bytesPerSample <= device.limits.maxColorAttachmentBytesPerSample, () => `color attachments bytesPerSample(${bytesPerSample}) > device.limits.maxColorAttachmentBytesPerSample(${device.limits.maxColorAttachmentBytesPerSample})`); + assert(numAttachments > 0, 'there must be at least 1 colorAttachment or depthStencilAttachment'); + assert(numAttachments <= device.limits.maxColorAttachments, () => `numAttachments(${numAttachments}) > device.limits.maxColorAttachments(${device.limits.maxColorAttachments})`); + assert(bytesPerSample <= device.limits.maxColorAttachmentBytesPerSample, () => `color attachments bytesPerSample(${bytesPerSample}) > device.limits.maxColorAttachmentBytesPerSample(${device.limits.maxColorAttachmentBytesPerSample})`); if (timestampWrites) { validateTimestampWrites(device, timestampWrites); } if (occlusionQuerySet) { assertNotDestroyed(occlusionQuerySet); - assert$1(device === s_objToDevice.get(occlusionQuerySet), 'occlusionQuerySet is not from same device', [occlusionQuerySet]); - assert$1(occlusionQuerySet.type === 'occlusion', () => `occlusionQuerySet.type(${occlusionQuerySet.type}) is not 'occlusion'`, [occlusionQuerySet]); + assert(device === s_objToDevice.get(occlusionQuerySet), 'occlusionQuerySet is not from same device', [occlusionQuerySet]); + assert(occlusionQuerySet.type === 'occlusion', () => `occlusionQuerySet.type(${occlusionQuerySet.type}) is not 'occlusion'`, [occlusionQuerySet]); } const renderPassLayout = createRenderPassLayout(trimNulls(colorFormats), passSampleCount, depthStencilFormat); s_renderPassToPassInfoMap.set(passEncoder, { @@ -7603,11 +7608,11 @@ pipeline is: ${JSON.stringify(pipelineDesc.passLayoutInfo.renderPassLayout, null const device = s_objToDevice.get(this); let bundleCount = 0; for (const bundle of bundles) { - assert$1(s_objToDevice.get(bundle) === device, () => 'bundle[${count}] is not from same device as render pass encoder', [bundle]); + assert(s_objToDevice.get(bundle) === device, () => 'bundle[${count}] is not from same device as render pass encoder', [bundle]); const count = bundleCount; const bundleDesc = getRenderPassLayoutForRenderBundle(bundle); const passLayoutInfo = getRenderPassLayout(this); - assert$1(bundleDesc.passLayoutInfo.passLayoutSignature === passLayoutInfo.passLayoutSignature, () => `bundle[${count}] is not compatible with ${this.constructor.name} + assert(bundleDesc.passLayoutInfo.passLayoutSignature === passLayoutInfo.passLayoutSignature, () => `bundle[${count}] is not compatible with ${this.constructor.name} ${this.constructor.name} expects ${JSON.stringify(passLayoutInfo.renderPassLayout, null, 2)} @@ -7625,12 +7630,12 @@ bundle is: ${JSON.stringify(bundleDesc.passLayoutInfo.renderPassLayout, null, 2) const info = s_renderPassToPassInfoMap.get(this); validateEncoderState(this, info.state); const { occlusionIndices, occlusionQueryActive, occlusionQuerySet } = info; - assert$1(!!occlusionQuerySet, 'no occlusionQuerySet in pass'); + assert(!!occlusionQuerySet, 'no occlusionQuerySet in pass'); assertNotDestroyed(occlusionQuerySet); - assert$1(queryIndex < occlusionQuerySet.count, () => `queryIndex(${queryIndex}) >= occlusionQuerySet.count(${occlusionQuerySet.count})`, [occlusionQuerySet]); + assert(queryIndex < occlusionQuerySet.count, () => `queryIndex(${queryIndex}) >= occlusionQuerySet.count(${occlusionQuerySet.count})`, [occlusionQuerySet]); const queryErr = occlusionIndices.get(queryIndex); - assert$1(!queryErr, () => `queryIndex(${queryIndex}) was already used in this pass at ${queryErr.stack}`); - assert$1(!occlusionQueryActive, () => `another query is already active from ${occlusionQueryActive.stack}`); + assert(!queryErr, () => `queryIndex(${queryIndex}) was already used in this pass at ${queryErr.stack}`); + assert(!occlusionQueryActive, () => `another query is already active from ${occlusionQueryActive.stack}`); info.occlusionQueryActive = new Error(); info.occlusionQueryActiveIndex = queryIndex; }); @@ -7638,7 +7643,7 @@ bundle is: ${JSON.stringify(bundleDesc.passLayoutInfo.renderPassLayout, null, 2) const info = s_renderPassToPassInfoMap.get(this); validateEncoderState(this, info.state); const { occlusionIndices, occlusionQueryActive, occlusionQueryActiveIndex, occlusionQuerySet } = info; - assert$1(!!info.occlusionQueryActive, 'no occlusion query is active'); + assert(!!info.occlusionQueryActive, 'no occlusion query is active'); occlusionIndices.set(occlusionQueryActiveIndex, occlusionQueryActive); if (occlusionQuerySet) { assertNotDestroyed(occlusionQuerySet); @@ -7651,28 +7656,28 @@ bundle is: ${JSON.stringify(bundleDesc.passLayoutInfo.renderPassLayout, null, 2) validateEncoderState(this, info.state); info.state = 'ended'; unlockCommandEncoder(info.commandEncoder); - assert$1(!info.occlusionQueryActive, () => `occlusion queryIndex(${info.occlusionQueryActiveIndex}) is still active`); + assert(!info.occlusionQueryActive, () => `occlusion queryIndex(${info.occlusionQueryActiveIndex}) is still active`); }); wrapFunctionBefore(GPURenderPassEncoder, 'setViewport', function ([x, y, width, height, minDepth, maxDepth]) { const info = s_renderPassToPassInfoMap.get(this); validateEncoderState(this, info.state); const { targetWidth, targetHeight, } = info; - assert$1(x >= 0, () => `x(${x}) < 0`, [this]); - assert$1(y >= 0, () => `y(${y}) < 0`, [this]); - assert$1(x + width <= targetWidth, () => `x(${x}) + width(${width}) > texture.width(${targetWidth})`, [this]); - assert$1(y + height <= targetHeight, () => `y(${x}) + height(${height}) > texture.height(${targetHeight})`, [this]); - assert$1(minDepth >= 0 && minDepth <= 1.0, () => `minDepth(${minDepth}) must be >= 0 and <= 1`); - assert$1(maxDepth >= 0 && maxDepth <= 1.0, () => `maxDepth(${maxDepth}) must be >= 0 and <= 1`); - assert$1(minDepth < maxDepth, () => `minDepth(${minDepth}) must be < maxDepth(${maxDepth})`); + assert(x >= 0, () => `x(${x}) < 0`, [this]); + assert(y >= 0, () => `y(${y}) < 0`, [this]); + assert(x + width <= targetWidth, () => `x(${x}) + width(${width}) > texture.width(${targetWidth})`, [this]); + assert(y + height <= targetHeight, () => `y(${x}) + height(${height}) > texture.height(${targetHeight})`, [this]); + assert(minDepth >= 0 && minDepth <= 1.0, () => `minDepth(${minDepth}) must be >= 0 and <= 1`); + assert(maxDepth >= 0 && maxDepth <= 1.0, () => `maxDepth(${maxDepth}) must be >= 0 and <= 1`); + assert(minDepth < maxDepth, () => `minDepth(${minDepth}) must be < maxDepth(${maxDepth})`); }); wrapFunctionBefore(GPURenderPassEncoder, 'setScissorRect', function ([x, y, width, height]) { const info = s_renderPassToPassInfoMap.get(this); validateEncoderState(this, info.state); const { targetWidth, targetHeight, } = info; - assert$1(x >= 0, () => `x(${x}) < 0`, [this]); - assert$1(y >= 0, () => `y(${y}) < 0`, [this]); - assert$1(x + width <= targetWidth, () => `x(${x}) + width(${width}) > texture.width(${targetWidth})`, [this]); - assert$1(y + height <= targetHeight, () => `y(${x}) + height(${height}) > texture.height(${targetHeight})`, [this]); + assert(x >= 0, () => `x(${x}) < 0`, [this]); + assert(y >= 0, () => `y(${y}) < 0`, [this]); + assert(x + width <= targetWidth, () => `x(${x}) + width(${width}) > texture.width(${targetWidth})`, [this]); + assert(y + height <= targetHeight, () => `y(${x}) + height(${height}) > texture.height(${targetHeight})`, [this]); }); wrapFunctionAfter(GPUCommandEncoder, 'beginComputePass', function (passEncoder, [desc]) { @@ -7693,21 +7698,21 @@ bundle is: ${JSON.stringify(bundleDesc.passLayoutInfo.renderPassLayout, null, 2) assertNotDestroyed(src); assertNotDestroyed(dst); const device = s_objToDevice.get(this); - assert$1(device === s_objToDevice.get(src), 'src is not from same device as commandEncoder', [src, this]); - assert$1(device === s_objToDevice.get(dst), 'dst is not from same device as commandEncoder', [dst, this]); - assert$1(src !== dst, 'src must not be same buffer as dst', [src, dst]); - assert$1(!!(src.usage & GPUBufferUsage.COPY_SRC), () => `src.usage(${bufferUsageToString(src.usage)} missing COPY_SRC)`, [src]); - assert$1(!!(dst.usage & GPUBufferUsage.COPY_DST), () => `dst.usage(${bufferUsageToString(dst.usage)} missing COPY_DST)`, [dst]); - assert$1(srcOffset + size <= src.size, () => `srcOffset(${srcOffset}) + size(${size}) > srcBuffer.size(${src.size})`, [src]); - assert$1(dstOffset + size <= dst.size, () => `dstOffset(${dstOffset}) + size(${size}) > dstBuffer.size(${dst.size})`, [dst]); - assert$1(size % 4 === 0, () => `size(${size}) is not multiple of 4`); - assert$1(srcOffset % 4 === 0, () => `srcOffset(${srcOffset}) is not multiple of 4`); - assert$1(dstOffset % 4 === 0, () => `dstOffset(${dstOffset}) is not multiple of 4`); + assert(device === s_objToDevice.get(src), 'src is not from same device as commandEncoder', [src, this]); + assert(device === s_objToDevice.get(dst), 'dst is not from same device as commandEncoder', [dst, this]); + assert(src !== dst, 'src must not be same buffer as dst', [src, dst]); + assert(!!(src.usage & GPUBufferUsage.COPY_SRC), () => `src.usage(${bufferUsageToString(src.usage)} missing COPY_SRC)`, [src]); + assert(!!(dst.usage & GPUBufferUsage.COPY_DST), () => `dst.usage(${bufferUsageToString(dst.usage)} missing COPY_DST)`, [dst]); + assert(srcOffset + size <= src.size, () => `srcOffset(${srcOffset}) + size(${size}) > srcBuffer.size(${src.size})`, [src]); + assert(dstOffset + size <= dst.size, () => `dstOffset(${dstOffset}) + size(${size}) > dstBuffer.size(${dst.size})`, [dst]); + assert(size % 4 === 0, () => `size(${size}) is not multiple of 4`); + assert(srcOffset % 4 === 0, () => `srcOffset(${srcOffset}) is not multiple of 4`); + assert(dstOffset % 4 === 0, () => `dstOffset(${dstOffset}) is not multiple of 4`); }); function validateImageCopyBuffer(icb) { assertNotDestroyed(icb.buffer); const bytesPerRow = icb.bytesPerRow || 0; - assert$1(bytesPerRow % 256 === 0, () => `src.bytesPerRow(${bytesPerRow}) not multiple of 256`, [icb.buffer]); + assert(bytesPerRow % 256 === 0, () => `src.bytesPerRow(${bytesPerRow}) not multiple of 256`, [icb.buffer]); } function validateImageCopyTexture(ict, copySize) { assertNotDestroyed(ict.texture); @@ -7715,13 +7720,13 @@ bundle is: ${JSON.stringify(bundleDesc.passLayoutInfo.renderPassLayout, null, 2) const { blockWidth, blockHeight, } = formatInfo; const mipLevel = ict.mipLevel || 0; const [origX, origY] = reifyGPUOrigin3D(ict.origin); - assert$1(mipLevel < ict.texture.mipLevelCount, () => `mipLevel(${mipLevel}) must be less than texture.mipLevelCount(${ict.texture.mipLevelCount})`, [ict.texture]); - assert$1(origX % blockWidth === 0, () => `origin.x(${origX}) not multiple of blockWidth(${blockWidth})`, [ict.texture]); - assert$1(origY % blockHeight === 0, () => `origin.y(${origY}) not multiple of blockHeight(${blockHeight})`, [ict.texture]); + assert(mipLevel < ict.texture.mipLevelCount, () => `mipLevel(${mipLevel}) must be less than texture.mipLevelCount(${ict.texture.mipLevelCount})`, [ict.texture]); + assert(origX % blockWidth === 0, () => `origin.x(${origX}) not multiple of blockWidth(${blockWidth})`, [ict.texture]); + assert(origY % blockHeight === 0, () => `origin.y(${origY}) not multiple of blockHeight(${blockHeight})`, [ict.texture]); const [copyWidth, copyHeight, copyDepthOrArrayLayers] = reifyGPUExtent3D(copySize); if (formatInfo.depth && formatInfo.stencil && ict.texture.sampleCount > 1) { const [w, h, d] = physicalMipLevelSpecificTextureExtent(ict.texture, mipLevel); - assert$1(copyWidth === w && + assert(copyWidth === w && copyHeight === h && copyDepthOrArrayLayers === d, 'copySize must match textureSize for depth-stencil textures', [ict.texture]); } @@ -7734,11 +7739,11 @@ bundle is: ${JSON.stringify(bundleDesc.passLayoutInfo.renderPassLayout, null, 2) const [copyWidth, copyHeight, copyDepthOrArrayLayers] = reifyGPUExtent3D(copySize); const [w, h, d] = physicalMipLevelSpecificTextureExtent(ict.texture, mipLevel); const res = [ict.texture]; - assert$1(origX + copyWidth <= w, () => `origin.x(${origX}) + copySize.width(${copyWidth}) is > physical width(${w}) of mipLevel(${mipLevel})`, res); - assert$1(origY + copyHeight <= h, () => `origin.y(${origY}) + copySize.height(${copyHeight}) is > physical height(${h}) of mipLevel(${mipLevel})`, res); - assert$1(origZ + copyDepthOrArrayLayers <= d, () => `origin.z(${origZ}) + copySize.depthOrArrayBuffers(${copyDepthOrArrayLayers}) is > texture.depthOrArrayLayers(${d}) of mipLevel(${mipLevel})`, res); - assert$1(copyWidth % blockWidth === 0, () => `copySize.width(${copyWidth}) is not multiple of blockWidth(${blockWidth})`, res); - assert$1(copyHeight % blockHeight === 0, () => `copySize.height(${copyHeight}) is not multiple of blockHeight(${blockHeight})`, res); + assert(origX + copyWidth <= w, () => `origin.x(${origX}) + copySize.width(${copyWidth}) is > physical width(${w}) of mipLevel(${mipLevel})`, res); + assert(origY + copyHeight <= h, () => `origin.y(${origY}) + copySize.height(${copyHeight}) is > physical height(${h}) of mipLevel(${mipLevel})`, res); + assert(origZ + copyDepthOrArrayLayers <= d, () => `origin.z(${origZ}) + copySize.depthOrArrayBuffers(${copyDepthOrArrayLayers}) is > texture.depthOrArrayLayers(${d}) of mipLevel(${mipLevel})`, res); + assert(copyWidth % blockWidth === 0, () => `copySize.width(${copyWidth}) is not multiple of blockWidth(${blockWidth})`, res); + assert(copyHeight % blockHeight === 0, () => `copySize.height(${copyHeight}) is not multiple of blockHeight(${blockHeight})`, res); } function validateLinearTextureData(idl, byteSize, format, copyExtent) { const formatInfo = kAllTextureFormatInfo[format]; @@ -7747,22 +7752,22 @@ bundle is: ${JSON.stringify(bundleDesc.passLayoutInfo.renderPassLayout, null, 2) const widthInBlocks = copyWidth / blockWidth; const heightInBlocks = copyHeight / blockHeight; const bytesInLastRow = widthInBlocks * formatInfo.bytesPerBlock; - assert$1(widthInBlocks % 1 === 0, () => `width(${copyWidth}) must be multiple of blockWidth${blockWidth}`); - assert$1(heightInBlocks % 1 === 0, () => `height(${copyHeight}) must be multiple of blockHeight${blockHeight}`); + assert(widthInBlocks % 1 === 0, () => `width(${copyWidth}) must be multiple of blockWidth${blockWidth}`); + assert(heightInBlocks % 1 === 0, () => `height(${copyHeight}) must be multiple of blockHeight${blockHeight}`); if (heightInBlocks > 1) { - assert$1(idl.bytesPerRow !== undefined, () => `bytesPerRow must be set if heightInBlocks(${heightInBlocks}) > 1`); + assert(idl.bytesPerRow !== undefined, () => `bytesPerRow must be set if heightInBlocks(${heightInBlocks}) > 1`); } if (copyDepthOrArrayLayers > 1) { - assert$1(idl.bytesPerRow !== undefined, () => `bytesPerRow must be set if copySize.depthOrArrayLayers(${copyDepthOrArrayLayers}) > 1`); + assert(idl.bytesPerRow !== undefined, () => `bytesPerRow must be set if copySize.depthOrArrayLayers(${copyDepthOrArrayLayers}) > 1`); } if (copyDepthOrArrayLayers > 1) { - assert$1(idl.rowsPerImage !== undefined, () => `rowsPerImage must be set if copySize.depthOrArrayLayers(${copyDepthOrArrayLayers}) > 1`); + assert(idl.rowsPerImage !== undefined, () => `rowsPerImage must be set if copySize.depthOrArrayLayers(${copyDepthOrArrayLayers}) > 1`); } if (idl.bytesPerRow !== undefined) { - assert$1(idl.bytesPerRow >= bytesInLastRow, () => `bytesPerRow(${idl.bytesPerRow}) must be >= bytes in the last row(${bytesInLastRow})`); + assert(idl.bytesPerRow >= bytesInLastRow, () => `bytesPerRow(${idl.bytesPerRow}) must be >= bytes in the last row(${bytesInLastRow})`); } if (idl.rowsPerImage !== undefined) { - assert$1(idl.rowsPerImage >= heightInBlocks, () => `rowsPerImage(${idl.rowsPerImage}) must be >= heightInBlocks(${heightInBlocks})`); + assert(idl.rowsPerImage >= heightInBlocks, () => `rowsPerImage(${idl.rowsPerImage}) must be >= heightInBlocks(${heightInBlocks})`); } const bytesPerRow = idl.bytesPerRow ?? 0; const rowsPerImage = idl.rowsPerImage ?? 0; @@ -7776,34 +7781,34 @@ bundle is: ${JSON.stringify(bundleDesc.passLayoutInfo.renderPassLayout, null, 2) } } const offset = idl.offset ?? 0; - assert$1(offset + requiredBytesInCopy <= byteSize, () => `offset(${offset}) + requiredBytesInCopy(${requiredBytesInCopy}) must be <= buffer.size(${byteSize})`); + assert(offset + requiredBytesInCopy <= byteSize, () => `offset(${offset}) + requiredBytesInCopy(${requiredBytesInCopy}) must be <= buffer.size(${byteSize})`); } function validateB2TorT2BCopy(encoder, buf, tex, copySize, bufferIsSource) { const device = s_objToDevice.get(encoder); - assert$1(device === s_objToDevice.get(buf.buffer), 'buffer is not from same device as commandEncoder', [buf.buffer, encoder]); - assert$1(device === s_objToDevice.get(tex.texture), 'texture is not from same device as commandEncoder', [tex.texture, encoder]); + assert(device === s_objToDevice.get(buf.buffer), 'buffer is not from same device as commandEncoder', [buf.buffer, encoder]); + assert(device === s_objToDevice.get(tex.texture), 'texture is not from same device as commandEncoder', [tex.texture, encoder]); validateImageCopyBuffer(buf); const [bufRequiredUsage, texRequiredUsage] = bufferIsSource ? ['COPY_SRC', 'COPY_DST'] : ['COPY_DST', 'COPY_SRC']; - assert$1(!!(buf.buffer.usage & GPUBufferUsage[bufRequiredUsage]), () => `src.usage(${bufferUsageToString(buf.buffer.usage)} missing ${bufRequiredUsage})`, [buf.buffer]); + assert(!!(buf.buffer.usage & GPUBufferUsage[bufRequiredUsage]), () => `src.usage(${bufferUsageToString(buf.buffer.usage)} missing ${bufRequiredUsage})`, [buf.buffer]); validateImageCopyTexture(tex, copySize); const formatInfo = kAllTextureFormatInfo[tex.texture.format]; - assert$1(!!(tex.texture.usage & GPUTextureUsage[texRequiredUsage]), () => `dst.texture.usage(${textureUsageToString(tex.texture.usage)} missing ${texRequiredUsage})`, [tex.texture]); - assert$1(tex.texture.sampleCount === 1, 'sampleCount must be 1', [tex.texture]); + assert(!!(tex.texture.usage & GPUTextureUsage[texRequiredUsage]), () => `dst.texture.usage(${textureUsageToString(tex.texture.usage)} missing ${texRequiredUsage})`, [tex.texture]); + assert(tex.texture.sampleCount === 1, 'sampleCount must be 1', [tex.texture]); let aspectSpecificFormat = tex.texture.format; const isDepthOrStencil = formatInfo.depth || formatInfo.stencil; if (isDepthOrStencil) { if (!formatInfo.stencil) { - assert$1(tex.aspect !== 'stencil-only', 'can not use stencil-only aspect on non stencil texture', [tex.texture]); + assert(tex.aspect !== 'stencil-only', 'can not use stencil-only aspect on non stencil texture', [tex.texture]); } if (!formatInfo.depth) { - assert$1(tex.aspect !== 'depth-only', 'can not use depth-only aspect on non depth texture', [tex.texture]); + assert(tex.aspect !== 'depth-only', 'can not use depth-only aspect on non depth texture', [tex.texture]); } - assert$1(tex.aspect === 'depth-only' || tex.aspect === 'stencil-only', 'must use one aspect'); + assert(tex.aspect === 'depth-only' || tex.aspect === 'stencil-only', 'must use one aspect'); const aspect = tex.aspect === 'depth-only' ? 'depth' : 'stencil'; const info = formatInfo[aspect]; - assert$1(!!info?.copyDst, `can not copy to ${tex.aspect} of texture of format(${tex.texture.format})`, [tex.texture]); + assert(!!info?.copyDst, `can not copy to ${tex.aspect} of texture of format(${tex.texture.format})`, [tex.texture]); if (aspectSpecificFormat === 'depth24plus-stencil8') { aspectSpecificFormat = tex.aspect === 'depth-only' ? 'depth24plus' @@ -7819,10 +7824,10 @@ bundle is: ${JSON.stringify(bundleDesc.passLayoutInfo.renderPassLayout, null, 2) const srcOffset = buf.offset || 0; if (!isDepthOrStencil) { const texelCopyBlockFootPrint = formatInfo.bytesPerBlock; - assert$1(srcOffset % texelCopyBlockFootPrint === 0, () => `src.offset(${srcOffset}) must multiple of blockSize(${texelCopyBlockFootPrint})`); + assert(srcOffset % texelCopyBlockFootPrint === 0, () => `src.offset(${srcOffset}) must multiple of blockSize(${texelCopyBlockFootPrint})`); } else { - assert$1(srcOffset % 4 === 0, () => `src.offset(${srcOffset}) must by multiple of 4 for depth and/or stencil textures`); + assert(srcOffset % 4 === 0, () => `src.offset(${srcOffset}) must by multiple of 4 for depth and/or stencil textures`); } validateLinearTextureData(buf, buf.buffer.size, aspectSpecificFormat, copySize); } @@ -7845,19 +7850,19 @@ bundle is: ${JSON.stringify(bundleDesc.passLayoutInfo.renderPassLayout, null, 2) wrapFunctionBefore(GPUCommandEncoder, 'copyTextureToTexture', function ([src, dst, copySize]) { getCommandBufferInfoAndValidateState(this); const device = s_objToDevice.get(this); - assert$1(device === s_objToDevice.get(src.texture), 'src.texture is not from same device as commandEncoder', [src, this]); - assert$1(device === s_objToDevice.get(dst.texture), 'dst.texture is not from same device as commandEncoder', [dst, this]); + assert(device === s_objToDevice.get(src.texture), 'src.texture is not from same device as commandEncoder', [src, this]); + assert(device === s_objToDevice.get(dst.texture), 'dst.texture is not from same device as commandEncoder', [dst, this]); validateImageCopyTexture(src, copySize); - assert$1(!!(src.texture.usage & GPUTextureUsage.COPY_SRC), () => `src.texture.usage(${textureUsageToString(src.texture.usage)} missing COPY_SRC`, [src.texture]); + assert(!!(src.texture.usage & GPUTextureUsage.COPY_SRC), () => `src.texture.usage(${textureUsageToString(src.texture.usage)} missing COPY_SRC`, [src.texture]); validateImageCopyTexture(dst, copySize); - assert$1(!!(dst.texture.usage & GPUTextureUsage.COPY_DST), () => `src.texture.usage(${textureUsageToString(dst.texture.usage)} missing COPY_DST`, [dst.texture]); - assert$1(src.texture.sampleCount === dst.texture.sampleCount, () => `src.texture.sampleCount(${src.texture.sampleCount}) must equal dst.texture.sampleCount(${dst.texture.sampleCount})`, [src.texture, dst.texture]); - assert$1(isCopyCompatible(src.texture.format, dst.texture.format), () => `src.texture.format(${src.texture.format}) must be copy compatible with dst.texture.format(${dst.texture.format})`, [src.texture, dst.texture]); + assert(!!(dst.texture.usage & GPUTextureUsage.COPY_DST), () => `src.texture.usage(${textureUsageToString(dst.texture.usage)} missing COPY_DST`, [dst.texture]); + assert(src.texture.sampleCount === dst.texture.sampleCount, () => `src.texture.sampleCount(${src.texture.sampleCount}) must equal dst.texture.sampleCount(${dst.texture.sampleCount})`, [src.texture, dst.texture]); + assert(isCopyCompatible(src.texture.format, dst.texture.format), () => `src.texture.format(${src.texture.format}) must be copy compatible with dst.texture.format(${dst.texture.format})`, [src.texture, dst.texture]); const formatInfo = kAllTextureFormatInfo[src.texture.format]; const isDepthStencil = !!formatInfo.depth && !!formatInfo.stencil; if (isDepthStencil) { - assert$1(src.aspect === 'all', () => `src.aspect must be 'all' when format(${src.texture.format}) is a depth-stencil format`, [src.texture]); - assert$1(dst.aspect === 'all', () => `dst.aspect must be 'all' when format(${dst.texture.format}) is a depth-stencil format`, [dst.texture]); + assert(src.aspect === 'all', () => `src.aspect must be 'all' when format(${src.texture.format}) is a depth-stencil format`, [src.texture]); + assert(dst.aspect === 'all', () => `dst.aspect must be 'all' when format(${dst.texture.format}) is a depth-stencil format`, [dst.texture]); } validateTextureCopyRange(src, copySize); validateTextureCopyRange(dst, copySize); @@ -7865,7 +7870,7 @@ bundle is: ${JSON.stringify(bundleDesc.passLayoutInfo.renderPassLayout, null, 2) const srcOrigin = reifyGPUOrigin3D(src.origin); const dstOrigin = reifyGPUOrigin3D(dst.origin); const size = reifyGPUExtent3D(copySize); - assert$1(!isIntersectingAxis(srcOrigin[0], dstOrigin[0], size[0]) && + assert(!isIntersectingAxis(srcOrigin[0], dstOrigin[0], size[0]) && !isIntersectingAxis(srcOrigin[1], dstOrigin[1], size[1]) && !isIntersectingAxis(srcOrigin[2], dstOrigin[2], size[2]), () => `when src and dst textures are the same texture, copy boxes must not overlap`, [src.texture, dst.texture]); } @@ -7875,25 +7880,27 @@ bundle is: ${JSON.stringify(bundleDesc.passLayoutInfo.renderPassLayout, null, 2) assertNotDestroyed(buffer); offset = offset ?? 0; size = size ?? buffer.size - offset; - assert$1(s_objToDevice.get(this) === s_objToDevice.get(buffer), 'buffer not from same device as encoder', [buffer, this]); - assert$1(!!(buffer.usage & GPUBufferUsage.COPY_DST), () => `buffer.usage(${bufferUsageToString(buffer.usage)}) must have COPY_DST`, [buffer]); - assert$1(size % 4 === 0, () => `size(${size}) must be multiple of 4`); - assert$1(offset % 4 === 0, () => `offset(${offset}) must be multiple of 4`); - assert$1(offset + size <= buffer.size, () => `offset(${offset}) + size(${size}) must be <= buffer.size(${buffer.size})`); + assert(s_objToDevice.get(this) === s_objToDevice.get(buffer), 'buffer not from same device as encoder', [buffer, this]); + assert(!!(buffer.usage & GPUBufferUsage.COPY_DST), () => `buffer.usage(${bufferUsageToString(buffer.usage)}) must have COPY_DST`, [buffer]); + assert(size % 4 === 0, () => `size(${size}) must be multiple of 4`); + assert(offset % 4 === 0, () => `offset(${offset}) must be multiple of 4`); + assert(offset + size <= buffer.size, () => `offset(${offset}) + size(${size}) must be <= buffer.size(${buffer.size})`); }); wrapFunctionBefore(GPUCommandEncoder, 'resolveQuerySet', function ([querySet, firstQuery, queryCount, destination, destinationOffset]) { getCommandBufferInfoAndValidateState(this); assertNotDestroyed(querySet); assertNotDestroyed(destination); const device = s_objToDevice.get(this); - assert$1(s_objToDevice.get(querySet) === device, 'querySet not from same device', [querySet]); - assert$1(s_objToDevice.get(destination) === device, 'destination buffer not from same device', [destination]); - assert$1((destination.usage & GPUBufferUsage.QUERY_RESOLVE) !== 0, () => `destination.usage(${bufferUsageToString(destination.usage)} does not contain QUERY_RESOLVE)`, [destination]); - assert$1(firstQuery < querySet.count, () => `firstQuery(${firstQuery}) out of range for querySet.count(${querySet.count})`); - assert$1(firstQuery + queryCount <= querySet.count, () => `firstQuery(${firstQuery}) + queryCount(${queryCount}) > querySet.count(${querySet.count})`); - assert$1(destinationOffset % 256 === 0, () => `destinationOffset(${destinationOffset}) is not multiple of 256`); - assert$1(destinationOffset + queryCount * 8 <= destination.size, () => `destinationOffset(${destinationOffset}) + queryCount(${queryCount}) * 8 > destination.size(${destination.size})`); + assert(s_objToDevice.get(querySet) === device, 'querySet not from same device', [querySet]); + assert(s_objToDevice.get(destination) === device, 'destination buffer not from same device', [destination]); + assert((destination.usage & GPUBufferUsage.QUERY_RESOLVE) !== 0, () => `destination.usage(${bufferUsageToString(destination.usage)} does not contain QUERY_RESOLVE)`, [destination]); + assert(firstQuery < querySet.count, () => `firstQuery(${firstQuery}) out of range for querySet.count(${querySet.count})`); + assert(firstQuery + queryCount <= querySet.count, () => `firstQuery(${firstQuery}) + queryCount(${queryCount}) > querySet.count(${querySet.count})`); + assert(destinationOffset % 256 === 0, () => `destinationOffset(${destinationOffset}) is not multiple of 256`); + assert(destinationOffset + queryCount * 8 <= destination.size, () => `destinationOffset(${destinationOffset}) + queryCount(${queryCount}) * 8 > destination.size(${destination.size})`); }); + console.log('webgpu-debug-helper running'); + })); //# sourceMappingURL=webgpu-debug-helper.js.map diff --git a/dist/0.x/webgpu-debug-helper.js.map b/dist/0.x/webgpu-debug-helper.js.map index 5f49b8b..6194ea0 100644 --- a/dist/0.x/webgpu-debug-helper.js.map +++ b/dist/0.x/webgpu-debug-helper.js.map @@ -1 +1 @@ -{"version":3,"file":"webgpu-debug-helper.js","sources":["../../../src/format-info.ts","../../../src/utils.ts","../../../src/validation.ts","../../../src/wrap-api.ts","../../../src/shared-state.ts","../../../src/error-scope-wrapper.ts","../../node_modules/webgpu-utils/dist/1.x/webgpu-utils.module.js","../../../src/encoder-utils.ts","../../../src/pipeline.ts","../../../src/texture.ts","../../../src/binding-mixin.ts","../../../src/render-commands-mixin.ts","../../../src/render-bundle-encoder.ts","../../../src/device.ts","../../../src/canvas-context.ts","../../../src/query-support.ts","../../../src/compute-pass-encoder.ts","../../../src/render-pass-encoder.ts","../../../src/command-encoder.ts"],"sourcesContent":["/* eslint-disable require-trailing-comma/require-trailing-comma */\nexport type DataInfo = {\n copySrc: boolean,\n copyDst: boolean,\n storage: boolean,\n readWriteStorage: boolean,\n};\n\nexport type ColorInfo = DataInfo & {\n type: 'float' | 'uint' | 'sint' | 'unfilterable-float',\n bytes: number,\n};\n\nexport type ColorRenderInfo = {\n blend: boolean,\n resolve: boolean,\n byteCost: number,\n alignment: number,\n};\n\nexport type StencilInfo = DataInfo & {\n type: 'uint',\n bytes: number,\n}\n\nexport type DepthInfo = DataInfo & {\n type: 'depth',\n bytes?: number,\n}\n\nexport type FormatInfo = {\n blockWidth: number,\n blockHeight: number,\n multisample?: boolean,\n bytesPerBlock?: number,\n color?: ColorInfo,\n colorRender?: ColorRenderInfo,\n stencil?: StencilInfo,\n depth?: DepthInfo,\n baseFormat?: string,\n feature?: string,\n};\n\n\n\n// exported from the WebGPU CTS by adding the following line to src/webgpu/format_info.ts\n//\n// console.log(JSON.stringify(kAllTextureFormatInfo, null, 2));\n\n/** `kDepthStencilFormatResolvedAspect[format][aspect]` returns the aspect-specific format for a\n * depth-stencil format, or `undefined` if the format doesn't have the aspect.\n */\nconst kDepthStencilFormatResolvedAspect = {\n // kUnsizedDepthStencilFormats\n depth24plus: {\n all: 'depth24plus',\n 'depth-only': 'depth24plus',\n 'stencil-only': undefined,\n },\n 'depth24plus-stencil8': {\n all: 'depth24plus-stencil8',\n 'depth-only': 'depth24plus',\n 'stencil-only': 'stencil8',\n },\n\n // kSizedDepthStencilFormats\n depth16unorm: {\n all: 'depth16unorm',\n 'depth-only': 'depth16unorm',\n 'stencil-only': undefined,\n },\n depth32float: {\n all: 'depth32float',\n 'depth-only': 'depth32float',\n 'stencil-only': undefined,\n },\n 'depth32float-stencil8': {\n all: 'depth32float-stencil8',\n 'depth-only': 'depth32float',\n 'stencil-only': 'stencil8',\n },\n stencil8: {\n all: 'stencil8',\n 'depth-only': undefined,\n 'stencil-only': 'stencil8',\n },\n};\n\nexport function getDepthStencilFormatResolvedAspect(format: GPUTextureFormat, aspect: GPUTextureAspect): GPUTextureFormat | undefined {\n const info = kDepthStencilFormatResolvedAspect[format as keyof typeof kDepthStencilFormatResolvedAspect];\n return info ? info[aspect] as GPUTextureFormat : undefined;\n}\n\nexport const kAllTextureFormatInfo: {[key: string]: FormatInfo} = {\n \"r8unorm\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 1\n },\n \"colorRender\": {\n \"blend\": true,\n \"resolve\": true,\n \"byteCost\": 1,\n \"alignment\": 1\n },\n \"multisample\": true,\n \"bytesPerBlock\": 1\n },\n \"r8snorm\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 1\n },\n \"multisample\": false,\n \"bytesPerBlock\": 1\n },\n \"r8uint\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"uint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 1\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 1,\n \"alignment\": 1\n },\n \"multisample\": true,\n \"bytesPerBlock\": 1\n },\n \"r8sint\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"sint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 1\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 1,\n \"alignment\": 1\n },\n \"multisample\": true,\n \"bytesPerBlock\": 1\n },\n \"rg8unorm\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 2\n },\n \"colorRender\": {\n \"blend\": true,\n \"resolve\": true,\n \"byteCost\": 2,\n \"alignment\": 1\n },\n \"multisample\": true,\n \"bytesPerBlock\": 2\n },\n \"rg8snorm\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 2\n },\n \"multisample\": false,\n \"bytesPerBlock\": 2\n },\n \"rg8uint\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"uint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 2\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 2,\n \"alignment\": 1\n },\n \"multisample\": true,\n \"bytesPerBlock\": 2\n },\n \"rg8sint\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"sint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 2\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 2,\n \"alignment\": 1\n },\n \"multisample\": true,\n \"bytesPerBlock\": 2\n },\n \"rgba8unorm\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": true,\n \"readWriteStorage\": false,\n \"bytes\": 4\n },\n \"colorRender\": {\n \"blend\": true,\n \"resolve\": true,\n \"byteCost\": 8,\n \"alignment\": 1\n },\n \"multisample\": true,\n \"baseFormat\": \"rgba8unorm\",\n \"bytesPerBlock\": 4\n },\n \"rgba8unorm-srgb\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 4\n },\n \"colorRender\": {\n \"blend\": true,\n \"resolve\": true,\n \"byteCost\": 8,\n \"alignment\": 1\n },\n \"multisample\": true,\n \"baseFormat\": \"rgba8unorm\",\n \"bytesPerBlock\": 4\n },\n \"rgba8snorm\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": true,\n \"readWriteStorage\": false,\n \"bytes\": 4\n },\n \"multisample\": false,\n \"bytesPerBlock\": 4\n },\n \"rgba8uint\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"uint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": true,\n \"readWriteStorage\": false,\n \"bytes\": 4\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 4,\n \"alignment\": 1\n },\n \"multisample\": true,\n \"bytesPerBlock\": 4\n },\n \"rgba8sint\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"sint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": true,\n \"readWriteStorage\": false,\n \"bytes\": 4\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 4,\n \"alignment\": 1\n },\n \"multisample\": true,\n \"bytesPerBlock\": 4\n },\n \"bgra8unorm\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 4\n },\n \"colorRender\": {\n \"blend\": true,\n \"resolve\": true,\n \"byteCost\": 8,\n \"alignment\": 1\n },\n \"multisample\": true,\n \"baseFormat\": \"bgra8unorm\",\n \"bytesPerBlock\": 4\n },\n \"bgra8unorm-srgb\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 4\n },\n \"colorRender\": {\n \"blend\": true,\n \"resolve\": true,\n \"byteCost\": 8,\n \"alignment\": 1\n },\n \"multisample\": true,\n \"baseFormat\": \"bgra8unorm\",\n \"bytesPerBlock\": 4\n },\n \"r16uint\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"uint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 2\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 2,\n \"alignment\": 2\n },\n \"multisample\": true,\n \"bytesPerBlock\": 2\n },\n \"r16sint\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"sint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 2\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 2,\n \"alignment\": 2\n },\n \"multisample\": true,\n \"bytesPerBlock\": 2\n },\n \"r16float\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 2\n },\n \"colorRender\": {\n \"blend\": true,\n \"resolve\": true,\n \"byteCost\": 2,\n \"alignment\": 2\n },\n \"multisample\": true,\n \"bytesPerBlock\": 2\n },\n \"rg16uint\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"uint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 4\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 4,\n \"alignment\": 2\n },\n \"multisample\": true,\n \"bytesPerBlock\": 4\n },\n \"rg16sint\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"sint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 4\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 4,\n \"alignment\": 2\n },\n \"multisample\": true,\n \"bytesPerBlock\": 4\n },\n \"rg16float\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 4\n },\n \"colorRender\": {\n \"blend\": true,\n \"resolve\": true,\n \"byteCost\": 4,\n \"alignment\": 2\n },\n \"multisample\": true,\n \"bytesPerBlock\": 4\n },\n \"rgba16uint\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"uint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": true,\n \"readWriteStorage\": false,\n \"bytes\": 8\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 8,\n \"alignment\": 2\n },\n \"multisample\": true,\n \"bytesPerBlock\": 8\n },\n \"rgba16sint\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"sint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": true,\n \"readWriteStorage\": false,\n \"bytes\": 8\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 8,\n \"alignment\": 2\n },\n \"multisample\": true,\n \"bytesPerBlock\": 8\n },\n \"rgba16float\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": true,\n \"readWriteStorage\": false,\n \"bytes\": 8\n },\n \"colorRender\": {\n \"blend\": true,\n \"resolve\": true,\n \"byteCost\": 8,\n \"alignment\": 2\n },\n \"multisample\": true,\n \"bytesPerBlock\": 8\n },\n \"r32uint\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"uint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": true,\n \"readWriteStorage\": true,\n \"bytes\": 4\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 4,\n \"alignment\": 4\n },\n \"multisample\": false,\n \"bytesPerBlock\": 4\n },\n \"r32sint\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"sint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": true,\n \"readWriteStorage\": true,\n \"bytes\": 4\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 4,\n \"alignment\": 4\n },\n \"multisample\": false,\n \"bytesPerBlock\": 4\n },\n \"r32float\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"unfilterable-float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": true,\n \"readWriteStorage\": true,\n \"bytes\": 4\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 4,\n \"alignment\": 4\n },\n \"multisample\": true,\n \"bytesPerBlock\": 4\n },\n \"rg32uint\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"uint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": true,\n \"readWriteStorage\": false,\n \"bytes\": 8\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 8,\n \"alignment\": 4\n },\n \"multisample\": false,\n \"bytesPerBlock\": 8\n },\n \"rg32sint\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"sint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": true,\n \"readWriteStorage\": false,\n \"bytes\": 8\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 8,\n \"alignment\": 4\n },\n \"multisample\": false,\n \"bytesPerBlock\": 8\n },\n \"rg32float\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"unfilterable-float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": true,\n \"readWriteStorage\": false,\n \"bytes\": 8\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 8,\n \"alignment\": 4\n },\n \"multisample\": false,\n \"bytesPerBlock\": 8\n },\n \"rgba32uint\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"uint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": true,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 16,\n \"alignment\": 4\n },\n \"multisample\": false,\n \"bytesPerBlock\": 16\n },\n \"rgba32sint\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"sint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": true,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 16,\n \"alignment\": 4\n },\n \"multisample\": false,\n \"bytesPerBlock\": 16\n },\n \"rgba32float\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"unfilterable-float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": true,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 16,\n \"alignment\": 4\n },\n \"multisample\": false,\n \"bytesPerBlock\": 16\n },\n \"rgb10a2uint\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"uint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 4\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 8,\n \"alignment\": 4\n },\n \"multisample\": true,\n \"bytesPerBlock\": 4\n },\n \"rgb10a2unorm\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 4\n },\n \"colorRender\": {\n \"blend\": true,\n \"resolve\": true,\n \"byteCost\": 8,\n \"alignment\": 4\n },\n \"multisample\": true,\n \"bytesPerBlock\": 4\n },\n \"rg11b10ufloat\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 4\n },\n \"multisample\": false,\n \"bytesPerBlock\": 4\n },\n \"rgb9e5ufloat\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 4\n },\n \"multisample\": false,\n \"bytesPerBlock\": 4\n },\n \"stencil8\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"stencil\": {\n \"type\": \"uint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 1\n },\n \"multisample\": true,\n \"bytesPerBlock\": 1\n },\n \"depth16unorm\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"depth\": {\n \"type\": \"depth\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 2\n },\n \"multisample\": true,\n \"bytesPerBlock\": 2\n },\n \"depth32float\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"depth\": {\n \"type\": \"depth\",\n \"copySrc\": true,\n \"copyDst\": false,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 4\n },\n \"multisample\": true,\n \"bytesPerBlock\": 4\n },\n \"depth24plus\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"depth\": {\n \"type\": \"depth\",\n \"copySrc\": false,\n \"copyDst\": false,\n \"storage\": false,\n \"readWriteStorage\": false\n },\n \"multisample\": true\n },\n \"depth24plus-stencil8\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"depth\": {\n \"type\": \"depth\",\n \"copySrc\": false,\n \"copyDst\": false,\n \"storage\": false,\n \"readWriteStorage\": false\n },\n \"stencil\": {\n \"type\": \"uint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 1\n },\n \"multisample\": true\n },\n \"depth32float-stencil8\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"depth\": {\n \"type\": \"depth\",\n \"copySrc\": true,\n \"copyDst\": false,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 4\n },\n \"stencil\": {\n \"type\": \"uint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 1\n },\n \"multisample\": true,\n \"feature\": \"depth32float-stencil8\"\n },\n \"bc1-rgba-unorm\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 8\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-bc\",\n \"baseFormat\": \"bc1-rgba-unorm\",\n \"bytesPerBlock\": 8\n },\n \"bc1-rgba-unorm-srgb\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 8\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-bc\",\n \"baseFormat\": \"bc1-rgba-unorm\",\n \"bytesPerBlock\": 8\n },\n \"bc2-rgba-unorm\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-bc\",\n \"baseFormat\": \"bc2-rgba-unorm\",\n \"bytesPerBlock\": 16\n },\n \"bc2-rgba-unorm-srgb\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-bc\",\n \"baseFormat\": \"bc2-rgba-unorm\",\n \"bytesPerBlock\": 16\n },\n \"bc3-rgba-unorm\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-bc\",\n \"baseFormat\": \"bc3-rgba-unorm\",\n \"bytesPerBlock\": 16\n },\n \"bc3-rgba-unorm-srgb\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-bc\",\n \"baseFormat\": \"bc3-rgba-unorm\",\n \"bytesPerBlock\": 16\n },\n \"bc4-r-unorm\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 8\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-bc\",\n \"bytesPerBlock\": 8\n },\n \"bc4-r-snorm\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 8\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-bc\",\n \"bytesPerBlock\": 8\n },\n \"bc5-rg-unorm\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-bc\",\n \"bytesPerBlock\": 16\n },\n \"bc5-rg-snorm\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-bc\",\n \"bytesPerBlock\": 16\n },\n \"bc6h-rgb-ufloat\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-bc\",\n \"bytesPerBlock\": 16\n },\n \"bc6h-rgb-float\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-bc\",\n \"bytesPerBlock\": 16\n },\n \"bc7-rgba-unorm\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-bc\",\n \"baseFormat\": \"bc7-rgba-unorm\",\n \"bytesPerBlock\": 16\n },\n \"bc7-rgba-unorm-srgb\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-bc\",\n \"baseFormat\": \"bc7-rgba-unorm\",\n \"bytesPerBlock\": 16\n },\n \"etc2-rgb8unorm\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 8\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-etc2\",\n \"baseFormat\": \"etc2-rgb8unorm\",\n \"bytesPerBlock\": 8\n },\n \"etc2-rgb8unorm-srgb\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 8\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-etc2\",\n \"baseFormat\": \"etc2-rgb8unorm\",\n \"bytesPerBlock\": 8\n },\n \"etc2-rgb8a1unorm\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 8\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-etc2\",\n \"baseFormat\": \"etc2-rgb8a1unorm\",\n \"bytesPerBlock\": 8\n },\n \"etc2-rgb8a1unorm-srgb\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 8\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-etc2\",\n \"baseFormat\": \"etc2-rgb8a1unorm\",\n \"bytesPerBlock\": 8\n },\n \"etc2-rgba8unorm\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-etc2\",\n \"baseFormat\": \"etc2-rgba8unorm\",\n \"bytesPerBlock\": 16\n },\n \"etc2-rgba8unorm-srgb\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-etc2\",\n \"baseFormat\": \"etc2-rgba8unorm\",\n \"bytesPerBlock\": 16\n },\n \"eac-r11unorm\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 8\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-etc2\",\n \"bytesPerBlock\": 8\n },\n \"eac-r11snorm\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 8\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-etc2\",\n \"bytesPerBlock\": 8\n },\n \"eac-rg11unorm\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-etc2\",\n \"bytesPerBlock\": 16\n },\n \"eac-rg11snorm\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-etc2\",\n \"bytesPerBlock\": 16\n },\n \"astc-4x4-unorm\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-4x4-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-4x4-unorm-srgb\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-4x4-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-5x4-unorm\": {\n \"blockWidth\": 5,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-5x4-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-5x4-unorm-srgb\": {\n \"blockWidth\": 5,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-5x4-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-5x5-unorm\": {\n \"blockWidth\": 5,\n \"blockHeight\": 5,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-5x5-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-5x5-unorm-srgb\": {\n \"blockWidth\": 5,\n \"blockHeight\": 5,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-5x5-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-6x5-unorm\": {\n \"blockWidth\": 6,\n \"blockHeight\": 5,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-6x5-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-6x5-unorm-srgb\": {\n \"blockWidth\": 6,\n \"blockHeight\": 5,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-6x5-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-6x6-unorm\": {\n \"blockWidth\": 6,\n \"blockHeight\": 6,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-6x6-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-6x6-unorm-srgb\": {\n \"blockWidth\": 6,\n \"blockHeight\": 6,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-6x6-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-8x5-unorm\": {\n \"blockWidth\": 8,\n \"blockHeight\": 5,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-8x5-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-8x5-unorm-srgb\": {\n \"blockWidth\": 8,\n \"blockHeight\": 5,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-8x5-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-8x6-unorm\": {\n \"blockWidth\": 8,\n \"blockHeight\": 6,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-8x6-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-8x6-unorm-srgb\": {\n \"blockWidth\": 8,\n \"blockHeight\": 6,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-8x6-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-8x8-unorm\": {\n \"blockWidth\": 8,\n \"blockHeight\": 8,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-8x8-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-8x8-unorm-srgb\": {\n \"blockWidth\": 8,\n \"blockHeight\": 8,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-8x8-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-10x5-unorm\": {\n \"blockWidth\": 10,\n \"blockHeight\": 5,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-10x5-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-10x5-unorm-srgb\": {\n \"blockWidth\": 10,\n \"blockHeight\": 5,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-10x5-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-10x6-unorm\": {\n \"blockWidth\": 10,\n \"blockHeight\": 6,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-10x6-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-10x6-unorm-srgb\": {\n \"blockWidth\": 10,\n \"blockHeight\": 6,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-10x6-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-10x8-unorm\": {\n \"blockWidth\": 10,\n \"blockHeight\": 8,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-10x8-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-10x8-unorm-srgb\": {\n \"blockWidth\": 10,\n \"blockHeight\": 8,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-10x8-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-10x10-unorm\": {\n \"blockWidth\": 10,\n \"blockHeight\": 10,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-10x10-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-10x10-unorm-srgb\": {\n \"blockWidth\": 10,\n \"blockHeight\": 10,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-10x10-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-12x10-unorm\": {\n \"blockWidth\": 12,\n \"blockHeight\": 10,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-12x10-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-12x10-unorm-srgb\": {\n \"blockWidth\": 12,\n \"blockHeight\": 10,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-12x10-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-12x12-unorm\": {\n \"blockWidth\": 12,\n \"blockHeight\": 12,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-12x12-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-12x12-unorm-srgb\": {\n \"blockWidth\": 12,\n \"blockHeight\": 12,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-12x12-unorm\",\n \"bytesPerBlock\": 16\n }\n};\n","import {\n kAllTextureFormatInfo\n} from './format-info.js';\n\nfunction bitmaskToString(bitNames: Record, mask: number) {\n const names = [];\n for (const [k, v] of Object.entries(bitNames)) {\n if (mask & v) {\n names.push(k);\n }\n }\n return names.join('|');\n}\n\nexport function bufferUsageToString(mask: number) {\n return bitmaskToString(GPUBufferUsage as unknown as Record, mask);\n}\n\nexport function textureUsageToString(mask: number) {\n return bitmaskToString(GPUTextureUsage as unknown as Record, mask);\n}\n\nexport function unreachable(msg?: string): never {\n throw Error(`unreachable: ${msg || ''}`);\n}\n\nexport function roundUp(v: number, align: number) {\n return Math.ceil(v / align) * align;\n}\n\nexport function arraysEqual(a: T[], b: T[]) {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; ++i) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function trimNulls(a: (T | null)[]) {\n const ndx = a.findLastIndex(v => v !== null);\n return a.slice(0, ndx + 1);\n}\n\nexport function reifyGPUOrigin3D(e?: GPUOrigin3D) {\n e = e || [];\n const d = e as GPUOrigin3DDict;\n if (typeof d.x === 'number' || typeof d.y === 'number' || typeof d.z === 'number') {\n return [\n d.x ?? 0,\n d.y ?? 0,\n d.z ?? 0,\n ];\n }\n\n const a = [...(e as number[])];\n return [\n a[0] ?? 0,\n a[1] ?? 0,\n a[2] ?? 0,\n ];\n}\n\nexport function reifyGPUExtent3D(e: GPUExtent3D) {\n const d = e as GPUExtent3DDict;\n if (typeof d.width === 'number') {\n return [\n d.width,\n d.height ?? 1,\n d.depthOrArrayLayers ?? 1,\n ];\n }\n\n const a = [...(e as number[])];\n return [\n a[0],\n a[1] ?? 1,\n a[2] ?? 1,\n ];\n}\n\nexport function logicalMipLevelSpecificTextureExtent(texture: GPUTexture, mipLevel: number) {\n switch (texture.dimension) {\n case '1d':\n return [\n Math.max(1, texture.width >> mipLevel),\n 1,\n 1,\n ];\n case '2d':\n return [\n Math.max(1, texture.width >> mipLevel),\n Math.max(1, texture.height >> mipLevel),\n texture.depthOrArrayLayers,\n ];\n case '3d':\n return [\n Math.max(1, texture.width >> mipLevel),\n Math.max(1, texture.height >> mipLevel),\n Math.max(1, texture.depthOrArrayLayers >> mipLevel),\n ];\n default:\n unreachable();\n return [];\n }\n}\n\nexport function physicalMipLevelSpecificTextureExtent(texture: GPUTexture, mipLevel: number) {\n const {\n blockWidth,\n blockHeight,\n } = kAllTextureFormatInfo[texture.format];\n\n const [width, height, depthOrArrayLayers] = logicalMipLevelSpecificTextureExtent(texture, mipLevel);\n\n switch (texture.dimension) {\n case '1d':\n return [\n roundUp(width, blockWidth),\n 1,\n 1,\n ];\n case '2d':\n case '3d':\n return [\n roundUp(width, blockWidth),\n roundUp(height, blockHeight),\n depthOrArrayLayers,\n ];\n default:\n unreachable();\n return [];\n }\n}","import {\n bufferUsageToString,\n textureUsageToString,\n} from './utils.js';\nexport type LabeledObject =\n | GPUBindGroup\n | GPUBindGroupLayout\n | GPUBuffer\n | GPUCommandEncoder\n | GPUComputePassEncoder\n | GPUComputePipeline\n | GPUDevice\n | GPUQuerySet\n | GPUPipelineLayout\n | GPURenderPassEncoder\n | GPURenderPipeline\n | GPUShaderModule\n | GPUSampler\n | GPUTexture\n | GPUTextureView;\n\nfunction getProperties(o: any) {\n const keyValues = [];\n for (const k in o) {\n const v = o[k];\n if (typeof v !== 'function') {\n if (o instanceof GPUBuffer && k === 'usage') {\n keyValues.push(`${k}: ${v} (${bufferUsageToString(v)})`);\n } else if (o instanceof GPUTexture && k === 'usage') {\n keyValues.push(`${k}: ${v} (${textureUsageToString(v)})`);\n } else {\n keyValues.push(`${k}: ${JSON.stringify(v)}`);\n }\n }\n }\n return keyValues.join(', ');\n}\n\nexport function objToString(o: LabeledObject) {\n return `${o.constructor.name}(${o.label}){${getProperties(o)}}`;\n}\n\nexport function emitError(msg: string, objs: LabeledObject[] = []) {\n throw new Error(`${msg}\\n${(objs).map(o => objToString(o)).join('\\n')}`);\n}\n\nexport function assert(condition: boolean, msg?: string | (() => string), resources?: any[]): asserts condition {\n if (!condition) {\n const lines = (resources || []).map(r => ` ${objToString(r)}`).join('\\n');\n const m = msg ? (typeof msg === 'string' ? msg : msg()) : '';\n emitError(`${m}${lines ? `\\n${lines}` : ''}`);\n }\n}\n","/**\n * Adds a wrapper function to a class method that gets called before the actual function\n */\nexport function wrapFunctionBefore) => any>>(\n API: { prototype: T },\n fnName: K, fn: (args: Parameters) => void) {\n const origFn = API.prototype[fnName];\n API.prototype[fnName] = function (this: T, ...args: Parameters) {\n fn.call(this, args);\n return origFn.call(this, ...args);\n } as any;\n}\n\n/**\n * Adds a wrapper function to a class method that gets called after the actual function\n */\nexport function wrapFunctionAfter) => any>>(\n API: { prototype: T },\n fnName: K, fn: (obj: ReturnType, args: Parameters) => void) {\n const origFn = API.prototype[fnName];\n API.prototype[fnName] = function (this: T, ...args: Parameters) {\n const result = origFn.call(this, ...args);\n fn.call(this, result, args);\n return result;\n } as any;\n}\n\n/**\n * Adds a wrapper function to an async class method that gets called after the actual function\n */\nexport function wrapAsyncFunctionAfter) => any>>(\n API: { prototype: T },\n fnName: K, fn: (obj: Awaited>, args: Parameters) => void) {\n const origFn = API.prototype[fnName];\n API.prototype[fnName] = async function (this: T, ...args: Parameters) {\n const result = await origFn.call(this, ...args);\n fn.call(this, result, args);\n return result;\n } as any;\n}","import { BindGroupLayoutDescriptorPlus } from './pipeline.js';\nimport {\n assert,\n objToString,\n} from './validation.js';\nimport {\n wrapFunctionBefore,\n} from './wrap-api.js';\n\nexport type DeviceResource =\n | GPUBindGroup\n | GPUBindGroupLayout\n | GPUBuffer\n | GPUCanvasContext\n | GPUCommandEncoder\n | GPUComputePassEncoder\n | GPUComputePipeline\n | GPUExternalTexture\n | GPUPipelineLayout\n | GPUQuerySet\n | GPUQueue\n | GPURenderBundle\n | GPURenderBundleEncoder\n | GPURenderPassEncoder\n | GPURenderPipeline\n | GPUSampler\n | GPUShaderModule\n | GPUTexture\n\nexport const s_objToDevice = new WeakMap();\n\nexport type Destroyable = GPUTexture | GPUBuffer | GPUQuerySet | GPUDevice;\n\nconst s_destroyedResource = new WeakSet();\n\nexport function assertNotDestroyed(obj: Destroyable) {\n assert(!s_destroyedResource.has(obj), () => `${objToString(obj)} is destroyed`);\n}\n\nlet s_nextId = 1;\nconst s_objectToId = new WeakMap();\nexport function getIdForObject(obj: DeviceResource) {\n let id = s_objectToId.get(obj);\n if (id) {\n return id;\n }\n id = s_nextId++;\n s_objectToId.set(obj, id);\n return id;\n}\n\nwrapFunctionBefore(GPUBuffer, 'destroy', function (this: GPUBuffer) {\n s_destroyedResource.add(this);\n});\n\nwrapFunctionBefore(GPUTexture, 'destroy', function (this: GPUTexture) {\n s_destroyedResource.add(this);\n});\n\nwrapFunctionBefore(GPUQuerySet, 'destroy', function (this: GPUQuerySet) {\n s_destroyedResource.add(this);\n});\n\nwrapFunctionBefore(GPUDevice, 'destroy', function (this: GPUDevice) {\n s_destroyedResource.add(this);\n});\n\nexport type BindGroupInfo = {\n layoutPlus: BindGroupLayoutDescriptorPlus,\n entries: GPUBindGroupEntry[],\n};\n\nexport const s_bindGroupToInfo = new WeakMap();\n","import {\n s_objToDevice\n} from './shared-state.js';\n\nconst deviceToErrorScopeStack: WeakMap[]}[]> = new WeakMap();\nconst origPushErrorScope = GPUDevice.prototype.pushErrorScope;\nconst origPopErrorScope = GPUDevice.prototype.popErrorScope;\n\n/*\nfunction getFilterForGPUError(error: GPUError): GPUErrorFilter {\n if (error instanceof GPUValidationError) {\n return 'validation';\n }\n if (error instanceof GPUOutOfMemoryError) {\n return 'out-of-memory';\n }\n if (error instanceof GPUInternalError) {\n return 'internal';\n }\n throw new Error('unknown GPUError type');\n}\n*/\n\ntype AnyFunction = (...args: any[]) => any;\n\nfunction errorWrapper(this: any, device: GPUDevice, fnName: string, origFn: T, ...args: Parameters): ReturnType {\n const stack = new Error();\n origPushErrorScope.call(device, 'validation');\n const result = origFn.call(this, ...args);\n\n const errorScopeStack = deviceToErrorScopeStack.get(device)!;\n const currentErrorScope = errorScopeStack.findLast(scope => scope.filter === 'validation');\n\n const promise = origPopErrorScope.call(device)\n .then(error => {\n // If there was a currentErrorScope when we added pushed then remove our promise\n if (currentErrorScope) {\n const ndx = currentErrorScope.errors.indexOf(promise);\n if (ndx) {\n currentErrorScope.errors.splice(ndx, 1);\n }\n } else {\n // there was no currentErrorScope so emit the error\n if (error) {\n device.dispatchEvent(new GPUUncapturedErrorEvent('uncapturederror', { error }));\n }\n }\n\n // show it\n if (error) {\n console.error('WebGPU ERROR in:', fnName, args);\n console.error(error.message);\n console.error(stack.stack);\n }\n\n // return it (as a promise)\n return error;\n });\n\n if (currentErrorScope) {\n currentErrorScope.errors.push(promise);\n }\n return result;\n}\n\nfunction addErrorWrapper(api: T, fnName: keyof T['prototype'] & PropertyKey): void {\n const origFn = api.prototype[fnName] as AnyFunction;\n api.prototype[fnName] = function (this: any, ...args: any[]) {\n return errorWrapper.call(this, this, fnName.toString(), origFn, ...args);\n };\n}\n\nfunction addErrorWrapperWithDevice(api: T, fnName: keyof T['prototype'] & PropertyKey): void {\n const origFn = api.prototype[fnName] as AnyFunction;\n api.prototype[fnName] = function (this: any, ...args: any[]) {\n const device = s_objToDevice.get(this as GPUQueue)!;\n return errorWrapper.call(this, device, fnName.toString(), origFn, ...args);\n };\n}\n\n/**\n * given a class returns all the method names.\n */\nfunction getAPIFunctionNames(api: T) {\n return Object.entries(Object.getOwnPropertyDescriptors(api.prototype))\n .filter(([, info]) => info.enumerable && typeof info.value === 'function')\n .map(([name]) => name as keyof T['prototype'] & PropertyKey);\n}\n\nconst skip = new Set([\n 'pushErrorScope',\n 'popErrorScope',\n 'destroy',\n]);\ngetAPIFunctionNames(GPUDevice)\n .filter(n => !skip.has(n))\n .forEach(n => addErrorWrapper(GPUDevice, n));\ngetAPIFunctionNames(GPUQueue)\n .forEach(n => addErrorWrapperWithDevice(GPUQueue, n));\n\nGPUDevice.prototype.pushErrorScope = (function (origFn) {\n return function (this: GPUDevice, filter: GPUErrorFilter) {\n origFn.call(this, filter);\n const errorScopeStack = deviceToErrorScopeStack.get(this);\n errorScopeStack!.push({filter, errors: []});\n };\n})(GPUDevice.prototype.pushErrorScope);\n\nGPUDevice.prototype.popErrorScope = (function (origFn) {\n return function (this: GPUDevice) {\n const errorScopeStack = deviceToErrorScopeStack.get(this);\n const errorScope = errorScopeStack!.pop();\n if (errorScope === undefined) {\n throw new DOMException('popErrorScope called on empty error scope stack', 'OperationError');\n }\n const errPromise = origFn.call(this);\n return errorScope.errors.pop() ?? errPromise;\n };\n})(GPUDevice.prototype.popErrorScope);\n\nGPUAdapter.prototype.requestDevice = (function (origFn) {\n return async function (this: GPUAdapter, ...args) {\n const device = await origFn.call(this, ...args);\n if (device) {\n device.addEventListener('uncapturederror', function (e) {\n console.error((e as GPUUncapturedErrorEvent).error.message);\n });\n deviceToErrorScopeStack.set(device, []);\n s_objToDevice.set(device.queue, device);\n }\n return device;\n };\n})(GPUAdapter.prototype.requestDevice);\n\n","/* webgpu-utils@1.8.2, license MIT */\nconst roundUpToMultipleOf = (v, multiple) => (((v + multiple - 1) / multiple) | 0) * multiple;\nfunction keysOf(obj) {\n return Object.keys(obj);\n}\nfunction range(count, fn) {\n return new Array(count).fill(0).map((_, i) => fn(i));\n}\n\nclass TypedArrayViewGenerator {\n arrayBuffer;\n byteOffset;\n constructor(sizeInBytes) {\n this.arrayBuffer = new ArrayBuffer(sizeInBytes);\n this.byteOffset = 0;\n }\n align(alignment) {\n this.byteOffset = roundUpToMultipleOf(this.byteOffset, alignment);\n }\n pad(numBytes) {\n this.byteOffset += numBytes;\n }\n getView(Ctor, numElements) {\n const view = new Ctor(this.arrayBuffer, this.byteOffset, numElements);\n this.byteOffset += view.byteLength;\n return view;\n }\n}\nfunction subarray(arr, offset, length) {\n return arr.subarray(offset, offset + length);\n}\n// TODO: fix better?\nconst isTypedArray = (arr) => arr && typeof arr.length === 'number' && arr.buffer instanceof ArrayBuffer && typeof arr.byteLength === 'number';\n\nconst createTypeDefs = (defs) => defs;\nconst b = createTypeDefs({\n i32: { numElements: 1, align: 4, size: 4, type: 'i32', View: Int32Array },\n u32: { numElements: 1, align: 4, size: 4, type: 'u32', View: Uint32Array },\n f32: { numElements: 1, align: 4, size: 4, type: 'f32', View: Float32Array },\n f16: { numElements: 1, align: 2, size: 2, type: 'u16', View: Uint16Array },\n vec2f: { numElements: 2, align: 8, size: 8, type: 'f32', View: Float32Array },\n vec2i: { numElements: 2, align: 8, size: 8, type: 'i32', View: Int32Array },\n vec2u: { numElements: 2, align: 8, size: 8, type: 'u32', View: Uint32Array },\n vec2h: { numElements: 2, align: 4, size: 4, type: 'u16', View: Uint16Array },\n vec3i: { numElements: 3, align: 16, size: 12, type: 'i32', View: Int32Array },\n vec3u: { numElements: 3, align: 16, size: 12, type: 'u32', View: Uint32Array },\n vec3f: { numElements: 3, align: 16, size: 12, type: 'f32', View: Float32Array },\n vec3h: { numElements: 3, align: 8, size: 6, type: 'u16', View: Uint16Array },\n vec4i: { numElements: 4, align: 16, size: 16, type: 'i32', View: Int32Array },\n vec4u: { numElements: 4, align: 16, size: 16, type: 'u32', View: Uint32Array },\n vec4f: { numElements: 4, align: 16, size: 16, type: 'f32', View: Float32Array },\n vec4h: { numElements: 4, align: 8, size: 8, type: 'u16', View: Uint16Array },\n // AlignOf(vecR)\tSizeOf(array)\n mat2x2f: { numElements: 4, align: 8, size: 16, type: 'f32', View: Float32Array },\n mat2x2h: { numElements: 4, align: 4, size: 8, type: 'u16', View: Uint16Array },\n mat3x2f: { numElements: 6, align: 8, size: 24, type: 'f32', View: Float32Array },\n mat3x2h: { numElements: 6, align: 4, size: 12, type: 'u16', View: Uint16Array },\n mat4x2f: { numElements: 8, align: 8, size: 32, type: 'f32', View: Float32Array },\n mat4x2h: { numElements: 8, align: 4, size: 16, type: 'u16', View: Uint16Array },\n mat2x3f: { numElements: 8, align: 16, size: 32, pad: [3, 1], type: 'f32', View: Float32Array },\n mat2x3h: { numElements: 8, align: 8, size: 16, pad: [3, 1], type: 'u16', View: Uint16Array },\n mat3x3f: { numElements: 12, align: 16, size: 48, pad: [3, 1], type: 'f32', View: Float32Array },\n mat3x3h: { numElements: 12, align: 8, size: 24, pad: [3, 1], type: 'u16', View: Uint16Array },\n mat4x3f: { numElements: 16, align: 16, size: 64, pad: [3, 1], type: 'f32', View: Float32Array },\n mat4x3h: { numElements: 16, align: 8, size: 32, pad: [3, 1], type: 'u16', View: Uint16Array },\n mat2x4f: { numElements: 8, align: 16, size: 32, type: 'f32', View: Float32Array },\n mat2x4h: { numElements: 8, align: 8, size: 16, type: 'u16', View: Uint16Array },\n mat3x4f: { numElements: 12, align: 16, size: 48, pad: [3, 1], type: 'f32', View: Float32Array },\n mat3x4h: { numElements: 12, align: 8, size: 24, pad: [3, 1], type: 'u16', View: Uint16Array },\n mat4x4f: { numElements: 16, align: 16, size: 64, type: 'f32', View: Float32Array },\n mat4x4h: { numElements: 16, align: 8, size: 32, type: 'u16', View: Uint16Array },\n // Note: At least as of WGSL V1 you can not create a bool for uniform or storage.\n // You can only create one in an internal struct. But, this code generates\n // views of structs and it needs to not fail if the struct has a bool\n bool: { numElements: 0, align: 1, size: 0, type: 'bool', View: Uint32Array },\n});\nconst kWGSLTypeInfo = createTypeDefs({\n ...b,\n 'atomic': b.i32,\n 'atomic': b.u32,\n 'vec2': b.vec2i,\n 'vec2': b.vec2u,\n 'vec2': b.vec2f,\n 'vec2': b.vec2h,\n 'vec3': b.vec3i,\n 'vec3': b.vec3u,\n 'vec3': b.vec3f,\n 'vec3': b.vec3h,\n 'vec4': b.vec4i,\n 'vec4': b.vec4u,\n 'vec4': b.vec4f,\n 'vec4': b.vec4h,\n 'mat2x2': b.mat2x2f,\n 'mat2x2': b.mat2x2h,\n 'mat3x2': b.mat3x2f,\n 'mat3x2': b.mat3x2h,\n 'mat4x2': b.mat4x2f,\n 'mat4x2': b.mat4x2h,\n 'mat2x3': b.mat2x3f,\n 'mat2x3': b.mat2x3h,\n 'mat3x3': b.mat3x3f,\n 'mat3x3': b.mat3x3h,\n 'mat4x3': b.mat4x3f,\n 'mat4x3': b.mat4x3h,\n 'mat2x4': b.mat2x4f,\n 'mat2x4': b.mat2x4h,\n 'mat3x4': b.mat3x4f,\n 'mat3x4': b.mat3x4h,\n 'mat4x4': b.mat4x4f,\n 'mat4x4': b.mat4x4h,\n});\nconst kWGSLTypes = keysOf(kWGSLTypeInfo);\n\n/**\n * Set which intrinsic types to make views for.\n *\n * Example:\n *\n * Given a an array of intrinsics like this\n * `array`\n *\n * The default is to create a single `Float32Array(4 * 200)`\n * because creating 200 `Float32Array` views is not usually\n * what you want.\n *\n * If you do want individual views then you'd call\n * `setIntrinsicsToView(['vec3f'])` and now you get\n * an array of 200 `Float32Array`s.\n *\n * Note: `setIntrinsicsToView` always sets ALL types. The list you\n * pass it is the types you want views created for, all other types\n * will be reset to do the default. In other words\n *\n * ```js\n * setIntrinsicsToView(['vec3f'])\n * setIntrinsicsToView(['vec2f'])\n * ```\n *\n * Only `vec2f` will have views created. `vec3f` has been reset to the default by\n * the second call\n *\n * You can pass in `true` as the 2nd parameter to make it set which types\n * to flatten and all others will be set to have views created. For example\n * to expand all types would be `setIntrinsicsToView([], true)`. To expand\n * all except `f32` would be `setIntrinsicsToView(['f32'], true)`.\n *\n * To reset all types to the default call it with no arguments\n *\n * @param types array of types to make views for\n * @param flatten whether to flatten or expand the specified types.\n */\nfunction setIntrinsicsToView(types = [], flatten) {\n // we need to track what we've viewed because for example `vec3f` references\n // the same info as `vec3` so we'd set one and reset the other.\n const visited = new Set();\n for (const type of kWGSLTypes) {\n const info = kWGSLTypeInfo[type];\n if (!visited.has(info)) {\n visited.add(info);\n info.flatten = types.includes(type) ? flatten : !flatten;\n }\n }\n}\nsetIntrinsicsToView();\n// This needs to be fixed! 😱\nfunction getSizeOfTypeDef(typeDef) {\n const asArrayDef = typeDef;\n const elementType = asArrayDef.elementType;\n if (elementType) {\n return asArrayDef.size;\n /*\n if (isIntrinsic(elementType)) {\n const asIntrinsicDef = elementType as IntrinsicDefinition;\n const { align } = typeInfo[asIntrinsicDef.type];\n return roundUpToMultipleOf(typeDef.size, align) * asArrayDef.numElements;\n } else {\n return asArrayDef.numElements * getSizeOfTypeDef(elementType);\n }\n */\n }\n else {\n const asStructDef = typeDef;\n const numElements = asArrayDef.numElements || 1;\n if (asStructDef.fields) {\n return typeDef.size * numElements;\n }\n else {\n const asIntrinsicDef = typeDef;\n const { align } = kWGSLTypeInfo[asIntrinsicDef.type];\n return numElements > 1\n ? roundUpToMultipleOf(typeDef.size, align) * numElements\n : typeDef.size;\n }\n }\n}\n// If numElements is undefined this is NOT an array. If it is defined then it IS an array\n// Sizes for arrays are different than sizes for non-arrays. Example\n// a vec3f non array is Float32Array(3)\n// a vec3f array of 2 is Float32Array(4 * 2)\n// a vec3f array of 1 is Float32Array(4 * 1)\nfunction makeIntrinsicTypedArrayView(typeDef, buffer, baseOffset, numElements) {\n const { size, type } = typeDef;\n try {\n const { View, align } = kWGSLTypeInfo[type];\n const isArray = numElements !== undefined;\n const sizeInBytes = isArray\n ? roundUpToMultipleOf(size, align)\n : size;\n const baseNumElements = sizeInBytes / View.BYTES_PER_ELEMENT;\n const effectiveNumElements = isArray\n ? (numElements === 0\n ? (buffer.byteLength - baseOffset) / sizeInBytes\n : numElements)\n : 1;\n return new View(buffer, baseOffset, baseNumElements * effectiveNumElements);\n }\n catch {\n throw new Error(`unknown type: ${type}`);\n }\n}\nfunction isIntrinsic(typeDef) {\n return !typeDef.fields &&\n !typeDef.elementType;\n}\n/**\n * Creates a set of named TypedArray views on an ArrayBuffer. If you don't\n * pass in an ArrayBuffer, one will be created. If you're using an unsized\n * array then you must pass in your own arraybuffer\n *\n * Example:\n *\n * ```js\n * const code = `\n * struct Stuff {\n * direction: vec3f,\n * strength: f32,\n * matrix: mat4x4f,\n * };\n * @group(0) @binding(0) var uni: Stuff;\n * `;\n * const defs = makeShaderDataDefinitions(code);\n * const views = makeTypedArrayViews(devs.uniforms.uni.typeDefinition);\n * ```\n *\n * views would effectively be\n *\n * ```js\n * views = {\n * direction: Float32Array(arrayBuffer, 0, 3),\n * strength: Float32Array(arrayBuffer, 3, 4),\n * matrix: Float32Array(arraybuffer, 4, 20),\n * };\n * ```\n *\n * You can use the views directly or you can use @link {setStructuredView}\n *\n * @param typeDef Definition of the various types of views.\n * @param arrayBuffer Optional ArrayBuffer to use (if one provided one will be created)\n * @param offset Optional offset in existing ArrayBuffer to start the views.\n * @returns A bunch of named TypedArray views and the ArrayBuffer\n */\nfunction makeTypedArrayViews(typeDef, arrayBuffer, offset) {\n const baseOffset = offset || 0;\n const buffer = arrayBuffer || new ArrayBuffer(getSizeOfTypeDef(typeDef));\n const makeViews = (typeDef, baseOffset) => {\n const asArrayDef = typeDef;\n const elementType = asArrayDef.elementType;\n if (elementType) {\n // TODO: Should be optional? Per Type? Depth set? Per field?\n // The issue is, if we have `array` we don't likely\n // want 1000 `Float32Array(4)` views. We want 1 `Float32Array(1000 * 4)` view.\n // On the other hand, if we have `array` the maybe we do want\n // 10 `Float32Array(16)` views since you might want to do\n // `mat4.perspective(fov, aspect, near, far, foo.bar.arrayOf10Mat4s[3])`;\n if (isIntrinsic(elementType) && kWGSLTypeInfo[elementType.type].flatten) {\n return makeIntrinsicTypedArrayView(elementType, buffer, baseOffset, asArrayDef.numElements);\n }\n else {\n const { size } = getSizeAndAlignmentOfUnsizedArrayElementOfTypeDef(typeDef);\n const effectiveNumElements = asArrayDef.numElements === 0\n ? (buffer.byteLength - baseOffset) / size\n : asArrayDef.numElements;\n return range(effectiveNumElements, i => makeViews(elementType, baseOffset + size * i));\n }\n }\n else if (typeof typeDef === 'string') {\n throw Error('unreachable');\n }\n else {\n const fields = typeDef.fields;\n if (fields) {\n const views = {};\n for (const [name, { type, offset }] of Object.entries(fields)) {\n views[name] = makeViews(type, baseOffset + offset);\n }\n return views;\n }\n else {\n return makeIntrinsicTypedArrayView(typeDef, buffer, baseOffset);\n }\n }\n };\n return { views: makeViews(typeDef, baseOffset), arrayBuffer: buffer };\n}\n/**\n * Given a set of TypeArrayViews and matching JavaScript data\n * sets the content of the views.\n *\n * Example:\n *\n * ```js\n * const code = `\n * struct Stuff {\n * direction: vec3f,\n * strength: f32,\n * matrix: mat4x4f,\n * };\n * @group(0) @binding(0) var uni: Stuff;\n * `;\n * const defs = makeShaderDataDefinitions(code);\n * const views = makeTypedArrayViews(devs.uniforms.uni.typeDefinition);\n *\n * setStructuredViews({\n * direction: [1, 2, 3],\n * strength: 45,\n * matrix: [\n * 1, 0, 0, 0,\n * 0, 1, 0, 0,\n * 0, 0, 1, 0,\n * 0, 0, 0, 1,\n * ],\n * });\n * ```\n *\n * The code above will set the various views, which all point to different\n * locations within the same array buffer.\n *\n * See @link {makeTypedArrayViews}.\n *\n * @param data The new values\n * @param views TypedArray views as returned from {@link makeTypedArrayViews}\n */\nfunction setStructuredView(data, views) {\n if (data === undefined) {\n return;\n }\n else if (isTypedArray(views)) {\n const view = views;\n if (view.length === 1 && typeof data === 'number') {\n view[0] = data;\n }\n else {\n if (Array.isArray(data[0]) || isTypedArray(data[0])) {\n // complete hack!\n // there's no type data here so let's guess based on the user's data\n const dataLen = data[0].length;\n const stride = dataLen === 3 ? 4 : dataLen;\n for (let i = 0; i < data.length; ++i) {\n const offset = i * stride;\n view.set(data[i], offset);\n }\n }\n else {\n view.set(data);\n }\n }\n }\n else if (Array.isArray(views)) {\n const asArray = views;\n data.forEach((newValue, ndx) => {\n setStructuredView(newValue, asArray[ndx]);\n });\n }\n else {\n const asViews = views;\n for (const [key, newValue] of Object.entries(data)) {\n const view = asViews[key];\n if (view) {\n setStructuredView(newValue, view);\n }\n }\n }\n}\n/**\n * Given a VariableDefinition, create matching TypedArray views\n * @param varDef A VariableDefinition as returned from {@link makeShaderDataDefinitions}\n * @param arrayBuffer Optional ArrayBuffer for the views\n * @param offset Optional offset into the ArrayBuffer for the views\n * @returns TypedArray views for the various named fields of the structure as well\n * as a `set` function to make them easy to set, and the arrayBuffer\n */\nfunction makeStructuredView(varDef, arrayBuffer, offset = 0) {\n const asVarDef = varDef;\n const typeDef = asVarDef.group === undefined ? varDef : asVarDef.typeDefinition;\n const views = makeTypedArrayViews(typeDef, arrayBuffer, offset);\n return {\n ...views,\n set(data) {\n setStructuredView(data, views.views);\n },\n };\n}\nconst s_views = new WeakMap();\nfunction getViewsByCtor(arrayBuffer) {\n let viewsByCtor = s_views.get(arrayBuffer);\n if (!viewsByCtor) {\n viewsByCtor = new Map();\n s_views.set(arrayBuffer, viewsByCtor);\n }\n return viewsByCtor;\n}\nfunction getView(arrayBuffer, Ctor) {\n const viewsByCtor = getViewsByCtor(arrayBuffer);\n let view = viewsByCtor.get(Ctor);\n if (!view) {\n view = new Ctor(arrayBuffer);\n viewsByCtor.set(Ctor, view);\n }\n return view;\n}\n// Is this something like [1,2,3]?\nfunction isArrayLikeOfNumber(data) {\n return isTypedArray(data) || Array.isArray(data) && typeof data[0] === 'number';\n}\nfunction setIntrinsicFromArrayLikeOfNumber(typeDef, data, arrayBuffer, offset) {\n const asIntrinsicDefinition = typeDef;\n const type = kWGSLTypeInfo[asIntrinsicDefinition.type];\n const view = getView(arrayBuffer, type.View);\n const index = offset / view.BYTES_PER_ELEMENT;\n if (typeof data === 'number') {\n view[index] = data;\n }\n else {\n view.set(data, index);\n }\n}\n/**\n * Sets values on an existing array buffer from a TypeDefinition\n * @param typeDef A type definition provided by @link {makeShaderDataDefinitions}\n * @param data The source data\n * @param arrayBuffer The arrayBuffer who's data to set.\n * @param offset An offset in the arrayBuffer to start at.\n */\nfunction setTypedValues(typeDef, data, arrayBuffer, offset = 0) {\n const asArrayDef = typeDef;\n const elementType = asArrayDef.elementType;\n if (elementType) {\n // It's ArrayDefinition\n if (isIntrinsic(elementType)) {\n const asIntrinsicDef = elementType;\n if (isArrayLikeOfNumber(data)) {\n setIntrinsicFromArrayLikeOfNumber(asIntrinsicDef, data, arrayBuffer, offset);\n return;\n }\n }\n data.forEach((newValue, ndx) => {\n setTypedValues(elementType, newValue, arrayBuffer, offset + elementType.size * ndx);\n });\n return;\n }\n const asStructDef = typeDef;\n const fields = asStructDef.fields;\n if (fields) {\n // It's StructDefinition\n for (const [key, newValue] of Object.entries(data)) {\n const fieldDef = fields[key];\n if (fieldDef) {\n setTypedValues(fieldDef.type, newValue, arrayBuffer, offset + fieldDef.offset);\n }\n }\n }\n else {\n // It's IntrinsicDefinition\n setIntrinsicFromArrayLikeOfNumber(typeDef, data, arrayBuffer, offset);\n }\n}\n/**\n * Same as @link {setTypedValues} except it takes a @link {VariableDefinition}.\n * @param varDef A variable definition provided by @link {makeShaderDataDefinitions}\n * @param data The source data\n * @param arrayBuffer The arrayBuffer who's data to set.\n * @param offset An offset in the arrayBuffer to start at.\n */\nfunction setStructuredValues(varDef, data, arrayBuffer, offset = 0) {\n setTypedValues(varDef.typeDefinition, data, arrayBuffer, offset);\n}\nfunction getAlignmentOfTypeDef(typeDef) {\n const asArrayDef = typeDef;\n const elementType = asArrayDef.elementType;\n if (elementType) {\n return getAlignmentOfTypeDef(elementType);\n }\n const asStructDef = typeDef;\n const fields = asStructDef.fields;\n if (fields) {\n return Object.values(fields).reduce((max, { type }) => Math.max(max, getAlignmentOfTypeDef(type)), 0);\n }\n const { type } = typeDef;\n const { align } = kWGSLTypeInfo[type];\n return align;\n}\nfunction getSizeAndAlignmentOfUnsizedArrayElementOfTypeDef(typeDef) {\n const asArrayDef = typeDef;\n const elementType = asArrayDef.elementType;\n if (elementType) {\n const unalignedSize = elementType.size;\n const align = getAlignmentOfTypeDef(elementType);\n return {\n unalignedSize,\n align,\n size: roundUpToMultipleOf(unalignedSize, align),\n };\n }\n const asStructDef = typeDef;\n const fields = asStructDef.fields;\n if (fields) {\n const lastField = Object.values(fields).pop();\n if (lastField.type.size === 0) {\n return getSizeAndAlignmentOfUnsizedArrayElementOfTypeDef(lastField.type);\n }\n }\n return {\n size: 0,\n unalignedSize: 0,\n align: 1,\n };\n}\n/**\n * Returns the size, align, and unalignedSize of \"the\" unsized array element. Unsized arrays are only\n * allowed at the outer most level or the last member of a top level struct.\n *\n * Example:\n *\n * ```js\n * const code = `\n * struct Foo {\n * a: u32,\n * b: array,\n * };\n * @group(0) @binding(0) var f: Foo;\n * `;\n * const defs = makeShaderDataDefinitions(code);\n * const { size, align, unalignedSize } = getSizeAndAlignmentOfUnsizedArrayElement(\n * defs.storages.f);\n * // size = 16 (since you need to allocate 16 bytes per element)\n * // align = 16 (since vec3f needs to be aligned to 16 bytes)\n * // unalignedSize = 12 (since only 12 bytes are used for a vec3f)\n * ```\n *\n * Generally you only need size. Example:\n *\n * ```js\n * const code = `\n * struct Foo {\n * a: u32,\n * b: array,\n * };\n * @group(0) @binding(0) var f: Foo;\n * `;\n * const defs = makeShaderDataDefinitions(code);\n * const { size } = getSizeAndAlignmentOfUnsizedArrayElement(defs.storages.f);\n * const numElements = 10;\n * const views = makeStructuredViews(\n * defs.storages.f,\n * new ArrayBuffer(defs.storages.f.size + size * numElements));\n * ```\n *\n * @param varDef A variable definition provided by @link {makeShaderDataDefinitions}\n * @returns the size, align, and unalignedSize in bytes of the unsized array element in this type definition.\n * If there is no unsized array, size = 0.\n */\nfunction getSizeAndAlignmentOfUnsizedArrayElement(varDef) {\n const asVarDef = varDef;\n const typeDef = asVarDef.group === undefined ? varDef : asVarDef.typeDefinition;\n return getSizeAndAlignmentOfUnsizedArrayElementOfTypeDef(typeDef);\n}\n\nclass ParseContext {\n constructor() {\n this.constants = new Map();\n this.aliases = new Map();\n this.structs = new Map();\n }\n}\n/**\n * @class Node\n * @category AST\n * Base class for AST nodes parsed from a WGSL shader.\n */\nclass Node {\n constructor() { }\n get isAstNode() {\n return true;\n }\n get astNodeType() {\n return \"\";\n }\n evaluate(context) {\n throw new Error(\"Cannot evaluate node\");\n }\n evaluateString(context) {\n return this.evaluate(context).toString();\n }\n search(callback) { }\n searchBlock(block, callback) {\n if (block) {\n callback(_BlockStart.instance);\n for (const node of block) {\n if (node instanceof Array) {\n this.searchBlock(node, callback);\n }\n else {\n node.search(callback);\n }\n }\n callback(_BlockEnd.instance);\n }\n }\n}\n// For internal use only\nclass _BlockStart extends Node {\n}\n_BlockStart.instance = new _BlockStart();\n// For internal use only\nclass _BlockEnd extends Node {\n}\n_BlockEnd.instance = new _BlockEnd();\n/**\n * @class Statement\n * @extends Node\n * @category AST\n */\nclass Statement extends Node {\n constructor() {\n super();\n }\n}\n/**\n * @class Function\n * @extends Statement\n * @category AST\n */\nclass Function extends Statement {\n constructor(name, args, returnType, body, startLine, endLine) {\n super();\n this.calls = new Set();\n this.name = name;\n this.args = args;\n this.returnType = returnType;\n this.body = body;\n this.startLine = startLine;\n this.endLine = endLine;\n }\n get astNodeType() {\n return \"function\";\n }\n search(callback) {\n this.searchBlock(this.body, callback);\n }\n}\n/**\n * @class StaticAssert\n * @extends Statement\n * @category AST\n */\nclass StaticAssert extends Statement {\n constructor(expression) {\n super();\n this.expression = expression;\n }\n get astNodeType() {\n return \"staticAssert\";\n }\n search(callback) {\n this.expression.search(callback);\n }\n}\n/**\n * @class While\n * @extends Statement\n * @category AST\n */\nclass While extends Statement {\n constructor(condition, body) {\n super();\n this.condition = condition;\n this.body = body;\n }\n get astNodeType() {\n return \"while\";\n }\n search(callback) {\n this.condition.search(callback);\n this.searchBlock(this.body, callback);\n }\n}\n/**\n * @class Continuing\n * @extends Statement\n * @category AST\n */\nclass Continuing extends Statement {\n constructor(body) {\n super();\n this.body = body;\n }\n get astNodeType() {\n return \"continuing\";\n }\n search(callback) {\n this.searchBlock(this.body, callback);\n }\n}\n/**\n * @class For\n * @extends Statement\n * @category AST\n */\nclass For extends Statement {\n constructor(init, condition, increment, body) {\n super();\n this.init = init;\n this.condition = condition;\n this.increment = increment;\n this.body = body;\n }\n get astNodeType() {\n return \"for\";\n }\n search(callback) {\n var _a, _b, _c;\n (_a = this.init) === null || _a === void 0 ? void 0 : _a.search(callback);\n (_b = this.condition) === null || _b === void 0 ? void 0 : _b.search(callback);\n (_c = this.increment) === null || _c === void 0 ? void 0 : _c.search(callback);\n this.searchBlock(this.body, callback);\n }\n}\n/**\n * @class Var\n * @extends Statement\n * @category AST\n */\nclass Var extends Statement {\n constructor(name, type, storage, access, value) {\n super();\n this.name = name;\n this.type = type;\n this.storage = storage;\n this.access = access;\n this.value = value;\n }\n get astNodeType() {\n return \"var\";\n }\n search(callback) {\n var _a;\n callback(this);\n (_a = this.value) === null || _a === void 0 ? void 0 : _a.search(callback);\n }\n}\n/**\n * @class Override\n * @extends Statement\n * @category AST\n */\nclass Override extends Statement {\n constructor(name, type, value) {\n super();\n this.name = name;\n this.type = type;\n this.value = value;\n }\n get astNodeType() {\n return \"override\";\n }\n search(callback) {\n var _a;\n (_a = this.value) === null || _a === void 0 ? void 0 : _a.search(callback);\n }\n}\n/**\n * @class Let\n * @extends Statement\n * @category AST\n */\nclass Let extends Statement {\n constructor(name, type, storage, access, value) {\n super();\n this.name = name;\n this.type = type;\n this.storage = storage;\n this.access = access;\n this.value = value;\n }\n get astNodeType() {\n return \"let\";\n }\n search(callback) {\n var _a;\n callback(this);\n (_a = this.value) === null || _a === void 0 ? void 0 : _a.search(callback);\n }\n}\n/**\n * @class Const\n * @extends Statement\n * @category AST\n */\nclass Const extends Statement {\n constructor(name, type, storage, access, value) {\n super();\n this.name = name;\n this.type = type;\n this.storage = storage;\n this.access = access;\n this.value = value;\n }\n get astNodeType() {\n return \"const\";\n }\n evaluate(context) {\n return this.value.evaluate(context);\n }\n search(callback) {\n var _a;\n callback(this);\n (_a = this.value) === null || _a === void 0 ? void 0 : _a.search(callback);\n }\n}\nvar IncrementOperator;\n(function (IncrementOperator) {\n IncrementOperator[\"increment\"] = \"++\";\n IncrementOperator[\"decrement\"] = \"--\";\n})(IncrementOperator || (IncrementOperator = {}));\n(function (IncrementOperator) {\n function parse(val) {\n const key = val;\n if (key == \"parse\")\n throw new Error(\"Invalid value for IncrementOperator\");\n return IncrementOperator[key];\n }\n IncrementOperator.parse = parse;\n})(IncrementOperator || (IncrementOperator = {}));\n/**\n * @class Increment\n * @extends Statement\n * @category AST\n */\nclass Increment extends Statement {\n constructor(operator, variable) {\n super();\n this.operator = operator;\n this.variable = variable;\n }\n get astNodeType() {\n return \"increment\";\n }\n search(callback) {\n this.variable.search(callback);\n }\n}\nvar AssignOperator;\n(function (AssignOperator) {\n AssignOperator[\"assign\"] = \"=\";\n AssignOperator[\"addAssign\"] = \"+=\";\n AssignOperator[\"subtractAssin\"] = \"-=\";\n AssignOperator[\"multiplyAssign\"] = \"*=\";\n AssignOperator[\"divideAssign\"] = \"/=\";\n AssignOperator[\"moduloAssign\"] = \"%=\";\n AssignOperator[\"andAssign\"] = \"&=\";\n AssignOperator[\"orAssign\"] = \"|=\";\n AssignOperator[\"xorAssign\"] = \"^=\";\n AssignOperator[\"shiftLeftAssign\"] = \"<<=\";\n AssignOperator[\"shiftRightAssign\"] = \">>=\";\n})(AssignOperator || (AssignOperator = {}));\n(function (AssignOperator) {\n function parse(val) {\n const key = val;\n if (key == \"parse\") {\n throw new Error(\"Invalid value for AssignOperator\");\n }\n //return AssignOperator[key];\n return key;\n }\n AssignOperator.parse = parse;\n})(AssignOperator || (AssignOperator = {}));\n/**\n * @class Assign\n * @extends Statement\n * @category AST\n */\nclass Assign extends Statement {\n constructor(operator, variable, value) {\n super();\n this.operator = operator;\n this.variable = variable;\n this.value = value;\n }\n get astNodeType() {\n return \"assign\";\n }\n search(callback) {\n this.variable.search(callback);\n this.value.search(callback);\n }\n}\n/**\n * @class Call\n * @extends Statement\n * @category AST\n */\nclass Call extends Statement {\n constructor(name, args) {\n super();\n this.name = name;\n this.args = args;\n }\n get astNodeType() {\n return \"call\";\n }\n search(callback) {\n for (const node of this.args) {\n node.search(callback);\n }\n callback(this);\n }\n}\n/**\n * @class Loop\n * @extends Statement\n * @category AST\n */\nclass Loop extends Statement {\n constructor(body, continuing) {\n super();\n this.body = body;\n this.continuing = continuing;\n }\n get astNodeType() {\n return \"loop\";\n }\n}\n/**\n * @class Switch\n * @extends Statement\n * @category AST\n */\nclass Switch extends Statement {\n constructor(condition, body) {\n super();\n this.condition = condition;\n this.body = body;\n }\n get astNodeType() {\n return \"body\";\n }\n}\n/**\n * @class If\n * @extends Statement\n * @category AST\n */\nclass If extends Statement {\n constructor(condition, body, elseif, _else) {\n super();\n this.condition = condition;\n this.body = body;\n this.elseif = elseif;\n this.else = _else;\n }\n get astNodeType() {\n return \"if\";\n }\n search(callback) {\n this.condition.search(callback);\n this.searchBlock(this.body, callback);\n this.searchBlock(this.elseif, callback);\n this.searchBlock(this.else, callback);\n }\n}\n/**\n * @class Return\n * @extends Statement\n * @category AST\n */\nclass Return extends Statement {\n constructor(value) {\n super();\n this.value = value;\n }\n get astNodeType() {\n return \"return\";\n }\n search(callback) {\n var _a;\n (_a = this.value) === null || _a === void 0 ? void 0 : _a.search(callback);\n }\n}\n/**\n * @class Enable\n * @extends Statement\n * @category AST\n */\nclass Enable extends Statement {\n constructor(name) {\n super();\n this.name = name;\n }\n get astNodeType() {\n return \"enable\";\n }\n}\n/**\n * @class Requires\n * @extends Statement\n * @category AST\n */\nclass Requires extends Statement {\n constructor(extensions) {\n super();\n this.extensions = extensions;\n }\n get astNodeType() {\n return \"requires\";\n }\n}\n/**\n * @class Diagnostic\n * @extends Statement\n * @category AST\n */\nclass Diagnostic extends Statement {\n constructor(severity, rule) {\n super();\n this.severity = severity;\n this.rule = rule;\n }\n get astNodeType() {\n return \"diagnostic\";\n }\n}\n/**\n * @class Alias\n * @extends Statement\n * @category AST\n */\nclass Alias extends Statement {\n constructor(name, type) {\n super();\n this.name = name;\n this.type = type;\n }\n get astNodeType() {\n return \"alias\";\n }\n}\n/**\n * @class Discard\n * @extends Statement\n * @category AST\n */\nclass Discard extends Statement {\n constructor() {\n super();\n }\n get astNodeType() {\n return \"discard\";\n }\n}\n/**\n * @class Break\n * @extends Statement\n * @category AST\n */\nclass Break extends Statement {\n constructor() {\n super();\n }\n get astNodeType() {\n return \"break\";\n }\n}\n/**\n * @class Continue\n * @extends Statement\n * @category AST\n */\nclass Continue extends Statement {\n constructor() {\n super();\n }\n get astNodeType() {\n return \"continue\";\n }\n}\n/**\n * @class Type\n * @extends Statement\n * @category AST\n */\nclass Type extends Statement {\n constructor(name) {\n super();\n this.name = name;\n }\n get astNodeType() {\n return \"type\";\n }\n get isStruct() {\n return false;\n }\n get isArray() {\n return false;\n }\n}\n/**\n * @class StructType\n * @extends Type\n * @category AST\n */\nclass Struct extends Type {\n constructor(name, members, startLine, endLine) {\n super(name);\n this.members = members;\n this.startLine = startLine;\n this.endLine = endLine;\n }\n get astNodeType() {\n return \"struct\";\n }\n get isStruct() {\n return true;\n }\n /// Return the index of the member with the given name, or -1 if not found.\n getMemberIndex(name) {\n for (let i = 0; i < this.members.length; i++) {\n if (this.members[i].name == name)\n return i;\n }\n return -1;\n }\n}\n/**\n * @class TemplateType\n * @extends Type\n * @category AST\n */\nclass TemplateType extends Type {\n constructor(name, format, access) {\n super(name);\n this.format = format;\n this.access = access;\n }\n get astNodeType() {\n return \"template\";\n }\n}\n/**\n * @class PointerType\n * @extends Type\n * @category AST\n */\nclass PointerType extends Type {\n constructor(name, storage, type, access) {\n super(name);\n this.storage = storage;\n this.type = type;\n this.access = access;\n }\n get astNodeType() {\n return \"pointer\";\n }\n}\n/**\n * @class ArrayType\n * @extends Type\n * @category AST\n */\nclass ArrayType extends Type {\n constructor(name, attributes, format, count) {\n super(name);\n this.attributes = attributes;\n this.format = format;\n this.count = count;\n }\n get astNodeType() {\n return \"array\";\n }\n get isArray() {\n return true;\n }\n}\n/**\n * @class SamplerType\n * @extends Type\n * @category AST\n */\nclass SamplerType extends Type {\n constructor(name, format, access) {\n super(name);\n this.format = format;\n this.access = access;\n }\n get astNodeType() {\n return \"sampler\";\n }\n}\n/**\n * @class Expression\n * @extends Node\n * @category AST\n */\nclass Expression extends Node {\n constructor() {\n super();\n }\n}\n/**\n * @class StringExpr\n * @extends Expression\n * @category AST\n */\nclass StringExpr extends Expression {\n constructor(value) {\n super();\n this.value = value;\n }\n get astNodeType() {\n return \"stringExpr\";\n }\n toString() {\n return this.value;\n }\n evaluateString() {\n return this.value;\n }\n}\n/**\n * @class CreateExpr\n * @extends Expression\n * @category AST\n */\nclass CreateExpr extends Expression {\n constructor(type, args) {\n super();\n this.type = type;\n this.args = args;\n }\n get astNodeType() {\n return \"createExpr\";\n }\n search(callback) {\n callback(this);\n for (const node of this.args) {\n node.search(callback);\n }\n }\n}\n/**\n * @class CallExpr\n * @extends Expression\n * @category AST\n */\nclass CallExpr extends Expression {\n constructor(name, args) {\n super();\n this.name = name;\n this.args = args;\n }\n get astNodeType() {\n return \"callExpr\";\n }\n evaluate(context) {\n switch (this.name) {\n case \"abs\":\n return Math.abs(this.args[0].evaluate(context));\n case \"acos\":\n return Math.acos(this.args[0].evaluate(context));\n case \"acosh\":\n return Math.acosh(this.args[0].evaluate(context));\n case \"asin\":\n return Math.asin(this.args[0].evaluate(context));\n case \"asinh\":\n return Math.asinh(this.args[0].evaluate(context));\n case \"atan\":\n return Math.atan(this.args[0].evaluate(context));\n case \"atan2\":\n return Math.atan2(this.args[0].evaluate(context), this.args[1].evaluate(context));\n case \"atanh\":\n return Math.atanh(this.args[0].evaluate(context));\n case \"ceil\":\n return Math.ceil(this.args[0].evaluate(context));\n case \"clamp\":\n return Math.min(Math.max(this.args[0].evaluate(context), this.args[1].evaluate(context)), this.args[2].evaluate(context));\n case \"cos\":\n return Math.cos(this.args[0].evaluate(context));\n //case \"cross\":\n //TODO: (x[i] * y[j] - x[j] * y[i])\n case \"degrees\":\n return (this.args[0].evaluate(context) * 180) / Math.PI;\n //case \"determinant\":\n //TODO implement\n case \"distance\":\n return Math.sqrt(Math.pow(this.args[0].evaluate(context) - this.args[1].evaluate(context), 2));\n case \"dot\":\n //TODO: (x[i] * y[i])\n case \"exp\":\n return Math.exp(this.args[0].evaluate(context));\n case \"exp2\":\n return Math.pow(2, this.args[0].evaluate(context));\n //case \"extractBits\":\n //TODO: implement\n //case \"firstLeadingBit\":\n //TODO: implement\n case \"floor\":\n return Math.floor(this.args[0].evaluate(context));\n case \"fma\":\n return (this.args[0].evaluate(context) * this.args[1].evaluate(context) +\n this.args[2].evaluate(context));\n case \"fract\":\n return (this.args[0].evaluate(context) -\n Math.floor(this.args[0].evaluate(context)));\n //case \"frexp\":\n //TODO: implement\n case \"inverseSqrt\":\n return 1 / Math.sqrt(this.args[0].evaluate(context));\n //case \"length\":\n //TODO: implement\n case \"log\":\n return Math.log(this.args[0].evaluate(context));\n case \"log2\":\n return Math.log2(this.args[0].evaluate(context));\n case \"max\":\n return Math.max(this.args[0].evaluate(context), this.args[1].evaluate(context));\n case \"min\":\n return Math.min(this.args[0].evaluate(context), this.args[1].evaluate(context));\n case \"mix\":\n return (this.args[0].evaluate(context) *\n (1 - this.args[2].evaluate(context)) +\n this.args[1].evaluate(context) * this.args[2].evaluate(context));\n case \"modf\":\n return (this.args[0].evaluate(context) -\n Math.floor(this.args[0].evaluate(context)));\n case \"pow\":\n return Math.pow(this.args[0].evaluate(context), this.args[1].evaluate(context));\n case \"radians\":\n return (this.args[0].evaluate(context) * Math.PI) / 180;\n case \"round\":\n return Math.round(this.args[0].evaluate(context));\n case \"sign\":\n return Math.sign(this.args[0].evaluate(context));\n case \"sin\":\n return Math.sin(this.args[0].evaluate(context));\n case \"sinh\":\n return Math.sinh(this.args[0].evaluate(context));\n case \"saturate\":\n return Math.min(Math.max(this.args[0].evaluate(context), 0), 1);\n case \"smoothstep\":\n return (this.args[0].evaluate(context) *\n this.args[0].evaluate(context) *\n (3 - 2 * this.args[0].evaluate(context)));\n case \"sqrt\":\n return Math.sqrt(this.args[0].evaluate(context));\n case \"step\":\n return this.args[0].evaluate(context) < this.args[1].evaluate(context)\n ? 0\n : 1;\n case \"tan\":\n return Math.tan(this.args[0].evaluate(context));\n case \"tanh\":\n return Math.tanh(this.args[0].evaluate(context));\n case \"trunc\":\n return Math.trunc(this.args[0].evaluate(context));\n default:\n throw new Error(\"Non const function: \" + this.name);\n }\n }\n search(callback) {\n for (const node of this.args) {\n node.search(callback);\n }\n callback(this);\n }\n}\n/**\n * @class VariableExpr\n * @extends Expression\n * @category AST\n */\nclass VariableExpr extends Expression {\n constructor(name) {\n super();\n this.name = name;\n }\n get astNodeType() {\n return \"varExpr\";\n }\n search(callback) {\n callback(this);\n if (this.postfix) {\n this.postfix.search(callback);\n }\n }\n evaluate(context) {\n const constant = context.constants.get(this.name);\n if (!constant) {\n throw new Error(\"Cannot evaluate node\");\n }\n return constant.evaluate(context);\n }\n}\n/**\n * @class ConstExpr\n * @extends Expression\n * @category AST\n */\nclass ConstExpr extends Expression {\n constructor(name, initializer) {\n super();\n this.name = name;\n this.initializer = initializer;\n }\n get astNodeType() {\n return \"constExpr\";\n }\n evaluate(context) {\n var _a, _b;\n if (this.initializer instanceof CreateExpr) {\n // This is a struct constant\n const property = (_a = this.postfix) === null || _a === void 0 ? void 0 : _a.evaluateString(context);\n const type = (_b = this.initializer.type) === null || _b === void 0 ? void 0 : _b.name;\n const struct = context.structs.get(type);\n const memberIndex = struct === null || struct === void 0 ? void 0 : struct.getMemberIndex(property);\n if (memberIndex != -1) {\n const value = this.initializer.args[memberIndex].evaluate(context);\n return value;\n }\n console.log(memberIndex);\n }\n return this.initializer.evaluate(context);\n }\n search(callback) {\n this.initializer.search(callback);\n }\n}\n/**\n * @class LiteralExpr\n * @extends Expression\n * @category AST\n */\nclass LiteralExpr extends Expression {\n constructor(value) {\n super();\n this.value = value;\n }\n get astNodeType() {\n return \"literalExpr\";\n }\n evaluate() {\n return this.value;\n }\n}\n/**\n * @class BitcastExpr\n * @extends Expression\n * @category AST\n */\nclass BitcastExpr extends Expression {\n constructor(type, value) {\n super();\n this.type = type;\n this.value = value;\n }\n get astNodeType() {\n return \"bitcastExpr\";\n }\n search(callback) {\n this.value.search(callback);\n }\n}\n/**\n * @class TypecastExpr\n * @extends Expression\n * @category AST\n */\nclass TypecastExpr extends Expression {\n constructor(type, args) {\n super();\n this.type = type;\n this.args = args;\n }\n get astNodeType() {\n return \"typecastExpr\";\n }\n evaluate(context) {\n return this.args[0].evaluate(context);\n }\n search(callback) {\n this.searchBlock(this.args, callback);\n }\n}\n/**\n * @class GroupingExpr\n * @extends Expression\n * @category AST\n */\nclass GroupingExpr extends Expression {\n constructor(contents) {\n super();\n this.contents = contents;\n }\n get astNodeType() {\n return \"groupExpr\";\n }\n evaluate(context) {\n return this.contents[0].evaluate(context);\n }\n search(callback) {\n this.searchBlock(this.contents, callback);\n }\n}\n/**\n * @class ArrayIndex\n * @extends Expression\n * @category AST\n */\nclass ArrayIndex extends Expression {\n constructor(index) {\n super();\n this.index = index;\n }\n search(callback) {\n this.index.search(callback);\n }\n}\n/**\n * @class Operator\n * @extends Expression\n * @category AST\n */\nclass Operator extends Expression {\n constructor() {\n super();\n }\n}\n/**\n * @class UnaryOperator\n * @extends Operator\n * @category AST\n * @property {string} operator +, -, !, ~\n */\nclass UnaryOperator extends Operator {\n constructor(operator, right) {\n super();\n this.operator = operator;\n this.right = right;\n }\n get astNodeType() {\n return \"unaryOp\";\n }\n evaluate(context) {\n switch (this.operator) {\n case \"+\":\n return this.right.evaluate(context);\n case \"-\":\n return -this.right.evaluate(context);\n case \"!\":\n return this.right.evaluate(context) ? 0 : 1;\n case \"~\":\n return ~this.right.evaluate(context);\n default:\n throw new Error(\"Unknown unary operator: \" + this.operator);\n }\n }\n search(callback) {\n this.right.search(callback);\n }\n}\n/**\n * @class BinaryOperator\n * @extends Operator\n * @category AST\n * @property {string} operator +, -, *, /, %, ==, !=, <, >, <=, >=, &&, ||\n */\nclass BinaryOperator extends Operator {\n constructor(operator, left, right) {\n super();\n this.operator = operator;\n this.left = left;\n this.right = right;\n }\n get astNodeType() {\n return \"binaryOp\";\n }\n evaluate(context) {\n switch (this.operator) {\n case \"+\":\n return this.left.evaluate(context) + this.right.evaluate(context);\n case \"-\":\n return this.left.evaluate(context) - this.right.evaluate(context);\n case \"*\":\n return this.left.evaluate(context) * this.right.evaluate(context);\n case \"/\":\n return this.left.evaluate(context) / this.right.evaluate(context);\n case \"%\":\n return this.left.evaluate(context) % this.right.evaluate(context);\n case \"==\":\n return this.left.evaluate(context) == this.right.evaluate(context)\n ? 1\n : 0;\n case \"!=\":\n return this.left.evaluate(context) != this.right.evaluate(context)\n ? 1\n : 0;\n case \"<\":\n return this.left.evaluate(context) < this.right.evaluate(context)\n ? 1\n : 0;\n case \">\":\n return this.left.evaluate(context) > this.right.evaluate(context)\n ? 1\n : 0;\n case \"<=\":\n return this.left.evaluate(context) <= this.right.evaluate(context)\n ? 1\n : 0;\n case \">=\":\n return this.left.evaluate(context) >= this.right.evaluate(context)\n ? 1\n : 0;\n case \"&&\":\n return this.left.evaluate(context) && this.right.evaluate(context)\n ? 1\n : 0;\n case \"||\":\n return this.left.evaluate(context) || this.right.evaluate(context)\n ? 1\n : 0;\n default:\n throw new Error(`Unknown operator ${this.operator}`);\n }\n }\n search(callback) {\n this.left.search(callback);\n this.right.search(callback);\n }\n}\n/**\n * @class SwitchCase\n * @extends Node\n * @category AST\n */\nclass SwitchCase extends Node {\n constructor() {\n super();\n }\n}\n/**\n * @class Case\n * @extends SwitchCase\n * @category AST\n */\nclass Case extends SwitchCase {\n constructor(selector, body) {\n super();\n this.selector = selector;\n this.body = body;\n }\n get astNodeType() {\n return \"case\";\n }\n search(callback) {\n this.searchBlock(this.body, callback);\n }\n}\n/**\n * @class Default\n * @extends SwitchCase\n * @category AST\n */\nclass Default extends SwitchCase {\n constructor(body) {\n super();\n this.body = body;\n }\n get astNodeType() {\n return \"default\";\n }\n search(callback) {\n this.searchBlock(this.body, callback);\n }\n}\n/**\n * @class Argument\n * @extends Node\n * @category AST\n */\nclass Argument extends Node {\n constructor(name, type, attributes) {\n super();\n this.name = name;\n this.type = type;\n this.attributes = attributes;\n }\n get astNodeType() {\n return \"argument\";\n }\n}\n/**\n * @class ElseIf\n * @extends Node\n * @category AST\n */\nclass ElseIf extends Node {\n constructor(condition, body) {\n super();\n this.condition = condition;\n this.body = body;\n }\n get astNodeType() {\n return \"elseif\";\n }\n search(callback) {\n this.condition.search(callback);\n this.searchBlock(this.body, callback);\n }\n}\n/**\n * @class Member\n * @extends Node\n * @category AST\n */\nclass Member extends Node {\n constructor(name, type, attributes) {\n super();\n this.name = name;\n this.type = type;\n this.attributes = attributes;\n }\n get astNodeType() {\n return \"member\";\n }\n}\n/**\n * @class Attribute\n * @extends Node\n * @category AST\n */\nclass Attribute extends Node {\n constructor(name, value) {\n super();\n this.name = name;\n this.value = value;\n }\n get astNodeType() {\n return \"attribute\";\n }\n}\n\nvar _a;\nvar TokenClass;\n(function (TokenClass) {\n TokenClass[TokenClass[\"token\"] = 0] = \"token\";\n TokenClass[TokenClass[\"keyword\"] = 1] = \"keyword\";\n TokenClass[TokenClass[\"reserved\"] = 2] = \"reserved\";\n})(TokenClass || (TokenClass = {}));\nclass TokenType {\n constructor(name, type, rule) {\n this.name = name;\n this.type = type;\n this.rule = rule;\n }\n toString() {\n return this.name;\n }\n}\n/// Catalog of defined token types, keywords, and reserved words.\nclass TokenTypes {\n}\n_a = TokenTypes;\nTokenTypes.none = new TokenType(\"\", TokenClass.reserved, \"\");\nTokenTypes.eof = new TokenType(\"EOF\", TokenClass.token, \"\");\nTokenTypes.reserved = {\n asm: new TokenType(\"asm\", TokenClass.reserved, \"asm\"),\n bf16: new TokenType(\"bf16\", TokenClass.reserved, \"bf16\"),\n do: new TokenType(\"do\", TokenClass.reserved, \"do\"),\n enum: new TokenType(\"enum\", TokenClass.reserved, \"enum\"),\n f16: new TokenType(\"f16\", TokenClass.reserved, \"f16\"),\n f64: new TokenType(\"f64\", TokenClass.reserved, \"f64\"),\n handle: new TokenType(\"handle\", TokenClass.reserved, \"handle\"),\n i8: new TokenType(\"i8\", TokenClass.reserved, \"i8\"),\n i16: new TokenType(\"i16\", TokenClass.reserved, \"i16\"),\n i64: new TokenType(\"i64\", TokenClass.reserved, \"i64\"),\n mat: new TokenType(\"mat\", TokenClass.reserved, \"mat\"),\n premerge: new TokenType(\"premerge\", TokenClass.reserved, \"premerge\"),\n regardless: new TokenType(\"regardless\", TokenClass.reserved, \"regardless\"),\n typedef: new TokenType(\"typedef\", TokenClass.reserved, \"typedef\"),\n u8: new TokenType(\"u8\", TokenClass.reserved, \"u8\"),\n u16: new TokenType(\"u16\", TokenClass.reserved, \"u16\"),\n u64: new TokenType(\"u64\", TokenClass.reserved, \"u64\"),\n unless: new TokenType(\"unless\", TokenClass.reserved, \"unless\"),\n using: new TokenType(\"using\", TokenClass.reserved, \"using\"),\n vec: new TokenType(\"vec\", TokenClass.reserved, \"vec\"),\n void: new TokenType(\"void\", TokenClass.reserved, \"void\"),\n};\nTokenTypes.keywords = {\n array: new TokenType(\"array\", TokenClass.keyword, \"array\"),\n atomic: new TokenType(\"atomic\", TokenClass.keyword, \"atomic\"),\n bool: new TokenType(\"bool\", TokenClass.keyword, \"bool\"),\n f32: new TokenType(\"f32\", TokenClass.keyword, \"f32\"),\n i32: new TokenType(\"i32\", TokenClass.keyword, \"i32\"),\n mat2x2: new TokenType(\"mat2x2\", TokenClass.keyword, \"mat2x2\"),\n mat2x3: new TokenType(\"mat2x3\", TokenClass.keyword, \"mat2x3\"),\n mat2x4: new TokenType(\"mat2x4\", TokenClass.keyword, \"mat2x4\"),\n mat3x2: new TokenType(\"mat3x2\", TokenClass.keyword, \"mat3x2\"),\n mat3x3: new TokenType(\"mat3x3\", TokenClass.keyword, \"mat3x3\"),\n mat3x4: new TokenType(\"mat3x4\", TokenClass.keyword, \"mat3x4\"),\n mat4x2: new TokenType(\"mat4x2\", TokenClass.keyword, \"mat4x2\"),\n mat4x3: new TokenType(\"mat4x3\", TokenClass.keyword, \"mat4x3\"),\n mat4x4: new TokenType(\"mat4x4\", TokenClass.keyword, \"mat4x4\"),\n ptr: new TokenType(\"ptr\", TokenClass.keyword, \"ptr\"),\n sampler: new TokenType(\"sampler\", TokenClass.keyword, \"sampler\"),\n sampler_comparison: new TokenType(\"sampler_comparison\", TokenClass.keyword, \"sampler_comparison\"),\n struct: new TokenType(\"struct\", TokenClass.keyword, \"struct\"),\n texture_1d: new TokenType(\"texture_1d\", TokenClass.keyword, \"texture_1d\"),\n texture_2d: new TokenType(\"texture_2d\", TokenClass.keyword, \"texture_2d\"),\n texture_2d_array: new TokenType(\"texture_2d_array\", TokenClass.keyword, \"texture_2d_array\"),\n texture_3d: new TokenType(\"texture_3d\", TokenClass.keyword, \"texture_3d\"),\n texture_cube: new TokenType(\"texture_cube\", TokenClass.keyword, \"texture_cube\"),\n texture_cube_array: new TokenType(\"texture_cube_array\", TokenClass.keyword, \"texture_cube_array\"),\n texture_multisampled_2d: new TokenType(\"texture_multisampled_2d\", TokenClass.keyword, \"texture_multisampled_2d\"),\n texture_storage_1d: new TokenType(\"texture_storage_1d\", TokenClass.keyword, \"texture_storage_1d\"),\n texture_storage_2d: new TokenType(\"texture_storage_2d\", TokenClass.keyword, \"texture_storage_2d\"),\n texture_storage_2d_array: new TokenType(\"texture_storage_2d_array\", TokenClass.keyword, \"texture_storage_2d_array\"),\n texture_storage_3d: new TokenType(\"texture_storage_3d\", TokenClass.keyword, \"texture_storage_3d\"),\n texture_depth_2d: new TokenType(\"texture_depth_2d\", TokenClass.keyword, \"texture_depth_2d\"),\n texture_depth_2d_array: new TokenType(\"texture_depth_2d_array\", TokenClass.keyword, \"texture_depth_2d_array\"),\n texture_depth_cube: new TokenType(\"texture_depth_cube\", TokenClass.keyword, \"texture_depth_cube\"),\n texture_depth_cube_array: new TokenType(\"texture_depth_cube_array\", TokenClass.keyword, \"texture_depth_cube_array\"),\n texture_depth_multisampled_2d: new TokenType(\"texture_depth_multisampled_2d\", TokenClass.keyword, \"texture_depth_multisampled_2d\"),\n texture_external: new TokenType(\"texture_external\", TokenClass.keyword, \"texture_external\"),\n u32: new TokenType(\"u32\", TokenClass.keyword, \"u32\"),\n vec2: new TokenType(\"vec2\", TokenClass.keyword, \"vec2\"),\n vec3: new TokenType(\"vec3\", TokenClass.keyword, \"vec3\"),\n vec4: new TokenType(\"vec4\", TokenClass.keyword, \"vec4\"),\n bitcast: new TokenType(\"bitcast\", TokenClass.keyword, \"bitcast\"),\n block: new TokenType(\"block\", TokenClass.keyword, \"block\"),\n break: new TokenType(\"break\", TokenClass.keyword, \"break\"),\n case: new TokenType(\"case\", TokenClass.keyword, \"case\"),\n continue: new TokenType(\"continue\", TokenClass.keyword, \"continue\"),\n continuing: new TokenType(\"continuing\", TokenClass.keyword, \"continuing\"),\n default: new TokenType(\"default\", TokenClass.keyword, \"default\"),\n diagnostic: new TokenType(\"diagnostic\", TokenClass.keyword, \"diagnostic\"),\n discard: new TokenType(\"discard\", TokenClass.keyword, \"discard\"),\n else: new TokenType(\"else\", TokenClass.keyword, \"else\"),\n enable: new TokenType(\"enable\", TokenClass.keyword, \"enable\"),\n fallthrough: new TokenType(\"fallthrough\", TokenClass.keyword, \"fallthrough\"),\n false: new TokenType(\"false\", TokenClass.keyword, \"false\"),\n fn: new TokenType(\"fn\", TokenClass.keyword, \"fn\"),\n for: new TokenType(\"for\", TokenClass.keyword, \"for\"),\n function: new TokenType(\"function\", TokenClass.keyword, \"function\"),\n if: new TokenType(\"if\", TokenClass.keyword, \"if\"),\n let: new TokenType(\"let\", TokenClass.keyword, \"let\"),\n const: new TokenType(\"const\", TokenClass.keyword, \"const\"),\n loop: new TokenType(\"loop\", TokenClass.keyword, \"loop\"),\n while: new TokenType(\"while\", TokenClass.keyword, \"while\"),\n private: new TokenType(\"private\", TokenClass.keyword, \"private\"),\n read: new TokenType(\"read\", TokenClass.keyword, \"read\"),\n read_write: new TokenType(\"read_write\", TokenClass.keyword, \"read_write\"),\n return: new TokenType(\"return\", TokenClass.keyword, \"return\"),\n requires: new TokenType(\"requires\", TokenClass.keyword, \"requires\"),\n storage: new TokenType(\"storage\", TokenClass.keyword, \"storage\"),\n switch: new TokenType(\"switch\", TokenClass.keyword, \"switch\"),\n true: new TokenType(\"true\", TokenClass.keyword, \"true\"),\n alias: new TokenType(\"alias\", TokenClass.keyword, \"alias\"),\n type: new TokenType(\"type\", TokenClass.keyword, \"type\"),\n uniform: new TokenType(\"uniform\", TokenClass.keyword, \"uniform\"),\n var: new TokenType(\"var\", TokenClass.keyword, \"var\"),\n override: new TokenType(\"override\", TokenClass.keyword, \"override\"),\n workgroup: new TokenType(\"workgroup\", TokenClass.keyword, \"workgroup\"),\n write: new TokenType(\"write\", TokenClass.keyword, \"write\"),\n r8unorm: new TokenType(\"r8unorm\", TokenClass.keyword, \"r8unorm\"),\n r8snorm: new TokenType(\"r8snorm\", TokenClass.keyword, \"r8snorm\"),\n r8uint: new TokenType(\"r8uint\", TokenClass.keyword, \"r8uint\"),\n r8sint: new TokenType(\"r8sint\", TokenClass.keyword, \"r8sint\"),\n r16uint: new TokenType(\"r16uint\", TokenClass.keyword, \"r16uint\"),\n r16sint: new TokenType(\"r16sint\", TokenClass.keyword, \"r16sint\"),\n r16float: new TokenType(\"r16float\", TokenClass.keyword, \"r16float\"),\n rg8unorm: new TokenType(\"rg8unorm\", TokenClass.keyword, \"rg8unorm\"),\n rg8snorm: new TokenType(\"rg8snorm\", TokenClass.keyword, \"rg8snorm\"),\n rg8uint: new TokenType(\"rg8uint\", TokenClass.keyword, \"rg8uint\"),\n rg8sint: new TokenType(\"rg8sint\", TokenClass.keyword, \"rg8sint\"),\n r32uint: new TokenType(\"r32uint\", TokenClass.keyword, \"r32uint\"),\n r32sint: new TokenType(\"r32sint\", TokenClass.keyword, \"r32sint\"),\n r32float: new TokenType(\"r32float\", TokenClass.keyword, \"r32float\"),\n rg16uint: new TokenType(\"rg16uint\", TokenClass.keyword, \"rg16uint\"),\n rg16sint: new TokenType(\"rg16sint\", TokenClass.keyword, \"rg16sint\"),\n rg16float: new TokenType(\"rg16float\", TokenClass.keyword, \"rg16float\"),\n rgba8unorm: new TokenType(\"rgba8unorm\", TokenClass.keyword, \"rgba8unorm\"),\n rgba8unorm_srgb: new TokenType(\"rgba8unorm_srgb\", TokenClass.keyword, \"rgba8unorm_srgb\"),\n rgba8snorm: new TokenType(\"rgba8snorm\", TokenClass.keyword, \"rgba8snorm\"),\n rgba8uint: new TokenType(\"rgba8uint\", TokenClass.keyword, \"rgba8uint\"),\n rgba8sint: new TokenType(\"rgba8sint\", TokenClass.keyword, \"rgba8sint\"),\n bgra8unorm: new TokenType(\"bgra8unorm\", TokenClass.keyword, \"bgra8unorm\"),\n bgra8unorm_srgb: new TokenType(\"bgra8unorm_srgb\", TokenClass.keyword, \"bgra8unorm_srgb\"),\n rgb10a2unorm: new TokenType(\"rgb10a2unorm\", TokenClass.keyword, \"rgb10a2unorm\"),\n rg11b10float: new TokenType(\"rg11b10float\", TokenClass.keyword, \"rg11b10float\"),\n rg32uint: new TokenType(\"rg32uint\", TokenClass.keyword, \"rg32uint\"),\n rg32sint: new TokenType(\"rg32sint\", TokenClass.keyword, \"rg32sint\"),\n rg32float: new TokenType(\"rg32float\", TokenClass.keyword, \"rg32float\"),\n rgba16uint: new TokenType(\"rgba16uint\", TokenClass.keyword, \"rgba16uint\"),\n rgba16sint: new TokenType(\"rgba16sint\", TokenClass.keyword, \"rgba16sint\"),\n rgba16float: new TokenType(\"rgba16float\", TokenClass.keyword, \"rgba16float\"),\n rgba32uint: new TokenType(\"rgba32uint\", TokenClass.keyword, \"rgba32uint\"),\n rgba32sint: new TokenType(\"rgba32sint\", TokenClass.keyword, \"rgba32sint\"),\n rgba32float: new TokenType(\"rgba32float\", TokenClass.keyword, \"rgba32float\"),\n static_assert: new TokenType(\"static_assert\", TokenClass.keyword, \"static_assert\"),\n // WGSL grammar has a few keywords that have different token names than the strings they\n // represent. Aliasing them here.\n /*int32: new TokenType(\"i32\", TokenClass.keyword, \"i32\"),\n uint32: new TokenType(\"u32\", TokenClass.keyword, \"u32\"),\n float32: new TokenType(\"f32\", TokenClass.keyword, \"f32\"),\n pointer: new TokenType(\"ptr\", TokenClass.keyword, \"ptr\"),*/\n};\nTokenTypes.tokens = {\n decimal_float_literal: new TokenType(\"decimal_float_literal\", TokenClass.token, /((-?[0-9]*\\.[0-9]+|-?[0-9]+\\.[0-9]*)((e|E)(\\+|-)?[0-9]+)?f?)|(-?[0-9]+(e|E)(\\+|-)?[0-9]+f?)|([0-9]+f)/),\n hex_float_literal: new TokenType(\"hex_float_literal\", TokenClass.token, /-?0x((([0-9a-fA-F]*\\.[0-9a-fA-F]+|[0-9a-fA-F]+\\.[0-9a-fA-F]*)((p|P)(\\+|-)?[0-9]+f?)?)|([0-9a-fA-F]+(p|P)(\\+|-)?[0-9]+f?))/),\n int_literal: new TokenType(\"int_literal\", TokenClass.token, /-?0x[0-9a-fA-F]+|0i?|-?[1-9][0-9]*i?/),\n uint_literal: new TokenType(\"uint_literal\", TokenClass.token, /0x[0-9a-fA-F]+u|0u|[1-9][0-9]*u/),\n ident: new TokenType(\"ident\", TokenClass.token, /[_a-zA-Z][0-9a-zA-Z_]*/),\n and: new TokenType(\"and\", TokenClass.token, \"&\"),\n and_and: new TokenType(\"and_and\", TokenClass.token, \"&&\"),\n arrow: new TokenType(\"arrow \", TokenClass.token, \"->\"),\n attr: new TokenType(\"attr\", TokenClass.token, \"@\"),\n attr_left: new TokenType(\"attr_left\", TokenClass.token, \"[[\"),\n attr_right: new TokenType(\"attr_right\", TokenClass.token, \"]]\"),\n forward_slash: new TokenType(\"forward_slash\", TokenClass.token, \"/\"),\n bang: new TokenType(\"bang\", TokenClass.token, \"!\"),\n bracket_left: new TokenType(\"bracket_left\", TokenClass.token, \"[\"),\n bracket_right: new TokenType(\"bracket_right\", TokenClass.token, \"]\"),\n brace_left: new TokenType(\"brace_left\", TokenClass.token, \"{\"),\n brace_right: new TokenType(\"brace_right\", TokenClass.token, \"}\"),\n colon: new TokenType(\"colon\", TokenClass.token, \":\"),\n comma: new TokenType(\"comma\", TokenClass.token, \",\"),\n equal: new TokenType(\"equal\", TokenClass.token, \"=\"),\n equal_equal: new TokenType(\"equal_equal\", TokenClass.token, \"==\"),\n not_equal: new TokenType(\"not_equal\", TokenClass.token, \"!=\"),\n greater_than: new TokenType(\"greater_than\", TokenClass.token, \">\"),\n greater_than_equal: new TokenType(\"greater_than_equal\", TokenClass.token, \">=\"),\n shift_right: new TokenType(\"shift_right\", TokenClass.token, \">>\"),\n less_than: new TokenType(\"less_than\", TokenClass.token, \"<\"),\n less_than_equal: new TokenType(\"less_than_equal\", TokenClass.token, \"<=\"),\n shift_left: new TokenType(\"shift_left\", TokenClass.token, \"<<\"),\n modulo: new TokenType(\"modulo\", TokenClass.token, \"%\"),\n minus: new TokenType(\"minus\", TokenClass.token, \"-\"),\n minus_minus: new TokenType(\"minus_minus\", TokenClass.token, \"--\"),\n period: new TokenType(\"period\", TokenClass.token, \".\"),\n plus: new TokenType(\"plus\", TokenClass.token, \"+\"),\n plus_plus: new TokenType(\"plus_plus\", TokenClass.token, \"++\"),\n or: new TokenType(\"or\", TokenClass.token, \"|\"),\n or_or: new TokenType(\"or_or\", TokenClass.token, \"||\"),\n paren_left: new TokenType(\"paren_left\", TokenClass.token, \"(\"),\n paren_right: new TokenType(\"paren_right\", TokenClass.token, \")\"),\n semicolon: new TokenType(\"semicolon\", TokenClass.token, \";\"),\n star: new TokenType(\"star\", TokenClass.token, \"*\"),\n tilde: new TokenType(\"tilde\", TokenClass.token, \"~\"),\n underscore: new TokenType(\"underscore\", TokenClass.token, \"_\"),\n xor: new TokenType(\"xor\", TokenClass.token, \"^\"),\n plus_equal: new TokenType(\"plus_equal\", TokenClass.token, \"+=\"),\n minus_equal: new TokenType(\"minus_equal\", TokenClass.token, \"-=\"),\n times_equal: new TokenType(\"times_equal\", TokenClass.token, \"*=\"),\n division_equal: new TokenType(\"division_equal\", TokenClass.token, \"/=\"),\n modulo_equal: new TokenType(\"modulo_equal\", TokenClass.token, \"%=\"),\n and_equal: new TokenType(\"and_equal\", TokenClass.token, \"&=\"),\n or_equal: new TokenType(\"or_equal\", TokenClass.token, \"|=\"),\n xor_equal: new TokenType(\"xor_equal\", TokenClass.token, \"^=\"),\n shift_right_equal: new TokenType(\"shift_right_equal\", TokenClass.token, \">>=\"),\n shift_left_equal: new TokenType(\"shift_left_equal\", TokenClass.token, \"<<=\"),\n};\nTokenTypes.simpleTokens = {\n \"@\": _a.tokens.attr,\n \"{\": _a.tokens.brace_left,\n \"}\": _a.tokens.brace_right,\n \":\": _a.tokens.colon,\n \",\": _a.tokens.comma,\n \"(\": _a.tokens.paren_left,\n \")\": _a.tokens.paren_right,\n \";\": _a.tokens.semicolon,\n};\nTokenTypes.literalTokens = {\n \"&\": _a.tokens.and,\n \"&&\": _a.tokens.and_and,\n \"->\": _a.tokens.arrow,\n \"[[\": _a.tokens.attr_left,\n \"]]\": _a.tokens.attr_right,\n \"/\": _a.tokens.forward_slash,\n \"!\": _a.tokens.bang,\n \"[\": _a.tokens.bracket_left,\n \"]\": _a.tokens.bracket_right,\n \"=\": _a.tokens.equal,\n \"==\": _a.tokens.equal_equal,\n \"!=\": _a.tokens.not_equal,\n \">\": _a.tokens.greater_than,\n \">=\": _a.tokens.greater_than_equal,\n \">>\": _a.tokens.shift_right,\n \"<\": _a.tokens.less_than,\n \"<=\": _a.tokens.less_than_equal,\n \"<<\": _a.tokens.shift_left,\n \"%\": _a.tokens.modulo,\n \"-\": _a.tokens.minus,\n \"--\": _a.tokens.minus_minus,\n \".\": _a.tokens.period,\n \"+\": _a.tokens.plus,\n \"++\": _a.tokens.plus_plus,\n \"|\": _a.tokens.or,\n \"||\": _a.tokens.or_or,\n \"*\": _a.tokens.star,\n \"~\": _a.tokens.tilde,\n \"_\": _a.tokens.underscore,\n \"^\": _a.tokens.xor,\n \"+=\": _a.tokens.plus_equal,\n \"-=\": _a.tokens.minus_equal,\n \"*=\": _a.tokens.times_equal,\n \"/=\": _a.tokens.division_equal,\n \"%=\": _a.tokens.modulo_equal,\n \"&=\": _a.tokens.and_equal,\n \"|=\": _a.tokens.or_equal,\n \"^=\": _a.tokens.xor_equal,\n \">>=\": _a.tokens.shift_right_equal,\n \"<<=\": _a.tokens.shift_left_equal,\n};\nTokenTypes.regexTokens = {\n decimal_float_literal: _a.tokens.decimal_float_literal,\n hex_float_literal: _a.tokens.hex_float_literal,\n int_literal: _a.tokens.int_literal,\n uint_literal: _a.tokens.uint_literal,\n ident: _a.tokens.ident,\n};\nTokenTypes.storage_class = [\n _a.keywords.function,\n _a.keywords.private,\n _a.keywords.workgroup,\n _a.keywords.uniform,\n _a.keywords.storage,\n];\nTokenTypes.access_mode = [\n _a.keywords.read,\n _a.keywords.write,\n _a.keywords.read_write,\n];\nTokenTypes.sampler_type = [\n _a.keywords.sampler,\n _a.keywords.sampler_comparison,\n];\nTokenTypes.sampled_texture_type = [\n _a.keywords.texture_1d,\n _a.keywords.texture_2d,\n _a.keywords.texture_2d_array,\n _a.keywords.texture_3d,\n _a.keywords.texture_cube,\n _a.keywords.texture_cube_array,\n];\nTokenTypes.multisampled_texture_type = [\n _a.keywords.texture_multisampled_2d,\n];\nTokenTypes.storage_texture_type = [\n _a.keywords.texture_storage_1d,\n _a.keywords.texture_storage_2d,\n _a.keywords.texture_storage_2d_array,\n _a.keywords.texture_storage_3d,\n];\nTokenTypes.depth_texture_type = [\n _a.keywords.texture_depth_2d,\n _a.keywords.texture_depth_2d_array,\n _a.keywords.texture_depth_cube,\n _a.keywords.texture_depth_cube_array,\n _a.keywords.texture_depth_multisampled_2d,\n];\nTokenTypes.texture_external_type = [_a.keywords.texture_external];\nTokenTypes.any_texture_type = [\n ..._a.sampled_texture_type,\n ..._a.multisampled_texture_type,\n ..._a.storage_texture_type,\n ..._a.depth_texture_type,\n ..._a.texture_external_type,\n];\nTokenTypes.texel_format = [\n _a.keywords.r8unorm,\n _a.keywords.r8snorm,\n _a.keywords.r8uint,\n _a.keywords.r8sint,\n _a.keywords.r16uint,\n _a.keywords.r16sint,\n _a.keywords.r16float,\n _a.keywords.rg8unorm,\n _a.keywords.rg8snorm,\n _a.keywords.rg8uint,\n _a.keywords.rg8sint,\n _a.keywords.r32uint,\n _a.keywords.r32sint,\n _a.keywords.r32float,\n _a.keywords.rg16uint,\n _a.keywords.rg16sint,\n _a.keywords.rg16float,\n _a.keywords.rgba8unorm,\n _a.keywords.rgba8unorm_srgb,\n _a.keywords.rgba8snorm,\n _a.keywords.rgba8uint,\n _a.keywords.rgba8sint,\n _a.keywords.bgra8unorm,\n _a.keywords.bgra8unorm_srgb,\n _a.keywords.rgb10a2unorm,\n _a.keywords.rg11b10float,\n _a.keywords.rg32uint,\n _a.keywords.rg32sint,\n _a.keywords.rg32float,\n _a.keywords.rgba16uint,\n _a.keywords.rgba16sint,\n _a.keywords.rgba16float,\n _a.keywords.rgba32uint,\n _a.keywords.rgba32sint,\n _a.keywords.rgba32float,\n];\nTokenTypes.const_literal = [\n _a.tokens.int_literal,\n _a.tokens.uint_literal,\n _a.tokens.decimal_float_literal,\n _a.tokens.hex_float_literal,\n _a.keywords.true,\n _a.keywords.false,\n];\nTokenTypes.literal_or_ident = [\n _a.tokens.ident,\n _a.tokens.int_literal,\n _a.tokens.uint_literal,\n _a.tokens.decimal_float_literal,\n _a.tokens.hex_float_literal,\n];\nTokenTypes.element_count_expression = [\n _a.tokens.int_literal,\n _a.tokens.uint_literal,\n _a.tokens.ident,\n];\nTokenTypes.template_types = [\n _a.keywords.vec2,\n _a.keywords.vec3,\n _a.keywords.vec4,\n _a.keywords.mat2x2,\n _a.keywords.mat2x3,\n _a.keywords.mat2x4,\n _a.keywords.mat3x2,\n _a.keywords.mat3x3,\n _a.keywords.mat3x4,\n _a.keywords.mat4x2,\n _a.keywords.mat4x3,\n _a.keywords.mat4x4,\n _a.keywords.atomic,\n _a.keywords.bitcast,\n ..._a.any_texture_type,\n];\n// The grammar calls out 'block', but attribute grammar is defined to use a 'ident'.\n// The attribute grammar should be ident | block.\nTokenTypes.attribute_name = [_a.tokens.ident, _a.keywords.block, _a.keywords.diagnostic];\nTokenTypes.assignment_operators = [\n _a.tokens.equal,\n _a.tokens.plus_equal,\n _a.tokens.minus_equal,\n _a.tokens.times_equal,\n _a.tokens.division_equal,\n _a.tokens.modulo_equal,\n _a.tokens.and_equal,\n _a.tokens.or_equal,\n _a.tokens.xor_equal,\n _a.tokens.shift_right_equal,\n _a.tokens.shift_left_equal,\n];\nTokenTypes.increment_operators = [\n _a.tokens.plus_plus,\n _a.tokens.minus_minus,\n];\n/// A token parsed by the WgslScanner.\nclass Token {\n constructor(type, lexeme, line) {\n this.type = type;\n this.lexeme = lexeme;\n this.line = line;\n }\n toString() {\n return this.lexeme;\n }\n isTemplateType() {\n return TokenTypes.template_types.indexOf(this.type) != -1;\n }\n isArrayType() {\n return this.type == TokenTypes.keywords.array;\n }\n isArrayOrTemplateType() {\n return this.isArrayType() || this.isTemplateType();\n }\n}\n/// Lexical scanner for the WGSL language. This takes an input source text and generates a list\n/// of Token objects, which can then be fed into the WgslParser to generate an AST.\nclass WgslScanner {\n constructor(source) {\n this._tokens = [];\n this._start = 0;\n this._current = 0;\n this._line = 1;\n this._source = source !== null && source !== void 0 ? source : \"\";\n }\n /// Scan all tokens from the source.\n scanTokens() {\n while (!this._isAtEnd()) {\n this._start = this._current;\n if (!this.scanToken()) {\n throw `Invalid syntax at line ${this._line}`;\n }\n }\n this._tokens.push(new Token(TokenTypes.eof, \"\", this._line));\n return this._tokens;\n }\n /// Scan a single token from the source.\n scanToken() {\n // Find the longest consecutive set of characters that match a rule.\n let lexeme = this._advance();\n // Skip line-feed, adding to the line counter.\n if (lexeme == \"\\n\") {\n this._line++;\n return true;\n }\n // Skip whitespace\n if (this._isWhitespace(lexeme)) {\n return true;\n }\n if (lexeme == \"/\") {\n // If it's a // comment, skip everything until the next line-feed.\n if (this._peekAhead() == \"/\") {\n while (lexeme != \"\\n\") {\n if (this._isAtEnd()) {\n return true;\n }\n lexeme = this._advance();\n }\n // skip the linefeed\n this._line++;\n return true;\n }\n else if (this._peekAhead() == \"*\") {\n // If it's a / * block comment, skip everything until the matching * /,\n // allowing for nested block comments.\n this._advance();\n let commentLevel = 1;\n while (commentLevel > 0) {\n if (this._isAtEnd()) {\n return true;\n }\n lexeme = this._advance();\n if (lexeme == \"\\n\") {\n this._line++;\n }\n else if (lexeme == \"*\") {\n if (this._peekAhead() == \"/\") {\n this._advance();\n commentLevel--;\n if (commentLevel == 0) {\n return true;\n }\n }\n }\n else if (lexeme == \"/\") {\n if (this._peekAhead() == \"*\") {\n this._advance();\n commentLevel++;\n }\n }\n }\n return true;\n }\n }\n // Shortcut single character tokens\n const simpleToken = TokenTypes.simpleTokens[lexeme];\n if (simpleToken) {\n this._addToken(simpleToken);\n return true;\n }\n // Shortcut keywords and identifiers\n let matchType = TokenTypes.none;\n const isAlpha = this._isAlpha(lexeme);\n const isUnderscore = lexeme === \"_\";\n if (this._isAlphaNumeric(lexeme)) {\n let nextChar = this._peekAhead();\n while (this._isAlphaNumeric(nextChar)) {\n lexeme += this._advance();\n nextChar = this._peekAhead();\n }\n }\n if (isAlpha) {\n const matchedType = TokenTypes.keywords[lexeme];\n if (matchedType) {\n this._addToken(matchedType);\n return true;\n }\n }\n if (isAlpha || isUnderscore) {\n this._addToken(TokenTypes.tokens.ident);\n return true;\n }\n // Scan for the next valid token type\n for (;;) {\n let matchedType = this._findType(lexeme);\n // An exception to \"longest lexeme\" rule is '>>'. In the case of 1>>2, it's a\n // shift_right.\n // In the case of array>, it's two greater_than's (one to close the vec4,\n // and one to close the array).\n // Another ambiguity is '>='. In the case of vec2=vec2(1,2),\n // it's a greather_than and an equal, not a greater_than_equal.\n // WGSL requires context sensitive parsing to resolve these ambiguities. Both of these cases\n // are predicated on it the > either closing a template, or being part of an operator.\n // The solution here is to check if there was a less_than up to some number of tokens\n // previously, and the token prior to that is a keyword that requires a '<', then it will be\n // split into two operators; otherwise it's a single operator.\n const nextLexeme = this._peekAhead();\n if (lexeme == \">\" && (nextLexeme == \">\" || nextLexeme == \"=\")) {\n let foundLessThan = false;\n let ti = this._tokens.length - 1;\n for (let count = 0; count < 5 && ti >= 0; ++count, --ti) {\n if (this._tokens[ti].type === TokenTypes.tokens.less_than) {\n if (ti > 0 && this._tokens[ti - 1].isArrayOrTemplateType()) {\n foundLessThan = true;\n }\n break;\n }\n }\n // If there was a less_than in the recent token history, then this is probably a\n // greater_than.\n if (foundLessThan) {\n this._addToken(matchedType);\n return true;\n }\n }\n // The current lexeme may not match any rule, but some token types may be invalid for\n // part of the string but valid after a few more characters.\n // For example, 0x.5 is a hex_float_literal. But as it's being scanned,\n // \"0\" is a int_literal, then \"0x\" is invalid. If we stopped there, it would return\n // the int_literal \"0\", but that's incorrect. So if we look forward a few characters,\n // we'd get \"0x.\", which is still invalid, followed by \"0x.5\" which is the correct\n // hex_float_literal. So that means if we hit an non-matching string, we should look\n // ahead up to two characters to see if the string starts matching a valid rule again.\n if (matchedType === TokenTypes.none) {\n let lookAheadLexeme = lexeme;\n let lookAhead = 0;\n const maxLookAhead = 2;\n for (let li = 0; li < maxLookAhead; ++li) {\n lookAheadLexeme += this._peekAhead(li);\n matchedType = this._findType(lookAheadLexeme);\n if (matchedType !== TokenTypes.none) {\n lookAhead = li;\n break;\n }\n }\n if (matchedType === TokenTypes.none) {\n if (matchType === TokenTypes.none) {\n return false;\n }\n this._current--;\n this._addToken(matchType);\n return true;\n }\n lexeme = lookAheadLexeme;\n this._current += lookAhead + 1;\n }\n matchType = matchedType;\n if (this._isAtEnd()) {\n break;\n }\n lexeme += this._advance();\n }\n // We got to the end of the input stream. Then the token we've ready so far is it.\n if (matchType === TokenTypes.none) {\n return false;\n }\n this._addToken(matchType);\n return true;\n }\n _findType(lexeme) {\n for (const name in TokenTypes.regexTokens) {\n const type = TokenTypes.regexTokens[name];\n if (this._match(lexeme, type.rule)) {\n return type;\n }\n }\n const type = TokenTypes.literalTokens[lexeme];\n if (type) {\n return type;\n }\n return TokenTypes.none;\n }\n _match(lexeme, rule) {\n const match = rule.exec(lexeme);\n return match && match.index == 0 && match[0] == lexeme;\n }\n _isAtEnd() {\n return this._current >= this._source.length;\n }\n _isAlpha(c) {\n return (c >= \"a\" && c <= \"z\") || (c >= \"A\" && c <= \"Z\");\n }\n _isAlphaNumeric(c) {\n return (c >= \"a\" && c <= \"z\") || (c >= \"A\" && c <= \"Z\") || c == \"_\" || (c >= \"0\" && c <= \"9\");\n }\n _isWhitespace(c) {\n return c == \" \" || c == \"\\t\" || c == \"\\r\";\n }\n _advance(amount = 0) {\n let c = this._source[this._current];\n amount = amount || 0;\n amount++;\n this._current += amount;\n return c;\n }\n _peekAhead(offset = 0) {\n offset = offset || 0;\n if (this._current + offset >= this._source.length) {\n return \"\\0\";\n }\n return this._source[this._current + offset];\n }\n _addToken(type) {\n const text = this._source.substring(this._start, this._current);\n this._tokens.push(new Token(type, text, this._line));\n }\n}\n\n/**\n * @author Brendan Duncan / https://github.com/brendan-duncan\n */\n/// Parse a sequence of tokens from the WgslScanner into an Abstract Syntax Tree (AST).\nclass WgslParser {\n constructor() {\n this._tokens = [];\n this._current = 0;\n this._currentLine = 0;\n this._context = new ParseContext();\n this._deferArrayCountEval = [];\n }\n parse(tokensOrCode) {\n this._initialize(tokensOrCode);\n this._deferArrayCountEval.length = 0;\n const statements = [];\n while (!this._isAtEnd()) {\n const statement = this._global_decl_or_directive();\n if (!statement) {\n break;\n }\n statements.push(statement);\n }\n // Since constants can be declared after they are used, and\n // constants can be used to size arrays, defer calculating the\n // size until after the shader has finished parsing.\n if (this._deferArrayCountEval.length > 0) {\n for (const arrayDecl of this._deferArrayCountEval) {\n const arrayType = arrayDecl[\"arrayType\"];\n const countNode = arrayDecl[\"countNode\"];\n if (countNode instanceof VariableExpr) {\n const variable = countNode;\n const name = variable.name;\n const constant = this._context.constants.get(name);\n if (constant) {\n try {\n const count = constant.evaluate(this._context);\n arrayType.count = count;\n }\n catch (e) {\n }\n }\n }\n }\n this._deferArrayCountEval.length = 0;\n }\n return statements;\n }\n _initialize(tokensOrCode) {\n if (tokensOrCode) {\n if (typeof tokensOrCode == \"string\") {\n const scanner = new WgslScanner(tokensOrCode);\n this._tokens = scanner.scanTokens();\n }\n else {\n this._tokens = tokensOrCode;\n }\n }\n else {\n this._tokens = [];\n }\n this._current = 0;\n }\n _error(token, message) {\n return {\n token,\n message,\n toString: function () {\n return `${message}`;\n },\n };\n }\n _isAtEnd() {\n return (this._current >= this._tokens.length ||\n this._peek().type == TokenTypes.eof);\n }\n _match(types) {\n if (types instanceof TokenType) {\n if (this._check(types)) {\n this._advance();\n return true;\n }\n return false;\n }\n for (let i = 0, l = types.length; i < l; ++i) {\n const type = types[i];\n if (this._check(type)) {\n this._advance();\n return true;\n }\n }\n return false;\n }\n _consume(types, message) {\n if (this._check(types)) {\n return this._advance();\n }\n throw this._error(this._peek(), message);\n }\n _check(types) {\n if (this._isAtEnd()) {\n return false;\n }\n const tk = this._peek();\n if (types instanceof Array) {\n const t = tk.type;\n const index = types.indexOf(t);\n return index != -1;\n }\n return tk.type == types;\n }\n _advance() {\n var _a, _b;\n this._currentLine = (_b = (_a = this._peek()) === null || _a === void 0 ? void 0 : _a.line) !== null && _b !== void 0 ? _b : -1;\n if (!this._isAtEnd()) {\n this._current++;\n }\n return this._previous();\n }\n _peek() {\n return this._tokens[this._current];\n }\n _previous() {\n return this._tokens[this._current - 1];\n }\n _global_decl_or_directive() {\n // semicolon\n // global_variable_decl semicolon\n // global_constant_decl semicolon\n // type_alias semicolon\n // struct_decl\n // function_decl\n // enable_directive\n // Ignore any stand-alone semicolons\n while (this._match(TokenTypes.tokens.semicolon) && !this._isAtEnd())\n ;\n if (this._match(TokenTypes.keywords.alias)) {\n const type = this._type_alias();\n this._consume(TokenTypes.tokens.semicolon, \"Expected ';'\");\n return type;\n }\n if (this._match(TokenTypes.keywords.diagnostic)) {\n const directive = this._diagnostic();\n this._consume(TokenTypes.tokens.semicolon, \"Expected ';'\");\n return directive;\n }\n if (this._match(TokenTypes.keywords.requires)) {\n const requires = this._requires_directive();\n this._consume(TokenTypes.tokens.semicolon, \"Expected ';'\");\n return requires;\n }\n if (this._match(TokenTypes.keywords.enable)) {\n const enable = this._enable_directive();\n this._consume(TokenTypes.tokens.semicolon, \"Expected ';'\");\n return enable;\n }\n // The following statements have an optional attribute*\n const attrs = this._attribute();\n if (this._check(TokenTypes.keywords.var)) {\n const _var = this._global_variable_decl();\n if (_var != null) {\n _var.attributes = attrs;\n }\n this._consume(TokenTypes.tokens.semicolon, \"Expected ';'.\");\n return _var;\n }\n if (this._check(TokenTypes.keywords.override)) {\n const _override = this._override_variable_decl();\n if (_override != null) {\n _override.attributes = attrs;\n }\n this._consume(TokenTypes.tokens.semicolon, \"Expected ';'.\");\n return _override;\n }\n if (this._check(TokenTypes.keywords.let)) {\n const _let = this._global_let_decl();\n if (_let != null) {\n _let.attributes = attrs;\n }\n this._consume(TokenTypes.tokens.semicolon, \"Expected ';'.\");\n return _let;\n }\n if (this._check(TokenTypes.keywords.const)) {\n const _const = this._global_const_decl();\n if (_const != null) {\n _const.attributes = attrs;\n }\n this._consume(TokenTypes.tokens.semicolon, \"Expected ';'.\");\n return _const;\n }\n if (this._check(TokenTypes.keywords.struct)) {\n const _struct = this._struct_decl();\n if (_struct != null) {\n _struct.attributes = attrs;\n }\n return _struct;\n }\n if (this._check(TokenTypes.keywords.fn)) {\n const _fn = this._function_decl();\n if (_fn != null) {\n _fn.attributes = attrs;\n }\n return _fn;\n }\n return null;\n }\n _function_decl() {\n // attribute* function_header compound_statement\n // function_header: fn ident paren_left param_list? paren_right (arrow attribute* type_decl)?\n if (!this._match(TokenTypes.keywords.fn)) {\n return null;\n }\n const startLine = this._currentLine;\n const name = this._consume(TokenTypes.tokens.ident, \"Expected function name.\").toString();\n this._consume(TokenTypes.tokens.paren_left, \"Expected '(' for function arguments.\");\n const args = [];\n if (!this._check(TokenTypes.tokens.paren_right)) {\n do {\n if (this._check(TokenTypes.tokens.paren_right)) {\n break;\n }\n const argAttrs = this._attribute();\n const name = this._consume(TokenTypes.tokens.ident, \"Expected argument name.\").toString();\n this._consume(TokenTypes.tokens.colon, \"Expected ':' for argument type.\");\n const typeAttrs = this._attribute();\n const type = this._type_decl();\n if (type != null) {\n type.attributes = typeAttrs;\n args.push(new Argument(name, type, argAttrs));\n }\n } while (this._match(TokenTypes.tokens.comma));\n }\n this._consume(TokenTypes.tokens.paren_right, \"Expected ')' after function arguments.\");\n let _return = null;\n if (this._match(TokenTypes.tokens.arrow)) {\n const attrs = this._attribute();\n _return = this._type_decl();\n if (_return != null) {\n _return.attributes = attrs;\n }\n }\n const body = this._compound_statement();\n const endLine = this._currentLine;\n return new Function(name, args, _return, body, startLine, endLine);\n }\n _compound_statement() {\n // brace_left statement* brace_right\n const statements = [];\n this._consume(TokenTypes.tokens.brace_left, \"Expected '{' for block.\");\n while (!this._check(TokenTypes.tokens.brace_right)) {\n const statement = this._statement();\n if (statement !== null) {\n statements.push(statement);\n }\n }\n this._consume(TokenTypes.tokens.brace_right, \"Expected '}' for block.\");\n return statements;\n }\n _statement() {\n // semicolon\n // return_statement semicolon\n // if_statement\n // switch_statement\n // loop_statement\n // for_statement\n // func_call_statement semicolon\n // variable_statement semicolon\n // break_statement semicolon\n // continue_statement semicolon\n // continuing_statement compound_statement\n // discard semicolon\n // assignment_statement semicolon\n // compound_statement\n // increment_statement semicolon\n // decrement_statement semicolon\n // static_assert_statement semicolon\n // Ignore any stand-alone semicolons\n while (this._match(TokenTypes.tokens.semicolon) && !this._isAtEnd())\n ;\n if (this._check(TokenTypes.tokens.attr)) {\n this._attribute();\n }\n if (this._check(TokenTypes.keywords.if)) {\n return this._if_statement();\n }\n if (this._check(TokenTypes.keywords.switch)) {\n return this._switch_statement();\n }\n if (this._check(TokenTypes.keywords.loop)) {\n return this._loop_statement();\n }\n if (this._check(TokenTypes.keywords.for)) {\n return this._for_statement();\n }\n if (this._check(TokenTypes.keywords.while)) {\n return this._while_statement();\n }\n if (this._check(TokenTypes.keywords.continuing)) {\n return this._continuing_statement();\n }\n if (this._check(TokenTypes.keywords.static_assert)) {\n return this._static_assert_statement();\n }\n if (this._check(TokenTypes.tokens.brace_left)) {\n return this._compound_statement();\n }\n let result = null;\n if (this._check(TokenTypes.keywords.return)) {\n result = this._return_statement();\n }\n else if (this._check([\n TokenTypes.keywords.var,\n TokenTypes.keywords.let,\n TokenTypes.keywords.const,\n ])) {\n result = this._variable_statement();\n }\n else if (this._match(TokenTypes.keywords.discard)) {\n result = new Discard();\n }\n else if (this._match(TokenTypes.keywords.break)) {\n result = new Break();\n }\n else if (this._match(TokenTypes.keywords.continue)) {\n result = new Continue();\n }\n else {\n result =\n this._increment_decrement_statement() ||\n this._func_call_statement() ||\n this._assignment_statement();\n }\n if (result != null) {\n this._consume(TokenTypes.tokens.semicolon, \"Expected ';' after statement.\");\n }\n return result;\n }\n _static_assert_statement() {\n if (!this._match(TokenTypes.keywords.static_assert)) {\n return null;\n }\n const expression = this._optional_paren_expression();\n return new StaticAssert(expression);\n }\n _while_statement() {\n if (!this._match(TokenTypes.keywords.while)) {\n return null;\n }\n const condition = this._optional_paren_expression();\n if (this._check(TokenTypes.tokens.attr)) {\n this._attribute();\n }\n const block = this._compound_statement();\n return new While(condition, block);\n }\n _continuing_statement() {\n if (!this._match(TokenTypes.keywords.continuing)) {\n return null;\n }\n const block = this._compound_statement();\n return new Continuing(block);\n }\n _for_statement() {\n // for paren_left for_header paren_right compound_statement\n if (!this._match(TokenTypes.keywords.for)) {\n return null;\n }\n this._consume(TokenTypes.tokens.paren_left, \"Expected '('.\");\n // for_header: (variable_statement assignment_statement func_call_statement)? semicolon short_circuit_or_expression? semicolon (assignment_statement func_call_statement)?\n const init = !this._check(TokenTypes.tokens.semicolon)\n ? this._for_init()\n : null;\n this._consume(TokenTypes.tokens.semicolon, \"Expected ';'.\");\n const condition = !this._check(TokenTypes.tokens.semicolon)\n ? this._short_circuit_or_expression()\n : null;\n this._consume(TokenTypes.tokens.semicolon, \"Expected ';'.\");\n const increment = !this._check(TokenTypes.tokens.paren_right)\n ? this._for_increment()\n : null;\n this._consume(TokenTypes.tokens.paren_right, \"Expected ')'.\");\n if (this._check(TokenTypes.tokens.attr)) {\n this._attribute();\n }\n const body = this._compound_statement();\n return new For(init, condition, increment, body);\n }\n _for_init() {\n // (variable_statement assignment_statement func_call_statement)?\n return (this._variable_statement() ||\n this._func_call_statement() ||\n this._assignment_statement());\n }\n _for_increment() {\n // (assignment_statement func_call_statement increment_statement)?\n return (this._func_call_statement() ||\n this._increment_decrement_statement() ||\n this._assignment_statement());\n }\n _variable_statement() {\n // variable_decl\n // variable_decl equal short_circuit_or_expression\n // let (ident variable_ident_decl) equal short_circuit_or_expression\n // const (ident variable_ident_decl) equal short_circuit_or_expression\n if (this._check(TokenTypes.keywords.var)) {\n const _var = this._variable_decl();\n if (_var === null) {\n throw this._error(this._peek(), \"Variable declaration expected.\");\n }\n let value = null;\n if (this._match(TokenTypes.tokens.equal)) {\n value = this._short_circuit_or_expression();\n }\n return new Var(_var.name, _var.type, _var.storage, _var.access, value);\n }\n if (this._match(TokenTypes.keywords.let)) {\n const name = this._consume(TokenTypes.tokens.ident, \"Expected name for let.\").toString();\n let type = null;\n if (this._match(TokenTypes.tokens.colon)) {\n const typeAttrs = this._attribute();\n type = this._type_decl();\n if (type != null) {\n type.attributes = typeAttrs;\n }\n }\n this._consume(TokenTypes.tokens.equal, \"Expected '=' for let.\");\n const value = this._short_circuit_or_expression();\n return new Let(name, type, null, null, value);\n }\n if (this._match(TokenTypes.keywords.const)) {\n const name = this._consume(TokenTypes.tokens.ident, \"Expected name for const.\").toString();\n let type = null;\n if (this._match(TokenTypes.tokens.colon)) {\n const typeAttrs = this._attribute();\n type = this._type_decl();\n if (type != null) {\n type.attributes = typeAttrs;\n }\n }\n this._consume(TokenTypes.tokens.equal, \"Expected '=' for const.\");\n const value = this._short_circuit_or_expression();\n return new Const(name, type, null, null, value);\n }\n return null;\n }\n _increment_decrement_statement() {\n const savedPos = this._current;\n const _var = this._unary_expression();\n if (_var == null) {\n return null;\n }\n if (!this._check(TokenTypes.increment_operators)) {\n this._current = savedPos;\n return null;\n }\n const token = this._consume(TokenTypes.increment_operators, \"Expected increment operator\");\n return new Increment(token.type === TokenTypes.tokens.plus_plus\n ? IncrementOperator.increment\n : IncrementOperator.decrement, _var);\n }\n _assignment_statement() {\n // (unary_expression underscore) equal short_circuit_or_expression\n let _var = null;\n if (this._check(TokenTypes.tokens.brace_right)) {\n return null;\n }\n let isUnderscore = this._match(TokenTypes.tokens.underscore);\n if (!isUnderscore) {\n _var = this._unary_expression();\n }\n if (!isUnderscore && _var == null) {\n return null;\n }\n const type = this._consume(TokenTypes.assignment_operators, \"Expected assignment operator.\");\n const value = this._short_circuit_or_expression();\n return new Assign(AssignOperator.parse(type.lexeme), _var, value);\n }\n _func_call_statement() {\n // ident argument_expression_list\n if (!this._check(TokenTypes.tokens.ident)) {\n return null;\n }\n const savedPos = this._current;\n const name = this._consume(TokenTypes.tokens.ident, \"Expected function name.\");\n const args = this._argument_expression_list();\n if (args === null) {\n this._current = savedPos;\n return null;\n }\n return new Call(name.lexeme, args);\n }\n _loop_statement() {\n // loop brace_left statement* continuing_statement? brace_right\n if (!this._match(TokenTypes.keywords.loop)) {\n return null;\n }\n if (this._check(TokenTypes.tokens.attr)) {\n this._attribute();\n }\n this._consume(TokenTypes.tokens.brace_left, \"Expected '{' for loop.\");\n // statement*\n const statements = [];\n let statement = this._statement();\n while (statement !== null) {\n if (Array.isArray(statement)) {\n for (let s of statement) {\n statements.push(s);\n }\n }\n else {\n statements.push(statement);\n }\n statement = this._statement();\n }\n // continuing_statement: continuing compound_statement\n let continuing = null;\n if (this._match(TokenTypes.keywords.continuing)) {\n continuing = this._compound_statement();\n }\n this._consume(TokenTypes.tokens.brace_right, \"Expected '}' for loop.\");\n return new Loop(statements, continuing);\n }\n _switch_statement() {\n // switch optional_paren_expression brace_left switch_body+ brace_right\n if (!this._match(TokenTypes.keywords.switch)) {\n return null;\n }\n const condition = this._optional_paren_expression();\n if (this._check(TokenTypes.tokens.attr)) {\n this._attribute();\n }\n this._consume(TokenTypes.tokens.brace_left, \"Expected '{' for switch.\");\n const body = this._switch_body();\n if (body == null || body.length == 0) {\n throw this._error(this._previous(), \"Expected 'case' or 'default'.\");\n }\n this._consume(TokenTypes.tokens.brace_right, \"Expected '}' for switch.\");\n return new Switch(condition, body);\n }\n _switch_body() {\n // case case_selectors colon brace_left case_body? brace_right\n // default colon brace_left case_body? brace_right\n const cases = [];\n if (this._match(TokenTypes.keywords.case)) {\n const selector = this._case_selectors();\n this._match(TokenTypes.tokens.colon); // colon is optional\n if (this._check(TokenTypes.tokens.attr)) {\n this._attribute();\n }\n this._consume(TokenTypes.tokens.brace_left, \"Exected '{' for switch case.\");\n const body = this._case_body();\n this._consume(TokenTypes.tokens.brace_right, \"Exected '}' for switch case.\");\n cases.push(new Case(selector, body));\n }\n if (this._match(TokenTypes.keywords.default)) {\n this._match(TokenTypes.tokens.colon); // colon is optional\n if (this._check(TokenTypes.tokens.attr)) {\n this._attribute();\n }\n this._consume(TokenTypes.tokens.brace_left, \"Exected '{' for switch default.\");\n const body = this._case_body();\n this._consume(TokenTypes.tokens.brace_right, \"Exected '}' for switch default.\");\n cases.push(new Default(body));\n }\n if (this._check([TokenTypes.keywords.default, TokenTypes.keywords.case])) {\n const _cases = this._switch_body();\n cases.push(_cases[0]);\n }\n return cases;\n }\n _case_selectors() {\n // const_literal (comma const_literal)* comma?\n const selectors = [\n this._shift_expression(), //?.evaluate(this._context).toString() ?? \"\",\n ];\n while (this._match(TokenTypes.tokens.comma)) {\n selectors.push(this._shift_expression());\n }\n return selectors;\n }\n _case_body() {\n // statement case_body?\n // fallthrough semicolon\n if (this._match(TokenTypes.keywords.fallthrough)) {\n this._consume(TokenTypes.tokens.semicolon, \"Expected ';'\");\n return [];\n }\n let statement = this._statement();\n if (statement == null) {\n return [];\n }\n if (!(statement instanceof Array)) {\n statement = [statement];\n }\n const nextStatement = this._case_body();\n if (nextStatement.length == 0) {\n return statement;\n }\n return [...statement, nextStatement[0]];\n }\n _if_statement() {\n // if optional_paren_expression compound_statement elseif_statement? else_statement?\n if (!this._match(TokenTypes.keywords.if)) {\n return null;\n }\n const condition = this._optional_paren_expression();\n if (this._check(TokenTypes.tokens.attr)) {\n this._attribute();\n }\n const block = this._compound_statement();\n let elseif = [];\n if (this._match_elseif()) {\n if (this._check(TokenTypes.tokens.attr)) {\n this._attribute();\n }\n elseif = this._elseif_statement(elseif);\n }\n let _else = null;\n if (this._match(TokenTypes.keywords.else)) {\n if (this._check(TokenTypes.tokens.attr)) {\n this._attribute();\n }\n _else = this._compound_statement();\n }\n return new If(condition, block, elseif, _else);\n }\n _match_elseif() {\n if (this._tokens[this._current].type === TokenTypes.keywords.else &&\n this._tokens[this._current + 1].type === TokenTypes.keywords.if) {\n this._advance();\n this._advance();\n return true;\n }\n return false;\n }\n _elseif_statement(elseif = []) {\n // else_if optional_paren_expression compound_statement elseif_statement?\n const condition = this._optional_paren_expression();\n const block = this._compound_statement();\n elseif.push(new ElseIf(condition, block));\n if (this._match_elseif()) {\n if (this._check(TokenTypes.tokens.attr)) {\n this._attribute();\n }\n this._elseif_statement(elseif);\n }\n return elseif;\n }\n _return_statement() {\n // return short_circuit_or_expression?\n if (!this._match(TokenTypes.keywords.return)) {\n return null;\n }\n const value = this._short_circuit_or_expression();\n return new Return(value);\n }\n _short_circuit_or_expression() {\n // short_circuit_and_expression\n // short_circuit_or_expression or_or short_circuit_and_expression\n let expr = this._short_circuit_and_expr();\n while (this._match(TokenTypes.tokens.or_or)) {\n expr = new BinaryOperator(this._previous().toString(), expr, this._short_circuit_and_expr());\n }\n return expr;\n }\n _short_circuit_and_expr() {\n // inclusive_or_expression\n // short_circuit_and_expression and_and inclusive_or_expression\n let expr = this._inclusive_or_expression();\n while (this._match(TokenTypes.tokens.and_and)) {\n expr = new BinaryOperator(this._previous().toString(), expr, this._inclusive_or_expression());\n }\n return expr;\n }\n _inclusive_or_expression() {\n // exclusive_or_expression\n // inclusive_or_expression or exclusive_or_expression\n let expr = this._exclusive_or_expression();\n while (this._match(TokenTypes.tokens.or)) {\n expr = new BinaryOperator(this._previous().toString(), expr, this._exclusive_or_expression());\n }\n return expr;\n }\n _exclusive_or_expression() {\n // and_expression\n // exclusive_or_expression xor and_expression\n let expr = this._and_expression();\n while (this._match(TokenTypes.tokens.xor)) {\n expr = new BinaryOperator(this._previous().toString(), expr, this._and_expression());\n }\n return expr;\n }\n _and_expression() {\n // equality_expression\n // and_expression and equality_expression\n let expr = this._equality_expression();\n while (this._match(TokenTypes.tokens.and)) {\n expr = new BinaryOperator(this._previous().toString(), expr, this._equality_expression());\n }\n return expr;\n }\n _equality_expression() {\n // relational_expression\n // relational_expression equal_equal relational_expression\n // relational_expression not_equal relational_expression\n const expr = this._relational_expression();\n if (this._match([TokenTypes.tokens.equal_equal, TokenTypes.tokens.not_equal])) {\n return new BinaryOperator(this._previous().toString(), expr, this._relational_expression());\n }\n return expr;\n }\n _relational_expression() {\n // shift_expression\n // relational_expression less_than shift_expression\n // relational_expression greater_than shift_expression\n // relational_expression less_than_equal shift_expression\n // relational_expression greater_than_equal shift_expression\n let expr = this._shift_expression();\n while (this._match([\n TokenTypes.tokens.less_than,\n TokenTypes.tokens.greater_than,\n TokenTypes.tokens.less_than_equal,\n TokenTypes.tokens.greater_than_equal,\n ])) {\n expr = new BinaryOperator(this._previous().toString(), expr, this._shift_expression());\n }\n return expr;\n }\n _shift_expression() {\n // additive_expression\n // shift_expression shift_left additive_expression\n // shift_expression shift_right additive_expression\n let expr = this._additive_expression();\n while (this._match([TokenTypes.tokens.shift_left, TokenTypes.tokens.shift_right])) {\n expr = new BinaryOperator(this._previous().toString(), expr, this._additive_expression());\n }\n return expr;\n }\n _additive_expression() {\n // multiplicative_expression\n // additive_expression plus multiplicative_expression\n // additive_expression minus multiplicative_expression\n let expr = this._multiplicative_expression();\n while (this._match([TokenTypes.tokens.plus, TokenTypes.tokens.minus])) {\n expr = new BinaryOperator(this._previous().toString(), expr, this._multiplicative_expression());\n }\n return expr;\n }\n _multiplicative_expression() {\n // unary_expression\n // multiplicative_expression star unary_expression\n // multiplicative_expression forward_slash unary_expression\n // multiplicative_expression modulo unary_expression\n let expr = this._unary_expression();\n while (this._match([\n TokenTypes.tokens.star,\n TokenTypes.tokens.forward_slash,\n TokenTypes.tokens.modulo,\n ])) {\n expr = new BinaryOperator(this._previous().toString(), expr, this._unary_expression());\n }\n return expr;\n }\n _unary_expression() {\n // singular_expression\n // minus unary_expression\n // bang unary_expression\n // tilde unary_expression\n // star unary_expression\n // and unary_expression\n if (this._match([\n TokenTypes.tokens.minus,\n TokenTypes.tokens.bang,\n TokenTypes.tokens.tilde,\n TokenTypes.tokens.star,\n TokenTypes.tokens.and,\n ])) {\n return new UnaryOperator(this._previous().toString(), this._unary_expression());\n }\n return this._singular_expression();\n }\n _singular_expression() {\n // primary_expression postfix_expression ?\n const expr = this._primary_expression();\n const p = this._postfix_expression();\n if (p) {\n expr.postfix = p;\n }\n return expr;\n }\n _postfix_expression() {\n // bracket_left short_circuit_or_expression bracket_right postfix_expression?\n if (this._match(TokenTypes.tokens.bracket_left)) {\n const expr = this._short_circuit_or_expression();\n this._consume(TokenTypes.tokens.bracket_right, \"Expected ']'.\");\n const arrayIndex = new ArrayIndex(expr);\n const p = this._postfix_expression();\n if (p) {\n arrayIndex.postfix = p;\n }\n return arrayIndex;\n }\n // period ident postfix_expression?\n if (this._match(TokenTypes.tokens.period)) {\n const name = this._consume(TokenTypes.tokens.ident, \"Expected member name.\");\n const p = this._postfix_expression();\n const expr = new StringExpr(name.lexeme);\n if (p) {\n expr.postfix = p;\n }\n return expr;\n }\n return null;\n }\n _getStruct(name) {\n if (this._context.aliases.has(name)) {\n const alias = this._context.aliases.get(name).type;\n return alias;\n }\n if (this._context.structs.has(name)) {\n const struct = this._context.structs.get(name);\n return struct;\n }\n return null;\n }\n _primary_expression() {\n // ident argument_expression_list?\n if (this._match(TokenTypes.tokens.ident)) {\n const name = this._previous().toString();\n if (this._check(TokenTypes.tokens.paren_left)) {\n const args = this._argument_expression_list();\n const struct = this._getStruct(name);\n if (struct != null) {\n return new CreateExpr(struct, args);\n }\n return new CallExpr(name, args);\n }\n if (this._context.constants.has(name)) {\n const c = this._context.constants.get(name);\n return new ConstExpr(name, c.value);\n }\n return new VariableExpr(name);\n }\n // const_literal\n if (this._match(TokenTypes.const_literal)) {\n return new LiteralExpr(parseFloat(this._previous().toString()));\n }\n // paren_expression\n if (this._check(TokenTypes.tokens.paren_left)) {\n return this._paren_expression();\n }\n // bitcast less_than type_decl greater_than paren_expression\n if (this._match(TokenTypes.keywords.bitcast)) {\n this._consume(TokenTypes.tokens.less_than, \"Expected '<'.\");\n const type = this._type_decl();\n this._consume(TokenTypes.tokens.greater_than, \"Expected '>'.\");\n const value = this._paren_expression();\n return new BitcastExpr(type, value);\n }\n // type_decl argument_expression_list\n const type = this._type_decl();\n const args = this._argument_expression_list();\n return new TypecastExpr(type, args);\n }\n _argument_expression_list() {\n // paren_left ((short_circuit_or_expression comma)* short_circuit_or_expression comma?)? paren_right\n if (!this._match(TokenTypes.tokens.paren_left)) {\n return null;\n }\n const args = [];\n do {\n if (this._check(TokenTypes.tokens.paren_right)) {\n break;\n }\n const arg = this._short_circuit_or_expression();\n args.push(arg);\n } while (this._match(TokenTypes.tokens.comma));\n this._consume(TokenTypes.tokens.paren_right, \"Expected ')' for agument list\");\n return args;\n }\n _optional_paren_expression() {\n // [paren_left] short_circuit_or_expression [paren_right]\n this._match(TokenTypes.tokens.paren_left);\n const expr = this._short_circuit_or_expression();\n this._match(TokenTypes.tokens.paren_right);\n return new GroupingExpr([expr]);\n }\n _paren_expression() {\n // paren_left short_circuit_or_expression paren_right\n this._consume(TokenTypes.tokens.paren_left, \"Expected '('.\");\n const expr = this._short_circuit_or_expression();\n this._consume(TokenTypes.tokens.paren_right, \"Expected ')'.\");\n return new GroupingExpr([expr]);\n }\n _struct_decl() {\n // attribute* struct ident struct_body_decl\n if (!this._match(TokenTypes.keywords.struct)) {\n return null;\n }\n const startLine = this._currentLine;\n const name = this._consume(TokenTypes.tokens.ident, \"Expected name for struct.\").toString();\n // struct_body_decl: brace_left (struct_member comma)* struct_member comma? brace_right\n this._consume(TokenTypes.tokens.brace_left, \"Expected '{' for struct body.\");\n const members = [];\n while (!this._check(TokenTypes.tokens.brace_right)) {\n // struct_member: attribute* variable_ident_decl\n const memberAttrs = this._attribute();\n const memberName = this._consume(TokenTypes.tokens.ident, \"Expected variable name.\").toString();\n this._consume(TokenTypes.tokens.colon, \"Expected ':' for struct member type.\");\n const typeAttrs = this._attribute();\n const memberType = this._type_decl();\n if (memberType != null) {\n memberType.attributes = typeAttrs;\n }\n if (!this._check(TokenTypes.tokens.brace_right))\n this._consume(TokenTypes.tokens.comma, \"Expected ',' for struct member.\");\n else\n this._match(TokenTypes.tokens.comma); // trailing comma optional.\n members.push(new Member(memberName, memberType, memberAttrs));\n }\n this._consume(TokenTypes.tokens.brace_right, \"Expected '}' after struct body.\");\n const endLine = this._currentLine;\n const structNode = new Struct(name, members, startLine, endLine);\n this._context.structs.set(name, structNode);\n return structNode;\n }\n _global_variable_decl() {\n // attribute* variable_decl (equal const_expression)?\n const _var = this._variable_decl();\n if (_var && this._match(TokenTypes.tokens.equal)) {\n _var.value = this._const_expression();\n }\n return _var;\n }\n _override_variable_decl() {\n // attribute* override_decl (equal const_expression)?\n const _override = this._override_decl();\n if (_override && this._match(TokenTypes.tokens.equal)) {\n _override.value = this._const_expression();\n }\n return _override;\n }\n _global_const_decl() {\n // attribute* const (ident variable_ident_decl) global_const_initializer?\n if (!this._match(TokenTypes.keywords.const)) {\n return null;\n }\n const name = this._consume(TokenTypes.tokens.ident, \"Expected variable name\");\n let type = null;\n if (this._match(TokenTypes.tokens.colon)) {\n const attrs = this._attribute();\n type = this._type_decl();\n if (type != null) {\n type.attributes = attrs;\n }\n }\n let value = null;\n if (this._match(TokenTypes.tokens.equal)) {\n const valueExpr = this._short_circuit_or_expression();\n if (valueExpr instanceof CreateExpr) {\n value = valueExpr;\n }\n else if (valueExpr instanceof ConstExpr &&\n valueExpr.initializer instanceof CreateExpr) {\n value = valueExpr.initializer;\n }\n else {\n try {\n const constValue = valueExpr.evaluate(this._context);\n value = new LiteralExpr(constValue);\n }\n catch (_a) {\n value = valueExpr;\n }\n }\n }\n const c = new Const(name.toString(), type, \"\", \"\", value);\n this._context.constants.set(c.name, c);\n return c;\n }\n _global_let_decl() {\n // attribute* let (ident variable_ident_decl) global_const_initializer?\n if (!this._match(TokenTypes.keywords.let)) {\n return null;\n }\n const name = this._consume(TokenTypes.tokens.ident, \"Expected variable name\");\n let type = null;\n if (this._match(TokenTypes.tokens.colon)) {\n const attrs = this._attribute();\n type = this._type_decl();\n if (type != null) {\n type.attributes = attrs;\n }\n }\n let value = null;\n if (this._match(TokenTypes.tokens.equal)) {\n value = this._const_expression();\n }\n return new Let(name.toString(), type, \"\", \"\", value);\n }\n _const_expression() {\n // type_decl paren_left ((const_expression comma)* const_expression comma?)? paren_right\n // const_literal\n if (this._match(TokenTypes.const_literal)) {\n return new StringExpr(this._previous().toString());\n }\n const type = this._type_decl();\n this._consume(TokenTypes.tokens.paren_left, \"Expected '('.\");\n let args = [];\n while (!this._check(TokenTypes.tokens.paren_right)) {\n args.push(this._const_expression());\n if (!this._check(TokenTypes.tokens.comma)) {\n break;\n }\n this._advance();\n }\n this._consume(TokenTypes.tokens.paren_right, \"Expected ')'.\");\n return new CreateExpr(type, args);\n }\n _variable_decl() {\n // var variable_qualifier? (ident variable_ident_decl)\n if (!this._match(TokenTypes.keywords.var)) {\n return null;\n }\n // variable_qualifier: less_than storage_class (comma access_mode)? greater_than\n let storage = \"\";\n let access = \"\";\n if (this._match(TokenTypes.tokens.less_than)) {\n storage = this._consume(TokenTypes.storage_class, \"Expected storage_class.\").toString();\n if (this._match(TokenTypes.tokens.comma))\n access = this._consume(TokenTypes.access_mode, \"Expected access_mode.\").toString();\n this._consume(TokenTypes.tokens.greater_than, \"Expected '>'.\");\n }\n const name = this._consume(TokenTypes.tokens.ident, \"Expected variable name\");\n let type = null;\n if (this._match(TokenTypes.tokens.colon)) {\n const attrs = this._attribute();\n type = this._type_decl();\n if (type != null) {\n type.attributes = attrs;\n }\n }\n return new Var(name.toString(), type, storage, access, null);\n }\n _override_decl() {\n // override (ident variable_ident_decl)\n if (!this._match(TokenTypes.keywords.override)) {\n return null;\n }\n const name = this._consume(TokenTypes.tokens.ident, \"Expected variable name\");\n let type = null;\n if (this._match(TokenTypes.tokens.colon)) {\n const attrs = this._attribute();\n type = this._type_decl();\n if (type != null) {\n type.attributes = attrs;\n }\n }\n return new Override(name.toString(), type, null);\n }\n _diagnostic() {\n // diagnostic(severity_control_name, diagnostic_rule_name)\n this._consume(TokenTypes.tokens.paren_left, \"Expected '('\");\n const severity = this._consume(TokenTypes.tokens.ident, \"Expected severity control name.\");\n this._consume(TokenTypes.tokens.comma, \"Expected ','\");\n const rule = this._consume(TokenTypes.tokens.ident, \"Expected diagnostic rule name.\");\n this._consume(TokenTypes.tokens.paren_right, \"Expected ')'\");\n return new Diagnostic(severity.toString(), rule.toString());\n }\n _enable_directive() {\n // enable ident semicolon\n const name = this._consume(TokenTypes.tokens.ident, \"identity expected.\");\n return new Enable(name.toString());\n }\n _requires_directive() {\n // requires extension [, extension]* semicolon\n const extensions = [this._consume(TokenTypes.tokens.ident, \"identity expected.\").toString()];\n while (this._match(TokenTypes.tokens.comma)) {\n const name = this._consume(TokenTypes.tokens.ident, \"identity expected.\");\n extensions.push(name.toString());\n }\n return new Requires(extensions);\n }\n _type_alias() {\n // type ident equal type_decl\n const name = this._consume(TokenTypes.tokens.ident, \"identity expected.\");\n this._consume(TokenTypes.tokens.equal, \"Expected '=' for type alias.\");\n let aliasType = this._type_decl();\n if (aliasType === null) {\n throw this._error(this._peek(), \"Expected Type for Alias.\");\n }\n if (this._context.aliases.has(aliasType.name)) {\n aliasType = this._context.aliases.get(aliasType.name).type;\n }\n const aliasNode = new Alias(name.toString(), aliasType);\n this._context.aliases.set(aliasNode.name, aliasNode);\n return aliasNode;\n }\n _type_decl() {\n // ident\n // bool\n // float32\n // int32\n // uint32\n // vec2 less_than type_decl greater_than\n // vec3 less_than type_decl greater_than\n // vec4 less_than type_decl greater_than\n // mat2x2 less_than type_decl greater_than\n // mat2x3 less_than type_decl greater_than\n // mat2x4 less_than type_decl greater_than\n // mat3x2 less_than type_decl greater_than\n // mat3x3 less_than type_decl greater_than\n // mat3x4 less_than type_decl greater_than\n // mat4x2 less_than type_decl greater_than\n // mat4x3 less_than type_decl greater_than\n // mat4x4 less_than type_decl greater_than\n // atomic less_than type_decl greater_than\n // pointer less_than storage_class comma type_decl (comma access_mode)? greater_than\n // array_type_decl\n // texture_sampler_types\n if (this._check([\n TokenTypes.tokens.ident,\n ...TokenTypes.texel_format,\n TokenTypes.keywords.bool,\n TokenTypes.keywords.f32,\n TokenTypes.keywords.i32,\n TokenTypes.keywords.u32,\n ])) {\n const type = this._advance();\n const typeName = type.toString();\n if (this._context.structs.has(typeName)) {\n return this._context.structs.get(typeName);\n }\n if (this._context.aliases.has(typeName)) {\n return this._context.aliases.get(typeName).type;\n }\n return new Type(type.toString());\n }\n // texture_sampler_types\n let type = this._texture_sampler_types();\n if (type) {\n return type;\n }\n if (this._check(TokenTypes.template_types)) {\n let type = this._advance().toString();\n let format = null;\n let access = null;\n if (this._match(TokenTypes.tokens.less_than)) {\n format = this._type_decl();\n access = null;\n if (this._match(TokenTypes.tokens.comma)) {\n access = this._consume(TokenTypes.access_mode, \"Expected access_mode for pointer\").toString();\n }\n this._consume(TokenTypes.tokens.greater_than, \"Expected '>' for type.\");\n }\n return new TemplateType(type, format, access);\n }\n // pointer less_than storage_class comma type_decl (comma access_mode)? greater_than\n if (this._match(TokenTypes.keywords.ptr)) {\n let pointer = this._previous().toString();\n this._consume(TokenTypes.tokens.less_than, \"Expected '<' for pointer.\");\n const storage = this._consume(TokenTypes.storage_class, \"Expected storage_class for pointer\");\n this._consume(TokenTypes.tokens.comma, \"Expected ',' for pointer.\");\n const decl = this._type_decl();\n let access = null;\n if (this._match(TokenTypes.tokens.comma)) {\n access = this._consume(TokenTypes.access_mode, \"Expected access_mode for pointer\").toString();\n }\n this._consume(TokenTypes.tokens.greater_than, \"Expected '>' for pointer.\");\n return new PointerType(pointer, storage.toString(), decl, access);\n }\n // The following type_decl's have an optional attribyte_list*\n const attrs = this._attribute();\n // attribute* array\n // attribute* array less_than type_decl (comma element_count_expression)? greater_than\n if (this._match(TokenTypes.keywords.array)) {\n let format = null;\n let countInt = -1;\n const array = this._previous();\n let countNode = null;\n if (this._match(TokenTypes.tokens.less_than)) {\n format = this._type_decl();\n if (this._context.aliases.has(format.name)) {\n format = this._context.aliases.get(format.name).type;\n }\n let count = \"\";\n if (this._match(TokenTypes.tokens.comma)) {\n countNode = this._shift_expression();\n // If we can't evaluate the node, defer evaluating it until after the shader has\n // finished being parsed, because const statements can be declared **after** they\n // are used.\n try {\n count = countNode.evaluate(this._context).toString();\n countNode = null;\n }\n catch (e) {\n count = \"1\";\n }\n }\n this._consume(TokenTypes.tokens.greater_than, \"Expected '>' for array.\");\n countInt = count ? parseInt(count) : 0;\n }\n const arrayType = new ArrayType(array.toString(), attrs, format, countInt);\n if (countNode) {\n this._deferArrayCountEval.push({ arrayType, countNode });\n }\n return arrayType;\n }\n return null;\n }\n _texture_sampler_types() {\n // sampler_type\n if (this._match(TokenTypes.sampler_type)) {\n return new SamplerType(this._previous().toString(), null, null);\n }\n // depth_texture_type\n if (this._match(TokenTypes.depth_texture_type)) {\n return new SamplerType(this._previous().toString(), null, null);\n }\n // sampled_texture_type less_than type_decl greater_than\n // multisampled_texture_type less_than type_decl greater_than\n if (this._match(TokenTypes.sampled_texture_type) ||\n this._match(TokenTypes.multisampled_texture_type)) {\n const sampler = this._previous();\n this._consume(TokenTypes.tokens.less_than, \"Expected '<' for sampler type.\");\n const format = this._type_decl();\n this._consume(TokenTypes.tokens.greater_than, \"Expected '>' for sampler type.\");\n return new SamplerType(sampler.toString(), format, null);\n }\n // storage_texture_type less_than texel_format comma access_mode greater_than\n if (this._match(TokenTypes.storage_texture_type)) {\n const sampler = this._previous();\n this._consume(TokenTypes.tokens.less_than, \"Expected '<' for sampler type.\");\n const format = this._consume(TokenTypes.texel_format, \"Invalid texel format.\").toString();\n this._consume(TokenTypes.tokens.comma, \"Expected ',' after texel format.\");\n const access = this._consume(TokenTypes.access_mode, \"Expected access mode for storage texture type.\").toString();\n this._consume(TokenTypes.tokens.greater_than, \"Expected '>' for sampler type.\");\n return new SamplerType(sampler.toString(), format, access);\n }\n return null;\n }\n _attribute() {\n // attr ident paren_left (literal_or_ident comma)* literal_or_ident paren_right\n // attr ident\n let attributes = [];\n while (this._match(TokenTypes.tokens.attr)) {\n const name = this._consume(TokenTypes.attribute_name, \"Expected attribute name\");\n const attr = new Attribute(name.toString(), null);\n if (this._match(TokenTypes.tokens.paren_left)) {\n // literal_or_ident\n attr.value = this._consume(TokenTypes.literal_or_ident, \"Expected attribute value\").toString();\n if (this._check(TokenTypes.tokens.comma)) {\n this._advance();\n do {\n const v = this._consume(TokenTypes.literal_or_ident, \"Expected attribute value\").toString();\n if (!(attr.value instanceof Array)) {\n attr.value = [attr.value];\n }\n attr.value.push(v);\n } while (this._match(TokenTypes.tokens.comma));\n }\n this._consume(TokenTypes.tokens.paren_right, \"Expected ')'\");\n }\n attributes.push(attr);\n }\n // Deprecated:\n // attr_left (attribute comma)* attribute attr_right\n while (this._match(TokenTypes.tokens.attr_left)) {\n if (!this._check(TokenTypes.tokens.attr_right)) {\n do {\n const name = this._consume(TokenTypes.attribute_name, \"Expected attribute name\");\n const attr = new Attribute(name.toString(), null);\n if (this._match(TokenTypes.tokens.paren_left)) {\n // literal_or_ident\n attr.value = [\n this._consume(TokenTypes.literal_or_ident, \"Expected attribute value\").toString(),\n ];\n if (this._check(TokenTypes.tokens.comma)) {\n this._advance();\n do {\n const v = this._consume(TokenTypes.literal_or_ident, \"Expected attribute value\").toString();\n attr.value.push(v);\n } while (this._match(TokenTypes.tokens.comma));\n }\n this._consume(TokenTypes.tokens.paren_right, \"Expected ')'\");\n }\n attributes.push(attr);\n } while (this._match(TokenTypes.tokens.comma));\n }\n // Consume ]]\n this._consume(TokenTypes.tokens.attr_right, \"Expected ']]' after attribute declarations\");\n }\n if (attributes.length == 0) {\n return null;\n }\n return attributes;\n }\n}\n\n/**\n * @author Brendan Duncan / https://github.com/brendan-duncan\n */\nclass TypeInfo {\n constructor(name, attributes) {\n this.name = name;\n this.attributes = attributes;\n this.size = 0;\n }\n get isArray() {\n return false;\n }\n get isStruct() {\n return false;\n }\n get isTemplate() {\n return false;\n }\n}\nclass MemberInfo {\n constructor(name, type, attributes) {\n this.name = name;\n this.type = type;\n this.attributes = attributes;\n this.offset = 0;\n this.size = 0;\n }\n get isArray() {\n return this.type.isArray;\n }\n get isStruct() {\n return this.type.isStruct;\n }\n get isTemplate() {\n return this.type.isTemplate;\n }\n get align() {\n return this.type.isStruct ? this.type.align : 0;\n }\n get members() {\n return this.type.isStruct ? this.type.members : null;\n }\n get format() {\n return this.type.isArray\n ? this.type.format\n : this.type.isTemplate\n ? this.type.format\n : null;\n }\n get count() {\n return this.type.isArray ? this.type.count : 0;\n }\n get stride() {\n return this.type.isArray ? this.type.stride : this.size;\n }\n}\nclass StructInfo extends TypeInfo {\n constructor(name, attributes) {\n super(name, attributes);\n this.members = [];\n this.align = 0;\n this.startLine = -1;\n this.endLine = -1;\n this.inUse = false;\n }\n get isStruct() {\n return true;\n }\n}\nclass ArrayInfo extends TypeInfo {\n constructor(name, attributes) {\n super(name, attributes);\n this.count = 0;\n this.stride = 0;\n }\n get isArray() {\n return true;\n }\n}\nclass TemplateInfo extends TypeInfo {\n constructor(name, format, attributes, access) {\n super(name, attributes);\n this.format = format;\n this.access = access;\n }\n get isTemplate() {\n return true;\n }\n}\nvar ResourceType;\n(function (ResourceType) {\n ResourceType[ResourceType[\"Uniform\"] = 0] = \"Uniform\";\n ResourceType[ResourceType[\"Storage\"] = 1] = \"Storage\";\n ResourceType[ResourceType[\"Texture\"] = 2] = \"Texture\";\n ResourceType[ResourceType[\"Sampler\"] = 3] = \"Sampler\";\n ResourceType[ResourceType[\"StorageTexture\"] = 4] = \"StorageTexture\";\n})(ResourceType || (ResourceType = {}));\nclass VariableInfo {\n constructor(name, type, group, binding, attributes, resourceType, access) {\n this.name = name;\n this.type = type;\n this.group = group;\n this.binding = binding;\n this.attributes = attributes;\n this.resourceType = resourceType;\n this.access = access;\n }\n get isArray() {\n return this.type.isArray;\n }\n get isStruct() {\n return this.type.isStruct;\n }\n get isTemplate() {\n return this.type.isTemplate;\n }\n get size() {\n return this.type.size;\n }\n get align() {\n return this.type.isStruct ? this.type.align : 0;\n }\n get members() {\n return this.type.isStruct ? this.type.members : null;\n }\n get format() {\n return this.type.isArray\n ? this.type.format\n : this.type.isTemplate\n ? this.type.format\n : null;\n }\n get count() {\n return this.type.isArray ? this.type.count : 0;\n }\n get stride() {\n return this.type.isArray ? this.type.stride : this.size;\n }\n}\nclass AliasInfo {\n constructor(name, type) {\n this.name = name;\n this.type = type;\n }\n}\nclass _TypeSize {\n constructor(align, size) {\n this.align = align;\n this.size = size;\n }\n}\nclass InputInfo {\n constructor(name, type, locationType, location) {\n this.name = name;\n this.type = type;\n this.locationType = locationType;\n this.location = location;\n this.interpolation = null;\n }\n}\nclass OutputInfo {\n constructor(name, type, locationType, location) {\n this.name = name;\n this.type = type;\n this.locationType = locationType;\n this.location = location;\n }\n}\nclass FunctionInfo {\n constructor(name, stage = null) {\n this.stage = null;\n this.inputs = [];\n this.outputs = [];\n this.resources = [];\n this.startLine = -1;\n this.endLine = -1;\n this.inUse = false;\n this.calls = new Set();\n this.name = name;\n this.stage = stage;\n }\n}\nclass EntryFunctions {\n constructor() {\n this.vertex = [];\n this.fragment = [];\n this.compute = [];\n }\n}\nclass OverrideInfo {\n constructor(name, type, attributes, id) {\n this.name = name;\n this.type = type;\n this.attributes = attributes;\n this.id = id;\n }\n}\nclass _FunctionResources {\n constructor(node) {\n this.resources = null;\n this.inUse = false;\n this.info = null;\n this.node = node;\n }\n}\nclass WgslReflect {\n constructor(code) {\n /// All top-level uniform vars in the shader.\n this.uniforms = [];\n /// All top-level storage vars in the shader.\n this.storage = [];\n /// All top-level texture vars in the shader;\n this.textures = [];\n // All top-level sampler vars in the shader.\n this.samplers = [];\n /// All top-level type aliases in the shader.\n this.aliases = [];\n /// All top-level overrides in the shader.\n this.overrides = [];\n /// All top-level structs in the shader.\n this.structs = [];\n /// All entry functions in the shader: vertex, fragment, and/or compute.\n this.entry = new EntryFunctions();\n /// All functions in the shader, including entry functions.\n this.functions = [];\n this._types = new Map();\n this._functions = new Map();\n if (code) {\n this.update(code);\n }\n }\n _isStorageTexture(type) {\n return (type.name == \"texture_storage_1d\" ||\n type.name == \"texture_storage_2d\" ||\n type.name == \"texture_storage_2d_array\" ||\n type.name == \"texture_storage_3d\");\n }\n update(code) {\n const parser = new WgslParser();\n const ast = parser.parse(code);\n for (const node of ast) {\n if (node instanceof Function) {\n this._functions.set(node.name, new _FunctionResources(node));\n }\n }\n for (const node of ast) {\n if (node instanceof Struct) {\n const info = this._getTypeInfo(node, null);\n if (info instanceof StructInfo) {\n this.structs.push(info);\n }\n }\n }\n for (const node of ast) {\n if (node instanceof Alias) {\n this.aliases.push(this._getAliasInfo(node));\n continue;\n }\n if (node instanceof Override) {\n const v = node;\n const id = this._getAttributeNum(v.attributes, \"id\", 0);\n const type = v.type != null ? this._getTypeInfo(v.type, v.attributes) : null;\n this.overrides.push(new OverrideInfo(v.name, type, v.attributes, id));\n continue;\n }\n if (this._isUniformVar(node)) {\n const v = node;\n const g = this._getAttributeNum(v.attributes, \"group\", 0);\n const b = this._getAttributeNum(v.attributes, \"binding\", 0);\n const type = this._getTypeInfo(v.type, v.attributes);\n const varInfo = new VariableInfo(v.name, type, g, b, v.attributes, ResourceType.Uniform, v.access);\n this.uniforms.push(varInfo);\n continue;\n }\n if (this._isStorageVar(node)) {\n const v = node;\n const g = this._getAttributeNum(v.attributes, \"group\", 0);\n const b = this._getAttributeNum(v.attributes, \"binding\", 0);\n const type = this._getTypeInfo(v.type, v.attributes);\n const isStorageTexture = this._isStorageTexture(type);\n const varInfo = new VariableInfo(v.name, type, g, b, v.attributes, isStorageTexture ? ResourceType.StorageTexture : ResourceType.Storage, v.access);\n this.storage.push(varInfo);\n continue;\n }\n if (this._isTextureVar(node)) {\n const v = node;\n const g = this._getAttributeNum(v.attributes, \"group\", 0);\n const b = this._getAttributeNum(v.attributes, \"binding\", 0);\n const type = this._getTypeInfo(v.type, v.attributes);\n const isStorageTexture = this._isStorageTexture(type);\n const varInfo = new VariableInfo(v.name, type, g, b, v.attributes, isStorageTexture ? ResourceType.StorageTexture : ResourceType.Texture, v.access);\n if (isStorageTexture) {\n this.storage.push(varInfo);\n }\n else {\n this.textures.push(varInfo);\n }\n continue;\n }\n if (this._isSamplerVar(node)) {\n const v = node;\n const g = this._getAttributeNum(v.attributes, \"group\", 0);\n const b = this._getAttributeNum(v.attributes, \"binding\", 0);\n const type = this._getTypeInfo(v.type, v.attributes);\n const varInfo = new VariableInfo(v.name, type, g, b, v.attributes, ResourceType.Sampler, v.access);\n this.samplers.push(varInfo);\n continue;\n }\n if (node instanceof Function) {\n const vertexStage = this._getAttribute(node, \"vertex\");\n const fragmentStage = this._getAttribute(node, \"fragment\");\n const computeStage = this._getAttribute(node, \"compute\");\n const stage = vertexStage || fragmentStage || computeStage;\n const fn = new FunctionInfo(node.name, stage === null || stage === void 0 ? void 0 : stage.name);\n fn.startLine = node.startLine;\n fn.endLine = node.endLine;\n this.functions.push(fn);\n this._functions.get(node.name).info = fn;\n if (stage) {\n this._functions.get(node.name).inUse = true;\n fn.inUse = true;\n fn.resources = this._findResources(node, !!stage);\n fn.inputs = this._getInputs(node.args);\n fn.outputs = this._getOutputs(node.returnType);\n this.entry[stage.name].push(fn);\n }\n continue;\n }\n }\n for (const fn of this._functions.values()) {\n if (fn.info) {\n fn.info.inUse = fn.inUse;\n this._addCalls(fn.node, fn.info.calls);\n }\n }\n for (const u of this.uniforms) {\n this._markStructsInUse(u.type);\n }\n for (const s of this.storage) {\n this._markStructsInUse(s.type);\n }\n }\n _markStructsInUse(type) {\n if (type.isStruct) {\n type.inUse = true;\n for (const m of type.members) {\n this._markStructsInUse(m.type);\n }\n }\n else if (type.isArray) {\n this._markStructsInUse(type.format);\n }\n else if (type.isTemplate) {\n this._markStructsInUse(type.format);\n }\n else {\n const alias = this._getAlias(type.name);\n if (alias) {\n this._markStructsInUse(alias);\n }\n }\n }\n _addCalls(fn, calls) {\n var _a;\n for (const call of fn.calls) {\n const info = (_a = this._functions.get(call.name)) === null || _a === void 0 ? void 0 : _a.info;\n if (info) {\n calls.add(info);\n }\n }\n }\n /// Find a resource by its group and binding.\n findResource(group, binding) {\n for (const u of this.uniforms) {\n if (u.group == group && u.binding == binding) {\n return u;\n }\n }\n for (const s of this.storage) {\n if (s.group == group && s.binding == binding) {\n return s;\n }\n }\n for (const t of this.textures) {\n if (t.group == group && t.binding == binding) {\n return t;\n }\n }\n for (const s of this.samplers) {\n if (s.group == group && s.binding == binding) {\n return s;\n }\n }\n return null;\n }\n _findResource(name) {\n for (const u of this.uniforms) {\n if (u.name == name) {\n return u;\n }\n }\n for (const s of this.storage) {\n if (s.name == name) {\n return s;\n }\n }\n for (const t of this.textures) {\n if (t.name == name) {\n return t;\n }\n }\n for (const s of this.samplers) {\n if (s.name == name) {\n return s;\n }\n }\n return null;\n }\n _markStructsFromAST(type) {\n const info = this._getTypeInfo(type, null);\n this._markStructsInUse(info);\n }\n _findResources(fn, isEntry) {\n const resources = [];\n const self = this;\n const varStack = [];\n fn.search((node) => {\n if (node instanceof _BlockStart) {\n varStack.push({});\n }\n else if (node instanceof _BlockEnd) {\n varStack.pop();\n }\n else if (node instanceof Var) {\n const v = node;\n if (isEntry && v.type !== null) {\n this._markStructsFromAST(v.type);\n }\n if (varStack.length > 0) {\n varStack[varStack.length - 1][v.name] = v;\n }\n }\n else if (node instanceof CreateExpr) {\n const c = node;\n if (isEntry && c.type !== null) {\n this._markStructsFromAST(c.type);\n }\n }\n else if (node instanceof Let) {\n const v = node;\n if (isEntry && v.type !== null) {\n this._markStructsFromAST(v.type);\n }\n if (varStack.length > 0) {\n varStack[varStack.length - 1][v.name] = v;\n }\n }\n else if (node instanceof VariableExpr) {\n const v = node;\n // Check to see if the variable is a local variable before checking to see if it's\n // a resource.\n if (varStack.length > 0) {\n const varInfo = varStack[varStack.length - 1][v.name];\n if (varInfo) {\n return;\n }\n }\n const varInfo = self._findResource(v.name);\n if (varInfo) {\n resources.push(varInfo);\n }\n }\n else if (node instanceof CallExpr) {\n const c = node;\n const callFn = self._functions.get(c.name);\n if (callFn) {\n if (isEntry) {\n callFn.inUse = true;\n }\n fn.calls.add(callFn.node);\n if (callFn.resources === null) {\n callFn.resources = self._findResources(callFn.node, isEntry);\n }\n resources.push(...callFn.resources);\n }\n }\n else if (node instanceof Call) {\n const c = node;\n const callFn = self._functions.get(c.name);\n if (callFn) {\n if (isEntry) {\n callFn.inUse = true;\n }\n fn.calls.add(callFn.node);\n if (callFn.resources === null) {\n callFn.resources = self._findResources(callFn.node, isEntry);\n }\n resources.push(...callFn.resources);\n }\n }\n });\n return [...new Map(resources.map(r => [r.name, r])).values()];\n }\n getBindGroups() {\n const groups = [];\n function _makeRoom(group, binding) {\n if (group >= groups.length) {\n groups.length = group + 1;\n }\n if (groups[group] === undefined) {\n groups[group] = [];\n }\n if (binding >= groups[group].length) {\n groups[group].length = binding + 1;\n }\n }\n for (const u of this.uniforms) {\n _makeRoom(u.group, u.binding);\n const group = groups[u.group];\n group[u.binding] = u;\n }\n for (const u of this.storage) {\n _makeRoom(u.group, u.binding);\n const group = groups[u.group];\n group[u.binding] = u;\n }\n for (const t of this.textures) {\n _makeRoom(t.group, t.binding);\n const group = groups[t.group];\n group[t.binding] = t;\n }\n for (const t of this.samplers) {\n _makeRoom(t.group, t.binding);\n const group = groups[t.group];\n group[t.binding] = t;\n }\n return groups;\n }\n _getOutputs(type, outputs = undefined) {\n if (outputs === undefined) {\n outputs = [];\n }\n if (type instanceof Struct) {\n this._getStructOutputs(type, outputs);\n }\n else {\n const output = this._getOutputInfo(type);\n if (output !== null) {\n outputs.push(output);\n }\n }\n return outputs;\n }\n _getStructOutputs(struct, outputs) {\n for (const m of struct.members) {\n if (m.type instanceof Struct) {\n this._getStructOutputs(m.type, outputs);\n }\n else {\n const location = this._getAttribute(m, \"location\") || this._getAttribute(m, \"builtin\");\n if (location !== null) {\n const typeInfo = this._getTypeInfo(m.type, m.type.attributes);\n const locationValue = this._parseInt(location.value);\n const info = new OutputInfo(m.name, typeInfo, location.name, locationValue);\n outputs.push(info);\n }\n }\n }\n }\n _getOutputInfo(type) {\n const location = this._getAttribute(type, \"location\") ||\n this._getAttribute(type, \"builtin\");\n if (location !== null) {\n const typeInfo = this._getTypeInfo(type, type.attributes);\n const locationValue = this._parseInt(location.value);\n const info = new OutputInfo(\"\", typeInfo, location.name, locationValue);\n return info;\n }\n return null;\n }\n _getInputs(args, inputs = undefined) {\n if (inputs === undefined) {\n inputs = [];\n }\n for (const arg of args) {\n if (arg.type instanceof Struct) {\n this._getStructInputs(arg.type, inputs);\n }\n else {\n const input = this._getInputInfo(arg);\n if (input !== null) {\n inputs.push(input);\n }\n }\n }\n return inputs;\n }\n _getStructInputs(struct, inputs) {\n for (const m of struct.members) {\n if (m.type instanceof Struct) {\n this._getStructInputs(m.type, inputs);\n }\n else {\n const input = this._getInputInfo(m);\n if (input !== null) {\n inputs.push(input);\n }\n }\n }\n }\n _getInputInfo(node) {\n const location = this._getAttribute(node, \"location\") ||\n this._getAttribute(node, \"builtin\");\n if (location !== null) {\n const interpolation = this._getAttribute(node, \"interpolation\");\n const type = this._getTypeInfo(node.type, node.attributes);\n const locationValue = this._parseInt(location.value);\n const info = new InputInfo(node.name, type, location.name, locationValue);\n if (interpolation !== null) {\n info.interpolation = this._parseString(interpolation.value);\n }\n return info;\n }\n return null;\n }\n _parseString(s) {\n if (s instanceof Array) {\n s = s[0];\n }\n return s;\n }\n _parseInt(s) {\n if (s instanceof Array) {\n s = s[0];\n }\n const n = parseInt(s);\n return isNaN(n) ? s : n;\n }\n _getAlias(name) {\n for (const a of this.aliases) {\n if (a.name == name) {\n return a.type;\n }\n }\n return null;\n }\n _getAliasInfo(node) {\n return new AliasInfo(node.name, this._getTypeInfo(node.type, null));\n }\n _getTypeInfo(type, attributes) {\n if (this._types.has(type)) {\n return this._types.get(type);\n }\n if (type instanceof ArrayType) {\n const a = type;\n const t = this._getTypeInfo(a.format, a.attributes);\n const info = new ArrayInfo(a.name, attributes);\n info.format = t;\n info.count = a.count;\n this._types.set(type, info);\n this._updateTypeInfo(info);\n return info;\n }\n if (type instanceof Struct) {\n const s = type;\n const info = new StructInfo(s.name, attributes);\n info.startLine = s.startLine;\n info.endLine = s.endLine;\n for (const m of s.members) {\n const t = this._getTypeInfo(m.type, m.attributes);\n info.members.push(new MemberInfo(m.name, t, m.attributes));\n }\n this._types.set(type, info);\n this._updateTypeInfo(info);\n return info;\n }\n if (type instanceof SamplerType) {\n const s = type;\n const formatIsType = s.format instanceof Type;\n const format = s.format\n ? formatIsType\n ? this._getTypeInfo(s.format, null)\n : new TypeInfo(s.format, null)\n : null;\n const info = new TemplateInfo(s.name, format, attributes, s.access);\n this._types.set(type, info);\n this._updateTypeInfo(info);\n return info;\n }\n if (type instanceof TemplateType) {\n const t = type;\n const format = t.format ? this._getTypeInfo(t.format, null) : null;\n const info = new TemplateInfo(t.name, format, attributes, t.access);\n this._types.set(type, info);\n this._updateTypeInfo(info);\n return info;\n }\n const info = new TypeInfo(type.name, attributes);\n this._types.set(type, info);\n this._updateTypeInfo(info);\n return info;\n }\n _updateTypeInfo(type) {\n var _a, _b;\n const typeSize = this._getTypeSize(type);\n type.size = (_a = typeSize === null || typeSize === void 0 ? void 0 : typeSize.size) !== null && _a !== void 0 ? _a : 0;\n if (type instanceof ArrayInfo) {\n const formatInfo = this._getTypeSize(type[\"format\"]);\n type.stride = (_b = formatInfo === null || formatInfo === void 0 ? void 0 : formatInfo.size) !== null && _b !== void 0 ? _b : 0;\n this._updateTypeInfo(type[\"format\"]);\n }\n if (type instanceof StructInfo) {\n this._updateStructInfo(type);\n }\n }\n _updateStructInfo(struct) {\n var _a;\n let offset = 0;\n let lastSize = 0;\n let lastOffset = 0;\n let structAlign = 0;\n for (let mi = 0, ml = struct.members.length; mi < ml; ++mi) {\n const member = struct.members[mi];\n const sizeInfo = this._getTypeSize(member);\n if (!sizeInfo) {\n continue;\n }\n (_a = this._getAlias(member.type.name)) !== null && _a !== void 0 ? _a : member.type;\n const align = sizeInfo.align;\n const size = sizeInfo.size;\n offset = this._roundUp(align, offset + lastSize);\n lastSize = size;\n lastOffset = offset;\n structAlign = Math.max(structAlign, align);\n member.offset = offset;\n member.size = size;\n this._updateTypeInfo(member.type);\n }\n struct.size = this._roundUp(structAlign, lastOffset + lastSize);\n struct.align = structAlign;\n }\n _getTypeSize(type) {\n var _a;\n if (type === null || type === undefined) {\n return null;\n }\n const explicitSize = this._getAttributeNum(type.attributes, \"size\", 0);\n const explicitAlign = this._getAttributeNum(type.attributes, \"align\", 0);\n if (type instanceof MemberInfo) {\n type = type.type;\n }\n if (type instanceof TypeInfo) {\n const alias = this._getAlias(type.name);\n if (alias !== null) {\n type = alias;\n }\n }\n {\n const info = WgslReflect._typeInfo[type.name];\n if (info !== undefined) {\n const divisor = type[\"format\"] === \"f16\" ? 2 : 1;\n return new _TypeSize(Math.max(explicitAlign, info.align / divisor), Math.max(explicitSize, info.size / divisor));\n }\n }\n {\n const info = WgslReflect._typeInfo[type.name.substring(0, type.name.length - 1)];\n if (info) {\n const divisor = type.name[type.name.length - 1] === \"h\" ? 2 : 1;\n return new _TypeSize(Math.max(explicitAlign, info.align / divisor), Math.max(explicitSize, info.size / divisor));\n }\n }\n if (type instanceof ArrayInfo) {\n let arrayType = type;\n let align = 8;\n let size = 8;\n // Type AlignOf(T) Sizeof(T)\n // array AlignOf(E) N * roundUp(AlignOf(E), SizeOf(E))\n // array AlignOf(E) N * roundUp(AlignOf(E), SizeOf(E)) (N determined at runtime)\n //\n // @stride(Q)\n // array AlignOf(E) N * Q\n //\n // @stride(Q)\n // array AlignOf(E) Nruntime * Q\n //const E = type.format.name;\n const E = this._getTypeSize(arrayType.format);\n if (E !== null) {\n size = E.size;\n align = E.align;\n }\n const N = arrayType.count;\n const stride = this._getAttributeNum((_a = type === null || type === void 0 ? void 0 : type.attributes) !== null && _a !== void 0 ? _a : null, \"stride\", this._roundUp(align, size));\n size = N * stride;\n if (explicitSize) {\n size = explicitSize;\n }\n return new _TypeSize(Math.max(explicitAlign, align), Math.max(explicitSize, size));\n }\n if (type instanceof StructInfo) {\n let align = 0;\n let size = 0;\n // struct S AlignOf: max(AlignOfMember(S, M1), ... , AlignOfMember(S, MN))\n // SizeOf: roundUp(AlignOf(S), OffsetOfMember(S, L) + SizeOfMember(S, L))\n // Where L is the last member of the structure\n let offset = 0;\n let lastSize = 0;\n let lastOffset = 0;\n for (const m of type.members) {\n const mi = this._getTypeSize(m.type);\n if (mi !== null) {\n align = Math.max(mi.align, align);\n offset = this._roundUp(mi.align, offset + lastSize);\n lastSize = mi.size;\n lastOffset = offset;\n }\n }\n size = this._roundUp(align, lastOffset + lastSize);\n return new _TypeSize(Math.max(explicitAlign, align), Math.max(explicitSize, size));\n }\n return null;\n }\n _isUniformVar(node) {\n return node instanceof Var && node.storage == \"uniform\";\n }\n _isStorageVar(node) {\n return node instanceof Var && node.storage == \"storage\";\n }\n _isTextureVar(node) {\n return (node instanceof Var &&\n node.type !== null &&\n WgslReflect._textureTypes.indexOf(node.type.name) != -1);\n }\n _isSamplerVar(node) {\n return (node instanceof Var &&\n node.type !== null &&\n WgslReflect._samplerTypes.indexOf(node.type.name) != -1);\n }\n _getAttribute(node, name) {\n const obj = node;\n if (!obj || !obj[\"attributes\"]) {\n return null;\n }\n const attrs = obj[\"attributes\"];\n for (let a of attrs) {\n if (a.name == name) {\n return a;\n }\n }\n return null;\n }\n _getAttributeNum(attributes, name, defaultValue) {\n if (attributes === null) {\n return defaultValue;\n }\n for (let a of attributes) {\n if (a.name == name) {\n let v = a !== null && a.value !== null ? a.value : defaultValue;\n if (v instanceof Array) {\n v = v[0];\n }\n if (typeof v === \"number\") {\n return v;\n }\n if (typeof v === \"string\") {\n return parseInt(v);\n }\n return defaultValue;\n }\n }\n return defaultValue;\n }\n _roundUp(k, n) {\n return Math.ceil(n / k) * k;\n }\n}\n// Type AlignOf(T) Sizeof(T)\n// i32, u32, or f32 4 4\n// atomic 4 4\n// vec2 8 8\n// vec3 16 12\n// vec4 16 16\n// mat2x2 8 16\n// mat3x2 8 24\n// mat4x2 8 32\n// mat2x3 16 32\n// mat3x3 16 48\n// mat4x3 16 64\n// mat2x4 16 32\n// mat3x4 16 48\n// mat4x4 16 64\nWgslReflect._typeInfo = {\n f16: { align: 2, size: 2 },\n i32: { align: 4, size: 4 },\n u32: { align: 4, size: 4 },\n f32: { align: 4, size: 4 },\n atomic: { align: 4, size: 4 },\n vec2: { align: 8, size: 8 },\n vec3: { align: 16, size: 12 },\n vec4: { align: 16, size: 16 },\n mat2x2: { align: 8, size: 16 },\n mat3x2: { align: 8, size: 24 },\n mat4x2: { align: 8, size: 32 },\n mat2x3: { align: 16, size: 32 },\n mat3x3: { align: 16, size: 48 },\n mat4x3: { align: 16, size: 64 },\n mat2x4: { align: 16, size: 32 },\n mat3x4: { align: 16, size: 48 },\n mat4x4: { align: 16, size: 64 },\n};\nWgslReflect._textureTypes = TokenTypes.any_texture_type.map((t) => {\n return t.name;\n});\nWgslReflect._samplerTypes = TokenTypes.sampler_type.map((t) => {\n return t.name;\n});\n\nfunction getEntryPointForStage(defs, stage, stageFlags) {\n const { entryPoint: entryPointName } = stage;\n if (entryPointName) {\n const ep = defs.entryPoints[entryPointName];\n return (ep && ep.stage === stageFlags) ? ep : undefined;\n }\n return Object.values(defs.entryPoints).filter(ep => ep.stage === stageFlags)[0];\n}\nfunction getStageResources(defs, stage, stageFlags) {\n if (!stage) {\n return [];\n }\n const entryPoint = getEntryPointForStage(defs, stage, stageFlags);\n return entryPoint?.resources || [];\n}\nconst byBinding = (a, b) => Math.sign(a.binding - b.binding);\n/**\n * Gets GPUBindGroupLayoutDescriptors for the given pipeline.\n *\n * Important: Assumes you pipeline is valid (it doesn't check for errors).\n *\n * Note: In WebGPU some layouts must be specified manually. For example an unfiltered-float\n * sampler can not be derived since it is unknown at compile time pipeline creation time\n * which texture you'll use.\n *\n * MAINTENANCE_TODO: Add example\n *\n * @param defs ShaderDataDefinitions or an array of ShaderDataDefinitions as\n * returned from @link {makeShaderDataDefinitions}. If an array more than 1\n * definition it's assumed the vertex shader is in the first and the fragment\n * shader in the second.\n * @param desc A PipelineDescriptor. You should be able to pass in the same object you passed\n * to `createRenderPipeline` or `createComputePipeline`.\n * @returns An array of GPUBindGroupLayoutDescriptors which you can pass, one at a time, to\n * `createBindGroupLayout`. Note: the array will be sparse if there are gaps in group\n * numbers. Note: Each GPUBindGroupLayoutDescriptor.entries will be sorted by binding.\n */\nfunction makeBindGroupLayoutDescriptors(defs, desc) {\n defs = Array.isArray(defs) ? defs : [defs];\n const resources = [\n ...getStageResources(defs[0], desc.vertex, GPUShaderStage.VERTEX),\n ...getStageResources(defs[defs.length - 1], desc.fragment, GPUShaderStage.FRAGMENT),\n ...getStageResources(defs[0], desc.compute, GPUShaderStage.COMPUTE),\n ];\n const bindGroupLayoutDescriptorsByGroupByBinding = [];\n for (const resource of resources) {\n const bindingsToBindGroupEntry = bindGroupLayoutDescriptorsByGroupByBinding[resource.group] || new Map();\n bindGroupLayoutDescriptorsByGroupByBinding[resource.group] = bindingsToBindGroupEntry;\n // Should we error here if the 2 don't match?\n const entry = bindingsToBindGroupEntry.get(resource.entry.binding);\n bindingsToBindGroupEntry.set(resource.entry.binding, {\n ...resource.entry,\n visibility: resource.entry.visibility | (entry?.visibility || 0),\n });\n }\n const descriptors = bindGroupLayoutDescriptorsByGroupByBinding.map(v => ({ entries: [...v.values()].sort(byBinding) }));\n for (let i = 0; i < descriptors.length; ++i) {\n if (!descriptors[i]) {\n descriptors[i] = { entries: [] };\n }\n }\n return descriptors;\n}\nfunction getNamedVariables(reflect, variables) {\n return Object.fromEntries(variables.map(v => {\n const typeDefinition = addVariableType(reflect, v, 0);\n return [\n v.name,\n {\n typeDefinition,\n group: v.group,\n binding: v.binding,\n size: typeDefinition.size,\n },\n ];\n }));\n}\nfunction makeStructDefinition(reflect, structInfo, offset) {\n // StructDefinition\n const fields = Object.fromEntries(structInfo.members.map(m => {\n return [\n m.name,\n {\n offset: m.offset,\n type: addType(reflect, m.type, 0),\n },\n ];\n }));\n return {\n fields,\n size: structInfo.size,\n offset,\n };\n}\nfunction getTextureSampleType(type) {\n if (type.name.includes('depth')) {\n return 'depth';\n }\n // unfiltered-float\n switch (type.format?.name) {\n case 'f32': return 'float';\n case 'i32': return 'sint';\n case 'u32': return 'uint';\n default:\n throw new Error('unknown texture sample type');\n }\n}\nfunction getViewDimension(type) {\n if (type.name.includes('2d_array')) {\n return '2d-array';\n }\n if (type.name.includes('cube_array')) {\n return 'cube-array';\n }\n if (type.name.includes('3d')) {\n return '3d';\n }\n if (type.name.includes('1d')) {\n return '1d';\n }\n if (type.name.includes('cube')) {\n return 'cube';\n }\n return '2d';\n}\nfunction getStorageTextureAccess(type) {\n switch (type.access) {\n case 'read': return 'read-only';\n case 'write': return 'write-only';\n case 'read_write': return 'read-write';\n default:\n throw new Error('unknonw storage texture access');\n }\n}\nfunction getSamplerType(type) {\n // \"non-filtering\" can only be specified manually.\n return type.name.endsWith('_comparison')\n ? 'comparison'\n : 'filtering';\n}\nfunction getBindGroupLayoutEntry(resource, visibility) {\n const { binding, access, type } = resource;\n switch (resource.resourceType) {\n case ResourceType.Uniform:\n return {\n binding,\n visibility,\n buffer: {},\n };\n case ResourceType.Storage:\n return {\n binding,\n visibility,\n buffer: {\n type: (access === '' || access === 'read') ? 'read-only-storage' : 'storage',\n },\n };\n case ResourceType.Texture: {\n if (type.name === 'texture_external') {\n return {\n binding,\n visibility,\n externalTexture: {},\n };\n }\n const multisampled = type.name.includes('multisampled');\n return {\n binding,\n visibility,\n texture: {\n sampleType: getTextureSampleType(type),\n viewDimension: getViewDimension(type),\n multisampled,\n },\n };\n }\n case ResourceType.Sampler:\n return {\n binding,\n visibility,\n sampler: {\n type: getSamplerType(type),\n },\n };\n case ResourceType.StorageTexture:\n return {\n binding,\n visibility,\n storageTexture: {\n access: getStorageTextureAccess(type),\n format: type.format.name,\n viewDimension: getViewDimension(type),\n },\n };\n default:\n throw new Error('unknown resource type');\n }\n}\nfunction addEntryPoints(funcInfos, stage) {\n const entryPoints = {};\n for (const info of funcInfos) {\n entryPoints[info.name] = {\n stage,\n resources: info.resources.map(resource => {\n const { name, group } = resource;\n return {\n name,\n group,\n entry: getBindGroupLayoutEntry(resource, stage),\n };\n }),\n };\n }\n return entryPoints;\n}\n/**\n * Given a WGSL shader, returns data definitions for structures,\n * uniforms, and storage buffers\n *\n * Example:\n *\n * ```js\n * const code = `\n * struct MyStruct {\n * color: vec4f,\n * brightness: f32,\n * kernel: array,\n * };\n * @group(0) @binding(0) var myUniforms: MyUniforms;\n * `;\n * const defs = makeShaderDataDefinitions(code);\n * const myUniformValues = makeStructuredView(defs.uniforms.myUniforms);\n *\n * myUniformValues.set({\n * color: [1, 0, 1, 1],\n * brightness: 0.8,\n * kernel: [\n * 1, 0, -1,\n * 2, 0, -2,\n * 1, 0, -1,\n * ],\n * });\n * device.queue.writeBuffer(uniformBuffer, 0, myUniformValues.arrayBuffer);\n * ```\n *\n * @param code WGSL shader. Note: it is not required for this to be a complete shader\n * @returns definitions of the structures by name. Useful for passing to {@link makeStructuredView}\n */\nfunction makeShaderDataDefinitions(code) {\n const reflect = new WgslReflect(code);\n const structs = Object.fromEntries(reflect.structs.map(structInfo => {\n return [structInfo.name, makeStructDefinition(reflect, structInfo, 0)];\n }));\n const uniforms = getNamedVariables(reflect, reflect.uniforms);\n const storages = getNamedVariables(reflect, reflect.storage.filter(v => v.resourceType === ResourceType.Storage));\n const storageTextures = getNamedVariables(reflect, reflect.storage.filter(v => v.resourceType === ResourceType.StorageTexture));\n const textures = getNamedVariables(reflect, reflect.textures.filter(v => v.type.name !== 'texture_external'));\n const externalTextures = getNamedVariables(reflect, reflect.textures.filter(v => v.type.name === 'texture_external'));\n const samplers = getNamedVariables(reflect, reflect.samplers);\n const entryPoints = {\n ...addEntryPoints(reflect.entry.vertex, GPUShaderStage.VERTEX),\n ...addEntryPoints(reflect.entry.fragment, GPUShaderStage.FRAGMENT),\n ...addEntryPoints(reflect.entry.compute, GPUShaderStage.COMPUTE),\n };\n return {\n externalTextures,\n samplers,\n structs,\n storages,\n storageTextures,\n textures,\n uniforms,\n entryPoints,\n };\n}\nfunction assert(cond, msg = '') {\n if (!cond) {\n throw new Error(msg);\n }\n}\n/*\n write down what I want for a given type\n\n struct VSUniforms {\n foo: u32,\n };\n @group(4) @binding(1) var uni1: f32;\n @group(3) @binding(2) var uni2: array;\n @group(2) @binding(3) var uni3: VSUniforms;\n @group(1) @binding(4) var uni4: array;\n\n uni1: {\n type: 'f32',\n numElements: undefined\n },\n uni2: {\n type: 'array',\n elementType: 'f32'\n numElements: 5,\n },\n uni3: {\n type: 'struct',\n fields: {\n foo: {\n type: 'f32',\n numElements: undefined\n }\n },\n },\n uni4: {\n type: 'array',\n elementType:\n fields: {\n foo: {\n type: 'f32',\n numElements: undefined\n }\n },\n fields: {\n foo: {\n type: 'f32',\n numElements: undefined\n }\n },\n ...\n ]\n\n */\nfunction addVariableType(reflect, v, offset) {\n switch (v.resourceType) {\n case ResourceType.Uniform:\n case ResourceType.Storage:\n case ResourceType.StorageTexture:\n return addType(reflect, v.type, offset);\n default:\n return {\n size: 0,\n type: v.type.name,\n };\n }\n}\nfunction addType(reflect, typeInfo, offset) {\n if (typeInfo.isArray) {\n assert(!typeInfo.isStruct, 'struct array is invalid');\n assert(!typeInfo.isStruct, 'template array is invalid');\n const arrayInfo = typeInfo;\n // ArrayDefinition\n return {\n size: arrayInfo.size,\n elementType: addType(reflect, arrayInfo.format, offset),\n numElements: arrayInfo.count,\n };\n }\n else if (typeInfo.isStruct) {\n assert(!typeInfo.isTemplate, 'template struct is invalid');\n const structInfo = typeInfo;\n return makeStructDefinition(reflect, structInfo, offset);\n }\n else {\n // template is like vec4 or mat4x4\n const asTemplateInfo = typeInfo;\n const type = typeInfo.isTemplate\n ? `${asTemplateInfo.name}<${asTemplateInfo.format.name}>`\n : typeInfo.name;\n // IntrinsicDefinition\n return {\n size: typeInfo.size,\n type: type,\n };\n }\n}\n\nfunction guessTextureBindingViewDimensionForTexture(texture) {\n switch (texture.dimension) {\n case '1d':\n return '1d';\n case '3d':\n return '3d';\n default: // to shut up TS\n case '2d':\n return texture.depthOrArrayLayers > 1 ? '2d-array' : '2d';\n }\n}\nfunction normalizeGPUExtent3Dict(size) {\n return [size.width, size.height || 1, size.depthOrArrayLayers || 1];\n}\n/**\n * Converts a `GPUExtent3D` into an array of numbers\n *\n * `GPUExtent3D` has two forms `[width, height?, depth?]` or\n * `{width: number, height?: number, depthOrArrayLayers?: number}`\n *\n * You pass one of those in here and it returns an array of 3 numbers\n * so that your code doesn't have to deal with multiple forms.\n *\n * @param size\n * @returns an array of 3 numbers, [width, height, depthOrArrayLayers]\n */\nfunction normalizeGPUExtent3D(size) {\n return (Array.isArray(size) || isTypedArray(size))\n ? [...size, 1, 1].slice(0, 3)\n : normalizeGPUExtent3Dict(size);\n}\n/**\n * Given a GPUExtent3D returns the number of mip levels needed\n *\n * @param size\n * @returns number of mip levels needed for the given size\n */\nfunction numMipLevels(size, dimension) {\n const sizes = normalizeGPUExtent3D(size);\n const maxSize = Math.max(...sizes.slice(0, dimension === '3d' ? 3 : 2));\n return 1 + Math.log2(maxSize) | 0;\n}\nfunction getMipmapGenerationWGSL(textureBindingViewDimension) {\n let textureSnippet;\n let sampleSnippet;\n switch (textureBindingViewDimension) {\n case '2d':\n textureSnippet = 'texture_2d';\n sampleSnippet = 'textureSample(ourTexture, ourSampler, fsInput.texcoord)';\n break;\n case '2d-array':\n textureSnippet = 'texture_2d_array';\n sampleSnippet = `\n textureSample(\n ourTexture,\n ourSampler,\n fsInput.texcoord,\n uni.layer)`;\n break;\n case 'cube':\n textureSnippet = 'texture_cube';\n sampleSnippet = `\n textureSample(\n ourTexture,\n ourSampler,\n faceMat[uni.layer] * vec3f(fract(fsInput.texcoord), 1))`;\n break;\n case 'cube-array':\n textureSnippet = 'texture_cube_array';\n sampleSnippet = `\n textureSample(\n ourTexture,\n ourSampler,\n faceMat[uni.layer] * vec3f(fract(fsInput.texcoord), 1), uni.layer)`;\n break;\n default:\n throw new Error(`unsupported view: ${textureBindingViewDimension}`);\n }\n return `\n const faceMat = array(\n mat3x3f( 0, 0, -2, 0, -2, 0, 1, 1, 1), // pos-x\n mat3x3f( 0, 0, 2, 0, -2, 0, -1, 1, -1), // neg-x\n mat3x3f( 2, 0, 0, 0, 0, 2, -1, 1, -1), // pos-y\n mat3x3f( 2, 0, 0, 0, 0, -2, -1, -1, 1), // neg-y\n mat3x3f( 2, 0, 0, 0, -2, 0, -1, 1, 1), // pos-z\n mat3x3f(-2, 0, 0, 0, -2, 0, 1, 1, -1)); // neg-z\n\n struct VSOutput {\n @builtin(position) position: vec4f,\n @location(0) texcoord: vec2f,\n };\n\n @vertex fn vs(\n @builtin(vertex_index) vertexIndex : u32\n ) -> VSOutput {\n var pos = array(\n vec2f(-1.0, -1.0),\n vec2f(-1.0, 3.0),\n vec2f( 3.0, -1.0),\n );\n\n var vsOutput: VSOutput;\n let xy = pos[vertexIndex];\n vsOutput.position = vec4f(xy, 0.0, 1.0);\n vsOutput.texcoord = xy * vec2f(0.5, -0.5) + vec2f(0.5);\n return vsOutput;\n }\n\n struct Uniforms {\n layer: u32,\n };\n\n @group(0) @binding(0) var ourSampler: sampler;\n @group(0) @binding(1) var ourTexture: ${textureSnippet};\n @group(0) @binding(2) var uni: Uniforms;\n\n @fragment fn fs(fsInput: VSOutput) -> @location(0) vec4f {\n _ = uni.layer; // make sure this is used so all pipelines have the same bindings\n return ${sampleSnippet};\n }\n `;\n}\n// Use a WeakMap so the device can be destroyed and/or lost\nconst byDevice = new WeakMap();\n/**\n * Generates mip levels from level 0 to the last mip for an existing texture\n *\n * The texture must have been created with TEXTURE_BINDING and RENDER_ATTACHMENT\n * and been created with mip levels\n *\n * @param device A GPUDevice\n * @param texture The texture to create mips for\n * @param textureBindingViewDimension This is only needed in compatibility mode\n * and it is only needed when the texture is going to be used as a cube map.\n */\nfunction generateMipmap(device, texture, textureBindingViewDimension) {\n let perDeviceInfo = byDevice.get(device);\n if (!perDeviceInfo) {\n perDeviceInfo = {\n pipelineByFormatAndView: {},\n moduleByViewType: {},\n };\n byDevice.set(device, perDeviceInfo);\n }\n let { sampler, uniformBuffer, uniformValues, } = perDeviceInfo;\n const { pipelineByFormatAndView, moduleByViewType, } = perDeviceInfo;\n textureBindingViewDimension = textureBindingViewDimension || guessTextureBindingViewDimensionForTexture(texture);\n let module = moduleByViewType[textureBindingViewDimension];\n if (!module) {\n const code = getMipmapGenerationWGSL(textureBindingViewDimension);\n module = device.createShaderModule({\n label: `mip level generation for ${textureBindingViewDimension}`,\n code,\n });\n moduleByViewType[textureBindingViewDimension] = module;\n }\n if (!sampler) {\n sampler = device.createSampler({\n minFilter: 'linear',\n magFilter: 'linear',\n });\n uniformBuffer = device.createBuffer({\n size: 16,\n usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n });\n uniformValues = new Uint32Array(1);\n Object.assign(perDeviceInfo, { sampler, uniformBuffer, uniformValues });\n }\n const id = `${texture.format}.${textureBindingViewDimension}`;\n if (!pipelineByFormatAndView[id]) {\n pipelineByFormatAndView[id] = device.createRenderPipeline({\n label: `mip level generator pipeline for ${textureBindingViewDimension}`,\n layout: 'auto',\n vertex: {\n module,\n entryPoint: 'vs',\n },\n fragment: {\n module,\n entryPoint: 'fs',\n targets: [{ format: texture.format }],\n },\n });\n }\n const pipeline = pipelineByFormatAndView[id];\n for (let baseMipLevel = 1; baseMipLevel < texture.mipLevelCount; ++baseMipLevel) {\n for (let baseArrayLayer = 0; baseArrayLayer < texture.depthOrArrayLayers; ++baseArrayLayer) {\n uniformValues[0] = baseArrayLayer;\n device.queue.writeBuffer(uniformBuffer, 0, uniformValues);\n const bindGroup = device.createBindGroup({\n layout: pipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: sampler },\n {\n binding: 1,\n resource: texture.createView({\n dimension: textureBindingViewDimension,\n baseMipLevel: baseMipLevel - 1,\n mipLevelCount: 1,\n }),\n },\n { binding: 2, resource: { buffer: uniformBuffer } },\n ],\n });\n const renderPassDescriptor = {\n label: 'mip gen renderPass',\n colorAttachments: [\n {\n view: texture.createView({\n dimension: '2d',\n baseMipLevel,\n mipLevelCount: 1,\n baseArrayLayer,\n arrayLayerCount: 1,\n }),\n loadOp: 'clear',\n storeOp: 'store',\n },\n ],\n };\n const encoder = device.createCommandEncoder({\n label: 'mip gen encoder',\n });\n const pass = encoder.beginRenderPass(renderPassDescriptor);\n pass.setPipeline(pipeline);\n pass.setBindGroup(0, bindGroup);\n pass.draw(3);\n pass.end();\n const commandBuffer = encoder.finish();\n device.queue.submit([commandBuffer]);\n }\n }\n}\n\nconst kTypedArrayToAttribFormat = new Map([\n [Int8Array, { formats: ['sint8', 'snorm8'], defaultForType: 1 }],\n [Uint8Array, { formats: ['uint8', 'unorm8'], defaultForType: 1 }],\n [Int16Array, { formats: ['sint16', 'snorm16'], defaultForType: 1 }],\n [Uint16Array, { formats: ['uint16', 'unorm16'], defaultForType: 1 }],\n [Int32Array, { formats: ['sint32', 'snorm32'], defaultForType: 0 }],\n [Uint32Array, { formats: ['uint32', 'unorm32'], defaultForType: 0 }],\n [Float32Array, { formats: ['float32', 'float32'], defaultForType: 0 }],\n // TODO: Add Float16Array\n]);\nconst kVertexFormatPrefixToType = new Map([...kTypedArrayToAttribFormat.entries()].map(([Type, { formats: [s1, s2] }]) => [[s1, Type], [s2, Type]]).flat());\nfunction isIndices(name) {\n return name === \"indices\";\n}\nfunction makeTypedArrayFromArrayUnion(array, name) {\n if (isTypedArray(array)) {\n return array;\n }\n let asFullSpec = array;\n if (isTypedArray(asFullSpec.data)) {\n return asFullSpec.data;\n }\n if (Array.isArray(array) || typeof array === 'number') {\n asFullSpec = {\n data: array,\n };\n }\n let Type = asFullSpec.type;\n if (!Type) {\n if (isIndices(name)) {\n Type = Uint32Array;\n }\n else {\n Type = Float32Array;\n }\n }\n return new Type(asFullSpec.data); // ugh!\n}\nfunction getArray(array) {\n const arr = array.length ? array : array.data;\n return arr;\n}\nconst kNameToNumComponents = [\n { re: /coord|texture|uv/i, numComponents: 2 },\n { re: /color|colour/i, numComponents: 4 },\n];\nfunction guessNumComponentsFromNameImpl(name) {\n for (const { re, numComponents } of kNameToNumComponents) {\n if (re.test(name)) {\n return numComponents;\n }\n }\n return 3;\n}\nfunction guessNumComponentsFromName(name, length) {\n const numComponents = guessNumComponentsFromNameImpl(name);\n if (length % numComponents > 0) {\n throw new Error(`Can not guess numComponents for attribute '${name}'. Tried ${numComponents} but ${length} values is not evenly divisible by ${numComponents}. You should specify it.`);\n }\n return numComponents;\n}\nfunction getNumComponents(array, arrayName) {\n return array.numComponents || guessNumComponentsFromName(arrayName, getArray(array).length);\n}\nconst kVertexFormatRE = /(\\w+)(?:x(\\d))$/;\nfunction numComponentsAndTypeFromVertexFormat(format) {\n const m = kVertexFormatRE.exec(format);\n const [prefix, numComponents] = m ? [m[1], parseInt(m[2])] : [format, 1];\n return {\n Type: kVertexFormatPrefixToType.get(prefix),\n numComponents,\n };\n}\nfunction createTypedArrayOfSameType(typedArray, arrayBuffer) {\n const Ctor = Object.getPrototypeOf(typedArray).constructor;\n return new Ctor(arrayBuffer);\n}\n/**\n * Given a set of named arrays, generates an array `GPUBufferLayout`s\n *\n * Examples:\n *\n * ```js\n * const arrays = {\n * position: [1, 1, -1, 1, 1, 1, 1, -1, 1, 1, -1, -1, -1, 1, 1, -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, -1, 1, -1, -1, 1, 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1, -1, 1, -1, 1, 1, -1, 1, -1, -1, -1, -1, -1],\n * normal: [1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1],\n * texcoord: [1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1],\n * };\n *\n * const { bufferLayouts, typedArrays } = createBufferLayoutsFromArrays(arrays);\n * ```\n *\n * results in `bufferLayouts` being\n *\n * ```js\n * [\n * {\n * stepMode: 'vertex',\n * arrayStride: 32,\n * attributes: [\n * { shaderLocation: 0, offset: 0, format: 'float32x3' },\n * { shaderLocation: 1, offset: 12, format: 'float32x3' },\n * { shaderLocation: 2, offset: 24, format: 'float32x2' },\n * ],\n * },\n * ]\n * ```\n *\n * and `typedArrays` being\n *\n * ```\n * [\n * someFloat32Array0,\n * someFloat32Array1,\n * someFloat32Array2,\n * ]\n * ```\n *\n * See {@link Arrays} for details on the various types of arrays.\n *\n * Note: If typed arrays are passed in the same typed arrays will come out (copies will not be made)\n */\nfunction createBufferLayoutsFromArrays(arrays, options = {}) {\n const interleave = options.interleave === undefined ? true : options.interleave;\n const stepMode = options.stepMode || 'vertex';\n const shaderLocations = options.shaderLocation\n ? (Array.isArray(options.shaderLocation) ? options.shaderLocation : [options.shaderLocation])\n : [0];\n let currentOffset = 0;\n const bufferLayouts = [];\n const attributes = [];\n const typedArrays = [];\n Object.keys(arrays)\n .filter(arrayName => !isIndices(arrayName))\n .forEach(arrayName => {\n const array = arrays[arrayName];\n const data = makeTypedArrayFromArrayUnion(array, arrayName);\n const totalNumComponents = getNumComponents(array, arrayName);\n // if totalNumComponents > 4 then we clearly need to split this into multiple\n // attributes\n // (a) <= 4 doesn't mean don't split and\n // (b) how to split? We could divide by 4 and if it's not even then divide by 3\n // as a guess?\n // 5 is error? or 1x4 + 1x1?\n // 6 is 2x3\n // 7 is error? or 1x4 + 1x3?\n // 8 is 2x4\n // 9 is 3x3\n // 10 is error? or 2x4 + 1x2?\n // 11 is error? or 2x4 + 1x3?\n // 12 is 3x4 or 4x3?\n // 13 is error? or 3x4 + 1x1 or 4x3 + 1x1?\n // 14 is error? or 3x4 + 1x2 or 4x3 + 1x2?\n // 15 is error? or 3x4 + 1x3 or 4x3 + 1x3?\n // 16 is 4x4\n const by4 = totalNumComponents / 4;\n const by3 = totalNumComponents / 3;\n const step = by4 % 1 === 0 ? 4 : (by3 % 1 === 0 ? 3 : 4);\n for (let component = 0; component < totalNumComponents; component += step) {\n const numComponents = Math.min(step, totalNumComponents - component);\n const offset = currentOffset;\n currentOffset += numComponents * data.BYTES_PER_ELEMENT;\n const { defaultForType, formats } = kTypedArrayToAttribFormat.get(Object.getPrototypeOf(data).constructor);\n const normalize = array.normalize;\n const formatNdx = typeof normalize === 'undefined' ? defaultForType : (normalize ? 1 : 0);\n const format = `${formats[formatNdx]}${numComponents > 1 ? `x${numComponents}` : ''}`;\n // TODO: cleanup with generator?\n const shaderLocation = shaderLocations.shift();\n if (shaderLocations.length === 0) {\n shaderLocations.push(shaderLocation + 1);\n }\n attributes.push({\n offset,\n format,\n shaderLocation,\n });\n typedArrays.push({\n data,\n offset: component,\n stride: totalNumComponents,\n });\n }\n if (!interleave) {\n bufferLayouts.push({\n stepMode,\n arrayStride: currentOffset,\n attributes: attributes.slice(),\n });\n currentOffset = 0;\n attributes.length = 0;\n }\n });\n if (attributes.length) {\n bufferLayouts.push({\n stepMode,\n arrayStride: currentOffset,\n attributes: attributes,\n });\n }\n return {\n bufferLayouts,\n typedArrays,\n };\n}\nfunction getTypedArrayWithOffsetAndStride(ta, numComponents) {\n return (isTypedArray(ta)\n ? { data: ta, offset: 0, stride: numComponents }\n : ta);\n}\n/**\n * Given an array of `GPUVertexAttribute`s and a corresponding array\n * of TypedArrays, interleaves the contents of the typed arrays\n * into the given ArrayBuffer\n *\n * example:\n *\n * ```js\n * const attributes: GPUVertexAttribute[] = [\n * { shaderLocation: 0, offset: 0, format: 'float32x3' },\n * { shaderLocation: 1, offset: 12, format: 'float32x3' },\n * { shaderLocation: 2, offset: 24, format: 'float32x2' },\n * ];\n * const typedArrays = [\n * new Float32Array([1, 1, -1, 1, 1, 1, 1, -1, 1, 1, -1, -1, -1, 1, 1, -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, -1, 1, -1, -1, 1, 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1, -1, 1, -1, 1, 1, -1, 1, -1, -1, -1, -1, -1]),\n * new Float32Array([1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1]),\n * new Float32Array([1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1]),\n * ];\n * const arrayStride = (3 + 3 + 2) * 4; // pos + nrm + uv\n * const arrayBuffer = new ArrayBuffer(arrayStride * 24)\n * interleaveVertexData(attributes, typedArrays, arrayStride, arrayBuffer)\n * ```\n *\n * results in the contents of `arrayBuffer` to be the 3 TypedArrays interleaved\n *\n * See {@link Arrays} for details on the various types of arrays.\n *\n * Note: You can generate `attributes` and `typedArrays` above by calling\n * {@link createBufferLayoutsFromArrays}\n */\nfunction interleaveVertexData(attributes, typedArrays, arrayStride, arrayBuffer) {\n const views = new Map();\n const getView = (typedArray) => {\n const Ctor = Object.getPrototypeOf(typedArray).constructor;\n const view = views.get(Ctor);\n if (view) {\n return view;\n }\n const newView = new Ctor(arrayBuffer);\n views.set(Ctor, newView);\n return newView;\n };\n attributes.forEach((attribute, ndx) => {\n const { offset, format } = attribute;\n const { numComponents } = numComponentsAndTypeFromVertexFormat(format);\n const { data, offset: srcOffset, stride, } = getTypedArrayWithOffsetAndStride(typedArrays[ndx], numComponents);\n const view = getView(data);\n for (let i = 0; i < data.length; i += stride) {\n const ndx = i / stride;\n const dstOffset = (offset + ndx * arrayStride) / view.BYTES_PER_ELEMENT;\n const srcOff = i + srcOffset;\n const s = data.subarray(srcOff, srcOff + numComponents);\n view.set(s, dstOffset);\n }\n });\n}\n/**\n * Given arrays, create buffers, fills the buffers with data if provided, optionally\n * interleaves the data (the default).\n *\n * Example:\n *\n * ```js\n * const {\n * buffers,\n * bufferLayouts,\n * indexBuffer,\n * indexFormat,\n * numElements,\n * } = createBuffersAndAttributesFromArrays(device, {\n * position: [1, 1, -1, 1, 1, 1, 1, -1, 1, 1, -1, -1, -1, 1, 1, -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, -1, 1, -1, -1, 1, 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1, -1, 1, -1, 1, 1, -1, 1, -1, -1, -1, -1, -1],\n * normal: [1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1],\n * texcoord: [1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1],\n * indices: [0, 1, 2, 0, 2, 3, 4, 5, 6, 4, 6, 7, 8, 9, 10, 8, 10, 11, 12, 13, 14, 12, 14, 15, 16, 17, 18, 16, 18, 19, 20, 21, 22, 20, 22, 23],\n * });\n * ```\n *\n * Where `bufferLayouts` will be\n *\n * ```js\n * [\n * {\n * stepMode: 'vertex',\n * arrayStride: 32,\n * attributes: [\n * { shaderLocation: 0, offset: 0, format: 'float32x3' },\n * { shaderLocation: 1, offset: 12, format: 'float32x3' },\n * { shaderLocation: 2, offset: 24, format: 'float32x2' },\n * ],\n * },\n * ]\n * ```\n *\n * * `buffers` will have one `GPUBuffer` of usage `GPUBufferUsage.VERTEX`\n * * `indexBuffer` will be `GPUBuffer` of usage `GPUBufferUsage.INDEX`\n * * `indexFormat` will be `uint32` (use a full spec or a typedarray of `Uint16Array` if you want 16bit indices)\n * * `numElements` will be 36 (this is either the number entries in the array named `indices` or if no\n * indices are provided then it's the length of the first array divided by numComponents. See {@link Arrays})\n *\n * See {@link Arrays} for details on the various types of arrays.\n * Also see the cube and instancing examples.\n */\nfunction createBuffersAndAttributesFromArrays(device, arrays, options = {}) {\n const usage = (options.usage || 0);\n const { bufferLayouts, typedArrays, } = createBufferLayoutsFromArrays(arrays, options);\n const buffers = [];\n let numElements = -1;\n let bufferNdx = 0;\n for (const { attributes, arrayStride } of bufferLayouts) {\n const attribs = attributes;\n const attrib0 = attribs[0];\n const { numComponents } = numComponentsAndTypeFromVertexFormat(attrib0.format);\n const { data: data0, stride, } = getTypedArrayWithOffsetAndStride(typedArrays[bufferNdx], numComponents);\n if (numElements < 0) {\n numElements = data0.length / stride;\n }\n const size = arrayStride * numElements;\n const buffer = device.createBuffer({\n usage: usage | GPUBufferUsage.VERTEX,\n size,\n mappedAtCreation: true,\n });\n const arrayBuffer = buffer.getMappedRange();\n if (attribs.length === 1 && arrayStride === data0.BYTES_PER_ELEMENT * numComponents) {\n const view = createTypedArrayOfSameType(data0, arrayBuffer);\n view.set(data0);\n }\n else {\n interleaveVertexData(attribs, typedArrays.slice(bufferNdx), arrayStride, arrayBuffer);\n }\n buffer.unmap();\n buffers.push(buffer);\n bufferNdx += attribs.length;\n }\n const buffersAndAttributes = {\n numElements,\n bufferLayouts,\n buffers,\n };\n const indicesEntry = Object.entries(arrays).find(([arrayName]) => isIndices(arrayName));\n if (indicesEntry) {\n const indices = makeTypedArrayFromArrayUnion(indicesEntry[1], 'indices');\n const indexBuffer = device.createBuffer({\n size: indices.byteLength,\n usage: GPUBufferUsage.INDEX | usage,\n mappedAtCreation: true,\n });\n const dst = createTypedArrayOfSameType(indices, indexBuffer.getMappedRange());\n dst.set(indices);\n indexBuffer.unmap();\n buffersAndAttributes.indexBuffer = indexBuffer;\n buffersAndAttributes.indexFormat = indices instanceof Uint16Array ? 'uint16' : 'uint32';\n buffersAndAttributes.numElements = indices.length;\n }\n return buffersAndAttributes;\n}\n/**\n * Calls `passEncoder.setVertexBuffer` and optionally `passEncoder.setIndexBuffer`\n * for the buffers specified in `buffersAndAttributes`.\n *\n * This is extremely simple function. It is equivalent to\n *\n * ```js\n * buffersAndAttributes.buffers.forEach((buffer, i) => {\n * passEncoder.setVertexBuffer(firstVertexBufferIndex + i, buffer);\n * });\n*\n * if (buffersAndAttributes.indexBuffer) {\n * passEncoder.setIndexBuffer(buffersAndAttributes.indexBuffer, buffersAndAttributes.indexFormat!);\n * }\n * ```\n *\n * It exists solely for simple cases. If you have a complex case, call the passEncoder\n * yourself as appropriate.\n *\n * @param passEncoder a render pass encoder\n * @param buffersAndAttributes As returned from {@link createBuffersAndAttributesFromArrays}\n * @param firstVertexBufferIndex The first vertex buffer index. default = 0.\n */\nfunction setVertexAndIndexBuffers(passEncoder, buffersAndAttributes, firstVertexBufferIndex = 0) {\n buffersAndAttributes.buffers.forEach((buffer, i) => {\n passEncoder.setVertexBuffer(firstVertexBufferIndex + i, buffer);\n });\n if (buffersAndAttributes.indexBuffer) {\n passEncoder.setIndexBuffer(buffersAndAttributes.indexBuffer, buffersAndAttributes.indexFormat);\n }\n}\n/**\n * Calls {@link setVertexAndIndexBuffers} and then calls either `draw` or `drawIndexed`\n *\n * This is an extremely simple function. See {@link setVertexAndIndexBuffers}.\n * If you need something more complex, call pass encoder functions yourself as appropriate.\n *\n * @param passEncoder a render pass encoder\n * @param buffersAndAttributes As returned from {@link createBuffersAndAttributesFromArrays}\n */\nfunction drawArrays(passEncoder, buffersAndAttributes) {\n setVertexAndIndexBuffers(passEncoder, buffersAndAttributes);\n if (buffersAndAttributes.indexBuffer) {\n passEncoder.drawIndexed(buffersAndAttributes.numElements);\n }\n else {\n passEncoder.draw(buffersAndAttributes.numElements);\n }\n}\n\nfunction isTextureData(source) {\n const src = source;\n return isTypedArray(src.data) || Array.isArray(src.data);\n}\nfunction isTextureRawDataSource(source) {\n return isTypedArray(source) || Array.isArray(source) || isTextureData(source);\n}\nfunction toTypedArray(v, format) {\n if (isTypedArray(v)) {\n return v;\n }\n const { Type } = getTextureFormatInfo(format);\n return new Type(v);\n}\nfunction guessDimensions(width, height, numElements, dimension = '2d') {\n if (numElements % 1 !== 0) {\n throw new Error(\"can't guess dimensions\");\n }\n if (!width && !height) {\n const size = Math.sqrt(numElements / (dimension === 'cube' ? 6 : 1));\n if (size % 1 === 0) {\n width = size;\n height = size;\n }\n else {\n width = numElements;\n height = 1;\n }\n }\n else if (!height) {\n height = numElements / width;\n if (height % 1) {\n throw new Error(\"can't guess dimensions\");\n }\n }\n else if (!width) {\n width = numElements / height;\n if (width % 1) {\n throw new Error(\"can't guess dimensions\");\n }\n }\n const depth = numElements / width / height;\n if (depth % 1) {\n throw new Error(\"can't guess dimensions\");\n }\n return [width, height, depth];\n}\nfunction textureViewDimensionToDimension(viewDimension) {\n switch (viewDimension) {\n case '1d': return '1d';\n case '3d': return '3d';\n default: return '2d';\n }\n}\nconst kFormatToTypedArray = {\n '8snorm': Int8Array,\n '8unorm': Uint8Array,\n '8sint': Int8Array,\n '8uint': Uint8Array,\n '16snorm': Int16Array,\n '16unorm': Uint16Array,\n '16sint': Int16Array,\n '16uint': Uint16Array,\n '32snorm': Int32Array,\n '32unorm': Uint32Array,\n '32sint': Int32Array,\n '32uint': Uint32Array,\n '16float': Uint16Array,\n '32float': Float32Array,\n};\nconst kTextureFormatRE = /([a-z]+)(\\d+)([a-z]+)/;\nfunction getTextureFormatInfo(format) {\n // this is a hack! It will only work for common formats\n const [, channels, bits, typeName] = kTextureFormatRE.exec(format);\n // TODO: if the regex fails, use table for other formats?\n const numChannels = channels.length;\n const bytesPerChannel = parseInt(bits) / 8;\n const bytesPerElement = numChannels * bytesPerChannel;\n const Type = kFormatToTypedArray[`${bits}${typeName}`];\n return {\n channels,\n numChannels,\n bytesPerChannel,\n bytesPerElement,\n Type,\n };\n}\n/**\n * Gets the size of a mipLevel. Returns an array of 3 numbers [width, height, depthOrArrayLayers]\n */\nfunction getSizeForMipFromTexture(texture, mipLevel) {\n return [\n texture.width,\n texture.height,\n texture.depthOrArrayLayers,\n ].map(v => Math.max(1, Math.floor(v / 2 ** mipLevel)));\n}\n/**\n * Uploads Data to a texture\n */\nfunction uploadDataToTexture(device, texture, source, options) {\n const data = toTypedArray(source.data || source, texture.format);\n const mipLevel = 0;\n const size = getSizeForMipFromTexture(texture, mipLevel);\n const { bytesPerElement } = getTextureFormatInfo(texture.format);\n const origin = options.origin || [0, 0, 0];\n device.queue.writeTexture({ texture, origin }, data, { bytesPerRow: bytesPerElement * size[0], rowsPerImage: size[1] }, size);\n}\n/**\n * Copies a an array of \"sources\" (Video, Canvas, OffscreenCanvas, ImageBitmap)\n * to a texture and then optionally generates mip levels\n */\nfunction copySourcesToTexture(device, texture, sources, options = {}) {\n let tempTexture;\n sources.forEach((source, layer) => {\n const origin = [0, 0, layer + (options.baseArrayLayer || 0)];\n if (isTextureRawDataSource(source)) {\n uploadDataToTexture(device, texture, source, { origin });\n }\n else {\n const s = source;\n // work around limit that you can't call copyExternalImageToTexture for 3d texture.\n // sse https://github.com/gpuweb/gpuweb/issues/4697 for if we can remove this\n let dstTexture = texture;\n let copyOrigin = origin;\n if (texture.dimension === '3d') {\n tempTexture = tempTexture ?? device.createTexture({\n format: texture.format,\n usage: texture.usage | GPUTextureUsage.COPY_SRC,\n size: [texture.width, texture.height, 1],\n });\n dstTexture = tempTexture;\n copyOrigin = [0, 0, 0];\n }\n const { flipY, premultipliedAlpha, colorSpace } = options;\n device.queue.copyExternalImageToTexture({ source: s, flipY, }, { texture: dstTexture, premultipliedAlpha, colorSpace, origin: copyOrigin }, getSizeFromSource(s, options));\n if (tempTexture) {\n const encoder = device.createCommandEncoder();\n encoder.copyTextureToTexture({ texture: tempTexture }, { texture, origin }, tempTexture);\n device.queue.submit([encoder.finish()]);\n }\n }\n });\n if (tempTexture) {\n tempTexture.destroy();\n }\n if (texture.mipLevelCount > 1) {\n generateMipmap(device, texture);\n }\n}\n/**\n * Copies a \"source\" (Video, Canvas, OffscreenCanvas, ImageBitmap)\n * to a texture and then optionally generates mip levels\n */\nfunction copySourceToTexture(device, texture, source, options = {}) {\n copySourcesToTexture(device, texture, [source], options);\n}\n/**\n * Gets the size from a source. This is to smooth out the fact that different\n * sources have a different way to get their size.\n */\nfunction getSizeFromSource(source, options) {\n if (source instanceof HTMLVideoElement) {\n return [source.videoWidth, source.videoHeight, 1];\n }\n else {\n const maybeHasWidthAndHeight = source;\n const { width, height } = maybeHasWidthAndHeight;\n if (width > 0 && height > 0 && !isTextureRawDataSource(source)) {\n // this should cover Canvas, Image, ImageData, ImageBitmap, TextureCreationData\n return [width, height, 1];\n }\n const format = options.format || 'rgba8unorm';\n const { bytesPerElement, bytesPerChannel } = getTextureFormatInfo(format);\n const data = isTypedArray(source) || Array.isArray(source)\n ? source\n : source.data;\n const numBytes = isTypedArray(data)\n ? data.byteLength\n : (data.length * bytesPerChannel);\n const numElements = numBytes / bytesPerElement;\n return guessDimensions(width, height, numElements);\n }\n}\n/**\n * Create a texture from an array of sources (Video, Canvas, OffscreenCanvas, ImageBitmap)\n * and optionally create mip levels. If you set `mips: true` and don't set a mipLevelCount\n * then it will automatically make the correct number of mip levels.\n *\n * Example:\n *\n * ```js\n * const texture = createTextureFromSource(\n * device,\n * [\n * someCanvasOrVideoOrImageImageBitmap0,\n * someCanvasOrVideoOrImageImageBitmap1,\n * ],\n * {\n * usage: GPUTextureUsage.TEXTURE_BINDING |\n * GPUTextureUsage.RENDER_ATTACHMENT |\n * GPUTextureUsage.COPY_DST,\n * mips: true,\n * }\n * );\n * ```\n */\nfunction createTextureFromSources(device, sources, options = {}) {\n // NOTE: We assume all the sizes are the same. If they are not you'll get\n // an error.\n const size = getSizeFromSource(sources[0], options);\n size[2] = size[2] > 1 ? size[2] : sources.length;\n const texture = device.createTexture({\n dimension: textureViewDimensionToDimension(options.dimension),\n format: options.format || 'rgba8unorm',\n mipLevelCount: options.mipLevelCount\n ? options.mipLevelCount\n : options.mips ? numMipLevels(size) : 1,\n size,\n usage: (options.usage ?? 0) |\n GPUTextureUsage.TEXTURE_BINDING |\n GPUTextureUsage.COPY_DST |\n GPUTextureUsage.RENDER_ATTACHMENT,\n });\n copySourcesToTexture(device, texture, sources, options);\n return texture;\n}\n/**\n * Create a texture from a source (Video, Canvas, OffscreenCanvas, ImageBitmap)\n * and optionally create mip levels. If you set `mips: true` and don't set a mipLevelCount\n * then it will automatically make the correct number of mip levels.\n *\n * Example:\n *\n * ```js\n * const texture = createTextureFromSource(\n * device,\n * someCanvasOrVideoOrImageImageBitmap,\n * {\n * usage: GPUTextureUsage.TEXTURE_BINDING |\n * GPUTextureUsage.RENDER_ATTACHMENT |\n * GPUTextureUsage.COPY_DST,\n * mips: true,\n * }\n * );\n * ```\n */\nfunction createTextureFromSource(device, source, options = {}) {\n return createTextureFromSources(device, [source], options);\n}\n/**\n * Load an ImageBitmap\n * @param url\n * @param options\n * @returns the loaded ImageBitmap\n */\nasync function loadImageBitmap(url, options = {}) {\n const res = await fetch(url);\n const blob = await res.blob();\n const opt = {\n ...options,\n ...(options.colorSpaceConversion !== undefined && { colorSpaceConversion: 'none' }),\n };\n return await createImageBitmap(blob, opt);\n}\n/**\n * Load images and create a texture from them, optionally generating mip levels\n *\n * Assumes all the urls reference images of the same size.\n *\n * Example:\n *\n * ```js\n * const texture = await createTextureFromImage(\n * device,\n * [\n * 'https://someimage1.url',\n * 'https://someimage2.url',\n * ],\n * {\n * mips: true,\n * flipY: true,\n * },\n * );\n * ```\n */\nasync function createTextureFromImages(device, urls, options = {}) {\n // TODO: start once we've loaded one?\n // We need at least 1 to know the size of the texture to create\n const imgBitmaps = await Promise.all(urls.map(url => loadImageBitmap(url)));\n return createTextureFromSources(device, imgBitmaps, options);\n}\n/**\n * Load an image and create a texture from it, optionally generating mip levels\n *\n * Example:\n *\n * ```js\n * const texture = await createTextureFromImage(device, 'https://someimage.url', {\n * mips: true,\n * flipY: true,\n * });\n * ```\n */\nasync function createTextureFromImage(device, url, options = {}) {\n return createTextureFromImages(device, [url], options);\n}\n\n/*\n * Copyright 2023 Gregg Tavares\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n * copy of this software and associated documentation files (the \"Software\"),\n * to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense,\n * and/or sell copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\n * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n */\n/**\n * A class to provide `push` on a typed array.\n *\n * example:\n *\n * ```js\n * const positions = new TypedArrayWrapper(new Float32Array(300), 3);\n * positions.push(1, 2, 3); // add a position\n * positions.push([4, 5, 6]); // add a position\n * positions.push(new Float32Array(6)); // add 2 positions\n * const data = positions.typedArray;\n * ```\n */\nclass TypedArrayWrapper {\n typedArray;\n cursor = 0;\n numComponents;\n constructor(arr, numComponents) {\n this.typedArray = arr;\n this.numComponents = numComponents;\n }\n get numElements() {\n return this.typedArray.length / this.numComponents;\n }\n push(...data) {\n for (const value of data) {\n if (Array.isArray(value) || isTypedArray(value)) {\n const asArray = data;\n this.typedArray.set(asArray, this.cursor);\n this.cursor += asArray.length;\n }\n else {\n this.typedArray[this.cursor++] = value;\n }\n }\n }\n reset(index = 0) {\n this.cursor = index;\n }\n}\n/**\n * creates a typed array with a `push` function attached\n * so that you can easily *push* values.\n *\n * `push` can take multiple arguments. If an argument is an array each element\n * of the array will be added to the typed array.\n *\n * Example:\n *\n * const array = createAugmentedTypedArray(3, 2, Float32Array);\n * array.push(1, 2, 3);\n * array.push([4, 5, 6]);\n * // array now contains [1, 2, 3, 4, 5, 6]\n *\n * Also has `numComponents` and `numElements` properties.\n *\n * @param numComponents number of components\n * @param numElements number of elements. The total size of the array will be `numComponents * numElements`.\n * @param Type A constructor for the type. Default = `Float32Array`.\n */\nfunction createAugmentedTypedArray(numComponents, numElements, Type) {\n return new TypedArrayWrapper(new Type(numComponents * numElements), numComponents);\n}\n// I couldn't figure out how to make this because TypedArrayWrapper wants a type\n// but this is explicity kind of type-less.\nfunction createAugmentedTypedArrayFromExisting(numComponents, numElements, existingArray) {\n const Ctor = existingArray.constructor;\n const array = new Ctor(numComponents * numElements);\n return new TypedArrayWrapper(array, numComponents);\n}\n/**\n * Creates XY quad vertices\n *\n * The default with no parameters will return a 2x2 quad with values from -1 to +1.\n * If you want a unit quad with that goes from 0 to 1 you'd call it with\n *\n * createXYQuadVertices(1, 0.5, 0.5);\n *\n * If you want a unit quad centered above 0,0 you'd call it with\n *\n * primitives.createXYQuadVertices(1, 0, 0.5);\n *\n * @param params\n * @param params.size the size across the quad. Defaults to 2 which means vertices will go from -1 to +1\n * @param params.xOffset the amount to offset the quad in X. Default = 0\n * @param params.yOffset the amount to offset the quad in Y. Default = 0\n * @return the created XY Quad vertices\n */\nfunction createXYQuadVertices({ size: inSize = 2, xOffset = 0, yOffset = 0 } = {}) {\n const size = inSize * 0.5;\n return {\n position: {\n numComponents: 2,\n data: [\n xOffset + -1 * size, yOffset + -1 * size,\n xOffset + 1 * size, yOffset + -1 * size,\n xOffset + -1 * size, yOffset + 1 * size,\n xOffset + 1 * size, yOffset + 1 * size,\n ],\n },\n normal: [\n 0, 0, 1,\n 0, 0, 1,\n 0, 0, 1,\n 0, 0, 1,\n ],\n texcoord: [\n 0, 0,\n 1, 0,\n 0, 1,\n 1, 1,\n ],\n indices: [0, 1, 2, 2, 1, 3],\n };\n}\n/**\n * Creates XZ plane vertices.\n *\n * The created plane has position, normal, and texcoord data\n *\n * @param params\n * @param params.width Width of the plane. Default = 1\n * @param params.depth Depth of the plane. Default = 1\n * @param params.subdivisionsWidth Number of steps across the plane. Default = 1\n * @param params.subdivisionsDepth Number of steps down the plane. Default = 1\n * @return The created plane vertices.\n */\nfunction createPlaneVertices({ width = 1, depth = 1, subdivisionsWidth = 1, subdivisionsDepth = 1, } = {}) {\n const numVertices = (subdivisionsWidth + 1) * (subdivisionsDepth + 1);\n const positions = createAugmentedTypedArray(3, numVertices, Float32Array);\n const normals = createAugmentedTypedArray(3, numVertices, Float32Array);\n const texcoords = createAugmentedTypedArray(2, numVertices, Float32Array);\n for (let z = 0; z <= subdivisionsDepth; z++) {\n for (let x = 0; x <= subdivisionsWidth; x++) {\n const u = x / subdivisionsWidth;\n const v = z / subdivisionsDepth;\n positions.push(width * u - width * 0.5, 0, depth * v - depth * 0.5);\n normals.push(0, 1, 0);\n texcoords.push(u, v);\n }\n }\n const numVertsAcross = subdivisionsWidth + 1;\n const indices = createAugmentedTypedArray(3, subdivisionsWidth * subdivisionsDepth * 2, Uint16Array);\n for (let z = 0; z < subdivisionsDepth; z++) { // eslint-disable-line\n for (let x = 0; x < subdivisionsWidth; x++) { // eslint-disable-line\n // Make triangle 1 of quad.\n indices.push((z + 0) * numVertsAcross + x, (z + 1) * numVertsAcross + x, (z + 0) * numVertsAcross + x + 1);\n // Make triangle 2 of quad.\n indices.push((z + 1) * numVertsAcross + x, (z + 1) * numVertsAcross + x + 1, (z + 0) * numVertsAcross + x + 1);\n }\n }\n return {\n position: positions.typedArray,\n normal: normals.typedArray,\n texcoord: texcoords.typedArray,\n indices: indices.typedArray,\n };\n}\n/**\n * Creates sphere vertices.\n *\n * The created sphere has position, normal, and texcoord data\n *\n * @param params\n * @param params.radius radius of the sphere. Default = 1\n * @param params.subdivisionsAxis number of steps around the sphere. Default = 24\n * @param params.subdivisionsHeight number of vertically on the sphere. Default = 12\n * @param params.startLatitudeInRadians where to start the\n * top of the sphere. Default = 0\n * @param params.endLatitudeInRadians Where to end the\n * bottom of the sphere. Default = π\n * @param params.startLongitudeInRadians where to start\n * wrapping the sphere. Default = 0\n * @param params.endLongitudeInRadians where to end\n * wrapping the sphere. Default = 2π\n * @return The created sphere vertices.\n */\nfunction createSphereVertices({ radius = 1, subdivisionsAxis = 24, subdivisionsHeight = 12, startLatitudeInRadians = 0, endLatitudeInRadians = Math.PI, startLongitudeInRadians = 0, endLongitudeInRadians = Math.PI * 2, } = {}) {\n if (subdivisionsAxis <= 0 || subdivisionsHeight <= 0) {\n throw new Error('subdivisionAxis and subdivisionHeight must be > 0');\n }\n const latRange = endLatitudeInRadians - startLatitudeInRadians;\n const longRange = endLongitudeInRadians - startLongitudeInRadians;\n // We are going to generate our sphere by iterating through its\n // spherical coordinates and generating 2 triangles for each quad on a\n // ring of the sphere.\n const numVertices = (subdivisionsAxis + 1) * (subdivisionsHeight + 1);\n const positions = createAugmentedTypedArray(3, numVertices, Float32Array);\n const normals = createAugmentedTypedArray(3, numVertices, Float32Array);\n const texcoords = createAugmentedTypedArray(2, numVertices, Float32Array);\n // Generate the individual vertices in our vertex buffer.\n for (let y = 0; y <= subdivisionsHeight; y++) {\n for (let x = 0; x <= subdivisionsAxis; x++) {\n // Generate a vertex based on its spherical coordinates\n const u = x / subdivisionsAxis;\n const v = y / subdivisionsHeight;\n const theta = longRange * u + startLongitudeInRadians;\n const phi = latRange * v + startLatitudeInRadians;\n const sinTheta = Math.sin(theta);\n const cosTheta = Math.cos(theta);\n const sinPhi = Math.sin(phi);\n const cosPhi = Math.cos(phi);\n const ux = cosTheta * sinPhi;\n const uy = cosPhi;\n const uz = sinTheta * sinPhi;\n positions.push(radius * ux, radius * uy, radius * uz);\n normals.push(ux, uy, uz);\n texcoords.push(1 - u, v);\n }\n }\n const numVertsAround = subdivisionsAxis + 1;\n const indices = createAugmentedTypedArray(3, subdivisionsAxis * subdivisionsHeight * 2, Uint16Array);\n for (let x = 0; x < subdivisionsAxis; x++) { // eslint-disable-line\n for (let y = 0; y < subdivisionsHeight; y++) { // eslint-disable-line\n // Make triangle 1 of quad.\n indices.push((y + 0) * numVertsAround + x, (y + 0) * numVertsAround + x + 1, (y + 1) * numVertsAround + x);\n // Make triangle 2 of quad.\n indices.push((y + 1) * numVertsAround + x, (y + 0) * numVertsAround + x + 1, (y + 1) * numVertsAround + x + 1);\n }\n }\n return {\n position: positions.typedArray,\n normal: normals.typedArray,\n texcoord: texcoords.typedArray,\n indices: indices.typedArray,\n };\n}\n/**\n * Array of the indices of corners of each face of a cube.\n */\nconst CUBE_FACE_INDICES = [\n [3, 7, 5, 1],\n [6, 2, 0, 4],\n [6, 7, 3, 2],\n [0, 1, 5, 4],\n [7, 6, 4, 5],\n [2, 3, 1, 0], // back\n];\n/**\n * Creates the vertices and indices for a cube.\n *\n * The cube is created around the origin. (-size / 2, size / 2).\n *\n * @param params\n * @param params.size width, height and depth of the cube. Default = 1\n * @return The created vertices.\n */\nfunction createCubeVertices({ size = 1 } = {}) {\n const k = size / 2;\n const cornerVertices = [\n [-k, -k, -k],\n [+k, -k, -k],\n [-k, +k, -k],\n [+k, +k, -k],\n [-k, -k, +k],\n [+k, -k, +k],\n [-k, +k, +k],\n [+k, +k, +k],\n ];\n const faceNormals = [\n [+1, +0, +0],\n [-1, +0, +0],\n [+0, +1, +0],\n [+0, -1, +0],\n [+0, +0, +1],\n [+0, +0, -1],\n ];\n const uvCoords = [\n [1, 0],\n [0, 0],\n [0, 1],\n [1, 1],\n ];\n const numVertices = 6 * 4;\n const positions = createAugmentedTypedArray(3, numVertices, Float32Array);\n const normals = createAugmentedTypedArray(3, numVertices, Float32Array);\n const texcoords = createAugmentedTypedArray(2, numVertices, Float32Array);\n const indices = createAugmentedTypedArray(3, 6 * 2, Uint16Array);\n for (let f = 0; f < 6; ++f) {\n const faceIndices = CUBE_FACE_INDICES[f];\n for (let v = 0; v < 4; ++v) {\n const position = cornerVertices[faceIndices[v]];\n const normal = faceNormals[f];\n const uv = uvCoords[v];\n // Each face needs all four vertices because the normals and texture\n // coordinates are not all the same.\n positions.push(...position);\n normals.push(...normal);\n texcoords.push(...uv);\n }\n // Two triangles make a square face.\n const offset = 4 * f;\n indices.push(offset + 0, offset + 1, offset + 2);\n indices.push(offset + 0, offset + 2, offset + 3);\n }\n return {\n position: positions.typedArray,\n normal: normals.typedArray,\n texcoord: texcoords.typedArray,\n indices: indices.typedArray,\n };\n}\n/**\n * Creates vertices for a truncated cone, which is like a cylinder\n * except that it has different top and bottom radii. A truncated cone\n * can also be used to create cylinders and regular cones. The\n * truncated cone will be created centered about the origin, with the\n * y axis as its vertical axis. .\n *\n * @param bottomRadius Bottom radius of truncated cone. Default = 1\n * @param topRadius Top radius of truncated cone. Default = 0\n * @param height Height of truncated cone. Default = 1\n * @param radialSubdivisions The number of subdivisions around the\n * truncated cone. Default = 24\n * @param verticalSubdivisions The number of subdivisions down the\n * truncated cone. Default = 1\n * @param topCap Create top cap. Default = true.\n * @param bottomCap Create bottom cap. Default = true.\n * @return The created cone vertices.\n */\nfunction createTruncatedConeVertices({ bottomRadius = 1, topRadius = 0, height = 1, radialSubdivisions = 24, verticalSubdivisions = 1, topCap = true, bottomCap = true, } = {}) {\n if (radialSubdivisions < 3) {\n throw new Error('radialSubdivisions must be 3 or greater');\n }\n if (verticalSubdivisions < 1) {\n throw new Error('verticalSubdivisions must be 1 or greater');\n }\n const extra = (topCap ? 2 : 0) + (bottomCap ? 2 : 0);\n const numVertices = (radialSubdivisions + 1) * (verticalSubdivisions + 1 + extra);\n const positions = createAugmentedTypedArray(3, numVertices, Float32Array);\n const normals = createAugmentedTypedArray(3, numVertices, Float32Array);\n const texcoords = createAugmentedTypedArray(2, numVertices, Float32Array);\n const indices = createAugmentedTypedArray(3, radialSubdivisions * (verticalSubdivisions + extra / 2) * 2, Uint16Array);\n const vertsAroundEdge = radialSubdivisions + 1;\n // The slant of the cone is constant across its surface\n const slant = Math.atan2(bottomRadius - topRadius, height);\n const cosSlant = Math.cos(slant);\n const sinSlant = Math.sin(slant);\n const start = topCap ? -2 : 0;\n const end = verticalSubdivisions + (bottomCap ? 2 : 0);\n for (let yy = start; yy <= end; ++yy) {\n let v = yy / verticalSubdivisions;\n let y = height * v;\n let ringRadius;\n if (yy < 0) {\n y = 0;\n v = 1;\n ringRadius = bottomRadius;\n }\n else if (yy > verticalSubdivisions) {\n y = height;\n v = 1;\n ringRadius = topRadius;\n }\n else {\n ringRadius = bottomRadius +\n (topRadius - bottomRadius) * (yy / verticalSubdivisions);\n }\n if (yy === -2 || yy === verticalSubdivisions + 2) {\n ringRadius = 0;\n v = 0;\n }\n y -= height / 2;\n for (let ii = 0; ii < vertsAroundEdge; ++ii) {\n const sin = Math.sin(ii * Math.PI * 2 / radialSubdivisions);\n const cos = Math.cos(ii * Math.PI * 2 / radialSubdivisions);\n positions.push(sin * ringRadius, y, cos * ringRadius);\n if (yy < 0) {\n normals.push(0, -1, 0);\n }\n else if (yy > verticalSubdivisions) {\n normals.push(0, 1, 0);\n }\n else if (ringRadius === 0.0) {\n normals.push(0, 0, 0);\n }\n else {\n normals.push(sin * cosSlant, sinSlant, cos * cosSlant);\n }\n texcoords.push((ii / radialSubdivisions), 1 - v);\n }\n }\n for (let yy = 0; yy < verticalSubdivisions + extra; ++yy) { // eslint-disable-line\n if (yy === 1 && topCap || yy === verticalSubdivisions + extra - 2 && bottomCap) {\n continue;\n }\n for (let ii = 0; ii < radialSubdivisions; ++ii) { // eslint-disable-line\n indices.push(vertsAroundEdge * (yy + 0) + 0 + ii, vertsAroundEdge * (yy + 0) + 1 + ii, vertsAroundEdge * (yy + 1) + 1 + ii);\n indices.push(vertsAroundEdge * (yy + 0) + 0 + ii, vertsAroundEdge * (yy + 1) + 1 + ii, vertsAroundEdge * (yy + 1) + 0 + ii);\n }\n }\n return {\n position: positions.typedArray,\n normal: normals.typedArray,\n texcoord: texcoords.typedArray,\n indices: indices.typedArray,\n };\n}\n/**\n * Expands RLE data\n * @param rleData data in format of run-length, x, y, z, run-length, x, y, z\n * @param padding value to add each entry with.\n * @return the expanded rleData\n */\nfunction expandRLEData(rleData, padding = []) {\n padding = padding || [];\n const data = [];\n for (let ii = 0; ii < rleData.length; ii += 4) {\n const runLength = rleData[ii];\n const element = rleData.slice(ii + 1, ii + 4);\n element.push(...padding);\n for (let jj = 0; jj < runLength; ++jj) {\n data.push(...element);\n }\n }\n return data;\n}\n/**\n * Creates 3D 'F' vertices.\n * An 'F' is useful because you can easily tell which way it is oriented.\n * The created 'F' has position, normal, texcoord, and color arrays.\n *\n * @return The created vertices.\n */\nfunction create3DFVertices() {\n const positions = [\n // left column front\n 0, 0, 0,\n 0, 150, 0,\n 30, 0, 0,\n 0, 150, 0,\n 30, 150, 0,\n 30, 0, 0,\n // top rung front\n 30, 0, 0,\n 30, 30, 0,\n 100, 0, 0,\n 30, 30, 0,\n 100, 30, 0,\n 100, 0, 0,\n // middle rung front\n 30, 60, 0,\n 30, 90, 0,\n 67, 60, 0,\n 30, 90, 0,\n 67, 90, 0,\n 67, 60, 0,\n // left column back\n 0, 0, 30,\n 30, 0, 30,\n 0, 150, 30,\n 0, 150, 30,\n 30, 0, 30,\n 30, 150, 30,\n // top rung back\n 30, 0, 30,\n 100, 0, 30,\n 30, 30, 30,\n 30, 30, 30,\n 100, 0, 30,\n 100, 30, 30,\n // middle rung back\n 30, 60, 30,\n 67, 60, 30,\n 30, 90, 30,\n 30, 90, 30,\n 67, 60, 30,\n 67, 90, 30,\n // top\n 0, 0, 0,\n 100, 0, 0,\n 100, 0, 30,\n 0, 0, 0,\n 100, 0, 30,\n 0, 0, 30,\n // top rung front\n 100, 0, 0,\n 100, 30, 0,\n 100, 30, 30,\n 100, 0, 0,\n 100, 30, 30,\n 100, 0, 30,\n // under top rung\n 30, 30, 0,\n 30, 30, 30,\n 100, 30, 30,\n 30, 30, 0,\n 100, 30, 30,\n 100, 30, 0,\n // between top rung and middle\n 30, 30, 0,\n 30, 60, 30,\n 30, 30, 30,\n 30, 30, 0,\n 30, 60, 0,\n 30, 60, 30,\n // top of middle rung\n 30, 60, 0,\n 67, 60, 30,\n 30, 60, 30,\n 30, 60, 0,\n 67, 60, 0,\n 67, 60, 30,\n // front of middle rung\n 67, 60, 0,\n 67, 90, 30,\n 67, 60, 30,\n 67, 60, 0,\n 67, 90, 0,\n 67, 90, 30,\n // bottom of middle rung.\n 30, 90, 0,\n 30, 90, 30,\n 67, 90, 30,\n 30, 90, 0,\n 67, 90, 30,\n 67, 90, 0,\n // front of bottom\n 30, 90, 0,\n 30, 150, 30,\n 30, 90, 30,\n 30, 90, 0,\n 30, 150, 0,\n 30, 150, 30,\n // bottom\n 0, 150, 0,\n 0, 150, 30,\n 30, 150, 30,\n 0, 150, 0,\n 30, 150, 30,\n 30, 150, 0,\n // left side\n 0, 0, 0,\n 0, 0, 30,\n 0, 150, 30,\n 0, 0, 0,\n 0, 150, 30,\n 0, 150, 0,\n ];\n const texcoords = [\n // left column front\n 0.22, 0.19,\n 0.22, 0.79,\n 0.34, 0.19,\n 0.22, 0.79,\n 0.34, 0.79,\n 0.34, 0.19,\n // top rung front\n 0.34, 0.19,\n 0.34, 0.31,\n 0.62, 0.19,\n 0.34, 0.31,\n 0.62, 0.31,\n 0.62, 0.19,\n // middle rung front\n 0.34, 0.43,\n 0.34, 0.55,\n 0.49, 0.43,\n 0.34, 0.55,\n 0.49, 0.55,\n 0.49, 0.43,\n // left column back\n 0, 0,\n 1, 0,\n 0, 1,\n 0, 1,\n 1, 0,\n 1, 1,\n // top rung back\n 0, 0,\n 1, 0,\n 0, 1,\n 0, 1,\n 1, 0,\n 1, 1,\n // middle rung back\n 0, 0,\n 1, 0,\n 0, 1,\n 0, 1,\n 1, 0,\n 1, 1,\n // top\n 0, 0,\n 1, 0,\n 1, 1,\n 0, 0,\n 1, 1,\n 0, 1,\n // top rung front\n 0, 0,\n 1, 0,\n 1, 1,\n 0, 0,\n 1, 1,\n 0, 1,\n // under top rung\n 0, 0,\n 0, 1,\n 1, 1,\n 0, 0,\n 1, 1,\n 1, 0,\n // between top rung and middle\n 0, 0,\n 1, 1,\n 0, 1,\n 0, 0,\n 1, 0,\n 1, 1,\n // top of middle rung\n 0, 0,\n 1, 1,\n 0, 1,\n 0, 0,\n 1, 0,\n 1, 1,\n // front of middle rung\n 0, 0,\n 1, 1,\n 0, 1,\n 0, 0,\n 1, 0,\n 1, 1,\n // bottom of middle rung.\n 0, 0,\n 0, 1,\n 1, 1,\n 0, 0,\n 1, 1,\n 1, 0,\n // front of bottom\n 0, 0,\n 1, 1,\n 0, 1,\n 0, 0,\n 1, 0,\n 1, 1,\n // bottom\n 0, 0,\n 0, 1,\n 1, 1,\n 0, 0,\n 1, 1,\n 1, 0,\n // left side\n 0, 0,\n 0, 1,\n 1, 1,\n 0, 0,\n 1, 1,\n 1, 0,\n ];\n const normals = expandRLEData([\n // left column front\n // top rung front\n // middle rung front\n 18, 0, 0, 1,\n // left column back\n // top rung back\n // middle rung back\n 18, 0, 0, -1,\n // top\n 6, 0, 1, 0,\n // top rung front\n 6, 1, 0, 0,\n // under top rung\n 6, 0, -1, 0,\n // between top rung and middle\n 6, 1, 0, 0,\n // top of middle rung\n 6, 0, 1, 0,\n // front of middle rung\n 6, 1, 0, 0,\n // bottom of middle rung.\n 6, 0, -1, 0,\n // front of bottom\n 6, 1, 0, 0,\n // bottom\n 6, 0, -1, 0,\n // left side\n 6, -1, 0, 0,\n ]);\n const colors = expandRLEData([\n // left column front\n // top rung front\n // middle rung front\n 18, 200, 70, 120,\n // left column back\n // top rung back\n // middle rung back\n 18, 80, 70, 200,\n // top\n 6, 70, 200, 210,\n // top rung front\n 6, 200, 200, 70,\n // under top rung\n 6, 210, 100, 70,\n // between top rung and middle\n 6, 210, 160, 70,\n // top of middle rung\n 6, 70, 180, 210,\n // front of middle rung\n 6, 100, 70, 210,\n // bottom of middle rung.\n 6, 76, 210, 100,\n // front of bottom\n 6, 140, 210, 80,\n // bottom\n 6, 90, 130, 110,\n // left side\n 6, 160, 160, 220,\n ], [255]);\n const numVerts = positions.length / 3;\n const arrays = {\n position: createAugmentedTypedArray(3, numVerts, Float32Array),\n texcoord: createAugmentedTypedArray(2, numVerts, Float32Array),\n normal: createAugmentedTypedArray(3, numVerts, Float32Array),\n color: createAugmentedTypedArray(4, numVerts, Uint8Array),\n indices: createAugmentedTypedArray(3, numVerts / 3, Uint16Array),\n };\n arrays.position.push(positions);\n arrays.texcoord.push(texcoords);\n arrays.normal.push(normals);\n arrays.color.push(colors);\n for (let ii = 0; ii < numVerts; ++ii) {\n arrays.indices.push(ii);\n }\n return Object.fromEntries(Object.entries(arrays).map(([k, v]) => [k, v.typedArray]));\n}\n/**\n * Creates cylinder vertices. The cylinder will be created around the origin\n * along the y-axis.\n *\n * @param params\n * @param params.radius Radius of cylinder. Default = 1\n * @param params.height Height of cylinder. Default = 1\n * @param params.radialSubdivisions The number of subdivisions around the cylinder. Default = 24\n * @param params.verticalSubdivisions The number of subdivisions down the cylinder. Default = 1\n * @param params.topCap Create top cap. Default = true.\n * @param params.bottomCap Create bottom cap. Default = true.\n * @return The created vertices.\n */\nfunction createCylinderVertices({ radius = 1, height = 1, radialSubdivisions = 24, verticalSubdivisions = 1, topCap = true, bottomCap = true, } = {}) {\n return createTruncatedConeVertices({\n bottomRadius: radius,\n topRadius: radius,\n height,\n radialSubdivisions,\n verticalSubdivisions,\n topCap,\n bottomCap,\n });\n}\n/**\n * Creates vertices for a torus\n *\n * @param params\n * @param params.radius radius of center of torus circle. Default = 1\n * @param params.thickness radius of torus ring. Default = 0.24\n * @param params.radialSubdivisions The number of subdivisions around the torus. Default = 24\n * @param params.bodySubdivisions The number of subdivisions around the body torus. Default = 12\n * @param params.startAngle start angle in radians. Default = 0.\n * @param params.endAngle end angle in radians. Default = Math.PI * 2.\n * @return The created vertices.\n */\nfunction createTorusVertices({ radius = 1, thickness = 0.24, radialSubdivisions = 24, bodySubdivisions = 12, startAngle = 0, endAngle = Math.PI * 2, } = {}) {\n if (radialSubdivisions < 3) {\n throw new Error('radialSubdivisions must be 3 or greater');\n }\n if (bodySubdivisions < 3) {\n throw new Error('verticalSubdivisions must be 3 or greater');\n }\n const range = endAngle - startAngle;\n const radialParts = radialSubdivisions + 1;\n const bodyParts = bodySubdivisions + 1;\n const numVertices = radialParts * bodyParts;\n const positions = createAugmentedTypedArray(3, numVertices, Float32Array);\n const normals = createAugmentedTypedArray(3, numVertices, Float32Array);\n const texcoords = createAugmentedTypedArray(2, numVertices, Float32Array);\n const indices = createAugmentedTypedArray(3, (radialSubdivisions) * (bodySubdivisions) * 2, Uint16Array);\n for (let slice = 0; slice < bodyParts; ++slice) {\n const v = slice / bodySubdivisions;\n const sliceAngle = v * Math.PI * 2;\n const sliceSin = Math.sin(sliceAngle);\n const ringRadius = radius + sliceSin * thickness;\n const ny = Math.cos(sliceAngle);\n const y = ny * thickness;\n for (let ring = 0; ring < radialParts; ++ring) {\n const u = ring / radialSubdivisions;\n const ringAngle = startAngle + u * range;\n const xSin = Math.sin(ringAngle);\n const zCos = Math.cos(ringAngle);\n const x = xSin * ringRadius;\n const z = zCos * ringRadius;\n const nx = xSin * sliceSin;\n const nz = zCos * sliceSin;\n positions.push(x, y, z);\n normals.push(nx, ny, nz);\n texcoords.push(u, 1 - v);\n }\n }\n for (let slice = 0; slice < bodySubdivisions; ++slice) { // eslint-disable-line\n for (let ring = 0; ring < radialSubdivisions; ++ring) { // eslint-disable-line\n const nextRingIndex = 1 + ring;\n const nextSliceIndex = 1 + slice;\n indices.push(radialParts * slice + ring, radialParts * nextSliceIndex + ring, radialParts * slice + nextRingIndex);\n indices.push(radialParts * nextSliceIndex + ring, radialParts * nextSliceIndex + nextRingIndex, radialParts * slice + nextRingIndex);\n }\n }\n return {\n position: positions.typedArray,\n normal: normals.typedArray,\n texcoord: texcoords.typedArray,\n indices: indices.typedArray,\n };\n}\n/**\n * Creates disc vertices. The disc will be in the xz plane, centered at\n * the origin. When creating, at least 3 divisions, or pie\n * pieces, need to be specified, otherwise the triangles making\n * up the disc will be degenerate. You can also specify the\n * number of radial pieces `stacks`. A value of 1 for\n * stacks will give you a simple disc of pie pieces. If you\n * want to create an annulus you can set `innerRadius` to a\n * value > 0. Finally, `stackPower` allows you to have the widths\n * increase or decrease as you move away from the center. This\n * is particularly useful when using the disc as a ground plane\n * with a fixed camera such that you don't need the resolution\n * of small triangles near the perimeter. For example, a value\n * of 2 will produce stacks whose outside radius increases with\n * the square of the stack index. A value of 1 will give uniform\n * stacks.\n *\n * @param params\n * @param params.radius Radius of the ground plane. Default = 1\n * @param params.divisions Number of triangles in the ground plane (at least 3). Default = 24\n * @param params.stacks Number of radial divisions. Default = 1\n * @param params.innerRadius Default = 0\n * @param params.stackPower Power to raise stack size to for decreasing width. Default = 1\n * @return The created vertices.\n */\nfunction createDiscVertices({ radius = 1, divisions = 24, stacks = 1, innerRadius = 0, stackPower = 1, } = {}) {\n if (divisions < 3) {\n throw new Error('divisions must be at least 3');\n }\n // Note: We don't share the center vertex because that would\n // mess up texture coordinates.\n const numVertices = (divisions + 1) * (stacks + 1);\n const positions = createAugmentedTypedArray(3, numVertices, Float32Array);\n const normals = createAugmentedTypedArray(3, numVertices, Float32Array);\n const texcoords = createAugmentedTypedArray(2, numVertices, Float32Array);\n const indices = createAugmentedTypedArray(3, stacks * divisions * 2, Uint16Array);\n let firstIndex = 0;\n const radiusSpan = radius - innerRadius;\n const pointsPerStack = divisions + 1;\n // Build the disk one stack at a time.\n for (let stack = 0; stack <= stacks; ++stack) {\n const stackRadius = innerRadius + radiusSpan * Math.pow(stack / stacks, stackPower);\n for (let i = 0; i <= divisions; ++i) {\n const theta = 2.0 * Math.PI * i / divisions;\n const x = stackRadius * Math.cos(theta);\n const z = stackRadius * Math.sin(theta);\n positions.push(x, 0, z);\n normals.push(0, 1, 0);\n texcoords.push(1 - (i / divisions), stack / stacks);\n if (stack > 0 && i !== divisions) {\n // a, b, c and d are the indices of the vertices of a quad. unless\n // the current stack is the one closest to the center, in which case\n // the vertices a and b connect to the center vertex.\n const a = firstIndex + (i + 1);\n const b = firstIndex + i;\n const c = firstIndex + i - pointsPerStack;\n const d = firstIndex + (i + 1) - pointsPerStack;\n // Make a quad of the vertices a, b, c, d.\n indices.push(a, b, c);\n indices.push(a, c, d);\n }\n }\n firstIndex += divisions + 1;\n }\n return {\n position: positions.typedArray,\n normal: normals.typedArray,\n texcoord: texcoords.typedArray,\n indices: indices.typedArray,\n };\n}\nfunction allButIndices(name) {\n return name !== \"indices\";\n}\n/**\n * Given indexed vertices creates a new set of vertices un-indexed by expanding the vertices by index.\n */\nfunction deindex(arrays) {\n const indicesP = arrays.indices;\n const newVertices = {};\n const indices = makeTypedArrayFromArrayUnion(indicesP, 'indices');\n const numElements = indices.length;\n function expandToUnindexed(channel) {\n const srcBuffer = makeTypedArrayFromArrayUnion(arrays[channel], channel);\n const numComponents = getNumComponents(srcBuffer, channel);\n const dstBuffer = createAugmentedTypedArrayFromExisting(numComponents, numElements, srcBuffer);\n for (let ii = 0; ii < numElements; ++ii) {\n const ndx = indices[ii];\n const offset = ndx * numComponents;\n for (let jj = 0; jj < numComponents; ++jj) {\n dstBuffer.push(srcBuffer[offset + jj]);\n }\n }\n newVertices[channel] = dstBuffer.typedArray;\n }\n Object.keys(arrays).filter(allButIndices).forEach(expandToUnindexed);\n return newVertices;\n}\n// I don't want to pull in a whole math library\nconst normalize = ([x, y, z]) => {\n const len = x * x + y * y + z * z;\n return new Float32Array([x / len, y / len, z / len]);\n};\nconst subtract = (a, b) => {\n const r = new Float32Array(a.length);\n for (let i = 0; i < a.length; ++i) {\n r[i] = a[i] - b[i];\n }\n return r;\n};\nconst cross = (a, b) => {\n const r = new Float32Array(a.length);\n r[0] = a[1] * b[2] - a[2] * b[1];\n r[1] = a[2] * b[0] - a[0] * b[2];\n r[2] = a[0] * b[1] - a[1] * b[0];\n return r;\n};\n/**\n * Generate triangle normals from positions.\n * Assumes every 3 values is a position and every 3 positions come from the same triangle\n */\nfunction generateTriangleNormals(positions) {\n const normals = new Float32Array(positions.length);\n for (let ii = 0; ii < positions.length; ii += 9) {\n // pull out the 3 positions for this triangle\n const p0 = positions.subarray(ii, ii + 3);\n const p1 = positions.subarray(ii + 3, ii + 6);\n const p2 = positions.subarray(ii + 6, ii + 9);\n const n0 = normalize(subtract(p0, p1));\n const n1 = normalize(subtract(p0, p2));\n const n = cross(n0, n1);\n // copy them back in\n normals.set(n, ii);\n normals.set(n, ii + 3);\n normals.set(n, ii + 6);\n }\n return normals;\n}\n\nvar primitives = {\n __proto__: null,\n TypedArrayWrapper: TypedArrayWrapper,\n create3DFVertices: create3DFVertices,\n createCubeVertices: createCubeVertices,\n createCylinderVertices: createCylinderVertices,\n createDiscVertices: createDiscVertices,\n createPlaneVertices: createPlaneVertices,\n createSphereVertices: createSphereVertices,\n createTorusVertices: createTorusVertices,\n createTruncatedConeVertices: createTruncatedConeVertices,\n createXYQuadVertices: createXYQuadVertices,\n deindex: deindex,\n generateTriangleNormals: generateTriangleNormals\n};\n\nexport { TypedArrayViewGenerator, copySourceToTexture, copySourcesToTexture, createBufferLayoutsFromArrays, createBuffersAndAttributesFromArrays, createTextureFromImage, createTextureFromImages, createTextureFromSource, createTextureFromSources, drawArrays, generateMipmap, getNumComponents, getSizeAndAlignmentOfUnsizedArrayElement, getSizeForMipFromTexture, getSizeFromSource, interleaveVertexData, isTypedArray, loadImageBitmap, makeBindGroupLayoutDescriptors, makeShaderDataDefinitions, makeStructuredView, makeTypedArrayFromArrayUnion, makeTypedArrayViews, normalizeGPUExtent3D, numMipLevels, primitives, setIntrinsicsToView, setStructuredValues, setStructuredView, setTypedValues, setVertexAndIndexBuffers, subarray };\n//# sourceMappingURL=webgpu-utils.module.js.map\n","import {\n assert\n} from './validation.js';\n\ntype EncoderState = 'open' | 'locked' | 'ended';\n\nexport type EncoderInfo = {\n state: EncoderState;\n}\n\nexport function validateEncoderState(encoder: GPUComputePassEncoder | GPURenderPassEncoder | GPUCommandEncoder | GPURenderBundleEncoder, state: EncoderState) {\n assert(state === 'open', () => `encoder state(${state}) is not \"open\"`, [encoder]);\n}\n\nconst s_commandEncoderToInfoMap = new WeakMap();\n\nexport function createCommandEncoder(commandEncoder: GPUCommandEncoder) {\n s_commandEncoderToInfoMap.set(commandEncoder, { state: 'open' });\n}\n\nexport function unlockCommandEncoder(commandEncoder: GPUCommandEncoder) {\n const info = s_commandEncoderToInfoMap.get(commandEncoder)!;\n assert(info.state === 'locked');\n info.state = 'open';\n}\n\nexport function lockCommandEncoder(commandEncoder: GPUCommandEncoder) {\n getCommandBufferInfoAndValidateState(commandEncoder).state = 'locked';\n}\n\nexport function finishCommandEncoder(commandEncoder: GPUCommandEncoder) {\n getCommandBufferInfoAndValidateState(commandEncoder).state = 'ended';\n}\n\nexport function getCommandBufferInfoAndValidateState(commandEncoder: GPUCommandEncoder) {\n const info = s_commandEncoderToInfoMap.get(commandEncoder)!;\n validateEncoderState(commandEncoder, info.state);\n return info;\n}\n\n\n//function validateBindGroups(this: PassEncoder, _: void) {\n// const {pipeline, bindGroups} = s_passToState.get(this)!;\n// if (!pipeline) {\n// emitError('no pipeline', [this]);\n// return;\n// }\n// // get bind group indices needed for current pipeline\n// const requiredGroupLayouts = s_pipelineToRequiredGroupLayouts.get(pipeline) || [];\n// for (const {ndx, layout: requiredLayout} of requiredGroupLayouts) {\n// const bindGroup = bindGroups[ndx];\n// if (!bindGroup) {\n// emitError(`no bindGroup at ndx: ${ndx}`);\n// return;\n// }\n//\n// {\n// const error = validateBindGroupIsGroupEquivalent(requiredLayout, bindGroup);\n// if (error) {\n// emitError(error);\n// return;\n// }\n// }\n//\n// {\n// const error = validateMinBindingSize(requiredLayout, bindGroup));\n// if (eror)\n// emitErr\n// }\n// }\n//}\n\n","// A normal GPUPipelineDescriptor just has references to GPUBindGroupLayout objects\n// but we need the GPUBindGroupLayoutDescriptor for each. They don't exist for\n\nimport { RenderPassLayoutInfo } from './render-commands-mixin.js';\nimport { arraysEqual, trimNulls } from './utils.js';\nimport { wrapFunctionAfter } from \"./wrap-api.js\";\n\ntype BindGroupLayoutDescriptor = {\n entries: GPUBindGroupLayoutEntry[];\n};\n\nexport type BindGroupLayoutDescriptorPlus = {\n bindGroupLayoutDescriptor: BindGroupLayoutDescriptor,\n dynamicOffsetCount: number,\n signature: string,\n}\n\nexport type ReifiedPipelineLayoutDescriptor = {\n bindGroupLayoutDescriptors: BindGroupLayoutDescriptorPlus[];\n}\n\nexport const s_bindGroupLayoutToBindGroupLayoutDescriptorPlus = new WeakMap();\nexport const s_pipelineLayoutToBindGroupLayoutDescriptorsPlus = new WeakMap();\n\n// getBindGroupLayout always returns a different object which means we can't\n// use it as a key in a map to look up it's layout descriptor ┌∩┐(◣_◢)┌∩┐\nfunction trackNewBindGroupLayout(this: GPUComputePipeline | GPURenderPipeline, layout: GPUBindGroupLayout, [group]: [number]) {\n // We need to associate this with it's BindGroupLayoutDescriptorPlus\n const pipelineLayout = s_pipelineToReifiedPipelineLayoutDescriptor.get(this)!;\n const descPlus = pipelineLayout.bindGroupLayoutDescriptors[group];\n s_bindGroupLayoutToBindGroupLayoutDescriptorPlus.set(layout, descPlus);\n}\n\nwrapFunctionAfter(GPUComputePipeline, 'getBindGroupLayout', trackNewBindGroupLayout);\nwrapFunctionAfter(GPURenderPipeline, 'getBindGroupLayout', trackNewBindGroupLayout);\n\n// We're using JSON.stringify to make a hash/id\n// so we need the properties to be in the same order\nexport function createRenderPassLayout(\n colorFormats: (GPUTextureFormat | null | undefined)[],\n sampleCount: number,\n depthStencilFormat?: GPUTextureFormat,\n): RenderPassLayout {\n return {\n colorFormats,\n sampleCount,\n ...(depthStencilFormat && {depthStencilFormat}),\n };\n}\n\nexport type RenderPassLayout = {\n colorFormats: (GPUTextureFormat | null | undefined)[];\n depthStencilFormat?: GPUTextureFormat;\n sampleCount: number;\n};\n\ntype RenderPipelineDescriptor = {\n vertex: GPUVertexState,\n primitive?: GPUPrimitiveState,\n depthStencil?: GPUDepthStencilState,\n multisample?: GPUMultisampleState,\n fragment?: GPUFragmentState,\n passLayoutInfo: RenderPassLayoutInfo,\n};\n\nexport function renderPassLayoutsEqual(a: RenderPassLayout, b: RenderPassLayout) {\n return a.sampleCount === b.sampleCount &&\n a.depthStencilFormat === b.depthStencilFormat &&\n arraysEqual(a.colorFormats, b.colorFormats);\n}\n\n\nexport const s_renderPipelineToRenderPipelineDescriptor = new WeakMap();\nexport const s_pipelineToReifiedPipelineLayoutDescriptor = new WeakMap();\n\nfunction reifyConstants(c: Record) {\n return { ...c };\n}\n\nfunction reifyProgramableStage(ps: GPUProgrammableStage) {\n const { /*module,*/ entryPoint, constants } = ps;\n return {\n ...(entryPoint && { entryPoint }),\n ...(constants && { constants: reifyConstants(constants) }),\n } as GPUProgrammableStage;\n}\n\nfunction reifyVertexAttribute(attr: GPUVertexAttribute): GPUVertexAttribute {\n const { format, offset, shaderLocation } = attr;\n return { format, offset, shaderLocation };\n}\n\nfunction reifyVertexBufferLayout(buffer: GPUVertexBufferLayout): GPUVertexBufferLayout {\n const { arrayStride, stepMode = 'vertex', attributes } = buffer;\n return {\n arrayStride,\n stepMode,\n attributes: [...attributes].map(reifyVertexAttribute),\n };\n}\n\nfunction reifyVertexState(vertex: GPUVertexState): GPUVertexState {\n const { buffers } = vertex;\n return {\n ...reifyProgramableStage(vertex),\n ...(buffers && { buffers: [...buffers].map(b => b ? reifyVertexBufferLayout(b) : null) }),\n };\n}\n\nfunction reifyBlendComponent(bc: GPUBlendComponent): GPUBlendComponent {\n const { operation = 'add', srcFactor = 'one', dstFactor = 'zero' } = bc;\n return {\n operation,\n srcFactor,\n dstFactor,\n };\n}\n\nfunction reifyBlendState(blend: GPUBlendState): GPUBlendState {\n return {\n color: reifyBlendComponent(blend.color),\n alpha: reifyBlendComponent(blend.alpha),\n };\n}\n\nfunction reifyColorTargetState(cts: GPUColorTargetState): GPUColorTargetState {\n const { format, blend, writeMask } = cts;\n return {\n format,\n ...(blend && {blend: reifyBlendState(blend)}),\n writeMask: writeMask ?? 0xF,\n };\n}\nfunction reifyFragmentState(fragment: GPUFragmentState): GPUFragmentState {\n return {\n ...reifyProgramableStage(fragment),\n targets: [...fragment.targets].map(t => t ? reifyColorTargetState(t) : null),\n };\n}\n\nfunction reifyPrimitiveState(p: GPUPrimitiveState): GPUPrimitiveState {\n const {\n topology = 'triangle-list',\n stripIndexFormat,\n frontFace = 'ccw',\n cullMode = 'none',\n // unclippedDepth,\n } = p;\n return {\n topology,\n ...(stripIndexFormat && { stripIndexFormat }),\n frontFace,\n cullMode,\n };\n}\n\nfunction reifyStencilFaceState(sf: GPUStencilFaceState): GPUStencilFaceState {\n const {\n compare = \"always\",\n failOp = \"keep\",\n depthFailOp = \"keep\",\n passOp = \"keep\",\n } = sf;\n return {\n compare, failOp, depthFailOp, passOp,\n };\n}\n\nfunction reifyDepthStencilState(ds: GPUDepthStencilState): GPUDepthStencilState {\n const {\n format,\n depthWriteEnabled,\n depthCompare,\n stencilFront,\n stencilBack,\n stencilReadMask = 0xFFFFFFFF,\n stencilWriteMask = 0xFFFFFFFF,\n depthBias = 0,\n depthBiasSlopeScale = 0,\n depthBiasClamp = 0,\n } = ds;\n return {\n format,\n ...(depthCompare && { depthCompare }),\n ...(depthWriteEnabled !== undefined && { depthWriteEnabled }),\n ...(stencilFront && { stencilFront: reifyStencilFaceState(stencilFront) }),\n ...(stencilBack && { stencilBack: reifyStencilFaceState(stencilBack) }),\n stencilReadMask,\n stencilWriteMask,\n depthBias,\n depthBiasSlopeScale,\n depthBiasClamp,\n };\n}\n\nfunction reifyMultisampleState(ms: GPUMultisampleState): GPUMultisampleState {\n const {\n count = 1,\n mask = 0xFFFFFFFF,\n alphaToCoverageEnabled = false,\n } = ms;\n return { count, mask, alphaToCoverageEnabled };\n}\n\nfunction reifyRenderPipelineDescriptor(desc: GPURenderPipelineDescriptor): RenderPipelineDescriptor {\n const {\n vertex,\n fragment,\n primitive,\n depthStencil,\n multisample,\n } = desc;\n const renderPassLayout = createRenderPassLayout(\n fragment ? trimNulls([...fragment.targets].map(t => t ? t.format : null)) : [],\n multisample?.count || 1,\n depthStencil?.format);\n return {\n vertex: reifyVertexState(vertex),\n ...(fragment && reifyFragmentState(fragment)),\n ...(primitive && reifyPrimitiveState(primitive)),\n ...(depthStencil && reifyDepthStencilState(depthStencil)),\n ...(multisample && reifyMultisampleState(multisample)),\n passLayoutInfo: {\n renderPassLayout,\n passLayoutSignature: JSON.stringify(renderPassLayout),\n },\n };\n}\n\nexport function trackRenderPipelineDescriptor(pipeline: GPURenderPipeline, desc: GPURenderPipelineDescriptor) {\n s_renderPipelineToRenderPipelineDescriptor.set(pipeline, reifyRenderPipelineDescriptor(desc));\n}\n","import {\n getDepthStencilFormatResolvedAspect,\n} from './format-info.js';\nimport {\n wrapFunctionBefore,\n wrapFunctionAfter,\n} from './wrap-api.js';\n\nexport type TextureViewDescriptor = {\n format: GPUTextureFormat;\n dimension: GPUTextureViewDimension;\n aspect: GPUTextureAspect;\n baseMipLevel: GPUIntegerCoordinate;\n mipLevelCount: GPUIntegerCoordinate;\n baseArrayLayer: GPUIntegerCoordinate;\n arrayLayerCount: GPUIntegerCoordinate;\n};\nexport const s_textureViewToTexture = new WeakMap();\nexport const s_textureViewToDesc = new WeakMap();\n\nfunction resolveTextureAspect(format: GPUTextureFormat, aspect: GPUTextureAspect) {\n switch (aspect) {\n case 'all':\n return format;\n case 'depth-only':\n case 'stencil-only':\n return getDepthStencilFormatResolvedAspect(format, aspect);\n }\n return undefined;\n}\n\nfunction reifyTextureViewDescriptor(texture: GPUTexture, desc: GPUTextureViewDescriptor | undefined): TextureViewDescriptor {\n const dimension = desc?.dimension ?? (\n texture.dimension === '2d'\n ? (texture.depthOrArrayLayers === 1 ? '2d' : '2d-array')\n : texture.dimension\n );\n const aspect = desc?.aspect ?? 'all';\n let format = desc?.format;\n if (!format) {\n const f = resolveTextureAspect(texture.format, aspect);\n format = f ?? texture.format;\n }\n return {\n format,\n dimension,\n aspect,\n baseMipLevel: desc?.baseMipLevel ?? 0,\n mipLevelCount: desc?.mipLevelCount ?? (texture.mipLevelCount - (desc?.baseMipLevel ?? 0)),\n baseArrayLayer: desc?.baseArrayLayer ?? 0,\n arrayLayerCount: desc?.arrayLayerCount ?? (\n dimension === 'cube'\n ? 6\n : (dimension === '2d-array' || dimension === 'cube-array'\n ? texture.depthOrArrayLayers - (desc?.baseArrayLayer ?? 0)\n : 1\n )\n ),\n };\n}\n\nlet lastDesc: GPUTextureViewDescriptor | undefined;\nwrapFunctionBefore(GPUTexture, 'createView', function (this: GPUTexture, [desc]) {\n lastDesc = desc;\n});\n\nwrapFunctionAfter(GPUTexture, 'createView', function (this: GPUTexture, view: GPUTextureView) {\n s_textureViewToTexture.set(view, this);\n s_textureViewToDesc.set(view, reifyTextureViewDescriptor(this, lastDesc));\n});\n","import {\n EncoderInfo,\n validateEncoderState,\n} from './encoder-utils.js';\nimport {\n BindGroupLayoutDescriptorPlus,\n s_pipelineToReifiedPipelineLayoutDescriptor,\n} from './pipeline.js';\nimport {\n BindGroupInfo,\n assertNotDestroyed,\n getIdForObject,\n s_bindGroupToInfo,\n s_objToDevice,\n} from './shared-state.js';\nimport { s_textureViewToDesc, s_textureViewToTexture } from './texture.js';\nimport {\n assert,\n} from './validation.js';\nimport {\n wrapFunctionBefore,\n} from './wrap-api.js';\n\nexport type BindGroupBinding = {\n bindGroup: GPUBindGroup,\n dynamicOffsets?: Uint32Array,\n} | undefined;\n\nexport type PassInfo = EncoderInfo & {\n bindGroups: BindGroupBinding[],\n}\n\ntype BindingMixin =\n | GPUComputePassEncoder\n | GPURenderPassEncoder\n | GPURenderBundleEncoder;\n\ntype Ctor = {\n new (): never;\n prototype: T;\n};\n\nfunction getResourceFromBindingResource(bindingResource: GPUBindingResource) {\n if (bindingResource instanceof GPUTextureView) {\n return s_textureViewToTexture.get(bindingResource)!;\n } else if (bindingResource instanceof GPUSampler ||\n bindingResource instanceof GPUExternalTexture) {\n return bindingResource;\n } else {\n return bindingResource.buffer;\n }\n}\n\nconst autoIdRE = /^(.*?)autoId\\((\\d+)\\)/;\nfunction generateErrorMessageForMismatchedBindGroupLayouts(group: number, bindGroupInfo: BindGroupInfo, bindGroupLayoutDescriptor: BindGroupLayoutDescriptorPlus) {\n const bgAuto = autoIdRE.exec(bindGroupInfo.layoutPlus.signature);\n const bglAuto = autoIdRE.exec(bindGroupLayoutDescriptor.signature);\n if (bgAuto || bglAuto) {\n // are they both auto?\n if (!bgAuto === !bglAuto) {\n if (bgAuto![2] !== bglAuto![2]) {\n return `bindGroup in group(${group}) is not compatible with pipeline requirements for that group \\\nbecause they are from different layout: 'auto' pipelines.`;\n }\n } else {\n return `bindGroup in group(${group}) is not compatible with pipeline requirements for that group \\\nbecause bindGroup's layout ${bgAuto ? 'is' : 'is not'} from a layout: 'auto' pipeline \\\nand the pipeline's bindGroup layout requirements ${bglAuto ? 'is' : 'is not'} from a layout: 'auto' pipeline`;\n }\n }\n return `bindGroup in group(${group}) is not compatible with pipeline requirements for that group\n\nbindGroup.layout = ${JSON.stringify(bindGroupInfo.layoutPlus.bindGroupLayoutDescriptor, null, 2)}\n\npipeline.group[${group}] requirements = ${JSON.stringify(bindGroupLayoutDescriptor.bindGroupLayoutDescriptor, null, 2)}`;\n}\n\n//function validateEncoderBindGroupsDoNotAliasAWritableResource() {\n// //\n//}\n\nexport function validateEncoderBindGroups(bindGroups: BindGroupBinding[], pipeline?: GPURenderPipeline | GPUComputePipeline) {\n assert(!!pipeline, 'no pipeline set');\n const device = s_objToDevice.get(pipeline);\n\n const reifiedPipelineDescriptor = s_pipelineToReifiedPipelineLayoutDescriptor.get(pipeline)!;\n reifiedPipelineDescriptor.bindGroupLayoutDescriptors.forEach((bindGroupLayoutDescriptor, group) => {\n const binding = bindGroups[group];\n assert(!!binding, () => `required bindGroup missing from group(${group})`);\n const bindGroupInfo = s_bindGroupToInfo.get(binding.bindGroup)!;\n assert(\n bindGroupInfo.layoutPlus.signature === bindGroupLayoutDescriptor.signature,\n () => generateErrorMessageForMismatchedBindGroupLayouts(group, bindGroupInfo, bindGroupLayoutDescriptor),\n );\n for (const {binding, resource: bindingResource} of bindGroupInfo.entries) {\n const resource = getResourceFromBindingResource(bindingResource);\n if (resource instanceof GPUTexture || resource instanceof GPUBuffer) {\n assertNotDestroyed(resource);\n }\n assert(s_objToDevice.get(resource) === device, () => `texture at binding(${binding}) group(${group}) is not from same device`, [resource]);\n }\n });\n\n const bindGroupSpaceUsed = 0;\n return bindGroupSpaceUsed;\n}\n\nexport function validateBindGroupResourcesNotDestroyed(entries: GPUBindGroupEntry[]) {\n for (const {resource} of entries) {\n if (resource instanceof GPUTextureView) {\n const texture = s_textureViewToTexture.get(resource)!;\n assertNotDestroyed(texture);\n } else {\n const asBufferBinding = resource as GPUBufferBinding;\n const buffer = asBufferBinding.buffer;\n if (buffer instanceof GPUBuffer) {\n assertNotDestroyed(buffer);\n }\n }\n }\n}\n\n\n\ntype BoundBufferRange = {\n bindGroupLayoutEntry: GPUBindGroupLayoutEntry,\n resource: GPUBufferBinding,\n};\n\nfunction makeIdForBoundBufferRange(boundBufferRange: BoundBufferRange) {\n const { binding, visibility, buffer: b } = boundBufferRange.bindGroupLayoutEntry;\n const { type = 'uniform', hasDynamicOffset = false, minBindingSize = 0 } = b!;\n const { buffer, offset = 0, size } = boundBufferRange.resource;\n return `\n${binding}]\n${visibility}\n${type}\n${hasDynamicOffset}\n${minBindingSize}\n${getIdForObject(buffer)}\n${offset}\n${size}\n`;\n}\n\nfunction boundBufferRanges(info: BindGroupInfo, dynamicOffsets: Uint32Array) {\n const result = new Map();\n let dynamicOffsetIndex = 0;\n for (const bindGroupEntry of info.entries) {\n const bindGroupLayoutEntry = info.layoutPlus.bindGroupLayoutDescriptor.entries[bindGroupEntry.binding];\n if (!bindGroupLayoutEntry.buffer) {\n continue;\n }\n const bound = {\n offset: 0,\n ...bindGroupEntry.resource,\n } as GPUBufferBinding;\n if (bindGroupLayoutEntry.buffer.hasDynamicOffset) {\n bound.offset! += dynamicOffsets[dynamicOffsetIndex++];\n }\n const boundBufferRange = {\n bindGroupLayoutEntry,\n resource: bound,\n };\n result.set(makeIdForBoundBufferRange(boundBufferRange), boundBufferRange);\n }\n return result;\n}\n\nfunction intersect(aStart: number, aLen: number, bStart: number, bLen: number) {\n const aEnd = aStart + aLen;\n const bEnd = bStart + bLen;\n return (aEnd > bStart) && (aStart < bEnd);\n}\n\nfunction isBufferBindingAliasing(a: GPUBufferBinding, b: GPUBufferBinding) {\n if (a.buffer !== b.buffer) {\n return false;\n }\n const aSize = a.size ?? a.buffer.size;\n const bSize = b.size ?? b.buffer.size;\n const aStart = a.offset ?? 0;\n const bStart = b.offset ?? 0;\n return intersect(aStart, aSize, bStart, bSize);\n}\n\nfunction aspectToBits(aspect: GPUTextureAspect): number {\n switch (aspect) {\n case 'stencil-only': return 1;\n case 'depth-only': return 2;\n case 'all': return 3;\n }\n throw new Error('unreachable');\n}\n\nfunction isTextureViewAliasing(a: GPUTextureView, b: GPUTextureView) {\n const aTex = s_textureViewToTexture.get(a);\n const bTex = s_textureViewToTexture.get(b);\n if (aTex !== bTex) {\n return false;\n }\n const aInfo = s_textureViewToDesc.get(a)!;\n const bInfo = s_textureViewToDesc.get(b)!;\n\n const aAspect = aspectToBits(aInfo.aspect);\n const bAspect = aspectToBits(bInfo.aspect);\n\n if ((aAspect & bAspect) === 0) {\n return false;\n }\n\n const layersIntersect = intersect(aInfo.baseArrayLayer, aInfo.arrayLayerCount, bInfo.baseArrayLayer, bInfo.arrayLayerCount);\n if (!layersIntersect) {\n return false;\n }\n return intersect(aInfo.baseMipLevel, aInfo.mipLevelCount, bInfo.baseMipLevel, bInfo.mipLevelCount);\n}\n\nconst kStages = [\n GPUShaderStage.VERTEX,\n GPUShaderStage.FRAGMENT,\n GPUShaderStage.COMPUTE,\n];\n\nexport function encoderBindGroupsAliasAWritableResource(\n bindGroups: BindGroupBinding[],\n dynamicOffsets: Uint32Array[],\n bindGroupLayoutDescriptorPlus: BindGroupLayoutDescriptorPlus[]) {\n for (const stage of kStages) {\n const bufferBindings = new Map();\n const textureViews = new Map();\n for (let bindGroupIndex = 0; bindGroupIndex < bindGroups.length; ++bindGroupIndex) {\n const bindGroupBinding = bindGroups[bindGroupIndex];\n if (!bindGroupBinding) {\n continue;\n }\n const bindGroupInfo = s_bindGroupToInfo.get(bindGroupBinding.bindGroup)!;\n\n // check buffers\n const bufferRanges = boundBufferRanges(bindGroupInfo, dynamicOffsets[bindGroupIndex]);\n for (const {bindGroupLayoutEntry, resource} of bufferRanges.values()) {\n if ((bindGroupLayoutEntry.visibility & stage) === 0) {\n continue;\n }\n const resourceWritable = bindGroupLayoutEntry.buffer!.type === 'storage';\n for (const [pastResource, pastResourceWritable] of bufferBindings.entries()) {\n if ((resourceWritable || pastResourceWritable) && isBufferBindingAliasing(pastResource, resource)) {\n return true;\n }\n }\n bufferBindings.set(resource, resourceWritable);\n }\n\n // check textures\n const textureEntries = bindGroupLayoutDescriptorPlus[bindGroupIndex].bindGroupLayoutDescriptor.entries.filter(e => (e.visibility & stage) !== 0 && (e.texture || e.storageTexture));\n for (const entry of textureEntries) {\n const resource = bindGroupInfo.entries[entry.binding].resource as GPUTextureView;\n const access = entry.storageTexture?.access;\n const resourceWritable = access === 'read-write' || access === 'write-only';\n if (!entry.storageTexture) {\n continue;\n }\n for (const [pastResource, pastResourceWritable] of textureViews.entries()) {\n if ((resourceWritable || pastResourceWritable) && isTextureViewAliasing(pastResource, resource)) {\n return true;\n }\n }\n textureViews.set(resource, resourceWritable);\n }\n }\n }\n return false;\n}\n\nfunction* forEachDynamicBinding(info: BindGroupInfo) {\n let dynamicOffsetIndex = 0;\n const layout = info.layoutPlus.bindGroupLayoutDescriptor;\n for (const entry of info.entries) {\n const bindingDescriptor = layout.entries[entry.binding];\n if (bindingDescriptor.buffer?.hasDynamicOffset) {\n const bufferBinding = entry.resource as GPUBufferBinding;\n const bufferLayout = bindingDescriptor.buffer;\n yield {bufferBinding, bufferLayout, dynamicOffsetIndex};\n ++dynamicOffsetIndex;\n }\n }\n}\n\nexport function wrapBindingCommandsMixin(\n API: Ctor,\n s_passToPassInfoMap: WeakMap) {\n\n wrapFunctionBefore(API, 'setBindGroup', function (this: T, [index, bindGroup, dynamicOffsetsArg, dynamicOffsetDataStart, dynamicOffsetDataLength]) {\n const info = s_passToPassInfoMap.get(this)!;\n validateEncoderState(this, info.state);\n const bindGroupBindings = info.bindGroups;\n\n const dynamicOffsetCount = bindGroup\n ? s_bindGroupToInfo.get(bindGroup)!.layoutPlus.dynamicOffsetCount\n : 0;\n dynamicOffsetsArg = dynamicOffsetsArg ? new Uint32Array(dynamicOffsetsArg) : new Uint32Array(0);\n dynamicOffsetDataStart = dynamicOffsetDataStart ?? 0;\n dynamicOffsetDataLength = dynamicOffsetDataLength ?? dynamicOffsetsArg.length;\n const dynamicOffsets = dynamicOffsetsArg.slice(dynamicOffsetDataStart, dynamicOffsetDataLength);\n\n assert(dynamicOffsets.length === dynamicOffsetCount, `there must be the same number of dynamicOffsets(${dynamicOffsets.length}) as the layout requires (${dynamicOffsetCount})`);\n\n const device = s_objToDevice.get(this)!;\n const maxIndex = device.limits.maxBindGroups;\n assert(index >= 0, () => `index(${index}) must be >= 0`);\n assert(index < maxIndex, () => `index(${index}) must be < device.limits.maxBindGroups(${maxIndex})`);\n if (bindGroup) {\n assert(device === s_objToDevice.get(bindGroup), () => `bindGroup must be from same device as ${parent.constructor.name}`, [bindGroup, parent]);\n\n // Validate resources are not destroyed\n const info = s_bindGroupToInfo.get(bindGroup)!;\n validateBindGroupResourcesNotDestroyed(info.entries);\n\n // Validate Dynamic Offsets\n for (const {bufferBinding, bufferLayout, dynamicOffsetIndex} of forEachDynamicBinding(info)) {\n const dynamicOffset = dynamicOffsets[dynamicOffsetIndex];\n assert((bufferBinding.offset || 0) + dynamicOffset + (bufferLayout.minBindingSize || 0) <= bufferBinding.buffer.size, 'dynamic offset is out of range');\n switch (bufferLayout.type) {\n case 'uniform':\n assert(dynamicOffset % device.limits.minUniformBufferOffsetAlignment === 0, () => `dynamicOffset[${dynamicOffsetIndex}](${dynamicOffset}) used for a uniform buffer is not a multiple of device.limits.minUniformBufferOffsetAlignment(${device.limits.minUniformBufferOffsetAlignment})`);\n break;\n case 'storage':\n case 'read-only-storage':\n assert(dynamicOffset % device.limits.minStorageBufferOffsetAlignment === 0, () => `dynamicOffset[${dynamicOffsetIndex}](${dynamicOffset}) used for a uniform buffer is not a multiple of device.limits.minStorageBufferOffsetAlignment(${device.limits.minStorageBufferOffsetAlignment})`);\n break;\n }\n }\n\n bindGroupBindings[index] = {\n bindGroup,\n dynamicOffsets,\n };\n } else {\n bindGroupBindings[index] = undefined;\n }\n });\n\n}\n\n","import {\n PassInfo,\n validateEncoderBindGroups,\n} from './binding-mixin.js';\nimport {\n validateEncoderState,\n} from './encoder-utils.js';\nimport {\n assertNotDestroyed,\n s_objToDevice,\n} from './shared-state.js';\nimport {\n assert,\n} from './validation.js';\nimport {\n RenderPassLayout,\n s_renderPipelineToRenderPipelineDescriptor,\n} from './pipeline.js';\nimport {\n bufferUsageToString,\n} from './utils.js';\nimport {\n wrapFunctionBefore,\n} from './wrap-api.js';\n\ntype RenderMixin = GPURenderPassEncoder | GPURenderBundleEncoder;\n\ntype BufferWithOffsetAndSize = {\n buffer: GPUBuffer,\n offset: number,\n size: number,\n};\n\nexport type RenderDrawInfo = PassInfo & {\n pipeline?: GPURenderPipeline,\n indexBuffer?: BufferWithOffsetAndSize,\n indexFormat?: GPUIndexFormat,\n vertexBuffers: (BufferWithOffsetAndSize | undefined)[],\n};\n\nfunction toArray(v: Iterable): T[] {\n return Array.isArray(v) ? v : [...v];\n}\n\ntype VertexBufferValidationFn = (slot: number, layout: GPUVertexBufferLayout, vertexBufferBinding: BufferWithOffsetAndSize) => void;\n\nfunction validateValidToDraw(mixin: RenderMixin, info: RenderDrawInfo, fn: VertexBufferValidationFn) {\n const bindGroupSpaceUsed = validateEncoderBindGroups(info.bindGroups, info.pipeline);\n const pipelineDescriptor = s_renderPipelineToRenderPipelineDescriptor.get(info.pipeline!)!;\n const device = s_objToDevice.get(mixin)!;\n let vertexBufferSpaceUsed = 0;\n if (pipelineDescriptor.vertex.buffers) {\n // buffers is sequence so no forEach, convert to array\n const buffers = toArray(pipelineDescriptor.vertex.buffers);\n buffers.forEach((buffer, slot) => {\n if (buffer) {\n const vertexBufferBinding = info.vertexBuffers[slot];\n assert(!!vertexBufferBinding, () => `no vertexBuffer in slot(${slot})`);\n assertNotDestroyed(vertexBufferBinding.buffer);\n fn(slot, buffer, vertexBufferBinding);\n // don't need to check that vertex buffer is same device as was checked at setVertexBuffer\n vertexBufferSpaceUsed = slot;\n }\n });\n }\n\n // TODO: test!\n assert(\n bindGroupSpaceUsed + vertexBufferSpaceUsed <= device.limits.maxBindGroupsPlusVertexBuffers,\n () => `bindGroupSpaceUsed(${bindGroupSpaceUsed}) + vertexBufferSpaceUsed(${vertexBufferSpaceUsed}) <= device.limits.maxBindGroupsPlusVertexBuffers(${device.limits.maxBindGroupsPlusVertexBuffers})`);\n}\n\nfunction validateValidToDrawIndexed(mixin: RenderMixin, info: RenderDrawInfo, fn: VertexBufferValidationFn) {\n assert(!!info.indexBuffer, 'indexBuffer is not set');\n const device = s_objToDevice.get(mixin)!;\n assertNotDestroyed(info.indexBuffer.buffer);\n assert(device === s_objToDevice.get(info.indexBuffer.buffer), 'indexBuffer is not from same device');\n validateValidToDraw(mixin, info, fn);\n\n const pipelineDescriptor = s_renderPipelineToRenderPipelineDescriptor.get(info.pipeline!)!;\n switch (pipelineDescriptor.primitive?.topology) {\n case 'line-strip':\n case 'triangle-strip':\n assert(\n info.indexFormat === pipelineDescriptor.primitive?.stripIndexFormat,\n () => `indexFormat(${info.indexFormat}) !== pipeline.primitive.stripIndexFormat(${pipelineDescriptor.primitive?.stripIndexFormat})`,\n );\n }\n}\n\nfunction bufferSizeFromBufferBinding({buffer, offset, size}: BufferWithOffsetAndSize) {\n offset = offset ?? 0;\n return size ?? buffer.size - offset;\n}\n\nconst kVertexFormatInfo = {\n \"uint8x2\": { components: 2, bytes: 2, type: \"vec2\" },\n \"uint8x4\": { components: 4, bytes: 4, type: \"vec4\" },\n \"sint8x2\": { components: 2, bytes: 2, type: \"vec2\" },\n \"sint8x4\": { components: 4, bytes: 4, type: \"vec4\" },\n \"unorm8x2\": { components: 2, bytes: 2, type: \"vec2\" },\n \"unorm8x4\": { components: 4, bytes: 4, type: \"vec4\" },\n \"snorm8x2\": { components: 2, bytes: 2, type: \"vec2\" },\n \"snorm8x4\": { components: 4, bytes: 4, type: \"vec4\" },\n \"uint16x2\": { components: 2, bytes: 4, type: \"vec2\" },\n \"uint16x4\": { components: 4, bytes: 8, type: \"vec4\" },\n \"sint16x2\": { components: 2, bytes: 4, type: \"vec2\" },\n \"sint16x4\": { components: 4, bytes: 8, type: \"vec4\" },\n \"unorm16x2\": { components: 2, bytes: 4, type: \"vec2\" },\n \"unorm16x4\": { components: 4, bytes: 8, type: \"vec4\" },\n \"snorm16x2\": { components: 2, bytes: 4, type: \"vec2\" },\n \"snorm16x4\": { components: 4, bytes: 8, type: \"vec4\" },\n \"float16x2\": { components: 2, bytes: 4, type: \"vec2\" },\n \"float16x4\": { components: 4, bytes: 8, type: \"vec4\" },\n \"float32\": { components: 1, bytes: 4, type: \"f32\" },\n \"float32x2\": { components: 2, bytes: 8, type: \"vec2\" },\n \"float32x3\": { components: 3, bytes: 12, type: \"vec3\" },\n \"float32x4\": { components: 4, bytes: 16, type: \"vec4\" },\n \"uint32\": { components: 1, bytes: 4, type: \"u32\" },\n \"uint32x2\": { components: 2, bytes: 8, type: \"vec2\" },\n \"uint32x3\": { components: 3, bytes: 12, type: \"vec3\" },\n \"uint32x4\": { components: 4, bytes: 16, type: \"vec4\" },\n \"sint32\": { components: 1, bytes: 4, type: \"i32\" },\n \"sint32x2\": { components: 2, bytes: 8, type: \"vec2\" },\n \"sint32x3\": { components: 3, bytes: 12, type: \"vec3\" },\n \"sint32x4\": { components: 4, bytes: 16, type: \"vec4\" },\n \"unorm10-10-10-2\": { components: 4, bytes:4, type:\"vec4\" },\n};\n\nfunction getLastStride(layout: GPUVertexBufferLayout) {\n let lastStride = 0;\n for (const {offset, format} of layout.attributes) {\n lastStride = Math.max(lastStride, offset + kVertexFormatInfo[format].bytes);\n }\n return lastStride;\n}\n\ntype Ctor = {\n new (): never;\n prototype: T;\n};\n\nexport type RenderPassLayoutInfo = {\n renderPassLayout: RenderPassLayout,\n passLayoutSignature: string,\n}\n\nexport function wrapRenderCommandsMixin(\n API: Ctor,\n s_renderPassToPassInfoMap: WeakMap,\n getRenderPassInfo: (pass: T) => RenderPassLayoutInfo) {\n\n wrapFunctionBefore(API, 'draw', function (this: T, [vertexCount, a_instanceCount, a_firstVertex, a_firstInstance]) {\n const instanceCount = a_instanceCount ?? 1;\n const firstVertex = a_firstVertex ?? 0;\n const firstInstance = a_firstInstance ?? 0;\n const info = s_renderPassToPassInfoMap.get(this)!;\n validateEncoderState(this, info.state);\n validateValidToDraw(this, info, (slot: number, layout: GPUVertexBufferLayout, vertexBufferBinding: BufferWithOffsetAndSize) => {\n const bufferSize = bufferSizeFromBufferBinding(vertexBufferBinding);\n const stride = layout.arrayStride;\n const lastStride = getLastStride(layout);\n const strideCount = layout.stepMode === 'instance'\n ? firstInstance + instanceCount\n : firstVertex + vertexCount;\n if (strideCount !== 0) {\n const bytesNeeded = (strideCount - 1) * stride + lastStride;\n assert(bytesNeeded <= bufferSize, () => `slot(${slot}) vertex buffer binding size ${bufferSize} is not large enough for bytes needed(${bytesNeeded})`);\n }\n });\n });\n\n wrapFunctionBefore(API, 'drawIndexed', function (this: T, [indexCount, a_instanceCount, a_firstIndex, /*a_baseVertex*/, a_firstInstance]) {\n const instanceCount = a_instanceCount ?? 1;\n const firstIndex = a_firstIndex ?? 0;\n // const baseVertex = a_baseVertex ?? 0;\n const firstInstance = a_firstInstance ?? 0;\n const info = s_renderPassToPassInfoMap.get(this)!;\n validateEncoderState(this, info.state);\n validateValidToDrawIndexed(this, info, (slot: number, layout: GPUVertexBufferLayout, vertexBufferBinding: BufferWithOffsetAndSize) => {\n const bufferSize = bufferSizeFromBufferBinding(vertexBufferBinding);\n const stride = layout.arrayStride;\n const lastStride = getLastStride(layout);\n const strideCount = firstInstance + instanceCount;\n if (layout.stepMode === 'instance') {\n const bytesNeeded = (strideCount - 1) * stride + lastStride;\n assert(bytesNeeded <= bufferSize, () => `slot(${slot}) vertex buffer binding size ${bufferSize} is not large enough for bytes needed(${bytesNeeded})`);\n }\n });\n const bufferSize = bufferSizeFromBufferBinding(info.indexBuffer!);\n const indexByteSize = info.indexFormat === 'uint16' ? 2 : 4;\n const bytesNeeded = firstIndex + indexCount * indexByteSize;\n assert(bytesNeeded <= bufferSize, () => `indexBuffer bound size(${bufferSize}) is not large enough for bytesNeeded(${bytesNeeded})`);\n });\n\n const kIndirectDrawParametersSize = 16;\n wrapFunctionBefore(API, 'drawIndirect', function (this: T, [indirectBuffer, indirectOffset]) {\n const info = s_renderPassToPassInfoMap.get(this)!;\n validateEncoderState(this, info.state);\n validateValidToDraw(this, info, () => {});\n assertNotDestroyed(indirectBuffer);\n const device = s_objToDevice.get(this)!;\n assert(device === s_objToDevice.get(indirectBuffer), 'indirectBuffer is not from same device', [indirectBuffer]);\n assert(!!(indirectBuffer.usage & GPUBufferUsage.INDIRECT), () => `buffer(${bufferUsageToString(indirectBuffer.usage)}) must have usage INDIRECT`, [indirectBuffer, this]);\n assert(indirectOffset + kIndirectDrawParametersSize <= indirectBuffer.size, `indirectOffset(${indirectOffset}) + sizeOfIndirectParameters(${kIndirectDrawParametersSize}) > indirectBuffer.size(${indirectBuffer.size})`, [indirectBuffer]);\n assert(indirectOffset % 4 === 0, () => `indirectOffset(${indirectOffset}) is not multiple of 4`);\n });\n\n const kIndirectDrawIndexedParametersSize = 20;\n wrapFunctionBefore(API, 'drawIndexedIndirect', function (this: T, [indirectBuffer, indirectOffset]) {\n const info = s_renderPassToPassInfoMap.get(this)!;\n validateEncoderState(this, info.state);\n validateValidToDrawIndexed(this, info, () => {});\n assertNotDestroyed(indirectBuffer);\n const device = s_objToDevice.get(this)!;\n assert(device === s_objToDevice.get(indirectBuffer), 'indirectBuffer is not from same device', [indirectBuffer]);\n assert(!!(indirectBuffer.usage & GPUBufferUsage.INDIRECT), () => `buffer(${bufferUsageToString(indirectBuffer.usage)}) must have usage INDIRECT`, [indirectBuffer, this]);\n assert(indirectOffset + kIndirectDrawIndexedParametersSize <= indirectBuffer.size, `indirectOffset(${indirectOffset}) + sizeOfIndirectParameters(${kIndirectDrawIndexedParametersSize}) > indirectBuffer.size(${indirectBuffer.size})`, [indirectBuffer]);\n assert(indirectOffset % 4 === 0, () => `indirectOffset(${indirectOffset}) is not multiple of 4`);\n });\n\n\n wrapFunctionBefore(API, 'setPipeline', function (this: T, [pipeline]) {\n const info = s_renderPassToPassInfoMap.get(this)!;\n validateEncoderState(this, info.state);\n assert(s_objToDevice.get(this) === s_objToDevice.get(pipeline), 'pipeline must be from same device as renderPassEncoder', [pipeline, this]);\n const pipelineDesc = s_renderPipelineToRenderPipelineDescriptor.get(pipeline)!;\n const passLayoutInfo = getRenderPassInfo(this);\n assert(pipelineDesc.passLayoutInfo.passLayoutSignature === passLayoutInfo.passLayoutSignature,\n () => `pipeline is not compatible with ${this.constructor.name}\n\n${this.constructor.name} expects ${JSON.stringify(passLayoutInfo.renderPassLayout, null, 2)}\n\npipeline is: ${JSON.stringify(pipelineDesc.passLayoutInfo.renderPassLayout, null, 2)}\n`,\n [pipeline, this],\n );\n info.pipeline = pipeline;\n });\n\n\n wrapFunctionBefore(API, 'setIndexBuffer', function (this: T, [buffer, format, offset, size]) {\n const info = s_renderPassToPassInfoMap.get(this)!;\n validateEncoderState(this, info.state);\n const device = s_objToDevice.get(this)!;\n offset = offset ?? 0;\n size = size ?? Math.max(0, buffer.size - offset);\n\n assert(device === s_objToDevice.get(buffer), 'buffer must be from the same device', [buffer, this]);\n assertNotDestroyed(buffer);\n assert(!!(buffer.usage & GPUBufferUsage.INDEX), () => `buffer(${bufferUsageToString(buffer.usage)}) must have usage INDEX`, [buffer, this]);\n const align = format === 'uint16' ? 2 : 4;\n assert(offset % align === 0, () => `offset(${offset}) must be multiple of index format: ${format}`, [buffer, this]);\n assert(offset + size <= buffer.size, () => `offset(${offset}) + size(${size}) is not <= buffer.size(${buffer.size})`, [buffer, this]);\n\n info.indexBuffer = {\n buffer,\n offset,\n size,\n };\n info.indexFormat = format;\n });\n\n wrapFunctionBefore(API, 'setVertexBuffer', function (this: T, [slot, buffer, offset, size]) {\n const info = s_renderPassToPassInfoMap.get(this)!;\n validateEncoderState(this, info.state);\n const device = s_objToDevice.get(this)!;\n const maxSlot = device.limits.maxVertexBuffers;\n const bufferSize = buffer?.size || 0;\n offset = offset ?? 0;\n size = size ?? Math.max(0, bufferSize - offset);\n assert(slot >= 0, () => `slot(${slot}) must be >= 0`, [this]);\n assert(slot < maxSlot, () => `slot(${slot}) must be < device.limits.maxVertexBuffers(${maxSlot})`, [this]);\n assert(offset % 4 === 0, () => `offset(${offset}) must be multiple of 4`, [this]);\n assert(offset + size <= bufferSize, () => `offset(${offset}) + size(${size}) is not <= buffer.size(${bufferSize})`, [this, ...(buffer ? [buffer] : [])]);\n if (!buffer) {\n info.vertexBuffers[slot] = undefined;\n } else {\n assert(device === s_objToDevice.get(buffer), 'buffer must be from the same device', [buffer, this]);\n assertNotDestroyed(buffer);\n assert(!!(buffer.usage & GPUBufferUsage.VERTEX), () => `buffer(${bufferUsageToString(buffer.usage)}) must have usage VERTEX`, [buffer, this]);\n info.vertexBuffers[slot] = {\n buffer,\n offset,\n size,\n };\n }\n });\n }","import {\n wrapBindingCommandsMixin\n} from './binding-mixin.js';\nimport {\n validateEncoderState,\n} from './encoder-utils.js';\nimport { createRenderPassLayout } from './pipeline.js';\nimport {\n RenderDrawInfo,\n RenderPassLayoutInfo,\n wrapRenderCommandsMixin,\n} from './render-commands-mixin.js';\nimport { s_objToDevice } from './shared-state.js';\nimport {\n trimNulls,\n} from './utils.js';\nimport {\n wrapFunctionAfter,\n wrapFunctionBefore,\n} from './wrap-api.js';\n\ntype BundleEncoderInfo = RenderDrawInfo & {\n desc: GPURenderBundleDescriptor,\n passLayoutInfo: RenderPassLayoutInfo,\n};\n\nconst s_bundleEncoderToPassInfoMap = new WeakMap();\nconst s_bundleToPassInfoMap = new WeakMap();\n\nfunction getRenderPassLayout(bundleEncoder: GPURenderBundleEncoder): RenderPassLayoutInfo {\n return s_bundleEncoderToPassInfoMap.get(bundleEncoder)!.passLayoutInfo;\n}\n\nexport function getRenderPassLayoutForRenderBundle(bundle: GPURenderBundle) {\n return s_bundleToPassInfoMap.get(bundle)!;\n}\n\nwrapRenderCommandsMixin(\n GPURenderBundleEncoder,\n s_bundleEncoderToPassInfoMap,\n getRenderPassLayout,\n);\n\nexport function createRenderBundleEncoder(encoder: GPURenderBundleEncoder, desc: GPURenderBundleEncoderDescriptor) {\n const { sampleCount = 1, depthStencilFormat, colorFormats } = desc;\n const renderPassLayout = createRenderPassLayout(\n trimNulls([...colorFormats]),\n sampleCount,\n depthStencilFormat);\n s_bundleEncoderToPassInfoMap.set(encoder, {\n state: 'open', // this is not needed. should we move it?\n desc: {...desc},\n vertexBuffers: [],\n bindGroups: [],\n passLayoutInfo: {\n renderPassLayout,\n passLayoutSignature: JSON.stringify(renderPassLayout),\n },\n });\n}\n\nwrapBindingCommandsMixin(GPURenderBundleEncoder, s_bundleEncoderToPassInfoMap);\n\nwrapFunctionBefore(GPURenderBundleEncoder, 'finish', function (this: GPURenderBundleEncoder) {\n const info = s_bundleEncoderToPassInfoMap.get(this)!;\n validateEncoderState(this, info.state);\n info.state = 'ended';\n});\n\nwrapFunctionAfter(GPURenderBundleEncoder, 'finish', function (this: GPURenderBundleEncoder, bundle: GPURenderBundle) {\n s_objToDevice.set(bundle, s_objToDevice.get(this)!);\n s_bundleToPassInfoMap.set(bundle, s_bundleEncoderToPassInfoMap.get(this)!);\n});","import {\n makeBindGroupLayoutDescriptors,\n makeShaderDataDefinitions,\n ShaderDataDefinitions,\n} from 'webgpu-utils';\n\nimport {\n validateBindGroupResourcesNotDestroyed,\n} from './binding-mixin.js';\nimport {\n createCommandEncoder,\n} from './encoder-utils.js';\nimport {\n BindGroupLayoutDescriptorPlus,\n s_bindGroupLayoutToBindGroupLayoutDescriptorPlus,\n s_pipelineToReifiedPipelineLayoutDescriptor,\n s_pipelineLayoutToBindGroupLayoutDescriptorsPlus,\n trackRenderPipelineDescriptor,\n} from './pipeline.js';\nimport {\n createRenderBundleEncoder,\n} from './render-bundle-encoder.js';\nimport {\n assertNotDestroyed,\n s_bindGroupToInfo,\n s_objToDevice,\n} from './shared-state.js';\nimport {\n assert\n} from './validation.js';\nimport {\n wrapFunctionAfter,\n wrapAsyncFunctionAfter,\n} from './wrap-api.js';\n\nconst s_shaderModuleToDefs = new WeakMap();\n\nfunction addDefs(defs: ShaderDataDefinitions[], stage: GPUProgrammableStage | undefined) {\n if (stage) {\n defs.push(s_shaderModuleToDefs.get(stage.module)!);\n }\n}\n\nfunction reifyBufferLayout(buffer: GPUBufferBindingLayout) {\n return {\n type: buffer.type ?? 'uniform',\n hasDynamicOffset: !!buffer.hasDynamicOffset,\n minBindingSize: buffer.minBindingSize ?? 0,\n };\n}\n\nfunction reifySamplerLayout(sampler: GPUSamplerBindingLayout) {\n return {\n type: sampler.type ?? 'filtering',\n };\n}\n\nfunction reifyTextureLayout(texture: GPUTextureBindingLayout) {\n return {\n sampleType: texture.sampleType ?? 'float',\n viewDimension: texture.viewDimension ?? '2d',\n multisampled: !!texture.multisampled,\n };\n}\n\nfunction reifyStorageTexture(storageTexture: GPUStorageTextureBindingLayout) {\n return {\n access: storageTexture.access ?? 'write-only',\n format: storageTexture.format,\n viewDimension: storageTexture.viewDimension ?? '2d',\n };\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction reifyExternalTexture(externalTexture: GPUExternalTextureBindingLayout) {\n return {\n };\n}\n\nfunction reifyBindGroupLayoutEntry({\n binding,\n visibility,\n buffer,\n sampler,\n texture,\n storageTexture,\n externalTexture,\n }: GPUBindGroupLayoutEntry): GPUBindGroupLayoutEntry {\n return {\n binding,\n visibility,\n ...(buffer && { buffer: reifyBufferLayout(buffer) }),\n ...(sampler && { sampler: reifySamplerLayout(sampler) }),\n ...(texture && { texture: reifyTextureLayout(texture) }),\n ...(storageTexture && { storageTexture: reifyStorageTexture(storageTexture) }),\n ...(externalTexture && { externalTexture: reifyExternalTexture(externalTexture) }),\n };\n}\n\nfunction bindGroupLayoutDescriptorToBindGroupLayoutDescriptorPlus(\n src: GPUBindGroupLayoutDescriptor,\n autoId: number): BindGroupLayoutDescriptorPlus {\n const bindGroupLayoutDescriptor = {\n entries: [...src.entries].map(reifyBindGroupLayoutEntry).sort((a, b) => a.binding - b.binding),\n };\n const dynamicOffsetCount = bindGroupLayoutDescriptor.entries.reduce((a, v) => a + (v.buffer?.hasDynamicOffset ? 1 : 0), 0);\n const signature = `${JSON.stringify(bindGroupLayoutDescriptor)}${autoId ? `:autoId(${autoId})` : ''})`;\n return {\n bindGroupLayoutDescriptor,\n dynamicOffsetCount,\n signature,\n };\n}\n\nlet s_autoCount = 1;\nfunction getReifiedPipelineLayoutDescriptor(desc: GPUComputePipelineDescriptor | GPURenderPipelineDescriptor) {\n if (desc.layout === 'auto') {\n // It's auto so we need to make a reified pipeline descriptor\n const defs: ShaderDataDefinitions[] = [];\n addDefs(defs, (desc as GPURenderPipelineDescriptor).vertex);\n addDefs(defs, (desc as GPURenderPipelineDescriptor).fragment);\n addDefs(defs, (desc as GPUComputePipelineDescriptor).compute);\n const autoId = s_autoCount++;\n const bindGroupLayoutDescriptors = makeBindGroupLayoutDescriptors(defs, desc).map(b => bindGroupLayoutDescriptorToBindGroupLayoutDescriptorPlus(b, autoId));\n return {\n bindGroupLayoutDescriptors,\n };\n } else {\n const bindGroupLayoutDescriptors = s_pipelineLayoutToBindGroupLayoutDescriptorsPlus.get(desc.layout)!;\n return {\n bindGroupLayoutDescriptors,\n };\n }\n}\n\nfunction trackPipelineLayouts(device: GPUDevice, pipeline: GPUPipelineBase, desc: GPUComputePipelineDescriptor | GPURenderPipelineDescriptor) {\n s_pipelineToReifiedPipelineLayoutDescriptor.set(pipeline, getReifiedPipelineLayoutDescriptor(desc));\n}\n\nwrapFunctionAfter(GPUDevice, 'createShaderModule', function (this: GPUDevice, module: GPUShaderModule, [desc]: [GPUShaderModuleDescriptor]) {\n assertNotDestroyed(this);\n s_objToDevice.set(module, this);\n s_shaderModuleToDefs.set(module, makeShaderDataDefinitions(desc.code));\n});\n\nwrapFunctionAfter(GPUDevice, 'createBindGroup', function (this: GPUDevice, bindGroup: GPUBindGroup, [desc]: [GPUBindGroupDescriptor]) {\n s_objToDevice.set(bindGroup, this);\n const { layout } = desc;\n // copy the entries since the user might change them\n const entries = [];\n for (const {binding, resource} of [...desc.entries]) {\n const r = resource instanceof GPUSampler ||\n resource instanceof GPUTextureView ||\n resource instanceof GPUExternalTexture\n ? resource\n : { ...resource };\n const rb = r as GPUBufferBinding;\n if (rb.buffer instanceof GPUBuffer) {\n const offset = rb.offset || 0;\n const size = rb.size || rb.buffer.size - offset;\n assert(offset + size <= rb.buffer.size, () => `offset(${offset} + size(${size}) > buffer.size(${rb.buffer.size}))`, [rb.buffer]);\n }\n entries.push({\n binding,\n resource: r,\n });\n }\n entries.sort((a, b) => a.binding - b.binding);\n validateBindGroupResourcesNotDestroyed(entries);\n const layoutPlus = s_bindGroupLayoutToBindGroupLayoutDescriptorPlus.get(layout)!;\n s_bindGroupToInfo.set(bindGroup, {\n entries,\n layoutPlus,\n });\n});\n\nwrapFunctionAfter(GPUDevice, 'createBuffer', function (this: GPUDevice, buffer: GPUBuffer) {\n assertNotDestroyed(this);\n s_objToDevice.set(buffer, this);\n});\n\nwrapFunctionAfter(GPUDevice, 'createQuerySet', function (this: GPUDevice, querySet: GPUQuerySet) {\n assertNotDestroyed(this);\n s_objToDevice.set(querySet, this);\n});\n\nwrapFunctionAfter(GPUDevice, 'createSampler', function (this: GPUDevice, sampler: GPUSampler) {\n assertNotDestroyed(this);\n s_objToDevice.set(sampler, this);\n});\n\nwrapFunctionAfter(GPUDevice, 'createTexture', function (this: GPUDevice, texture: GPUTexture) {\n assertNotDestroyed(this);\n s_objToDevice.set(texture, this);\n});\n\nwrapFunctionAfter(GPUDevice, 'importExternalTexture', function (this: GPUDevice, externalTexture: GPUExternalTexture) {\n s_objToDevice.set(externalTexture, this);\n});\n\nwrapFunctionAfter(GPUDevice, 'createCommandEncoder', function (this: GPUDevice, commandEncoder: GPUCommandEncoder) {\n assertNotDestroyed(this);\n s_objToDevice.set(commandEncoder, this);\n createCommandEncoder(commandEncoder);\n});\n\nwrapFunctionAfter(GPUDevice, 'createRenderBundleEncoder', function (this: GPUDevice, bundleEncoder: GPURenderBundleEncoder, [desc]) {\n assertNotDestroyed(this);\n s_objToDevice.set(bundleEncoder, this);\n createRenderBundleEncoder(bundleEncoder, desc);\n});\n\nwrapFunctionAfter(GPUDevice, 'createRenderPipeline', function (this: GPUDevice, pipeline: GPURenderPipeline, [desc]) {\n assertNotDestroyed(this);\n s_objToDevice.set(pipeline, this);\n trackRenderPipelineDescriptor(pipeline, desc);\n trackPipelineLayouts(this, pipeline, desc);\n});\n\nwrapFunctionAfter(GPUDevice, 'createComputePipeline', function (this: GPUDevice, pipeline: GPUComputePipeline, [desc]) {\n assertNotDestroyed(this);\n s_objToDevice.set(pipeline, this);\n trackPipelineLayouts(this, pipeline, desc);\n});\n\nwrapAsyncFunctionAfter(GPUDevice, 'createRenderPipelineAsync', function (this: GPUDevice, pipeline: GPURenderPipeline, [desc]) {\n assertNotDestroyed(this);\n s_objToDevice.set(pipeline, this);\n trackRenderPipelineDescriptor(pipeline, desc);\n trackPipelineLayouts(this, pipeline, desc);\n});\n\nwrapAsyncFunctionAfter(GPUDevice, 'createComputePipelineAsync', function (this: GPUDevice, pipeline: GPUComputePipeline, [desc]) {\n assertNotDestroyed(this);\n s_objToDevice.set(pipeline, this);\n trackPipelineLayouts(this, pipeline, desc);\n});\n\nwrapFunctionAfter(GPUDevice, 'createBindGroupLayout', function (this: GPUDevice, bindGroupLayout: GPUBindGroupLayout, [desc]) {\n s_bindGroupLayoutToBindGroupLayoutDescriptorPlus.set(\n bindGroupLayout,\n bindGroupLayoutDescriptorToBindGroupLayoutDescriptorPlus(desc, 0),\n );\n});\n\nwrapFunctionAfter(GPUDevice, 'createPipelineLayout', function (this: GPUDevice, pipelineLayout: GPUPipelineLayout, [desc]) {\n // need to copy the description because the user may change it after\n const bglDescriptorsPlus: BindGroupLayoutDescriptorPlus[] =\n [...desc.bindGroupLayouts].map(bgl => s_bindGroupLayoutToBindGroupLayoutDescriptorPlus.get(bgl)!);\n s_pipelineLayoutToBindGroupLayoutDescriptorsPlus.set(pipelineLayout, bglDescriptorsPlus);\n}\n\n);\n\n","\nimport {\n s_objToDevice,\n} from './shared-state.js';\nimport {\n wrapFunctionAfter,\n wrapFunctionBefore,\n} from './wrap-api.js';\n\n\nwrapFunctionBefore(GPUCanvasContext, 'configure', function (this: GPUCanvasContext, [desc]) {\n s_objToDevice.set(this, desc.device);\n});\n\nwrapFunctionBefore(GPUCanvasContext, 'unconfigure', function (this: GPUCanvasContext) {\n s_objToDevice.delete(this);\n});\n\nwrapFunctionAfter(GPUCanvasContext, 'getCurrentTexture', function (this: GPUCanvasContext, texture: GPUTexture) {\n const device = s_objToDevice.get(this)!;\n s_objToDevice.set(texture, device);\n});\n","import {\n assertNotDestroyed,\n s_objToDevice,\n} from './shared-state.js';\nimport {\n assert,\n} from './validation.js';\n\nexport function validateTimestampWrites(device: GPUDevice, timestampWrites: GPUComputePassTimestampWrites | GPURenderPassTimestampWrites) {\n const { querySet, beginningOfPassWriteIndex, endOfPassWriteIndex } = timestampWrites;\n assertNotDestroyed(querySet);\n assert(s_objToDevice.get(querySet) === device, 'querySet not from same device', [querySet]);\n assert(querySet.type === 'timestamp', () => `querySet.type(${querySet.type}) !== 'timestamp'`);\n assert(beginningOfPassWriteIndex === undefined || beginningOfPassWriteIndex < querySet.count, () => `timestampWrites.beginningOfPassWriteIndex(${beginningOfPassWriteIndex}) is >= querySet.count(${querySet.count})`);\n assert(endOfPassWriteIndex === undefined || endOfPassWriteIndex < querySet.count, () => `timestampWrites.endOfPassWriteIndex(${endOfPassWriteIndex}) is >= querySet.count(${querySet.count})`);\n assert(\n beginningOfPassWriteIndex !== undefined || endOfPassWriteIndex !== undefined,\n () => `at least one of beginningOfPassWriteIndex(${beginningOfPassWriteIndex}) or endOfPassWriteIndex(${endOfPassWriteIndex})`);\n assert(beginningOfPassWriteIndex !== endOfPassWriteIndex,\n () => `beginningOfPassWriteIndex(${beginningOfPassWriteIndex}) and endOfPassWriteIndex(${endOfPassWriteIndex}) may not be the same`);\n}\n\n","import {\n PassInfo,\n validateEncoderBindGroups,\n wrapBindingCommandsMixin,\n} from './binding-mixin.js';\nimport {\n unlockCommandEncoder,\n validateEncoderState,\n} from './encoder-utils.js';\nimport {\n validateTimestampWrites,\n} from './query-support.js';\nimport {\n assertNotDestroyed,\n s_objToDevice,\n} from './shared-state.js';\nimport {\n bufferUsageToString,\n} from './utils.js';\nimport {\n assert,\n} from './validation.js';\nimport {\n wrapFunctionBefore,\n} from './wrap-api.js';\n\ntype ComputePassInfo = PassInfo & {\n commandEncoder: GPUCommandEncoder,\n pipeline?: GPUComputePipeline,\n};\n\nconst s_computePassToPassInfoMap = new WeakMap();\n\nexport function beginComputePass(commandEncoder: GPUCommandEncoder, passEncoder: GPUComputePassEncoder, desc: GPUComputePassDescriptor | undefined) {\n const device = s_objToDevice.get(commandEncoder)!;\n const { timestampWrites } = desc || {};\n\n if (timestampWrites) {\n validateTimestampWrites(device, timestampWrites);\n }\n\n s_computePassToPassInfoMap.set(passEncoder, {\n state: 'open',\n commandEncoder,\n bindGroups: [],\n });\n}\n\nwrapBindingCommandsMixin(GPUComputePassEncoder, s_computePassToPassInfoMap);\n\nwrapFunctionBefore(GPUComputePassEncoder, 'setPipeline', function (this: GPUComputePassEncoder, [pipeline]) {\n const info = s_computePassToPassInfoMap.get(this)!;\n validateEncoderState(this, info.state);\n assert(s_objToDevice.get(info.commandEncoder) === s_objToDevice.get(pipeline), 'pipeline must be from same device as computePassEncoder', [this, info.commandEncoder]);\n info.pipeline = pipeline;\n});\n\nwrapFunctionBefore(GPUComputePassEncoder, 'end', function (this: GPUComputePassEncoder) {\n const info = s_computePassToPassInfoMap.get(this)!;\n validateEncoderState(this, info.state);\n info.state = 'ended';\n unlockCommandEncoder(info.commandEncoder);\n});\n\nwrapFunctionBefore(GPUComputePassEncoder, 'dispatchWorkgroups', function (this: GPUComputePassEncoder, [workgroupCountX, workgroupCountY = 1, workgroupCountZ = 1]) {\n const info = s_computePassToPassInfoMap.get(this)!;\n validateEncoderState(this, info.state);\n validateEncoderBindGroups(info.bindGroups, info.pipeline);\n\n const device = s_objToDevice.get(this)!;\n assert(workgroupCountX < device.limits.maxComputeWorkgroupsPerDimension, () => `workGroupCountX(${workgroupCountX} > device.limits.maxComputeWorkgroupsPerDimension(${device.limits.maxComputeWorkgroupsPerDimension})`);\n assert(workgroupCountY < device.limits.maxComputeWorkgroupsPerDimension, () => `workGroupCountY(${workgroupCountY} > device.limits.maxComputeWorkgroupsPerDimension(${device.limits.maxComputeWorkgroupsPerDimension})`);\n assert(workgroupCountZ < device.limits.maxComputeWorkgroupsPerDimension, () => `workGroupCountZ(${workgroupCountZ} > device.limits.maxComputeWorkgroupsPerDimension(${device.limits.maxComputeWorkgroupsPerDimension})`);\n});\n\nconst kIndirectDispatchWorkgroupsParametersSize = 12;\nwrapFunctionBefore(GPUComputePassEncoder, 'dispatchWorkgroupsIndirect', function (this: GPUComputePassEncoder, [indirectBuffer, indirectOffset]) {\n const info = s_computePassToPassInfoMap.get(this)!;\n validateEncoderState(this, info.state);\n validateEncoderBindGroups(info.bindGroups, info.pipeline);\n assertNotDestroyed(indirectBuffer);\n const device = s_objToDevice.get(this)!;\n assert(device === s_objToDevice.get(indirectBuffer), 'indirectBuffer is not from same device', [indirectBuffer]);\n assert(!!(indirectBuffer.usage & GPUBufferUsage.INDIRECT), () => `buffer(${bufferUsageToString(indirectBuffer.usage)}) must have usage INDIRECT`, [indirectBuffer, this]);\n assert(indirectOffset + kIndirectDispatchWorkgroupsParametersSize <= indirectBuffer.size, `indirectOffset(${indirectOffset}) + sizeOfIndirectParameters(${kIndirectDispatchWorkgroupsParametersSize}) > indirectBuffer.size(${indirectBuffer.size})`, [indirectBuffer]);\n assert(indirectOffset % 4 === 0, () => `indirectOffset(${indirectOffset}) is not multiple of 4`);\n});\n","import {\n wrapBindingCommandsMixin,\n} from './binding-mixin.js';\nimport {\n unlockCommandEncoder,\n validateEncoderState,\n} from './encoder-utils.js';\nimport { kAllTextureFormatInfo } from './format-info.js';\nimport {\n createRenderPassLayout,\n} from './pipeline.js';\nimport {\n validateTimestampWrites,\n} from './query-support.js';\nimport {\n getRenderPassLayoutForRenderBundle\n} from './render-bundle-encoder.js';\nimport {\n RenderDrawInfo,\n RenderPassLayoutInfo,\n wrapRenderCommandsMixin,\n} from './render-commands-mixin.js';\nimport {\n assertNotDestroyed,\n s_objToDevice,\n} from './shared-state.js';\nimport {\n TextureViewDescriptor,\n s_textureViewToDesc,\n s_textureViewToTexture,\n} from './texture.js';\nimport {\n logicalMipLevelSpecificTextureExtent,\n roundUp,\n textureUsageToString,\n trimNulls,\n} from './utils.js';\nimport {\n assert,\n emitError,\n} from './validation.js';\nimport {\n wrapFunctionBefore,\n} from './wrap-api.js';\n\ntype InUseMipLevels = Set;\ntype InUseDepthOrArrayLayers = Map;\ntype InUseTextures = Map;\n\ntype RenderPassInfo = RenderDrawInfo & {\n commandEncoder: GPUCommandEncoder,\n targetWidth: number,\n targetHeight: number,\n passLayoutInfo: RenderPassLayoutInfo,\n occlusionQuerySet?: GPUQuerySet,\n occlusionIndices: Map,\n occlusionQueryActive?: Error,\n occlusionQueryActiveIndex: number,\n inuseTextures: InUseTextures,\n};\n\nconst s_renderPassToPassInfoMap = new WeakMap();\n\nfunction getRenderPassLayout(passEncoder: GPURenderPassEncoder): RenderPassLayoutInfo {\n return s_renderPassToPassInfoMap.get(passEncoder)!.passLayoutInfo;\n}\n\n/*\nfunction checkTextureNotInUse(inuseTextures: InUseTextures, texture: GPUTexture, fullView: TextureViewDescriptor) {\n const views = inuseTextures.get(texture);\n if (!views) {\n return;\n }\n}\n*/\n\nfunction markTextureInUse(inuseTextures: InUseTextures, texture: GPUTexture, view: GPUTextureView) {\n const fullView = s_textureViewToDesc.get(view)!;\n const inUseDepthOrArrayLayers = inuseTextures.get(texture) || new Map();\n inuseTextures.set(texture, inUseDepthOrArrayLayers);\n for (let l = 0; l < fullView.arrayLayerCount; ++l) {\n const layer = l + fullView.baseArrayLayer;\n const inUseMipLevels = inUseDepthOrArrayLayers.get(layer) || new Set();\n inUseDepthOrArrayLayers.set(layer, inUseMipLevels);\n for (let m = 0; m < fullView.mipLevelCount; ++m) {\n const mipLevel = m + fullView.baseMipLevel;\n assert(!inUseMipLevels.has(mipLevel), () => `mipLevel(${mipLevel}) of layer(${layer}) is already in use`, [texture]);\n inUseMipLevels.add(mipLevel);\n }\n }\n}\n\nfunction validateViewAspectIsAllAspectsOfTexture(texture: GPUTexture, aspect: GPUTextureAspect) {\n const {depth, stencil} = kAllTextureFormatInfo[texture.format];\n if (depth && stencil) {\n assert(aspect === 'all', 'aspect must be all for depth-stencil textures', [texture]);\n } else if (depth) {\n assert(aspect === 'all' || aspect === 'depth-only',\n 'aspect must be all or depth-only for depth textures', [texture]);\n } else if (stencil) {\n assert(aspect === 'all' || aspect === 'stencil-only',\n 'aspect must be all or stencil-only for stencil textures', [texture]);\n }\n}\n\nfunction validateRenderableTextureView(texture: GPUTexture, viewDesc: TextureViewDescriptor) {\n assert((texture.usage & GPUTextureUsage.RENDER_ATTACHMENT) !== 0,\n () => `texture.usage(${textureUsageToString(texture.usage)}) is missing RENDER_ATTACHMENT`, [texture]\n );\n const { dimension, mipLevelCount, arrayLayerCount, aspect } = viewDesc;\n assert(dimension === '2d' || dimension === '3d', () => `dimension(${dimension}) must be 2d or 3d`);\n assert(mipLevelCount === 1, () => `mipLevelCount(${mipLevelCount}) must be 1`);\n assert(arrayLayerCount === 1, () => `arrayLayerCount(${arrayLayerCount}) must be 1`);\n validateViewAspectIsAllAspectsOfTexture(texture, aspect);\n}\n\nfunction validateRenderPassColorAttachment(attachment: GPURenderPassColorAttachment, slot: number) {\n const {view, resolveTarget, depthSlice, loadOp } = attachment;\n const renderViewDesc = s_textureViewToDesc.get(view)!;\n const renderTexture = s_textureViewToTexture.get(view)!;\n const formatInfo = kAllTextureFormatInfo[renderViewDesc.format];\n validateRenderableTextureView(renderTexture, renderViewDesc);\n assert(!!formatInfo.colorRender, () => `format(${renderViewDesc.format}) is not color renderable`);\n if (renderViewDesc.dimension === '3d') {\n assert(!!depthSlice, () => `attachment(${slot})'s dimension is '3d' but depthSlice is missing`);\n const [, , d] = logicalMipLevelSpecificTextureExtent(renderTexture, renderViewDesc.baseMipLevel);\n assert(depthSlice < d, () => `depthSlice(${depthSlice}) must be < depth(${d}) at mipLevel(${renderViewDesc.mipLevelCount}) of texture`, [renderTexture]);\n } else {\n assert(depthSlice === undefined, `attachment(${slot}) is not 3d so depthSlice must NOT be provided`);\n }\n if (loadOp) {\n // check that clearValue is valid\n }\n if (resolveTarget) {\n const resolveViewDesc = s_textureViewToDesc.get(resolveTarget)!;\n const resolveTexture = s_textureViewToTexture.get(resolveTarget)!;\n const [tw, th] = logicalMipLevelSpecificTextureExtent(renderTexture, renderViewDesc.baseMipLevel);\n const [rw, rh] = logicalMipLevelSpecificTextureExtent(resolveTexture, resolveViewDesc.baseMipLevel);\n assert(tw === rw && th === rh, () => `resolveTarget render extent(${rw}, ${rh}) != view render extent (${tw}, ${th})`);\n assert(renderTexture.sampleCount > 1, 'resolveTarget is set so view texture must have sampleCount > 1', [renderTexture]);\n assert(resolveTexture.sampleCount === 1, 'resolveTarget.sampleCount must be 1', [resolveTarget]);\n validateRenderableTextureView(resolveTexture, resolveViewDesc);\n assert(resolveViewDesc.format === renderViewDesc.format, () => `resolveTarget.view.format(${resolveViewDesc.format}) must equal target.view.format(${renderViewDesc.format})`);\n assert(resolveTexture.format === renderTexture.format, () => `resolve texture format(${resolveTexture.format}) must equal target texture format(${renderTexture.format})`);\n const resolveFormatInfo = kAllTextureFormatInfo[resolveTexture.format];\n assert(!!resolveFormatInfo?.colorRender?.resolve, () => `resolve texture.format(${resolveTexture.format}) does not support resolving`);\n }\n}\n\nwrapRenderCommandsMixin(GPURenderPassEncoder, s_renderPassToPassInfoMap, getRenderPassLayout);\n\nexport function beginRenderPass(commandEncoder: GPUCommandEncoder, passEncoder: GPURenderPassEncoder, desc: GPURenderPassDescriptor) {\n let targetWidth: number | undefined;\n let targetHeight: number | undefined;\n const device = s_objToDevice.get(commandEncoder)!;\n\n const inuseTextures = new Map();\n const colorFormats: (GPUTextureFormat | null)[] = [];\n let passSampleCount: number | undefined;\n let depthStencilFormat: GPUTextureFormat | undefined;\n let bytesPerSample = 0;\n let numAttachments = 0;\n\n const checkRenderExtent = (texture: GPUTexture, view: GPUTextureView) => {\n const desc = s_textureViewToDesc.get(view)!;\n const [width, height] = logicalMipLevelSpecificTextureExtent(texture, desc.baseMipLevel);\n if (targetWidth === undefined) {\n targetWidth = width;\n targetHeight = height;\n } else if (targetWidth !== width || targetHeight !== height) {\n emitError('attachments are not all the same width and height', [view, texture, passEncoder, commandEncoder]);\n }\n };\n\n const addView = (attachment: GPURenderPassColorAttachment | GPURenderPassDepthStencilAttachment | null | undefined, isDepth?: boolean) => {\n if (!attachment) {\n if (!isDepth) {\n colorFormats.push(null);\n }\n return;\n }\n ++numAttachments;\n const {view} = attachment;\n const texture = s_textureViewToTexture.get(view)!;\n assertNotDestroyed(texture);\n assert(s_objToDevice.get(texture) === device, 'texture is not from same device as command encoder', [texture, commandEncoder]);\n const {sampleCount, format} = texture;\n const formatInfo = kAllTextureFormatInfo[format];\n markTextureInUse(inuseTextures, texture, view);\n const { colorRender, depth, stencil } = formatInfo;\n checkRenderExtent(texture, view);\n if (isDepth) {\n assert(!!depth || !!stencil, () => `format(${format}) is not a depth stencil format`);\n depthStencilFormat = format;\n } else {\n validateRenderPassColorAttachment(attachment as GPURenderPassColorAttachment, colorFormats.length - 1);\n colorFormats.push(format);\n bytesPerSample += roundUp(colorRender!.byteCost, colorRender!.alignment);\n }\n if (!passSampleCount) {\n passSampleCount = sampleCount;\n } else {\n assert(sampleCount === passSampleCount, 'all attachments do not have the same sampleCount');\n }\n };\n\n const { timestampWrites, colorAttachments, depthStencilAttachment, occlusionQuerySet } = desc;\n\n for (const colorAttachment of colorAttachments || []) {\n addView(colorAttachment);\n }\n\n addView(depthStencilAttachment, true);\n\n assert(numAttachments > 0, 'there must be at least 1 colorAttachment or depthStencilAttachment');\n assert(numAttachments <= device.limits.maxColorAttachments, () => `numAttachments(${numAttachments}) > device.limits.maxColorAttachments(${device.limits.maxColorAttachments})`);\n assert(bytesPerSample <= device.limits.maxColorAttachmentBytesPerSample,\n () => `color attachments bytesPerSample(${bytesPerSample}) > device.limits.maxColorAttachmentBytesPerSample(${device.limits.maxColorAttachmentBytesPerSample})`);\n\n if (timestampWrites) {\n validateTimestampWrites(device, timestampWrites);\n }\n\n if (occlusionQuerySet) {\n assertNotDestroyed(occlusionQuerySet);\n assert(device === s_objToDevice.get(occlusionQuerySet), 'occlusionQuerySet is not from same device', [occlusionQuerySet]);\n assert(occlusionQuerySet.type === 'occlusion', () => `occlusionQuerySet.type(${occlusionQuerySet.type}) is not 'occlusion'`, [occlusionQuerySet]);\n }\n\n const renderPassLayout = createRenderPassLayout(\n trimNulls(colorFormats),\n passSampleCount!,\n depthStencilFormat);\n\n s_renderPassToPassInfoMap.set(passEncoder, {\n state: 'open',\n commandEncoder,\n targetWidth: targetWidth || 0,\n targetHeight: targetHeight || 0,\n vertexBuffers: [],\n bindGroups: [],\n occlusionQuerySet,\n occlusionIndices: new Map(),\n occlusionQueryActiveIndex: -1,\n passLayoutInfo: {\n renderPassLayout,\n passLayoutSignature: JSON.stringify(renderPassLayout),\n },\n inuseTextures,\n });\n}\n\nwrapFunctionBefore(GPURenderPassEncoder, 'executeBundles', function (this: GPURenderPassEncoder, [bundles]) {\n const info = s_renderPassToPassInfoMap.get(this)!;\n validateEncoderState(this, info.state);\n const device = s_objToDevice.get(this)!;\n\n let bundleCount = 0;\n for (const bundle of bundles) {\n assert(s_objToDevice.get(bundle) === device, () => 'bundle[${count}] is not from same device as render pass encoder', [bundle]);\n const count = bundleCount;\n const bundleDesc = getRenderPassLayoutForRenderBundle(bundle)!;\n const passLayoutInfo = getRenderPassLayout(this);\n assert(bundleDesc.passLayoutInfo.passLayoutSignature === passLayoutInfo.passLayoutSignature,\n () => `bundle[${count}] is not compatible with ${this.constructor.name}\n\n${this.constructor.name} expects ${JSON.stringify(passLayoutInfo.renderPassLayout, null, 2)}\n\nbundle is: ${JSON.stringify(bundleDesc.passLayoutInfo.renderPassLayout, null, 2)}\n`,\n [bundle, this],\n );\n ++bundleCount;\n }\n\n info.bindGroups.length = 0;\n info.pipeline = undefined;\n info.indexBuffer = undefined;\n info.indexFormat = undefined;\n info.vertexBuffers.length = 0;\n});\n\nwrapFunctionBefore(GPURenderPassEncoder, 'beginOcclusionQuery', function (this: GPURenderPassEncoder, [queryIndex]) {\n const info = s_renderPassToPassInfoMap.get(this)!;\n validateEncoderState(this, info.state);\n const { occlusionIndices, occlusionQueryActive, occlusionQuerySet } = info;\n assert(!!occlusionQuerySet, 'no occlusionQuerySet in pass');\n assertNotDestroyed(occlusionQuerySet);\n assert(queryIndex < occlusionQuerySet.count, () => `queryIndex(${queryIndex}) >= occlusionQuerySet.count(${occlusionQuerySet.count})`, [occlusionQuerySet]);\n const queryErr = occlusionIndices.get(queryIndex);\n assert(!queryErr, () => `queryIndex(${queryIndex}) was already used in this pass at ${queryErr!.stack}`);\n assert(!occlusionQueryActive, () => `another query is already active from ${occlusionQueryActive!.stack}`);\n info.occlusionQueryActive = new Error();\n info.occlusionQueryActiveIndex = queryIndex;\n});\n\nwrapFunctionBefore(GPURenderPassEncoder, 'endOcclusionQuery', function (this: GPURenderPassEncoder) {\n const info = s_renderPassToPassInfoMap.get(this)!;\n validateEncoderState(this, info.state);\n const { occlusionIndices, occlusionQueryActive, occlusionQueryActiveIndex, occlusionQuerySet } = info;\n assert(!!info.occlusionQueryActive, 'no occlusion query is active');\n occlusionIndices.set(occlusionQueryActiveIndex, occlusionQueryActive!);\n if (occlusionQuerySet) {\n assertNotDestroyed(occlusionQuerySet);\n }\n info.occlusionQueryActive = undefined;\n});\n\nwrapBindingCommandsMixin(GPURenderPassEncoder, s_renderPassToPassInfoMap);\n\nwrapFunctionBefore(GPURenderPassEncoder, 'end', function (this: GPURenderPassEncoder) {\n const info = s_renderPassToPassInfoMap.get(this)!;\n validateEncoderState(this, info.state);\n info.state = 'ended';\n unlockCommandEncoder(info.commandEncoder)!;\n assert(!info.occlusionQueryActive, () => `occlusion queryIndex(${info.occlusionQueryActiveIndex}) is still active`);\n});\n\nwrapFunctionBefore(GPURenderPassEncoder, 'setViewport', function (this: GPURenderPassEncoder, [x, y, width, height, minDepth, maxDepth]: [number, number, number, number, number, number]) {\n const info = s_renderPassToPassInfoMap.get(this)!;\n validateEncoderState(this, info.state);\n const {\n targetWidth,\n targetHeight,\n } = info;\n\n assert(x >= 0, () => `x(${x}) < 0`, [this]);\n assert(y >= 0, () => `y(${y}) < 0`, [this]);\n assert(x + width <= targetWidth, () => `x(${x}) + width(${width}) > texture.width(${targetWidth})`, [this]);\n assert(y + height <= targetHeight, () => `y(${x}) + height(${height}) > texture.height(${targetHeight})`, [this]);\n assert(minDepth >= 0 && minDepth <= 1.0, () => `minDepth(${minDepth}) must be >= 0 and <= 1`);\n assert(maxDepth >= 0 && maxDepth <= 1.0, () => `maxDepth(${maxDepth}) must be >= 0 and <= 1`);\n assert(minDepth < maxDepth, () => `minDepth(${minDepth}) must be < maxDepth(${maxDepth})`);\n});\n\nwrapFunctionBefore(GPURenderPassEncoder, 'setScissorRect', function (this: GPURenderPassEncoder, [x, y, width, height]: [number, number, number, number]) {\n const info = s_renderPassToPassInfoMap.get(this)!;\n validateEncoderState(this, info.state);\n const {\n targetWidth,\n targetHeight,\n } = info;\n assert(x >= 0, () => `x(${x}) < 0`, [this]);\n assert(y >= 0, () => `y(${y}) < 0`, [this]);\n assert(x + width <= targetWidth, () => `x(${x}) + width(${width}) > texture.width(${targetWidth})`, [this]);\n assert(y + height <= targetHeight, () => `y(${x}) + height(${height}) > texture.height(${targetHeight})`, [this]);\n});\n\n","import {\n beginComputePass,\n} from './compute-pass-encoder.js';\nimport {\n lockCommandEncoder,\n finishCommandEncoder,\n getCommandBufferInfoAndValidateState,\n} from './encoder-utils.js';\nimport {\n kAllTextureFormatInfo\n} from './format-info.js';\nimport {\n beginRenderPass,\n} from './render-pass-encoder.js';\nimport { assertNotDestroyed, s_objToDevice } from './shared-state.js';\nimport { bufferUsageToString, physicalMipLevelSpecificTextureExtent, reifyGPUExtent3D, reifyGPUOrigin3D, textureUsageToString } from './utils.js';\nimport { assert } from './validation.js';\nimport {\n wrapFunctionAfter,\n wrapFunctionBefore,\n} from './wrap-api.js';\n\nwrapFunctionAfter(GPUCommandEncoder, 'beginComputePass', function (this: GPUCommandEncoder, passEncoder: GPUComputePassEncoder, [desc]) {\n s_objToDevice.set(passEncoder, s_objToDevice.get(this)!);\n lockCommandEncoder(this);\n beginComputePass(this, passEncoder, desc);\n});\n\nwrapFunctionAfter(GPUCommandEncoder, 'beginRenderPass', function (this: GPUCommandEncoder, passEncoder: GPURenderPassEncoder, [desc]) {\n s_objToDevice.set(passEncoder, s_objToDevice.get(this)!);\n lockCommandEncoder(this);\n beginRenderPass(this, passEncoder, desc);\n});\n\nwrapFunctionBefore(GPUCommandEncoder, 'finish', function (this: GPUCommandEncoder) {\n finishCommandEncoder(this);\n});\n\nwrapFunctionBefore(GPUCommandEncoder, 'copyBufferToBuffer', function (this: GPUCommandEncoder, [src, srcOffset, dst, dstOffset, size]) {\n getCommandBufferInfoAndValidateState(this);\n assertNotDestroyed(src);\n assertNotDestroyed(dst);\n const device = s_objToDevice.get(this);\n assert(device === s_objToDevice.get(src), 'src is not from same device as commandEncoder', [src, this]);\n assert(device === s_objToDevice.get(dst), 'dst is not from same device as commandEncoder', [dst, this]);\n assert(src !== dst, 'src must not be same buffer as dst', [src, dst]);\n assert(!!(src.usage & GPUBufferUsage.COPY_SRC), () => `src.usage(${bufferUsageToString(src.usage)} missing COPY_SRC)`, [src]);\n assert(!!(dst.usage & GPUBufferUsage.COPY_DST), () => `dst.usage(${bufferUsageToString(dst.usage)} missing COPY_DST)`, [dst]);\n assert(srcOffset + size <= src.size, () => `srcOffset(${srcOffset}) + size(${size}) > srcBuffer.size(${src.size})`, [src]);\n assert(dstOffset + size <= dst.size, () => `dstOffset(${dstOffset}) + size(${size}) > dstBuffer.size(${dst.size})`, [dst]);\n assert(size % 4 === 0, () => `size(${size}) is not multiple of 4`);\n assert(srcOffset % 4 === 0, () => `srcOffset(${srcOffset}) is not multiple of 4`);\n assert(dstOffset % 4 === 0, () => `dstOffset(${dstOffset}) is not multiple of 4`);\n});\n\nfunction validateImageCopyBuffer(icb: GPUImageCopyBuffer) {\n assertNotDestroyed(icb.buffer);\n const bytesPerRow = icb.bytesPerRow || 0;\n assert(bytesPerRow % 256 === 0, () => `src.bytesPerRow(${bytesPerRow}) not multiple of 256`, [icb.buffer]);\n}\n\nfunction validateImageCopyTexture(ict: GPUImageCopyTexture, copySize: GPUExtent3D) {\n assertNotDestroyed(ict.texture);\n\n const formatInfo = kAllTextureFormatInfo[ict.texture.format];\n const {\n blockWidth,\n blockHeight,\n } = formatInfo;\n\n const mipLevel = ict.mipLevel || 0;\n const [origX, origY] = reifyGPUOrigin3D(ict.origin);\n assert(mipLevel < ict.texture.mipLevelCount, () => `mipLevel(${mipLevel}) must be less than texture.mipLevelCount(${ict.texture.mipLevelCount})`, [ict.texture]);\n assert(origX % blockWidth === 0, () => `origin.x(${origX}) not multiple of blockWidth(${blockWidth})`, [ict.texture]);\n assert(origY % blockHeight === 0, () => `origin.y(${origY}) not multiple of blockHeight(${blockHeight})`, [ict.texture]);\n\n const [copyWidth, copyHeight, copyDepthOrArrayLayers] = reifyGPUExtent3D(copySize);\n\n if (formatInfo.depth && formatInfo.stencil && ict.texture.sampleCount > 1) {\n const [w, h, d] = physicalMipLevelSpecificTextureExtent(ict.texture, mipLevel);\n assert(copyWidth === w &&\n copyHeight === h &&\n copyDepthOrArrayLayers === d, 'copySize must match textureSize for depth-stencil textures', [ict.texture]);\n }\n}\n\nfunction validateTextureCopyRange(ict: GPUImageCopyTexture, copySize: GPUExtent3D) {\n const formatInfo = kAllTextureFormatInfo[ict.texture.format];\n const {\n blockWidth,\n blockHeight,\n } = formatInfo;\n const mipLevel = ict.mipLevel || 0;\n const [origX, origY, origZ] = reifyGPUOrigin3D(ict.origin);\n const [copyWidth, copyHeight, copyDepthOrArrayLayers] = reifyGPUExtent3D(copySize);\n const [w, h, d] = physicalMipLevelSpecificTextureExtent(ict.texture, mipLevel);\n\n const res = [ict.texture];\n assert(origX + copyWidth <= w, () => `origin.x(${origX}) + copySize.width(${copyWidth}) is > physical width(${w}) of mipLevel(${mipLevel})`, res);\n assert(origY + copyHeight <= h, () => `origin.y(${origY}) + copySize.height(${copyHeight}) is > physical height(${h}) of mipLevel(${mipLevel})`, res);\n assert(origZ + copyDepthOrArrayLayers <= d, () => `origin.z(${origZ}) + copySize.depthOrArrayBuffers(${copyDepthOrArrayLayers}) is > texture.depthOrArrayLayers(${d}) of mipLevel(${mipLevel})`, res);\n assert(copyWidth % blockWidth === 0, () => `copySize.width(${copyWidth}) is not multiple of blockWidth(${blockWidth})`, res);\n assert(copyHeight % blockHeight === 0, () => `copySize.height(${copyHeight}) is not multiple of blockHeight(${blockHeight})`, res);\n}\n\nfunction validateLinearTextureData(idl: GPUImageDataLayout, byteSize: number, format: GPUTextureFormat, copyExtent: GPUExtent3D) {\n const formatInfo = kAllTextureFormatInfo[format];\n const [copyWidth, copyHeight, copyDepthOrArrayLayers] = reifyGPUExtent3D(copyExtent);\n const { blockWidth, blockHeight } = formatInfo;\n const widthInBlocks = copyWidth / blockWidth;\n const heightInBlocks = copyHeight / blockHeight;\n const bytesInLastRow = widthInBlocks * formatInfo.bytesPerBlock!;\n\n assert(widthInBlocks % 1 === 0, () => `width(${copyWidth}) must be multiple of blockWidth${blockWidth}`);\n assert(heightInBlocks % 1 === 0, () => `height(${copyHeight}) must be multiple of blockHeight${blockHeight}`);\n if (heightInBlocks > 1) {\n assert(idl.bytesPerRow !== undefined, () => `bytesPerRow must be set if heightInBlocks(${heightInBlocks}) > 1`);\n }\n\n if (copyDepthOrArrayLayers > 1) {\n assert(idl.bytesPerRow !== undefined, () => `bytesPerRow must be set if copySize.depthOrArrayLayers(${copyDepthOrArrayLayers}) > 1`);\n }\n if (copyDepthOrArrayLayers > 1) {\n assert(idl.rowsPerImage !== undefined, () => `rowsPerImage must be set if copySize.depthOrArrayLayers(${copyDepthOrArrayLayers}) > 1`);\n }\n if (idl.bytesPerRow !== undefined) {\n assert(idl.bytesPerRow >= bytesInLastRow, () => `bytesPerRow(${idl.bytesPerRow}) must be >= bytes in the last row(${bytesInLastRow})`);\n }\n if (idl.rowsPerImage !== undefined) {\n assert(idl.rowsPerImage >= heightInBlocks, () => `rowsPerImage(${idl.rowsPerImage}) must be >= heightInBlocks(${heightInBlocks})`);\n }\n\n const bytesPerRow = idl.bytesPerRow ?? 0;\n const rowsPerImage = idl.rowsPerImage ?? 0;\n let requiredBytesInCopy = 0;\n if (copyDepthOrArrayLayers > 0) {\n // all layers except the last one\n requiredBytesInCopy += bytesPerRow * rowsPerImage * (copyDepthOrArrayLayers - 1);\n if (heightInBlocks > 0) {\n // last layer = all rows padded + last row\n requiredBytesInCopy += bytesPerRow * (heightInBlocks - 1) + bytesInLastRow;\n }\n }\n const offset = idl.offset ?? 0;\n assert(offset + requiredBytesInCopy <= byteSize, () => `offset(${offset}) + requiredBytesInCopy(${requiredBytesInCopy}) must be <= buffer.size(${byteSize})`);\n}\n\nfunction validateB2TorT2BCopy(encoder: GPUCommandEncoder, buf: GPUImageCopyBuffer, tex: GPUImageCopyTexture, copySize: GPUExtent3D, bufferIsSource: boolean) {\n const device = s_objToDevice.get(encoder);\n assert(device === s_objToDevice.get(buf.buffer), 'buffer is not from same device as commandEncoder', [buf.buffer, encoder]);\n assert(device === s_objToDevice.get(tex.texture), 'texture is not from same device as commandEncoder', [tex.texture, encoder]);\n\n validateImageCopyBuffer(buf);\n const [bufRequiredUsage, texRequiredUsage]: [keyof typeof GPUBufferUsage, keyof typeof GPUTextureUsage] = bufferIsSource\n ? ['COPY_SRC', 'COPY_DST']\n : ['COPY_DST', 'COPY_SRC'];\n assert(!!(buf.buffer.usage & GPUBufferUsage[bufRequiredUsage]), () => `src.usage(${bufferUsageToString(buf.buffer.usage)} missing ${bufRequiredUsage})`, [buf.buffer]);\n\n validateImageCopyTexture(tex, copySize);\n\n const formatInfo = kAllTextureFormatInfo[tex.texture.format];\n\n assert(!!(tex.texture.usage & GPUTextureUsage[texRequiredUsage]), () => `dst.texture.usage(${textureUsageToString(tex.texture.usage)} missing ${texRequiredUsage})`, [tex.texture]);\n assert(tex.texture.sampleCount === 1, 'sampleCount must be 1', [tex.texture]);\n\n let aspectSpecificFormat = tex.texture.format;\n const isDepthOrStencil = formatInfo.depth || formatInfo.stencil;\n if (isDepthOrStencil) {\n if (!formatInfo.stencil) {\n assert(tex.aspect !== 'stencil-only', 'can not use stencil-only aspect on non stencil texture', [tex.texture]);\n }\n if (!formatInfo.depth) {\n assert(tex.aspect !== 'depth-only', 'can not use depth-only aspect on non depth texture', [tex.texture]);\n }\n assert(tex.aspect === 'depth-only' || tex.aspect === 'stencil-only', 'must use one aspect');\n const aspect = tex.aspect === 'depth-only' ? 'depth' : 'stencil';\n const info = formatInfo[aspect];\n assert(!!info?.copyDst, `can not copy to ${tex.aspect} of texture of format(${tex.texture.format})`, [tex.texture]);\n\n if (aspectSpecificFormat === 'depth24plus-stencil8') {\n aspectSpecificFormat = tex.aspect === 'depth-only'\n ? 'depth24plus'\n : 'stencil8';\n } else if (aspectSpecificFormat === 'depth32float-stencil8') {\n aspectSpecificFormat = tex.aspect === 'depth-only'\n ? 'depth32float'\n : 'stencil8';\n }\n }\n\n validateTextureCopyRange(tex, copySize);\n\n const srcOffset = buf.offset || 0;\n if (!isDepthOrStencil) {\n const texelCopyBlockFootPrint = formatInfo.bytesPerBlock!;\n assert(srcOffset % texelCopyBlockFootPrint === 0, () => `src.offset(${srcOffset}) must multiple of blockSize(${texelCopyBlockFootPrint})`);\n } else {\n assert(srcOffset % 4 === 0, () => `src.offset(${srcOffset}) must by multiple of 4 for depth and/or stencil textures`);\n }\n\n validateLinearTextureData(buf, buf.buffer.size, aspectSpecificFormat, copySize);\n}\n\nfunction isCopyCompatible(format1: GPUTextureFormat, format2: GPUTextureFormat) {\n return format1.replace('-srgb', '') === format2.replace('-srgb', '');\n}\n\nfunction isIntersectingAxis(v1: number, v2: number, size: number) {\n const distance = Math.abs(v2 - v1);\n const gap = distance - size;\n return gap < 0;\n}\n\nwrapFunctionBefore(GPUCommandEncoder, 'copyBufferToTexture', function (this: GPUCommandEncoder, [src, dst, copySize]) {\n getCommandBufferInfoAndValidateState(this);\n validateB2TorT2BCopy(this, src, dst, copySize, true);\n});\n\nwrapFunctionBefore(GPUCommandEncoder, 'copyTextureToBuffer', function (this: GPUCommandEncoder, [src, dst, copySize]) {\n getCommandBufferInfoAndValidateState(this);\n validateB2TorT2BCopy(this, dst, src, copySize, false);\n});\n\nwrapFunctionBefore(GPUCommandEncoder, 'copyTextureToTexture', function (this: GPUCommandEncoder, [src, dst, copySize]) {\n getCommandBufferInfoAndValidateState(this);\n\n const device = s_objToDevice.get(this);\n assert(device === s_objToDevice.get(src.texture), 'src.texture is not from same device as commandEncoder', [src, this]);\n assert(device === s_objToDevice.get(dst.texture), 'dst.texture is not from same device as commandEncoder', [dst, this]);\n\n validateImageCopyTexture(src, copySize);\n assert(!!(src.texture.usage & GPUTextureUsage.COPY_SRC), () => `src.texture.usage(${textureUsageToString(src.texture.usage)} missing COPY_SRC`, [src.texture]);\n\n validateImageCopyTexture(dst, copySize);\n assert(!!(dst.texture.usage & GPUTextureUsage.COPY_DST), () => `src.texture.usage(${textureUsageToString(dst.texture.usage)} missing COPY_DST`, [dst.texture]);\n\n assert(src.texture.sampleCount === dst.texture.sampleCount, () => `src.texture.sampleCount(${src.texture.sampleCount}) must equal dst.texture.sampleCount(${dst.texture.sampleCount})`, [src.texture, dst.texture]);\n assert(isCopyCompatible(src.texture.format, dst.texture.format), () => `src.texture.format(${src.texture.format}) must be copy compatible with dst.texture.format(${dst.texture.format})`, [src.texture, dst.texture]);\n\n const formatInfo = kAllTextureFormatInfo[src.texture.format];\n const isDepthStencil = !!formatInfo.depth && !!formatInfo.stencil;\n if (isDepthStencil) {\n assert(src.aspect === 'all', () => `src.aspect must be 'all' when format(${src.texture.format}) is a depth-stencil format`, [src.texture]);\n assert(dst.aspect === 'all', () => `dst.aspect must be 'all' when format(${dst.texture.format}) is a depth-stencil format`, [dst.texture]);\n }\n\n validateTextureCopyRange(src, copySize);\n validateTextureCopyRange(dst, copySize);\n\n if (src.texture === dst.texture) {\n const srcOrigin = reifyGPUOrigin3D(src.origin);\n const dstOrigin = reifyGPUOrigin3D(dst.origin);\n const size = reifyGPUExtent3D(copySize);\n assert(\n !isIntersectingAxis(srcOrigin[0], dstOrigin[0], size[0]) &&\n !isIntersectingAxis(srcOrigin[1], dstOrigin[1], size[1]) &&\n !isIntersectingAxis(srcOrigin[2], dstOrigin[2], size[2]),\n () => `when src and dst textures are the same texture, copy boxes must not overlap`, [src.texture, dst.texture]);\n }\n});\n\nwrapFunctionBefore(GPUCommandEncoder, 'clearBuffer', function (this: GPUCommandEncoder, [buffer, offset, size]) {\n getCommandBufferInfoAndValidateState(this);\n assertNotDestroyed(buffer);\n offset = offset ?? 0;\n size = size ?? buffer.size - offset;\n assert(s_objToDevice.get(this) === s_objToDevice.get(buffer), 'buffer not from same device as encoder', [buffer, this]);\n assert(!!(buffer.usage & GPUBufferUsage.COPY_DST), () => `buffer.usage(${bufferUsageToString(buffer.usage)}) must have COPY_DST`, [buffer]);\n assert(size % 4 === 0, () => `size(${size}) must be multiple of 4`);\n assert(offset % 4 === 0, () => `offset(${offset}) must be multiple of 4`);\n assert(offset + size <= buffer.size, () => `offset(${offset}) + size(${size}) must be <= buffer.size(${buffer.size})`);\n});\n\nwrapFunctionBefore(GPUCommandEncoder, 'resolveQuerySet', function (this: GPUCommandEncoder, [querySet, firstQuery, queryCount, destination, destinationOffset]) {\n getCommandBufferInfoAndValidateState(this);\n assertNotDestroyed(querySet);\n assertNotDestroyed(destination);\n const device = s_objToDevice.get(this);\n assert(s_objToDevice.get(querySet) === device, 'querySet not from same device', [querySet]);\n assert(s_objToDevice.get(destination) === device, 'destination buffer not from same device', [destination]);\n assert((destination.usage & GPUBufferUsage.QUERY_RESOLVE) !== 0, () => `destination.usage(${bufferUsageToString(destination.usage)} does not contain QUERY_RESOLVE)`, [destination]);\n assert(firstQuery < querySet.count, () => `firstQuery(${firstQuery}) out of range for querySet.count(${querySet.count})`);\n assert(firstQuery + queryCount <= querySet.count, () => `firstQuery(${firstQuery}) + queryCount(${queryCount}) > querySet.count(${querySet.count})`);\n assert(destinationOffset % 256 === 0, () => `destinationOffset(${destinationOffset}) is not multiple of 256`);\n assert(destinationOffset + queryCount * 8 <= destination.size, () => `destinationOffset(${destinationOffset}) + queryCount(${queryCount}) * 8 > destination.size(${destination.size})`);\n});"],"names":["assert","getRenderPassLayout"],"mappings":"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","x_google_ignoreList":[6]} \ No newline at end of file +{"version":3,"file":"webgpu-debug-helper.js","sources":["../../../src/object-to-device.ts","../../../src/error-scope-wrapper.ts","../../node_modules/webgpu-utils/dist/1.x/webgpu-utils.module.js","../../../src/format-info.ts","../../../src/utils.ts","../../../src/validation.ts","../../../src/encoder-utils.ts","../../../src/wrap-api.ts","../../../src/pipeline.ts","../../../src/shared-state.ts","../../../src/texture.ts","../../../src/binding-mixin.ts","../../../src/render-commands-mixin.ts","../../../src/render-bundle-encoder.ts","../../../src/device.ts","../../../src/canvas-context.ts","../../../src/query-support.ts","../../../src/compute-pass-encoder.ts","../../../src/render-pass-encoder.ts","../../../src/command-encoder.ts","../../../src/webgpu-debug-helper.ts"],"sourcesContent":["export type DeviceResource =\n | GPUBindGroup\n | GPUBindGroupLayout\n | GPUBuffer\n | GPUCanvasContext\n | GPUCommandEncoder\n | GPUComputePassEncoder\n | GPUComputePipeline\n | GPUExternalTexture\n | GPUPipelineLayout\n | GPUQuerySet\n | GPUQueue\n | GPURenderBundle\n | GPURenderBundleEncoder\n | GPURenderPassEncoder\n | GPURenderPipeline\n | GPUSampler\n | GPUShaderModule\n | GPUTexture\n\nexport const s_objToDevice = new WeakMap();\n","/* eslint-disable no-inner-declarations */\nimport {\n s_objToDevice\n} from './object-to-device.js';\n\nif (typeof GPUDevice !== 'undefined') {\n\n const deviceToErrorScopeStack: WeakMap[]}[]> = new WeakMap();\n const origPushErrorScope = GPUDevice.prototype.pushErrorScope;\n const origPopErrorScope = GPUDevice.prototype.popErrorScope;\n\n type AnyFunction = (...args: any[]) => any;\n\n function errorWrapper(this: any, device: GPUDevice, fnName: string, origFn: T, ...args: Parameters): ReturnType {\n const stack = new Error();\n origPushErrorScope.call(device, 'validation');\n const result = origFn.call(this, ...args);\n\n const errorScopeStack = deviceToErrorScopeStack.get(device)!;\n const currentErrorScope = errorScopeStack.findLast(scope => scope.filter === 'validation');\n\n const promise = origPopErrorScope.call(device)\n .then(error => {\n // If there was a currentErrorScope when we added pushed then remove our promise\n if (currentErrorScope) {\n const ndx = currentErrorScope.errors.indexOf(promise);\n if (ndx) {\n currentErrorScope.errors.splice(ndx, 1);\n }\n } else {\n // there was no currentErrorScope so emit the error\n if (error) {\n device.dispatchEvent(new GPUUncapturedErrorEvent('uncapturederror', { error }));\n }\n }\n\n // show it\n if (error) {\n console.error('WebGPU ERROR in:', fnName, args);\n console.error(error.message);\n console.error(stack.stack);\n }\n\n // return it (as a promise)\n return error;\n });\n\n if (currentErrorScope) {\n currentErrorScope.errors.push(promise);\n }\n return result;\n }\n\n function addErrorWrapper(api: T, fnName: keyof T['prototype'] & PropertyKey): void {\n const origFn = api.prototype[fnName] as AnyFunction;\n api.prototype[fnName] = function (this: any, ...args: any[]) {\n return errorWrapper.call(this, this, fnName.toString(), origFn, ...args);\n };\n }\n\n function addErrorWrapperWithDevice(api: T, fnName: keyof T['prototype'] & PropertyKey): void {\n const origFn = api.prototype[fnName] as AnyFunction;\n api.prototype[fnName] = function (this: any, ...args: any[]) {\n const device = s_objToDevice.get(this as GPUQueue)!;\n return errorWrapper.call(this, device, fnName.toString(), origFn, ...args);\n };\n }\n\n /**\n * given a class returns all the method names.\n */\n function getAPIFunctionNames(api: T) {\n return Object.entries(Object.getOwnPropertyDescriptors(api.prototype))\n .filter(([, info]) => info.enumerable && typeof info.value === 'function')\n .map(([name]) => name as keyof T['prototype'] & PropertyKey);\n }\n\n const skip = new Set([\n 'pushErrorScope',\n 'popErrorScope',\n 'destroy',\n ]);\n getAPIFunctionNames(GPUDevice)\n .filter(n => !skip.has(n))\n .forEach(n => addErrorWrapper(GPUDevice, n));\n getAPIFunctionNames(GPUQueue)\n .forEach(n => addErrorWrapperWithDevice(GPUQueue, n));\n\n GPUDevice.prototype.pushErrorScope = (function (origFn) {\n return function (this: GPUDevice, filter: GPUErrorFilter) {\n origFn.call(this, filter);\n const errorScopeStack = deviceToErrorScopeStack.get(this);\n errorScopeStack!.push({filter, errors: []});\n };\n })(GPUDevice.prototype.pushErrorScope);\n\n GPUDevice.prototype.popErrorScope = (function (origFn) {\n return async function (this: GPUDevice) {\n const errorScopeStack = deviceToErrorScopeStack.get(this);\n const errorScope = errorScopeStack!.pop();\n if (errorScope === undefined) {\n throw new DOMException('popErrorScope called on empty error scope stack', 'OperationError');\n }\n const errPromise = origFn.call(this);\n return errorScope.errors.pop() ?? errPromise;\n };\n })(GPUDevice.prototype.popErrorScope);\n\n GPUAdapter.prototype.requestDevice = (function (origFn) {\n return async function (this: GPUAdapter, ...args) {\n const device = await origFn.call(this, ...args);\n if (device) {\n device.addEventListener('uncapturederror', function (e) {\n console.error((e as GPUUncapturedErrorEvent).error.message);\n });\n deviceToErrorScopeStack.set(device, []);\n s_objToDevice.set(device.queue, device);\n }\n return device;\n };\n })(GPUAdapter.prototype.requestDevice);\n\n}","/* webgpu-utils@1.8.2, license MIT */\nconst roundUpToMultipleOf = (v, multiple) => (((v + multiple - 1) / multiple) | 0) * multiple;\nfunction keysOf(obj) {\n return Object.keys(obj);\n}\nfunction range(count, fn) {\n return new Array(count).fill(0).map((_, i) => fn(i));\n}\n\nclass TypedArrayViewGenerator {\n arrayBuffer;\n byteOffset;\n constructor(sizeInBytes) {\n this.arrayBuffer = new ArrayBuffer(sizeInBytes);\n this.byteOffset = 0;\n }\n align(alignment) {\n this.byteOffset = roundUpToMultipleOf(this.byteOffset, alignment);\n }\n pad(numBytes) {\n this.byteOffset += numBytes;\n }\n getView(Ctor, numElements) {\n const view = new Ctor(this.arrayBuffer, this.byteOffset, numElements);\n this.byteOffset += view.byteLength;\n return view;\n }\n}\nfunction subarray(arr, offset, length) {\n return arr.subarray(offset, offset + length);\n}\n// TODO: fix better?\nconst isTypedArray = (arr) => arr && typeof arr.length === 'number' && arr.buffer instanceof ArrayBuffer && typeof arr.byteLength === 'number';\n\nconst createTypeDefs = (defs) => defs;\nconst b = createTypeDefs({\n i32: { numElements: 1, align: 4, size: 4, type: 'i32', View: Int32Array },\n u32: { numElements: 1, align: 4, size: 4, type: 'u32', View: Uint32Array },\n f32: { numElements: 1, align: 4, size: 4, type: 'f32', View: Float32Array },\n f16: { numElements: 1, align: 2, size: 2, type: 'u16', View: Uint16Array },\n vec2f: { numElements: 2, align: 8, size: 8, type: 'f32', View: Float32Array },\n vec2i: { numElements: 2, align: 8, size: 8, type: 'i32', View: Int32Array },\n vec2u: { numElements: 2, align: 8, size: 8, type: 'u32', View: Uint32Array },\n vec2h: { numElements: 2, align: 4, size: 4, type: 'u16', View: Uint16Array },\n vec3i: { numElements: 3, align: 16, size: 12, type: 'i32', View: Int32Array },\n vec3u: { numElements: 3, align: 16, size: 12, type: 'u32', View: Uint32Array },\n vec3f: { numElements: 3, align: 16, size: 12, type: 'f32', View: Float32Array },\n vec3h: { numElements: 3, align: 8, size: 6, type: 'u16', View: Uint16Array },\n vec4i: { numElements: 4, align: 16, size: 16, type: 'i32', View: Int32Array },\n vec4u: { numElements: 4, align: 16, size: 16, type: 'u32', View: Uint32Array },\n vec4f: { numElements: 4, align: 16, size: 16, type: 'f32', View: Float32Array },\n vec4h: { numElements: 4, align: 8, size: 8, type: 'u16', View: Uint16Array },\n // AlignOf(vecR)\tSizeOf(array)\n mat2x2f: { numElements: 4, align: 8, size: 16, type: 'f32', View: Float32Array },\n mat2x2h: { numElements: 4, align: 4, size: 8, type: 'u16', View: Uint16Array },\n mat3x2f: { numElements: 6, align: 8, size: 24, type: 'f32', View: Float32Array },\n mat3x2h: { numElements: 6, align: 4, size: 12, type: 'u16', View: Uint16Array },\n mat4x2f: { numElements: 8, align: 8, size: 32, type: 'f32', View: Float32Array },\n mat4x2h: { numElements: 8, align: 4, size: 16, type: 'u16', View: Uint16Array },\n mat2x3f: { numElements: 8, align: 16, size: 32, pad: [3, 1], type: 'f32', View: Float32Array },\n mat2x3h: { numElements: 8, align: 8, size: 16, pad: [3, 1], type: 'u16', View: Uint16Array },\n mat3x3f: { numElements: 12, align: 16, size: 48, pad: [3, 1], type: 'f32', View: Float32Array },\n mat3x3h: { numElements: 12, align: 8, size: 24, pad: [3, 1], type: 'u16', View: Uint16Array },\n mat4x3f: { numElements: 16, align: 16, size: 64, pad: [3, 1], type: 'f32', View: Float32Array },\n mat4x3h: { numElements: 16, align: 8, size: 32, pad: [3, 1], type: 'u16', View: Uint16Array },\n mat2x4f: { numElements: 8, align: 16, size: 32, type: 'f32', View: Float32Array },\n mat2x4h: { numElements: 8, align: 8, size: 16, type: 'u16', View: Uint16Array },\n mat3x4f: { numElements: 12, align: 16, size: 48, pad: [3, 1], type: 'f32', View: Float32Array },\n mat3x4h: { numElements: 12, align: 8, size: 24, pad: [3, 1], type: 'u16', View: Uint16Array },\n mat4x4f: { numElements: 16, align: 16, size: 64, type: 'f32', View: Float32Array },\n mat4x4h: { numElements: 16, align: 8, size: 32, type: 'u16', View: Uint16Array },\n // Note: At least as of WGSL V1 you can not create a bool for uniform or storage.\n // You can only create one in an internal struct. But, this code generates\n // views of structs and it needs to not fail if the struct has a bool\n bool: { numElements: 0, align: 1, size: 0, type: 'bool', View: Uint32Array },\n});\nconst kWGSLTypeInfo = createTypeDefs({\n ...b,\n 'atomic': b.i32,\n 'atomic': b.u32,\n 'vec2': b.vec2i,\n 'vec2': b.vec2u,\n 'vec2': b.vec2f,\n 'vec2': b.vec2h,\n 'vec3': b.vec3i,\n 'vec3': b.vec3u,\n 'vec3': b.vec3f,\n 'vec3': b.vec3h,\n 'vec4': b.vec4i,\n 'vec4': b.vec4u,\n 'vec4': b.vec4f,\n 'vec4': b.vec4h,\n 'mat2x2': b.mat2x2f,\n 'mat2x2': b.mat2x2h,\n 'mat3x2': b.mat3x2f,\n 'mat3x2': b.mat3x2h,\n 'mat4x2': b.mat4x2f,\n 'mat4x2': b.mat4x2h,\n 'mat2x3': b.mat2x3f,\n 'mat2x3': b.mat2x3h,\n 'mat3x3': b.mat3x3f,\n 'mat3x3': b.mat3x3h,\n 'mat4x3': b.mat4x3f,\n 'mat4x3': b.mat4x3h,\n 'mat2x4': b.mat2x4f,\n 'mat2x4': b.mat2x4h,\n 'mat3x4': b.mat3x4f,\n 'mat3x4': b.mat3x4h,\n 'mat4x4': b.mat4x4f,\n 'mat4x4': b.mat4x4h,\n});\nconst kWGSLTypes = keysOf(kWGSLTypeInfo);\n\n/**\n * Set which intrinsic types to make views for.\n *\n * Example:\n *\n * Given a an array of intrinsics like this\n * `array`\n *\n * The default is to create a single `Float32Array(4 * 200)`\n * because creating 200 `Float32Array` views is not usually\n * what you want.\n *\n * If you do want individual views then you'd call\n * `setIntrinsicsToView(['vec3f'])` and now you get\n * an array of 200 `Float32Array`s.\n *\n * Note: `setIntrinsicsToView` always sets ALL types. The list you\n * pass it is the types you want views created for, all other types\n * will be reset to do the default. In other words\n *\n * ```js\n * setIntrinsicsToView(['vec3f'])\n * setIntrinsicsToView(['vec2f'])\n * ```\n *\n * Only `vec2f` will have views created. `vec3f` has been reset to the default by\n * the second call\n *\n * You can pass in `true` as the 2nd parameter to make it set which types\n * to flatten and all others will be set to have views created. For example\n * to expand all types would be `setIntrinsicsToView([], true)`. To expand\n * all except `f32` would be `setIntrinsicsToView(['f32'], true)`.\n *\n * To reset all types to the default call it with no arguments\n *\n * @param types array of types to make views for\n * @param flatten whether to flatten or expand the specified types.\n */\nfunction setIntrinsicsToView(types = [], flatten) {\n // we need to track what we've viewed because for example `vec3f` references\n // the same info as `vec3` so we'd set one and reset the other.\n const visited = new Set();\n for (const type of kWGSLTypes) {\n const info = kWGSLTypeInfo[type];\n if (!visited.has(info)) {\n visited.add(info);\n info.flatten = types.includes(type) ? flatten : !flatten;\n }\n }\n}\nsetIntrinsicsToView();\n// This needs to be fixed! 😱\nfunction getSizeOfTypeDef(typeDef) {\n const asArrayDef = typeDef;\n const elementType = asArrayDef.elementType;\n if (elementType) {\n return asArrayDef.size;\n /*\n if (isIntrinsic(elementType)) {\n const asIntrinsicDef = elementType as IntrinsicDefinition;\n const { align } = typeInfo[asIntrinsicDef.type];\n return roundUpToMultipleOf(typeDef.size, align) * asArrayDef.numElements;\n } else {\n return asArrayDef.numElements * getSizeOfTypeDef(elementType);\n }\n */\n }\n else {\n const asStructDef = typeDef;\n const numElements = asArrayDef.numElements || 1;\n if (asStructDef.fields) {\n return typeDef.size * numElements;\n }\n else {\n const asIntrinsicDef = typeDef;\n const { align } = kWGSLTypeInfo[asIntrinsicDef.type];\n return numElements > 1\n ? roundUpToMultipleOf(typeDef.size, align) * numElements\n : typeDef.size;\n }\n }\n}\n// If numElements is undefined this is NOT an array. If it is defined then it IS an array\n// Sizes for arrays are different than sizes for non-arrays. Example\n// a vec3f non array is Float32Array(3)\n// a vec3f array of 2 is Float32Array(4 * 2)\n// a vec3f array of 1 is Float32Array(4 * 1)\nfunction makeIntrinsicTypedArrayView(typeDef, buffer, baseOffset, numElements) {\n const { size, type } = typeDef;\n try {\n const { View, align } = kWGSLTypeInfo[type];\n const isArray = numElements !== undefined;\n const sizeInBytes = isArray\n ? roundUpToMultipleOf(size, align)\n : size;\n const baseNumElements = sizeInBytes / View.BYTES_PER_ELEMENT;\n const effectiveNumElements = isArray\n ? (numElements === 0\n ? (buffer.byteLength - baseOffset) / sizeInBytes\n : numElements)\n : 1;\n return new View(buffer, baseOffset, baseNumElements * effectiveNumElements);\n }\n catch {\n throw new Error(`unknown type: ${type}`);\n }\n}\nfunction isIntrinsic(typeDef) {\n return !typeDef.fields &&\n !typeDef.elementType;\n}\n/**\n * Creates a set of named TypedArray views on an ArrayBuffer. If you don't\n * pass in an ArrayBuffer, one will be created. If you're using an unsized\n * array then you must pass in your own arraybuffer\n *\n * Example:\n *\n * ```js\n * const code = `\n * struct Stuff {\n * direction: vec3f,\n * strength: f32,\n * matrix: mat4x4f,\n * };\n * @group(0) @binding(0) var uni: Stuff;\n * `;\n * const defs = makeShaderDataDefinitions(code);\n * const views = makeTypedArrayViews(devs.uniforms.uni.typeDefinition);\n * ```\n *\n * views would effectively be\n *\n * ```js\n * views = {\n * direction: Float32Array(arrayBuffer, 0, 3),\n * strength: Float32Array(arrayBuffer, 3, 4),\n * matrix: Float32Array(arraybuffer, 4, 20),\n * };\n * ```\n *\n * You can use the views directly or you can use @link {setStructuredView}\n *\n * @param typeDef Definition of the various types of views.\n * @param arrayBuffer Optional ArrayBuffer to use (if one provided one will be created)\n * @param offset Optional offset in existing ArrayBuffer to start the views.\n * @returns A bunch of named TypedArray views and the ArrayBuffer\n */\nfunction makeTypedArrayViews(typeDef, arrayBuffer, offset) {\n const baseOffset = offset || 0;\n const buffer = arrayBuffer || new ArrayBuffer(getSizeOfTypeDef(typeDef));\n const makeViews = (typeDef, baseOffset) => {\n const asArrayDef = typeDef;\n const elementType = asArrayDef.elementType;\n if (elementType) {\n // TODO: Should be optional? Per Type? Depth set? Per field?\n // The issue is, if we have `array` we don't likely\n // want 1000 `Float32Array(4)` views. We want 1 `Float32Array(1000 * 4)` view.\n // On the other hand, if we have `array` the maybe we do want\n // 10 `Float32Array(16)` views since you might want to do\n // `mat4.perspective(fov, aspect, near, far, foo.bar.arrayOf10Mat4s[3])`;\n if (isIntrinsic(elementType) && kWGSLTypeInfo[elementType.type].flatten) {\n return makeIntrinsicTypedArrayView(elementType, buffer, baseOffset, asArrayDef.numElements);\n }\n else {\n const { size } = getSizeAndAlignmentOfUnsizedArrayElementOfTypeDef(typeDef);\n const effectiveNumElements = asArrayDef.numElements === 0\n ? (buffer.byteLength - baseOffset) / size\n : asArrayDef.numElements;\n return range(effectiveNumElements, i => makeViews(elementType, baseOffset + size * i));\n }\n }\n else if (typeof typeDef === 'string') {\n throw Error('unreachable');\n }\n else {\n const fields = typeDef.fields;\n if (fields) {\n const views = {};\n for (const [name, { type, offset }] of Object.entries(fields)) {\n views[name] = makeViews(type, baseOffset + offset);\n }\n return views;\n }\n else {\n return makeIntrinsicTypedArrayView(typeDef, buffer, baseOffset);\n }\n }\n };\n return { views: makeViews(typeDef, baseOffset), arrayBuffer: buffer };\n}\n/**\n * Given a set of TypeArrayViews and matching JavaScript data\n * sets the content of the views.\n *\n * Example:\n *\n * ```js\n * const code = `\n * struct Stuff {\n * direction: vec3f,\n * strength: f32,\n * matrix: mat4x4f,\n * };\n * @group(0) @binding(0) var uni: Stuff;\n * `;\n * const defs = makeShaderDataDefinitions(code);\n * const views = makeTypedArrayViews(devs.uniforms.uni.typeDefinition);\n *\n * setStructuredViews({\n * direction: [1, 2, 3],\n * strength: 45,\n * matrix: [\n * 1, 0, 0, 0,\n * 0, 1, 0, 0,\n * 0, 0, 1, 0,\n * 0, 0, 0, 1,\n * ],\n * });\n * ```\n *\n * The code above will set the various views, which all point to different\n * locations within the same array buffer.\n *\n * See @link {makeTypedArrayViews}.\n *\n * @param data The new values\n * @param views TypedArray views as returned from {@link makeTypedArrayViews}\n */\nfunction setStructuredView(data, views) {\n if (data === undefined) {\n return;\n }\n else if (isTypedArray(views)) {\n const view = views;\n if (view.length === 1 && typeof data === 'number') {\n view[0] = data;\n }\n else {\n if (Array.isArray(data[0]) || isTypedArray(data[0])) {\n // complete hack!\n // there's no type data here so let's guess based on the user's data\n const dataLen = data[0].length;\n const stride = dataLen === 3 ? 4 : dataLen;\n for (let i = 0; i < data.length; ++i) {\n const offset = i * stride;\n view.set(data[i], offset);\n }\n }\n else {\n view.set(data);\n }\n }\n }\n else if (Array.isArray(views)) {\n const asArray = views;\n data.forEach((newValue, ndx) => {\n setStructuredView(newValue, asArray[ndx]);\n });\n }\n else {\n const asViews = views;\n for (const [key, newValue] of Object.entries(data)) {\n const view = asViews[key];\n if (view) {\n setStructuredView(newValue, view);\n }\n }\n }\n}\n/**\n * Given a VariableDefinition, create matching TypedArray views\n * @param varDef A VariableDefinition as returned from {@link makeShaderDataDefinitions}\n * @param arrayBuffer Optional ArrayBuffer for the views\n * @param offset Optional offset into the ArrayBuffer for the views\n * @returns TypedArray views for the various named fields of the structure as well\n * as a `set` function to make them easy to set, and the arrayBuffer\n */\nfunction makeStructuredView(varDef, arrayBuffer, offset = 0) {\n const asVarDef = varDef;\n const typeDef = asVarDef.group === undefined ? varDef : asVarDef.typeDefinition;\n const views = makeTypedArrayViews(typeDef, arrayBuffer, offset);\n return {\n ...views,\n set(data) {\n setStructuredView(data, views.views);\n },\n };\n}\nconst s_views = new WeakMap();\nfunction getViewsByCtor(arrayBuffer) {\n let viewsByCtor = s_views.get(arrayBuffer);\n if (!viewsByCtor) {\n viewsByCtor = new Map();\n s_views.set(arrayBuffer, viewsByCtor);\n }\n return viewsByCtor;\n}\nfunction getView(arrayBuffer, Ctor) {\n const viewsByCtor = getViewsByCtor(arrayBuffer);\n let view = viewsByCtor.get(Ctor);\n if (!view) {\n view = new Ctor(arrayBuffer);\n viewsByCtor.set(Ctor, view);\n }\n return view;\n}\n// Is this something like [1,2,3]?\nfunction isArrayLikeOfNumber(data) {\n return isTypedArray(data) || Array.isArray(data) && typeof data[0] === 'number';\n}\nfunction setIntrinsicFromArrayLikeOfNumber(typeDef, data, arrayBuffer, offset) {\n const asIntrinsicDefinition = typeDef;\n const type = kWGSLTypeInfo[asIntrinsicDefinition.type];\n const view = getView(arrayBuffer, type.View);\n const index = offset / view.BYTES_PER_ELEMENT;\n if (typeof data === 'number') {\n view[index] = data;\n }\n else {\n view.set(data, index);\n }\n}\n/**\n * Sets values on an existing array buffer from a TypeDefinition\n * @param typeDef A type definition provided by @link {makeShaderDataDefinitions}\n * @param data The source data\n * @param arrayBuffer The arrayBuffer who's data to set.\n * @param offset An offset in the arrayBuffer to start at.\n */\nfunction setTypedValues(typeDef, data, arrayBuffer, offset = 0) {\n const asArrayDef = typeDef;\n const elementType = asArrayDef.elementType;\n if (elementType) {\n // It's ArrayDefinition\n if (isIntrinsic(elementType)) {\n const asIntrinsicDef = elementType;\n if (isArrayLikeOfNumber(data)) {\n setIntrinsicFromArrayLikeOfNumber(asIntrinsicDef, data, arrayBuffer, offset);\n return;\n }\n }\n data.forEach((newValue, ndx) => {\n setTypedValues(elementType, newValue, arrayBuffer, offset + elementType.size * ndx);\n });\n return;\n }\n const asStructDef = typeDef;\n const fields = asStructDef.fields;\n if (fields) {\n // It's StructDefinition\n for (const [key, newValue] of Object.entries(data)) {\n const fieldDef = fields[key];\n if (fieldDef) {\n setTypedValues(fieldDef.type, newValue, arrayBuffer, offset + fieldDef.offset);\n }\n }\n }\n else {\n // It's IntrinsicDefinition\n setIntrinsicFromArrayLikeOfNumber(typeDef, data, arrayBuffer, offset);\n }\n}\n/**\n * Same as @link {setTypedValues} except it takes a @link {VariableDefinition}.\n * @param varDef A variable definition provided by @link {makeShaderDataDefinitions}\n * @param data The source data\n * @param arrayBuffer The arrayBuffer who's data to set.\n * @param offset An offset in the arrayBuffer to start at.\n */\nfunction setStructuredValues(varDef, data, arrayBuffer, offset = 0) {\n setTypedValues(varDef.typeDefinition, data, arrayBuffer, offset);\n}\nfunction getAlignmentOfTypeDef(typeDef) {\n const asArrayDef = typeDef;\n const elementType = asArrayDef.elementType;\n if (elementType) {\n return getAlignmentOfTypeDef(elementType);\n }\n const asStructDef = typeDef;\n const fields = asStructDef.fields;\n if (fields) {\n return Object.values(fields).reduce((max, { type }) => Math.max(max, getAlignmentOfTypeDef(type)), 0);\n }\n const { type } = typeDef;\n const { align } = kWGSLTypeInfo[type];\n return align;\n}\nfunction getSizeAndAlignmentOfUnsizedArrayElementOfTypeDef(typeDef) {\n const asArrayDef = typeDef;\n const elementType = asArrayDef.elementType;\n if (elementType) {\n const unalignedSize = elementType.size;\n const align = getAlignmentOfTypeDef(elementType);\n return {\n unalignedSize,\n align,\n size: roundUpToMultipleOf(unalignedSize, align),\n };\n }\n const asStructDef = typeDef;\n const fields = asStructDef.fields;\n if (fields) {\n const lastField = Object.values(fields).pop();\n if (lastField.type.size === 0) {\n return getSizeAndAlignmentOfUnsizedArrayElementOfTypeDef(lastField.type);\n }\n }\n return {\n size: 0,\n unalignedSize: 0,\n align: 1,\n };\n}\n/**\n * Returns the size, align, and unalignedSize of \"the\" unsized array element. Unsized arrays are only\n * allowed at the outer most level or the last member of a top level struct.\n *\n * Example:\n *\n * ```js\n * const code = `\n * struct Foo {\n * a: u32,\n * b: array,\n * };\n * @group(0) @binding(0) var f: Foo;\n * `;\n * const defs = makeShaderDataDefinitions(code);\n * const { size, align, unalignedSize } = getSizeAndAlignmentOfUnsizedArrayElement(\n * defs.storages.f);\n * // size = 16 (since you need to allocate 16 bytes per element)\n * // align = 16 (since vec3f needs to be aligned to 16 bytes)\n * // unalignedSize = 12 (since only 12 bytes are used for a vec3f)\n * ```\n *\n * Generally you only need size. Example:\n *\n * ```js\n * const code = `\n * struct Foo {\n * a: u32,\n * b: array,\n * };\n * @group(0) @binding(0) var f: Foo;\n * `;\n * const defs = makeShaderDataDefinitions(code);\n * const { size } = getSizeAndAlignmentOfUnsizedArrayElement(defs.storages.f);\n * const numElements = 10;\n * const views = makeStructuredViews(\n * defs.storages.f,\n * new ArrayBuffer(defs.storages.f.size + size * numElements));\n * ```\n *\n * @param varDef A variable definition provided by @link {makeShaderDataDefinitions}\n * @returns the size, align, and unalignedSize in bytes of the unsized array element in this type definition.\n * If there is no unsized array, size = 0.\n */\nfunction getSizeAndAlignmentOfUnsizedArrayElement(varDef) {\n const asVarDef = varDef;\n const typeDef = asVarDef.group === undefined ? varDef : asVarDef.typeDefinition;\n return getSizeAndAlignmentOfUnsizedArrayElementOfTypeDef(typeDef);\n}\n\nclass ParseContext {\n constructor() {\n this.constants = new Map();\n this.aliases = new Map();\n this.structs = new Map();\n }\n}\n/**\n * @class Node\n * @category AST\n * Base class for AST nodes parsed from a WGSL shader.\n */\nclass Node {\n constructor() { }\n get isAstNode() {\n return true;\n }\n get astNodeType() {\n return \"\";\n }\n evaluate(context) {\n throw new Error(\"Cannot evaluate node\");\n }\n evaluateString(context) {\n return this.evaluate(context).toString();\n }\n search(callback) { }\n searchBlock(block, callback) {\n if (block) {\n callback(_BlockStart.instance);\n for (const node of block) {\n if (node instanceof Array) {\n this.searchBlock(node, callback);\n }\n else {\n node.search(callback);\n }\n }\n callback(_BlockEnd.instance);\n }\n }\n}\n// For internal use only\nclass _BlockStart extends Node {\n}\n_BlockStart.instance = new _BlockStart();\n// For internal use only\nclass _BlockEnd extends Node {\n}\n_BlockEnd.instance = new _BlockEnd();\n/**\n * @class Statement\n * @extends Node\n * @category AST\n */\nclass Statement extends Node {\n constructor() {\n super();\n }\n}\n/**\n * @class Function\n * @extends Statement\n * @category AST\n */\nclass Function extends Statement {\n constructor(name, args, returnType, body, startLine, endLine) {\n super();\n this.calls = new Set();\n this.name = name;\n this.args = args;\n this.returnType = returnType;\n this.body = body;\n this.startLine = startLine;\n this.endLine = endLine;\n }\n get astNodeType() {\n return \"function\";\n }\n search(callback) {\n this.searchBlock(this.body, callback);\n }\n}\n/**\n * @class StaticAssert\n * @extends Statement\n * @category AST\n */\nclass StaticAssert extends Statement {\n constructor(expression) {\n super();\n this.expression = expression;\n }\n get astNodeType() {\n return \"staticAssert\";\n }\n search(callback) {\n this.expression.search(callback);\n }\n}\n/**\n * @class While\n * @extends Statement\n * @category AST\n */\nclass While extends Statement {\n constructor(condition, body) {\n super();\n this.condition = condition;\n this.body = body;\n }\n get astNodeType() {\n return \"while\";\n }\n search(callback) {\n this.condition.search(callback);\n this.searchBlock(this.body, callback);\n }\n}\n/**\n * @class Continuing\n * @extends Statement\n * @category AST\n */\nclass Continuing extends Statement {\n constructor(body) {\n super();\n this.body = body;\n }\n get astNodeType() {\n return \"continuing\";\n }\n search(callback) {\n this.searchBlock(this.body, callback);\n }\n}\n/**\n * @class For\n * @extends Statement\n * @category AST\n */\nclass For extends Statement {\n constructor(init, condition, increment, body) {\n super();\n this.init = init;\n this.condition = condition;\n this.increment = increment;\n this.body = body;\n }\n get astNodeType() {\n return \"for\";\n }\n search(callback) {\n var _a, _b, _c;\n (_a = this.init) === null || _a === void 0 ? void 0 : _a.search(callback);\n (_b = this.condition) === null || _b === void 0 ? void 0 : _b.search(callback);\n (_c = this.increment) === null || _c === void 0 ? void 0 : _c.search(callback);\n this.searchBlock(this.body, callback);\n }\n}\n/**\n * @class Var\n * @extends Statement\n * @category AST\n */\nclass Var extends Statement {\n constructor(name, type, storage, access, value) {\n super();\n this.name = name;\n this.type = type;\n this.storage = storage;\n this.access = access;\n this.value = value;\n }\n get astNodeType() {\n return \"var\";\n }\n search(callback) {\n var _a;\n callback(this);\n (_a = this.value) === null || _a === void 0 ? void 0 : _a.search(callback);\n }\n}\n/**\n * @class Override\n * @extends Statement\n * @category AST\n */\nclass Override extends Statement {\n constructor(name, type, value) {\n super();\n this.name = name;\n this.type = type;\n this.value = value;\n }\n get astNodeType() {\n return \"override\";\n }\n search(callback) {\n var _a;\n (_a = this.value) === null || _a === void 0 ? void 0 : _a.search(callback);\n }\n}\n/**\n * @class Let\n * @extends Statement\n * @category AST\n */\nclass Let extends Statement {\n constructor(name, type, storage, access, value) {\n super();\n this.name = name;\n this.type = type;\n this.storage = storage;\n this.access = access;\n this.value = value;\n }\n get astNodeType() {\n return \"let\";\n }\n search(callback) {\n var _a;\n callback(this);\n (_a = this.value) === null || _a === void 0 ? void 0 : _a.search(callback);\n }\n}\n/**\n * @class Const\n * @extends Statement\n * @category AST\n */\nclass Const extends Statement {\n constructor(name, type, storage, access, value) {\n super();\n this.name = name;\n this.type = type;\n this.storage = storage;\n this.access = access;\n this.value = value;\n }\n get astNodeType() {\n return \"const\";\n }\n evaluate(context) {\n return this.value.evaluate(context);\n }\n search(callback) {\n var _a;\n callback(this);\n (_a = this.value) === null || _a === void 0 ? void 0 : _a.search(callback);\n }\n}\nvar IncrementOperator;\n(function (IncrementOperator) {\n IncrementOperator[\"increment\"] = \"++\";\n IncrementOperator[\"decrement\"] = \"--\";\n})(IncrementOperator || (IncrementOperator = {}));\n(function (IncrementOperator) {\n function parse(val) {\n const key = val;\n if (key == \"parse\")\n throw new Error(\"Invalid value for IncrementOperator\");\n return IncrementOperator[key];\n }\n IncrementOperator.parse = parse;\n})(IncrementOperator || (IncrementOperator = {}));\n/**\n * @class Increment\n * @extends Statement\n * @category AST\n */\nclass Increment extends Statement {\n constructor(operator, variable) {\n super();\n this.operator = operator;\n this.variable = variable;\n }\n get astNodeType() {\n return \"increment\";\n }\n search(callback) {\n this.variable.search(callback);\n }\n}\nvar AssignOperator;\n(function (AssignOperator) {\n AssignOperator[\"assign\"] = \"=\";\n AssignOperator[\"addAssign\"] = \"+=\";\n AssignOperator[\"subtractAssin\"] = \"-=\";\n AssignOperator[\"multiplyAssign\"] = \"*=\";\n AssignOperator[\"divideAssign\"] = \"/=\";\n AssignOperator[\"moduloAssign\"] = \"%=\";\n AssignOperator[\"andAssign\"] = \"&=\";\n AssignOperator[\"orAssign\"] = \"|=\";\n AssignOperator[\"xorAssign\"] = \"^=\";\n AssignOperator[\"shiftLeftAssign\"] = \"<<=\";\n AssignOperator[\"shiftRightAssign\"] = \">>=\";\n})(AssignOperator || (AssignOperator = {}));\n(function (AssignOperator) {\n function parse(val) {\n const key = val;\n if (key == \"parse\") {\n throw new Error(\"Invalid value for AssignOperator\");\n }\n //return AssignOperator[key];\n return key;\n }\n AssignOperator.parse = parse;\n})(AssignOperator || (AssignOperator = {}));\n/**\n * @class Assign\n * @extends Statement\n * @category AST\n */\nclass Assign extends Statement {\n constructor(operator, variable, value) {\n super();\n this.operator = operator;\n this.variable = variable;\n this.value = value;\n }\n get astNodeType() {\n return \"assign\";\n }\n search(callback) {\n this.variable.search(callback);\n this.value.search(callback);\n }\n}\n/**\n * @class Call\n * @extends Statement\n * @category AST\n */\nclass Call extends Statement {\n constructor(name, args) {\n super();\n this.name = name;\n this.args = args;\n }\n get astNodeType() {\n return \"call\";\n }\n search(callback) {\n for (const node of this.args) {\n node.search(callback);\n }\n callback(this);\n }\n}\n/**\n * @class Loop\n * @extends Statement\n * @category AST\n */\nclass Loop extends Statement {\n constructor(body, continuing) {\n super();\n this.body = body;\n this.continuing = continuing;\n }\n get astNodeType() {\n return \"loop\";\n }\n}\n/**\n * @class Switch\n * @extends Statement\n * @category AST\n */\nclass Switch extends Statement {\n constructor(condition, body) {\n super();\n this.condition = condition;\n this.body = body;\n }\n get astNodeType() {\n return \"body\";\n }\n}\n/**\n * @class If\n * @extends Statement\n * @category AST\n */\nclass If extends Statement {\n constructor(condition, body, elseif, _else) {\n super();\n this.condition = condition;\n this.body = body;\n this.elseif = elseif;\n this.else = _else;\n }\n get astNodeType() {\n return \"if\";\n }\n search(callback) {\n this.condition.search(callback);\n this.searchBlock(this.body, callback);\n this.searchBlock(this.elseif, callback);\n this.searchBlock(this.else, callback);\n }\n}\n/**\n * @class Return\n * @extends Statement\n * @category AST\n */\nclass Return extends Statement {\n constructor(value) {\n super();\n this.value = value;\n }\n get astNodeType() {\n return \"return\";\n }\n search(callback) {\n var _a;\n (_a = this.value) === null || _a === void 0 ? void 0 : _a.search(callback);\n }\n}\n/**\n * @class Enable\n * @extends Statement\n * @category AST\n */\nclass Enable extends Statement {\n constructor(name) {\n super();\n this.name = name;\n }\n get astNodeType() {\n return \"enable\";\n }\n}\n/**\n * @class Requires\n * @extends Statement\n * @category AST\n */\nclass Requires extends Statement {\n constructor(extensions) {\n super();\n this.extensions = extensions;\n }\n get astNodeType() {\n return \"requires\";\n }\n}\n/**\n * @class Diagnostic\n * @extends Statement\n * @category AST\n */\nclass Diagnostic extends Statement {\n constructor(severity, rule) {\n super();\n this.severity = severity;\n this.rule = rule;\n }\n get astNodeType() {\n return \"diagnostic\";\n }\n}\n/**\n * @class Alias\n * @extends Statement\n * @category AST\n */\nclass Alias extends Statement {\n constructor(name, type) {\n super();\n this.name = name;\n this.type = type;\n }\n get astNodeType() {\n return \"alias\";\n }\n}\n/**\n * @class Discard\n * @extends Statement\n * @category AST\n */\nclass Discard extends Statement {\n constructor() {\n super();\n }\n get astNodeType() {\n return \"discard\";\n }\n}\n/**\n * @class Break\n * @extends Statement\n * @category AST\n */\nclass Break extends Statement {\n constructor() {\n super();\n }\n get astNodeType() {\n return \"break\";\n }\n}\n/**\n * @class Continue\n * @extends Statement\n * @category AST\n */\nclass Continue extends Statement {\n constructor() {\n super();\n }\n get astNodeType() {\n return \"continue\";\n }\n}\n/**\n * @class Type\n * @extends Statement\n * @category AST\n */\nclass Type extends Statement {\n constructor(name) {\n super();\n this.name = name;\n }\n get astNodeType() {\n return \"type\";\n }\n get isStruct() {\n return false;\n }\n get isArray() {\n return false;\n }\n}\n/**\n * @class StructType\n * @extends Type\n * @category AST\n */\nclass Struct extends Type {\n constructor(name, members, startLine, endLine) {\n super(name);\n this.members = members;\n this.startLine = startLine;\n this.endLine = endLine;\n }\n get astNodeType() {\n return \"struct\";\n }\n get isStruct() {\n return true;\n }\n /// Return the index of the member with the given name, or -1 if not found.\n getMemberIndex(name) {\n for (let i = 0; i < this.members.length; i++) {\n if (this.members[i].name == name)\n return i;\n }\n return -1;\n }\n}\n/**\n * @class TemplateType\n * @extends Type\n * @category AST\n */\nclass TemplateType extends Type {\n constructor(name, format, access) {\n super(name);\n this.format = format;\n this.access = access;\n }\n get astNodeType() {\n return \"template\";\n }\n}\n/**\n * @class PointerType\n * @extends Type\n * @category AST\n */\nclass PointerType extends Type {\n constructor(name, storage, type, access) {\n super(name);\n this.storage = storage;\n this.type = type;\n this.access = access;\n }\n get astNodeType() {\n return \"pointer\";\n }\n}\n/**\n * @class ArrayType\n * @extends Type\n * @category AST\n */\nclass ArrayType extends Type {\n constructor(name, attributes, format, count) {\n super(name);\n this.attributes = attributes;\n this.format = format;\n this.count = count;\n }\n get astNodeType() {\n return \"array\";\n }\n get isArray() {\n return true;\n }\n}\n/**\n * @class SamplerType\n * @extends Type\n * @category AST\n */\nclass SamplerType extends Type {\n constructor(name, format, access) {\n super(name);\n this.format = format;\n this.access = access;\n }\n get astNodeType() {\n return \"sampler\";\n }\n}\n/**\n * @class Expression\n * @extends Node\n * @category AST\n */\nclass Expression extends Node {\n constructor() {\n super();\n }\n}\n/**\n * @class StringExpr\n * @extends Expression\n * @category AST\n */\nclass StringExpr extends Expression {\n constructor(value) {\n super();\n this.value = value;\n }\n get astNodeType() {\n return \"stringExpr\";\n }\n toString() {\n return this.value;\n }\n evaluateString() {\n return this.value;\n }\n}\n/**\n * @class CreateExpr\n * @extends Expression\n * @category AST\n */\nclass CreateExpr extends Expression {\n constructor(type, args) {\n super();\n this.type = type;\n this.args = args;\n }\n get astNodeType() {\n return \"createExpr\";\n }\n search(callback) {\n callback(this);\n for (const node of this.args) {\n node.search(callback);\n }\n }\n}\n/**\n * @class CallExpr\n * @extends Expression\n * @category AST\n */\nclass CallExpr extends Expression {\n constructor(name, args) {\n super();\n this.name = name;\n this.args = args;\n }\n get astNodeType() {\n return \"callExpr\";\n }\n evaluate(context) {\n switch (this.name) {\n case \"abs\":\n return Math.abs(this.args[0].evaluate(context));\n case \"acos\":\n return Math.acos(this.args[0].evaluate(context));\n case \"acosh\":\n return Math.acosh(this.args[0].evaluate(context));\n case \"asin\":\n return Math.asin(this.args[0].evaluate(context));\n case \"asinh\":\n return Math.asinh(this.args[0].evaluate(context));\n case \"atan\":\n return Math.atan(this.args[0].evaluate(context));\n case \"atan2\":\n return Math.atan2(this.args[0].evaluate(context), this.args[1].evaluate(context));\n case \"atanh\":\n return Math.atanh(this.args[0].evaluate(context));\n case \"ceil\":\n return Math.ceil(this.args[0].evaluate(context));\n case \"clamp\":\n return Math.min(Math.max(this.args[0].evaluate(context), this.args[1].evaluate(context)), this.args[2].evaluate(context));\n case \"cos\":\n return Math.cos(this.args[0].evaluate(context));\n //case \"cross\":\n //TODO: (x[i] * y[j] - x[j] * y[i])\n case \"degrees\":\n return (this.args[0].evaluate(context) * 180) / Math.PI;\n //case \"determinant\":\n //TODO implement\n case \"distance\":\n return Math.sqrt(Math.pow(this.args[0].evaluate(context) - this.args[1].evaluate(context), 2));\n case \"dot\":\n //TODO: (x[i] * y[i])\n case \"exp\":\n return Math.exp(this.args[0].evaluate(context));\n case \"exp2\":\n return Math.pow(2, this.args[0].evaluate(context));\n //case \"extractBits\":\n //TODO: implement\n //case \"firstLeadingBit\":\n //TODO: implement\n case \"floor\":\n return Math.floor(this.args[0].evaluate(context));\n case \"fma\":\n return (this.args[0].evaluate(context) * this.args[1].evaluate(context) +\n this.args[2].evaluate(context));\n case \"fract\":\n return (this.args[0].evaluate(context) -\n Math.floor(this.args[0].evaluate(context)));\n //case \"frexp\":\n //TODO: implement\n case \"inverseSqrt\":\n return 1 / Math.sqrt(this.args[0].evaluate(context));\n //case \"length\":\n //TODO: implement\n case \"log\":\n return Math.log(this.args[0].evaluate(context));\n case \"log2\":\n return Math.log2(this.args[0].evaluate(context));\n case \"max\":\n return Math.max(this.args[0].evaluate(context), this.args[1].evaluate(context));\n case \"min\":\n return Math.min(this.args[0].evaluate(context), this.args[1].evaluate(context));\n case \"mix\":\n return (this.args[0].evaluate(context) *\n (1 - this.args[2].evaluate(context)) +\n this.args[1].evaluate(context) * this.args[2].evaluate(context));\n case \"modf\":\n return (this.args[0].evaluate(context) -\n Math.floor(this.args[0].evaluate(context)));\n case \"pow\":\n return Math.pow(this.args[0].evaluate(context), this.args[1].evaluate(context));\n case \"radians\":\n return (this.args[0].evaluate(context) * Math.PI) / 180;\n case \"round\":\n return Math.round(this.args[0].evaluate(context));\n case \"sign\":\n return Math.sign(this.args[0].evaluate(context));\n case \"sin\":\n return Math.sin(this.args[0].evaluate(context));\n case \"sinh\":\n return Math.sinh(this.args[0].evaluate(context));\n case \"saturate\":\n return Math.min(Math.max(this.args[0].evaluate(context), 0), 1);\n case \"smoothstep\":\n return (this.args[0].evaluate(context) *\n this.args[0].evaluate(context) *\n (3 - 2 * this.args[0].evaluate(context)));\n case \"sqrt\":\n return Math.sqrt(this.args[0].evaluate(context));\n case \"step\":\n return this.args[0].evaluate(context) < this.args[1].evaluate(context)\n ? 0\n : 1;\n case \"tan\":\n return Math.tan(this.args[0].evaluate(context));\n case \"tanh\":\n return Math.tanh(this.args[0].evaluate(context));\n case \"trunc\":\n return Math.trunc(this.args[0].evaluate(context));\n default:\n throw new Error(\"Non const function: \" + this.name);\n }\n }\n search(callback) {\n for (const node of this.args) {\n node.search(callback);\n }\n callback(this);\n }\n}\n/**\n * @class VariableExpr\n * @extends Expression\n * @category AST\n */\nclass VariableExpr extends Expression {\n constructor(name) {\n super();\n this.name = name;\n }\n get astNodeType() {\n return \"varExpr\";\n }\n search(callback) {\n callback(this);\n if (this.postfix) {\n this.postfix.search(callback);\n }\n }\n evaluate(context) {\n const constant = context.constants.get(this.name);\n if (!constant) {\n throw new Error(\"Cannot evaluate node\");\n }\n return constant.evaluate(context);\n }\n}\n/**\n * @class ConstExpr\n * @extends Expression\n * @category AST\n */\nclass ConstExpr extends Expression {\n constructor(name, initializer) {\n super();\n this.name = name;\n this.initializer = initializer;\n }\n get astNodeType() {\n return \"constExpr\";\n }\n evaluate(context) {\n var _a, _b;\n if (this.initializer instanceof CreateExpr) {\n // This is a struct constant\n const property = (_a = this.postfix) === null || _a === void 0 ? void 0 : _a.evaluateString(context);\n const type = (_b = this.initializer.type) === null || _b === void 0 ? void 0 : _b.name;\n const struct = context.structs.get(type);\n const memberIndex = struct === null || struct === void 0 ? void 0 : struct.getMemberIndex(property);\n if (memberIndex != -1) {\n const value = this.initializer.args[memberIndex].evaluate(context);\n return value;\n }\n console.log(memberIndex);\n }\n return this.initializer.evaluate(context);\n }\n search(callback) {\n this.initializer.search(callback);\n }\n}\n/**\n * @class LiteralExpr\n * @extends Expression\n * @category AST\n */\nclass LiteralExpr extends Expression {\n constructor(value) {\n super();\n this.value = value;\n }\n get astNodeType() {\n return \"literalExpr\";\n }\n evaluate() {\n return this.value;\n }\n}\n/**\n * @class BitcastExpr\n * @extends Expression\n * @category AST\n */\nclass BitcastExpr extends Expression {\n constructor(type, value) {\n super();\n this.type = type;\n this.value = value;\n }\n get astNodeType() {\n return \"bitcastExpr\";\n }\n search(callback) {\n this.value.search(callback);\n }\n}\n/**\n * @class TypecastExpr\n * @extends Expression\n * @category AST\n */\nclass TypecastExpr extends Expression {\n constructor(type, args) {\n super();\n this.type = type;\n this.args = args;\n }\n get astNodeType() {\n return \"typecastExpr\";\n }\n evaluate(context) {\n return this.args[0].evaluate(context);\n }\n search(callback) {\n this.searchBlock(this.args, callback);\n }\n}\n/**\n * @class GroupingExpr\n * @extends Expression\n * @category AST\n */\nclass GroupingExpr extends Expression {\n constructor(contents) {\n super();\n this.contents = contents;\n }\n get astNodeType() {\n return \"groupExpr\";\n }\n evaluate(context) {\n return this.contents[0].evaluate(context);\n }\n search(callback) {\n this.searchBlock(this.contents, callback);\n }\n}\n/**\n * @class ArrayIndex\n * @extends Expression\n * @category AST\n */\nclass ArrayIndex extends Expression {\n constructor(index) {\n super();\n this.index = index;\n }\n search(callback) {\n this.index.search(callback);\n }\n}\n/**\n * @class Operator\n * @extends Expression\n * @category AST\n */\nclass Operator extends Expression {\n constructor() {\n super();\n }\n}\n/**\n * @class UnaryOperator\n * @extends Operator\n * @category AST\n * @property {string} operator +, -, !, ~\n */\nclass UnaryOperator extends Operator {\n constructor(operator, right) {\n super();\n this.operator = operator;\n this.right = right;\n }\n get astNodeType() {\n return \"unaryOp\";\n }\n evaluate(context) {\n switch (this.operator) {\n case \"+\":\n return this.right.evaluate(context);\n case \"-\":\n return -this.right.evaluate(context);\n case \"!\":\n return this.right.evaluate(context) ? 0 : 1;\n case \"~\":\n return ~this.right.evaluate(context);\n default:\n throw new Error(\"Unknown unary operator: \" + this.operator);\n }\n }\n search(callback) {\n this.right.search(callback);\n }\n}\n/**\n * @class BinaryOperator\n * @extends Operator\n * @category AST\n * @property {string} operator +, -, *, /, %, ==, !=, <, >, <=, >=, &&, ||\n */\nclass BinaryOperator extends Operator {\n constructor(operator, left, right) {\n super();\n this.operator = operator;\n this.left = left;\n this.right = right;\n }\n get astNodeType() {\n return \"binaryOp\";\n }\n evaluate(context) {\n switch (this.operator) {\n case \"+\":\n return this.left.evaluate(context) + this.right.evaluate(context);\n case \"-\":\n return this.left.evaluate(context) - this.right.evaluate(context);\n case \"*\":\n return this.left.evaluate(context) * this.right.evaluate(context);\n case \"/\":\n return this.left.evaluate(context) / this.right.evaluate(context);\n case \"%\":\n return this.left.evaluate(context) % this.right.evaluate(context);\n case \"==\":\n return this.left.evaluate(context) == this.right.evaluate(context)\n ? 1\n : 0;\n case \"!=\":\n return this.left.evaluate(context) != this.right.evaluate(context)\n ? 1\n : 0;\n case \"<\":\n return this.left.evaluate(context) < this.right.evaluate(context)\n ? 1\n : 0;\n case \">\":\n return this.left.evaluate(context) > this.right.evaluate(context)\n ? 1\n : 0;\n case \"<=\":\n return this.left.evaluate(context) <= this.right.evaluate(context)\n ? 1\n : 0;\n case \">=\":\n return this.left.evaluate(context) >= this.right.evaluate(context)\n ? 1\n : 0;\n case \"&&\":\n return this.left.evaluate(context) && this.right.evaluate(context)\n ? 1\n : 0;\n case \"||\":\n return this.left.evaluate(context) || this.right.evaluate(context)\n ? 1\n : 0;\n default:\n throw new Error(`Unknown operator ${this.operator}`);\n }\n }\n search(callback) {\n this.left.search(callback);\n this.right.search(callback);\n }\n}\n/**\n * @class SwitchCase\n * @extends Node\n * @category AST\n */\nclass SwitchCase extends Node {\n constructor() {\n super();\n }\n}\n/**\n * @class Case\n * @extends SwitchCase\n * @category AST\n */\nclass Case extends SwitchCase {\n constructor(selector, body) {\n super();\n this.selector = selector;\n this.body = body;\n }\n get astNodeType() {\n return \"case\";\n }\n search(callback) {\n this.searchBlock(this.body, callback);\n }\n}\n/**\n * @class Default\n * @extends SwitchCase\n * @category AST\n */\nclass Default extends SwitchCase {\n constructor(body) {\n super();\n this.body = body;\n }\n get astNodeType() {\n return \"default\";\n }\n search(callback) {\n this.searchBlock(this.body, callback);\n }\n}\n/**\n * @class Argument\n * @extends Node\n * @category AST\n */\nclass Argument extends Node {\n constructor(name, type, attributes) {\n super();\n this.name = name;\n this.type = type;\n this.attributes = attributes;\n }\n get astNodeType() {\n return \"argument\";\n }\n}\n/**\n * @class ElseIf\n * @extends Node\n * @category AST\n */\nclass ElseIf extends Node {\n constructor(condition, body) {\n super();\n this.condition = condition;\n this.body = body;\n }\n get astNodeType() {\n return \"elseif\";\n }\n search(callback) {\n this.condition.search(callback);\n this.searchBlock(this.body, callback);\n }\n}\n/**\n * @class Member\n * @extends Node\n * @category AST\n */\nclass Member extends Node {\n constructor(name, type, attributes) {\n super();\n this.name = name;\n this.type = type;\n this.attributes = attributes;\n }\n get astNodeType() {\n return \"member\";\n }\n}\n/**\n * @class Attribute\n * @extends Node\n * @category AST\n */\nclass Attribute extends Node {\n constructor(name, value) {\n super();\n this.name = name;\n this.value = value;\n }\n get astNodeType() {\n return \"attribute\";\n }\n}\n\nvar _a;\nvar TokenClass;\n(function (TokenClass) {\n TokenClass[TokenClass[\"token\"] = 0] = \"token\";\n TokenClass[TokenClass[\"keyword\"] = 1] = \"keyword\";\n TokenClass[TokenClass[\"reserved\"] = 2] = \"reserved\";\n})(TokenClass || (TokenClass = {}));\nclass TokenType {\n constructor(name, type, rule) {\n this.name = name;\n this.type = type;\n this.rule = rule;\n }\n toString() {\n return this.name;\n }\n}\n/// Catalog of defined token types, keywords, and reserved words.\nclass TokenTypes {\n}\n_a = TokenTypes;\nTokenTypes.none = new TokenType(\"\", TokenClass.reserved, \"\");\nTokenTypes.eof = new TokenType(\"EOF\", TokenClass.token, \"\");\nTokenTypes.reserved = {\n asm: new TokenType(\"asm\", TokenClass.reserved, \"asm\"),\n bf16: new TokenType(\"bf16\", TokenClass.reserved, \"bf16\"),\n do: new TokenType(\"do\", TokenClass.reserved, \"do\"),\n enum: new TokenType(\"enum\", TokenClass.reserved, \"enum\"),\n f16: new TokenType(\"f16\", TokenClass.reserved, \"f16\"),\n f64: new TokenType(\"f64\", TokenClass.reserved, \"f64\"),\n handle: new TokenType(\"handle\", TokenClass.reserved, \"handle\"),\n i8: new TokenType(\"i8\", TokenClass.reserved, \"i8\"),\n i16: new TokenType(\"i16\", TokenClass.reserved, \"i16\"),\n i64: new TokenType(\"i64\", TokenClass.reserved, \"i64\"),\n mat: new TokenType(\"mat\", TokenClass.reserved, \"mat\"),\n premerge: new TokenType(\"premerge\", TokenClass.reserved, \"premerge\"),\n regardless: new TokenType(\"regardless\", TokenClass.reserved, \"regardless\"),\n typedef: new TokenType(\"typedef\", TokenClass.reserved, \"typedef\"),\n u8: new TokenType(\"u8\", TokenClass.reserved, \"u8\"),\n u16: new TokenType(\"u16\", TokenClass.reserved, \"u16\"),\n u64: new TokenType(\"u64\", TokenClass.reserved, \"u64\"),\n unless: new TokenType(\"unless\", TokenClass.reserved, \"unless\"),\n using: new TokenType(\"using\", TokenClass.reserved, \"using\"),\n vec: new TokenType(\"vec\", TokenClass.reserved, \"vec\"),\n void: new TokenType(\"void\", TokenClass.reserved, \"void\"),\n};\nTokenTypes.keywords = {\n array: new TokenType(\"array\", TokenClass.keyword, \"array\"),\n atomic: new TokenType(\"atomic\", TokenClass.keyword, \"atomic\"),\n bool: new TokenType(\"bool\", TokenClass.keyword, \"bool\"),\n f32: new TokenType(\"f32\", TokenClass.keyword, \"f32\"),\n i32: new TokenType(\"i32\", TokenClass.keyword, \"i32\"),\n mat2x2: new TokenType(\"mat2x2\", TokenClass.keyword, \"mat2x2\"),\n mat2x3: new TokenType(\"mat2x3\", TokenClass.keyword, \"mat2x3\"),\n mat2x4: new TokenType(\"mat2x4\", TokenClass.keyword, \"mat2x4\"),\n mat3x2: new TokenType(\"mat3x2\", TokenClass.keyword, \"mat3x2\"),\n mat3x3: new TokenType(\"mat3x3\", TokenClass.keyword, \"mat3x3\"),\n mat3x4: new TokenType(\"mat3x4\", TokenClass.keyword, \"mat3x4\"),\n mat4x2: new TokenType(\"mat4x2\", TokenClass.keyword, \"mat4x2\"),\n mat4x3: new TokenType(\"mat4x3\", TokenClass.keyword, \"mat4x3\"),\n mat4x4: new TokenType(\"mat4x4\", TokenClass.keyword, \"mat4x4\"),\n ptr: new TokenType(\"ptr\", TokenClass.keyword, \"ptr\"),\n sampler: new TokenType(\"sampler\", TokenClass.keyword, \"sampler\"),\n sampler_comparison: new TokenType(\"sampler_comparison\", TokenClass.keyword, \"sampler_comparison\"),\n struct: new TokenType(\"struct\", TokenClass.keyword, \"struct\"),\n texture_1d: new TokenType(\"texture_1d\", TokenClass.keyword, \"texture_1d\"),\n texture_2d: new TokenType(\"texture_2d\", TokenClass.keyword, \"texture_2d\"),\n texture_2d_array: new TokenType(\"texture_2d_array\", TokenClass.keyword, \"texture_2d_array\"),\n texture_3d: new TokenType(\"texture_3d\", TokenClass.keyword, \"texture_3d\"),\n texture_cube: new TokenType(\"texture_cube\", TokenClass.keyword, \"texture_cube\"),\n texture_cube_array: new TokenType(\"texture_cube_array\", TokenClass.keyword, \"texture_cube_array\"),\n texture_multisampled_2d: new TokenType(\"texture_multisampled_2d\", TokenClass.keyword, \"texture_multisampled_2d\"),\n texture_storage_1d: new TokenType(\"texture_storage_1d\", TokenClass.keyword, \"texture_storage_1d\"),\n texture_storage_2d: new TokenType(\"texture_storage_2d\", TokenClass.keyword, \"texture_storage_2d\"),\n texture_storage_2d_array: new TokenType(\"texture_storage_2d_array\", TokenClass.keyword, \"texture_storage_2d_array\"),\n texture_storage_3d: new TokenType(\"texture_storage_3d\", TokenClass.keyword, \"texture_storage_3d\"),\n texture_depth_2d: new TokenType(\"texture_depth_2d\", TokenClass.keyword, \"texture_depth_2d\"),\n texture_depth_2d_array: new TokenType(\"texture_depth_2d_array\", TokenClass.keyword, \"texture_depth_2d_array\"),\n texture_depth_cube: new TokenType(\"texture_depth_cube\", TokenClass.keyword, \"texture_depth_cube\"),\n texture_depth_cube_array: new TokenType(\"texture_depth_cube_array\", TokenClass.keyword, \"texture_depth_cube_array\"),\n texture_depth_multisampled_2d: new TokenType(\"texture_depth_multisampled_2d\", TokenClass.keyword, \"texture_depth_multisampled_2d\"),\n texture_external: new TokenType(\"texture_external\", TokenClass.keyword, \"texture_external\"),\n u32: new TokenType(\"u32\", TokenClass.keyword, \"u32\"),\n vec2: new TokenType(\"vec2\", TokenClass.keyword, \"vec2\"),\n vec3: new TokenType(\"vec3\", TokenClass.keyword, \"vec3\"),\n vec4: new TokenType(\"vec4\", TokenClass.keyword, \"vec4\"),\n bitcast: new TokenType(\"bitcast\", TokenClass.keyword, \"bitcast\"),\n block: new TokenType(\"block\", TokenClass.keyword, \"block\"),\n break: new TokenType(\"break\", TokenClass.keyword, \"break\"),\n case: new TokenType(\"case\", TokenClass.keyword, \"case\"),\n continue: new TokenType(\"continue\", TokenClass.keyword, \"continue\"),\n continuing: new TokenType(\"continuing\", TokenClass.keyword, \"continuing\"),\n default: new TokenType(\"default\", TokenClass.keyword, \"default\"),\n diagnostic: new TokenType(\"diagnostic\", TokenClass.keyword, \"diagnostic\"),\n discard: new TokenType(\"discard\", TokenClass.keyword, \"discard\"),\n else: new TokenType(\"else\", TokenClass.keyword, \"else\"),\n enable: new TokenType(\"enable\", TokenClass.keyword, \"enable\"),\n fallthrough: new TokenType(\"fallthrough\", TokenClass.keyword, \"fallthrough\"),\n false: new TokenType(\"false\", TokenClass.keyword, \"false\"),\n fn: new TokenType(\"fn\", TokenClass.keyword, \"fn\"),\n for: new TokenType(\"for\", TokenClass.keyword, \"for\"),\n function: new TokenType(\"function\", TokenClass.keyword, \"function\"),\n if: new TokenType(\"if\", TokenClass.keyword, \"if\"),\n let: new TokenType(\"let\", TokenClass.keyword, \"let\"),\n const: new TokenType(\"const\", TokenClass.keyword, \"const\"),\n loop: new TokenType(\"loop\", TokenClass.keyword, \"loop\"),\n while: new TokenType(\"while\", TokenClass.keyword, \"while\"),\n private: new TokenType(\"private\", TokenClass.keyword, \"private\"),\n read: new TokenType(\"read\", TokenClass.keyword, \"read\"),\n read_write: new TokenType(\"read_write\", TokenClass.keyword, \"read_write\"),\n return: new TokenType(\"return\", TokenClass.keyword, \"return\"),\n requires: new TokenType(\"requires\", TokenClass.keyword, \"requires\"),\n storage: new TokenType(\"storage\", TokenClass.keyword, \"storage\"),\n switch: new TokenType(\"switch\", TokenClass.keyword, \"switch\"),\n true: new TokenType(\"true\", TokenClass.keyword, \"true\"),\n alias: new TokenType(\"alias\", TokenClass.keyword, \"alias\"),\n type: new TokenType(\"type\", TokenClass.keyword, \"type\"),\n uniform: new TokenType(\"uniform\", TokenClass.keyword, \"uniform\"),\n var: new TokenType(\"var\", TokenClass.keyword, \"var\"),\n override: new TokenType(\"override\", TokenClass.keyword, \"override\"),\n workgroup: new TokenType(\"workgroup\", TokenClass.keyword, \"workgroup\"),\n write: new TokenType(\"write\", TokenClass.keyword, \"write\"),\n r8unorm: new TokenType(\"r8unorm\", TokenClass.keyword, \"r8unorm\"),\n r8snorm: new TokenType(\"r8snorm\", TokenClass.keyword, \"r8snorm\"),\n r8uint: new TokenType(\"r8uint\", TokenClass.keyword, \"r8uint\"),\n r8sint: new TokenType(\"r8sint\", TokenClass.keyword, \"r8sint\"),\n r16uint: new TokenType(\"r16uint\", TokenClass.keyword, \"r16uint\"),\n r16sint: new TokenType(\"r16sint\", TokenClass.keyword, \"r16sint\"),\n r16float: new TokenType(\"r16float\", TokenClass.keyword, \"r16float\"),\n rg8unorm: new TokenType(\"rg8unorm\", TokenClass.keyword, \"rg8unorm\"),\n rg8snorm: new TokenType(\"rg8snorm\", TokenClass.keyword, \"rg8snorm\"),\n rg8uint: new TokenType(\"rg8uint\", TokenClass.keyword, \"rg8uint\"),\n rg8sint: new TokenType(\"rg8sint\", TokenClass.keyword, \"rg8sint\"),\n r32uint: new TokenType(\"r32uint\", TokenClass.keyword, \"r32uint\"),\n r32sint: new TokenType(\"r32sint\", TokenClass.keyword, \"r32sint\"),\n r32float: new TokenType(\"r32float\", TokenClass.keyword, \"r32float\"),\n rg16uint: new TokenType(\"rg16uint\", TokenClass.keyword, \"rg16uint\"),\n rg16sint: new TokenType(\"rg16sint\", TokenClass.keyword, \"rg16sint\"),\n rg16float: new TokenType(\"rg16float\", TokenClass.keyword, \"rg16float\"),\n rgba8unorm: new TokenType(\"rgba8unorm\", TokenClass.keyword, \"rgba8unorm\"),\n rgba8unorm_srgb: new TokenType(\"rgba8unorm_srgb\", TokenClass.keyword, \"rgba8unorm_srgb\"),\n rgba8snorm: new TokenType(\"rgba8snorm\", TokenClass.keyword, \"rgba8snorm\"),\n rgba8uint: new TokenType(\"rgba8uint\", TokenClass.keyword, \"rgba8uint\"),\n rgba8sint: new TokenType(\"rgba8sint\", TokenClass.keyword, \"rgba8sint\"),\n bgra8unorm: new TokenType(\"bgra8unorm\", TokenClass.keyword, \"bgra8unorm\"),\n bgra8unorm_srgb: new TokenType(\"bgra8unorm_srgb\", TokenClass.keyword, \"bgra8unorm_srgb\"),\n rgb10a2unorm: new TokenType(\"rgb10a2unorm\", TokenClass.keyword, \"rgb10a2unorm\"),\n rg11b10float: new TokenType(\"rg11b10float\", TokenClass.keyword, \"rg11b10float\"),\n rg32uint: new TokenType(\"rg32uint\", TokenClass.keyword, \"rg32uint\"),\n rg32sint: new TokenType(\"rg32sint\", TokenClass.keyword, \"rg32sint\"),\n rg32float: new TokenType(\"rg32float\", TokenClass.keyword, \"rg32float\"),\n rgba16uint: new TokenType(\"rgba16uint\", TokenClass.keyword, \"rgba16uint\"),\n rgba16sint: new TokenType(\"rgba16sint\", TokenClass.keyword, \"rgba16sint\"),\n rgba16float: new TokenType(\"rgba16float\", TokenClass.keyword, \"rgba16float\"),\n rgba32uint: new TokenType(\"rgba32uint\", TokenClass.keyword, \"rgba32uint\"),\n rgba32sint: new TokenType(\"rgba32sint\", TokenClass.keyword, \"rgba32sint\"),\n rgba32float: new TokenType(\"rgba32float\", TokenClass.keyword, \"rgba32float\"),\n static_assert: new TokenType(\"static_assert\", TokenClass.keyword, \"static_assert\"),\n // WGSL grammar has a few keywords that have different token names than the strings they\n // represent. Aliasing them here.\n /*int32: new TokenType(\"i32\", TokenClass.keyword, \"i32\"),\n uint32: new TokenType(\"u32\", TokenClass.keyword, \"u32\"),\n float32: new TokenType(\"f32\", TokenClass.keyword, \"f32\"),\n pointer: new TokenType(\"ptr\", TokenClass.keyword, \"ptr\"),*/\n};\nTokenTypes.tokens = {\n decimal_float_literal: new TokenType(\"decimal_float_literal\", TokenClass.token, /((-?[0-9]*\\.[0-9]+|-?[0-9]+\\.[0-9]*)((e|E)(\\+|-)?[0-9]+)?f?)|(-?[0-9]+(e|E)(\\+|-)?[0-9]+f?)|([0-9]+f)/),\n hex_float_literal: new TokenType(\"hex_float_literal\", TokenClass.token, /-?0x((([0-9a-fA-F]*\\.[0-9a-fA-F]+|[0-9a-fA-F]+\\.[0-9a-fA-F]*)((p|P)(\\+|-)?[0-9]+f?)?)|([0-9a-fA-F]+(p|P)(\\+|-)?[0-9]+f?))/),\n int_literal: new TokenType(\"int_literal\", TokenClass.token, /-?0x[0-9a-fA-F]+|0i?|-?[1-9][0-9]*i?/),\n uint_literal: new TokenType(\"uint_literal\", TokenClass.token, /0x[0-9a-fA-F]+u|0u|[1-9][0-9]*u/),\n ident: new TokenType(\"ident\", TokenClass.token, /[_a-zA-Z][0-9a-zA-Z_]*/),\n and: new TokenType(\"and\", TokenClass.token, \"&\"),\n and_and: new TokenType(\"and_and\", TokenClass.token, \"&&\"),\n arrow: new TokenType(\"arrow \", TokenClass.token, \"->\"),\n attr: new TokenType(\"attr\", TokenClass.token, \"@\"),\n attr_left: new TokenType(\"attr_left\", TokenClass.token, \"[[\"),\n attr_right: new TokenType(\"attr_right\", TokenClass.token, \"]]\"),\n forward_slash: new TokenType(\"forward_slash\", TokenClass.token, \"/\"),\n bang: new TokenType(\"bang\", TokenClass.token, \"!\"),\n bracket_left: new TokenType(\"bracket_left\", TokenClass.token, \"[\"),\n bracket_right: new TokenType(\"bracket_right\", TokenClass.token, \"]\"),\n brace_left: new TokenType(\"brace_left\", TokenClass.token, \"{\"),\n brace_right: new TokenType(\"brace_right\", TokenClass.token, \"}\"),\n colon: new TokenType(\"colon\", TokenClass.token, \":\"),\n comma: new TokenType(\"comma\", TokenClass.token, \",\"),\n equal: new TokenType(\"equal\", TokenClass.token, \"=\"),\n equal_equal: new TokenType(\"equal_equal\", TokenClass.token, \"==\"),\n not_equal: new TokenType(\"not_equal\", TokenClass.token, \"!=\"),\n greater_than: new TokenType(\"greater_than\", TokenClass.token, \">\"),\n greater_than_equal: new TokenType(\"greater_than_equal\", TokenClass.token, \">=\"),\n shift_right: new TokenType(\"shift_right\", TokenClass.token, \">>\"),\n less_than: new TokenType(\"less_than\", TokenClass.token, \"<\"),\n less_than_equal: new TokenType(\"less_than_equal\", TokenClass.token, \"<=\"),\n shift_left: new TokenType(\"shift_left\", TokenClass.token, \"<<\"),\n modulo: new TokenType(\"modulo\", TokenClass.token, \"%\"),\n minus: new TokenType(\"minus\", TokenClass.token, \"-\"),\n minus_minus: new TokenType(\"minus_minus\", TokenClass.token, \"--\"),\n period: new TokenType(\"period\", TokenClass.token, \".\"),\n plus: new TokenType(\"plus\", TokenClass.token, \"+\"),\n plus_plus: new TokenType(\"plus_plus\", TokenClass.token, \"++\"),\n or: new TokenType(\"or\", TokenClass.token, \"|\"),\n or_or: new TokenType(\"or_or\", TokenClass.token, \"||\"),\n paren_left: new TokenType(\"paren_left\", TokenClass.token, \"(\"),\n paren_right: new TokenType(\"paren_right\", TokenClass.token, \")\"),\n semicolon: new TokenType(\"semicolon\", TokenClass.token, \";\"),\n star: new TokenType(\"star\", TokenClass.token, \"*\"),\n tilde: new TokenType(\"tilde\", TokenClass.token, \"~\"),\n underscore: new TokenType(\"underscore\", TokenClass.token, \"_\"),\n xor: new TokenType(\"xor\", TokenClass.token, \"^\"),\n plus_equal: new TokenType(\"plus_equal\", TokenClass.token, \"+=\"),\n minus_equal: new TokenType(\"minus_equal\", TokenClass.token, \"-=\"),\n times_equal: new TokenType(\"times_equal\", TokenClass.token, \"*=\"),\n division_equal: new TokenType(\"division_equal\", TokenClass.token, \"/=\"),\n modulo_equal: new TokenType(\"modulo_equal\", TokenClass.token, \"%=\"),\n and_equal: new TokenType(\"and_equal\", TokenClass.token, \"&=\"),\n or_equal: new TokenType(\"or_equal\", TokenClass.token, \"|=\"),\n xor_equal: new TokenType(\"xor_equal\", TokenClass.token, \"^=\"),\n shift_right_equal: new TokenType(\"shift_right_equal\", TokenClass.token, \">>=\"),\n shift_left_equal: new TokenType(\"shift_left_equal\", TokenClass.token, \"<<=\"),\n};\nTokenTypes.simpleTokens = {\n \"@\": _a.tokens.attr,\n \"{\": _a.tokens.brace_left,\n \"}\": _a.tokens.brace_right,\n \":\": _a.tokens.colon,\n \",\": _a.tokens.comma,\n \"(\": _a.tokens.paren_left,\n \")\": _a.tokens.paren_right,\n \";\": _a.tokens.semicolon,\n};\nTokenTypes.literalTokens = {\n \"&\": _a.tokens.and,\n \"&&\": _a.tokens.and_and,\n \"->\": _a.tokens.arrow,\n \"[[\": _a.tokens.attr_left,\n \"]]\": _a.tokens.attr_right,\n \"/\": _a.tokens.forward_slash,\n \"!\": _a.tokens.bang,\n \"[\": _a.tokens.bracket_left,\n \"]\": _a.tokens.bracket_right,\n \"=\": _a.tokens.equal,\n \"==\": _a.tokens.equal_equal,\n \"!=\": _a.tokens.not_equal,\n \">\": _a.tokens.greater_than,\n \">=\": _a.tokens.greater_than_equal,\n \">>\": _a.tokens.shift_right,\n \"<\": _a.tokens.less_than,\n \"<=\": _a.tokens.less_than_equal,\n \"<<\": _a.tokens.shift_left,\n \"%\": _a.tokens.modulo,\n \"-\": _a.tokens.minus,\n \"--\": _a.tokens.minus_minus,\n \".\": _a.tokens.period,\n \"+\": _a.tokens.plus,\n \"++\": _a.tokens.plus_plus,\n \"|\": _a.tokens.or,\n \"||\": _a.tokens.or_or,\n \"*\": _a.tokens.star,\n \"~\": _a.tokens.tilde,\n \"_\": _a.tokens.underscore,\n \"^\": _a.tokens.xor,\n \"+=\": _a.tokens.plus_equal,\n \"-=\": _a.tokens.minus_equal,\n \"*=\": _a.tokens.times_equal,\n \"/=\": _a.tokens.division_equal,\n \"%=\": _a.tokens.modulo_equal,\n \"&=\": _a.tokens.and_equal,\n \"|=\": _a.tokens.or_equal,\n \"^=\": _a.tokens.xor_equal,\n \">>=\": _a.tokens.shift_right_equal,\n \"<<=\": _a.tokens.shift_left_equal,\n};\nTokenTypes.regexTokens = {\n decimal_float_literal: _a.tokens.decimal_float_literal,\n hex_float_literal: _a.tokens.hex_float_literal,\n int_literal: _a.tokens.int_literal,\n uint_literal: _a.tokens.uint_literal,\n ident: _a.tokens.ident,\n};\nTokenTypes.storage_class = [\n _a.keywords.function,\n _a.keywords.private,\n _a.keywords.workgroup,\n _a.keywords.uniform,\n _a.keywords.storage,\n];\nTokenTypes.access_mode = [\n _a.keywords.read,\n _a.keywords.write,\n _a.keywords.read_write,\n];\nTokenTypes.sampler_type = [\n _a.keywords.sampler,\n _a.keywords.sampler_comparison,\n];\nTokenTypes.sampled_texture_type = [\n _a.keywords.texture_1d,\n _a.keywords.texture_2d,\n _a.keywords.texture_2d_array,\n _a.keywords.texture_3d,\n _a.keywords.texture_cube,\n _a.keywords.texture_cube_array,\n];\nTokenTypes.multisampled_texture_type = [\n _a.keywords.texture_multisampled_2d,\n];\nTokenTypes.storage_texture_type = [\n _a.keywords.texture_storage_1d,\n _a.keywords.texture_storage_2d,\n _a.keywords.texture_storage_2d_array,\n _a.keywords.texture_storage_3d,\n];\nTokenTypes.depth_texture_type = [\n _a.keywords.texture_depth_2d,\n _a.keywords.texture_depth_2d_array,\n _a.keywords.texture_depth_cube,\n _a.keywords.texture_depth_cube_array,\n _a.keywords.texture_depth_multisampled_2d,\n];\nTokenTypes.texture_external_type = [_a.keywords.texture_external];\nTokenTypes.any_texture_type = [\n ..._a.sampled_texture_type,\n ..._a.multisampled_texture_type,\n ..._a.storage_texture_type,\n ..._a.depth_texture_type,\n ..._a.texture_external_type,\n];\nTokenTypes.texel_format = [\n _a.keywords.r8unorm,\n _a.keywords.r8snorm,\n _a.keywords.r8uint,\n _a.keywords.r8sint,\n _a.keywords.r16uint,\n _a.keywords.r16sint,\n _a.keywords.r16float,\n _a.keywords.rg8unorm,\n _a.keywords.rg8snorm,\n _a.keywords.rg8uint,\n _a.keywords.rg8sint,\n _a.keywords.r32uint,\n _a.keywords.r32sint,\n _a.keywords.r32float,\n _a.keywords.rg16uint,\n _a.keywords.rg16sint,\n _a.keywords.rg16float,\n _a.keywords.rgba8unorm,\n _a.keywords.rgba8unorm_srgb,\n _a.keywords.rgba8snorm,\n _a.keywords.rgba8uint,\n _a.keywords.rgba8sint,\n _a.keywords.bgra8unorm,\n _a.keywords.bgra8unorm_srgb,\n _a.keywords.rgb10a2unorm,\n _a.keywords.rg11b10float,\n _a.keywords.rg32uint,\n _a.keywords.rg32sint,\n _a.keywords.rg32float,\n _a.keywords.rgba16uint,\n _a.keywords.rgba16sint,\n _a.keywords.rgba16float,\n _a.keywords.rgba32uint,\n _a.keywords.rgba32sint,\n _a.keywords.rgba32float,\n];\nTokenTypes.const_literal = [\n _a.tokens.int_literal,\n _a.tokens.uint_literal,\n _a.tokens.decimal_float_literal,\n _a.tokens.hex_float_literal,\n _a.keywords.true,\n _a.keywords.false,\n];\nTokenTypes.literal_or_ident = [\n _a.tokens.ident,\n _a.tokens.int_literal,\n _a.tokens.uint_literal,\n _a.tokens.decimal_float_literal,\n _a.tokens.hex_float_literal,\n];\nTokenTypes.element_count_expression = [\n _a.tokens.int_literal,\n _a.tokens.uint_literal,\n _a.tokens.ident,\n];\nTokenTypes.template_types = [\n _a.keywords.vec2,\n _a.keywords.vec3,\n _a.keywords.vec4,\n _a.keywords.mat2x2,\n _a.keywords.mat2x3,\n _a.keywords.mat2x4,\n _a.keywords.mat3x2,\n _a.keywords.mat3x3,\n _a.keywords.mat3x4,\n _a.keywords.mat4x2,\n _a.keywords.mat4x3,\n _a.keywords.mat4x4,\n _a.keywords.atomic,\n _a.keywords.bitcast,\n ..._a.any_texture_type,\n];\n// The grammar calls out 'block', but attribute grammar is defined to use a 'ident'.\n// The attribute grammar should be ident | block.\nTokenTypes.attribute_name = [_a.tokens.ident, _a.keywords.block, _a.keywords.diagnostic];\nTokenTypes.assignment_operators = [\n _a.tokens.equal,\n _a.tokens.plus_equal,\n _a.tokens.minus_equal,\n _a.tokens.times_equal,\n _a.tokens.division_equal,\n _a.tokens.modulo_equal,\n _a.tokens.and_equal,\n _a.tokens.or_equal,\n _a.tokens.xor_equal,\n _a.tokens.shift_right_equal,\n _a.tokens.shift_left_equal,\n];\nTokenTypes.increment_operators = [\n _a.tokens.plus_plus,\n _a.tokens.minus_minus,\n];\n/// A token parsed by the WgslScanner.\nclass Token {\n constructor(type, lexeme, line) {\n this.type = type;\n this.lexeme = lexeme;\n this.line = line;\n }\n toString() {\n return this.lexeme;\n }\n isTemplateType() {\n return TokenTypes.template_types.indexOf(this.type) != -1;\n }\n isArrayType() {\n return this.type == TokenTypes.keywords.array;\n }\n isArrayOrTemplateType() {\n return this.isArrayType() || this.isTemplateType();\n }\n}\n/// Lexical scanner for the WGSL language. This takes an input source text and generates a list\n/// of Token objects, which can then be fed into the WgslParser to generate an AST.\nclass WgslScanner {\n constructor(source) {\n this._tokens = [];\n this._start = 0;\n this._current = 0;\n this._line = 1;\n this._source = source !== null && source !== void 0 ? source : \"\";\n }\n /// Scan all tokens from the source.\n scanTokens() {\n while (!this._isAtEnd()) {\n this._start = this._current;\n if (!this.scanToken()) {\n throw `Invalid syntax at line ${this._line}`;\n }\n }\n this._tokens.push(new Token(TokenTypes.eof, \"\", this._line));\n return this._tokens;\n }\n /// Scan a single token from the source.\n scanToken() {\n // Find the longest consecutive set of characters that match a rule.\n let lexeme = this._advance();\n // Skip line-feed, adding to the line counter.\n if (lexeme == \"\\n\") {\n this._line++;\n return true;\n }\n // Skip whitespace\n if (this._isWhitespace(lexeme)) {\n return true;\n }\n if (lexeme == \"/\") {\n // If it's a // comment, skip everything until the next line-feed.\n if (this._peekAhead() == \"/\") {\n while (lexeme != \"\\n\") {\n if (this._isAtEnd()) {\n return true;\n }\n lexeme = this._advance();\n }\n // skip the linefeed\n this._line++;\n return true;\n }\n else if (this._peekAhead() == \"*\") {\n // If it's a / * block comment, skip everything until the matching * /,\n // allowing for nested block comments.\n this._advance();\n let commentLevel = 1;\n while (commentLevel > 0) {\n if (this._isAtEnd()) {\n return true;\n }\n lexeme = this._advance();\n if (lexeme == \"\\n\") {\n this._line++;\n }\n else if (lexeme == \"*\") {\n if (this._peekAhead() == \"/\") {\n this._advance();\n commentLevel--;\n if (commentLevel == 0) {\n return true;\n }\n }\n }\n else if (lexeme == \"/\") {\n if (this._peekAhead() == \"*\") {\n this._advance();\n commentLevel++;\n }\n }\n }\n return true;\n }\n }\n // Shortcut single character tokens\n const simpleToken = TokenTypes.simpleTokens[lexeme];\n if (simpleToken) {\n this._addToken(simpleToken);\n return true;\n }\n // Shortcut keywords and identifiers\n let matchType = TokenTypes.none;\n const isAlpha = this._isAlpha(lexeme);\n const isUnderscore = lexeme === \"_\";\n if (this._isAlphaNumeric(lexeme)) {\n let nextChar = this._peekAhead();\n while (this._isAlphaNumeric(nextChar)) {\n lexeme += this._advance();\n nextChar = this._peekAhead();\n }\n }\n if (isAlpha) {\n const matchedType = TokenTypes.keywords[lexeme];\n if (matchedType) {\n this._addToken(matchedType);\n return true;\n }\n }\n if (isAlpha || isUnderscore) {\n this._addToken(TokenTypes.tokens.ident);\n return true;\n }\n // Scan for the next valid token type\n for (;;) {\n let matchedType = this._findType(lexeme);\n // An exception to \"longest lexeme\" rule is '>>'. In the case of 1>>2, it's a\n // shift_right.\n // In the case of array>, it's two greater_than's (one to close the vec4,\n // and one to close the array).\n // Another ambiguity is '>='. In the case of vec2=vec2(1,2),\n // it's a greather_than and an equal, not a greater_than_equal.\n // WGSL requires context sensitive parsing to resolve these ambiguities. Both of these cases\n // are predicated on it the > either closing a template, or being part of an operator.\n // The solution here is to check if there was a less_than up to some number of tokens\n // previously, and the token prior to that is a keyword that requires a '<', then it will be\n // split into two operators; otherwise it's a single operator.\n const nextLexeme = this._peekAhead();\n if (lexeme == \">\" && (nextLexeme == \">\" || nextLexeme == \"=\")) {\n let foundLessThan = false;\n let ti = this._tokens.length - 1;\n for (let count = 0; count < 5 && ti >= 0; ++count, --ti) {\n if (this._tokens[ti].type === TokenTypes.tokens.less_than) {\n if (ti > 0 && this._tokens[ti - 1].isArrayOrTemplateType()) {\n foundLessThan = true;\n }\n break;\n }\n }\n // If there was a less_than in the recent token history, then this is probably a\n // greater_than.\n if (foundLessThan) {\n this._addToken(matchedType);\n return true;\n }\n }\n // The current lexeme may not match any rule, but some token types may be invalid for\n // part of the string but valid after a few more characters.\n // For example, 0x.5 is a hex_float_literal. But as it's being scanned,\n // \"0\" is a int_literal, then \"0x\" is invalid. If we stopped there, it would return\n // the int_literal \"0\", but that's incorrect. So if we look forward a few characters,\n // we'd get \"0x.\", which is still invalid, followed by \"0x.5\" which is the correct\n // hex_float_literal. So that means if we hit an non-matching string, we should look\n // ahead up to two characters to see if the string starts matching a valid rule again.\n if (matchedType === TokenTypes.none) {\n let lookAheadLexeme = lexeme;\n let lookAhead = 0;\n const maxLookAhead = 2;\n for (let li = 0; li < maxLookAhead; ++li) {\n lookAheadLexeme += this._peekAhead(li);\n matchedType = this._findType(lookAheadLexeme);\n if (matchedType !== TokenTypes.none) {\n lookAhead = li;\n break;\n }\n }\n if (matchedType === TokenTypes.none) {\n if (matchType === TokenTypes.none) {\n return false;\n }\n this._current--;\n this._addToken(matchType);\n return true;\n }\n lexeme = lookAheadLexeme;\n this._current += lookAhead + 1;\n }\n matchType = matchedType;\n if (this._isAtEnd()) {\n break;\n }\n lexeme += this._advance();\n }\n // We got to the end of the input stream. Then the token we've ready so far is it.\n if (matchType === TokenTypes.none) {\n return false;\n }\n this._addToken(matchType);\n return true;\n }\n _findType(lexeme) {\n for (const name in TokenTypes.regexTokens) {\n const type = TokenTypes.regexTokens[name];\n if (this._match(lexeme, type.rule)) {\n return type;\n }\n }\n const type = TokenTypes.literalTokens[lexeme];\n if (type) {\n return type;\n }\n return TokenTypes.none;\n }\n _match(lexeme, rule) {\n const match = rule.exec(lexeme);\n return match && match.index == 0 && match[0] == lexeme;\n }\n _isAtEnd() {\n return this._current >= this._source.length;\n }\n _isAlpha(c) {\n return (c >= \"a\" && c <= \"z\") || (c >= \"A\" && c <= \"Z\");\n }\n _isAlphaNumeric(c) {\n return (c >= \"a\" && c <= \"z\") || (c >= \"A\" && c <= \"Z\") || c == \"_\" || (c >= \"0\" && c <= \"9\");\n }\n _isWhitespace(c) {\n return c == \" \" || c == \"\\t\" || c == \"\\r\";\n }\n _advance(amount = 0) {\n let c = this._source[this._current];\n amount = amount || 0;\n amount++;\n this._current += amount;\n return c;\n }\n _peekAhead(offset = 0) {\n offset = offset || 0;\n if (this._current + offset >= this._source.length) {\n return \"\\0\";\n }\n return this._source[this._current + offset];\n }\n _addToken(type) {\n const text = this._source.substring(this._start, this._current);\n this._tokens.push(new Token(type, text, this._line));\n }\n}\n\n/**\n * @author Brendan Duncan / https://github.com/brendan-duncan\n */\n/// Parse a sequence of tokens from the WgslScanner into an Abstract Syntax Tree (AST).\nclass WgslParser {\n constructor() {\n this._tokens = [];\n this._current = 0;\n this._currentLine = 0;\n this._context = new ParseContext();\n this._deferArrayCountEval = [];\n }\n parse(tokensOrCode) {\n this._initialize(tokensOrCode);\n this._deferArrayCountEval.length = 0;\n const statements = [];\n while (!this._isAtEnd()) {\n const statement = this._global_decl_or_directive();\n if (!statement) {\n break;\n }\n statements.push(statement);\n }\n // Since constants can be declared after they are used, and\n // constants can be used to size arrays, defer calculating the\n // size until after the shader has finished parsing.\n if (this._deferArrayCountEval.length > 0) {\n for (const arrayDecl of this._deferArrayCountEval) {\n const arrayType = arrayDecl[\"arrayType\"];\n const countNode = arrayDecl[\"countNode\"];\n if (countNode instanceof VariableExpr) {\n const variable = countNode;\n const name = variable.name;\n const constant = this._context.constants.get(name);\n if (constant) {\n try {\n const count = constant.evaluate(this._context);\n arrayType.count = count;\n }\n catch (e) {\n }\n }\n }\n }\n this._deferArrayCountEval.length = 0;\n }\n return statements;\n }\n _initialize(tokensOrCode) {\n if (tokensOrCode) {\n if (typeof tokensOrCode == \"string\") {\n const scanner = new WgslScanner(tokensOrCode);\n this._tokens = scanner.scanTokens();\n }\n else {\n this._tokens = tokensOrCode;\n }\n }\n else {\n this._tokens = [];\n }\n this._current = 0;\n }\n _error(token, message) {\n return {\n token,\n message,\n toString: function () {\n return `${message}`;\n },\n };\n }\n _isAtEnd() {\n return (this._current >= this._tokens.length ||\n this._peek().type == TokenTypes.eof);\n }\n _match(types) {\n if (types instanceof TokenType) {\n if (this._check(types)) {\n this._advance();\n return true;\n }\n return false;\n }\n for (let i = 0, l = types.length; i < l; ++i) {\n const type = types[i];\n if (this._check(type)) {\n this._advance();\n return true;\n }\n }\n return false;\n }\n _consume(types, message) {\n if (this._check(types)) {\n return this._advance();\n }\n throw this._error(this._peek(), message);\n }\n _check(types) {\n if (this._isAtEnd()) {\n return false;\n }\n const tk = this._peek();\n if (types instanceof Array) {\n const t = tk.type;\n const index = types.indexOf(t);\n return index != -1;\n }\n return tk.type == types;\n }\n _advance() {\n var _a, _b;\n this._currentLine = (_b = (_a = this._peek()) === null || _a === void 0 ? void 0 : _a.line) !== null && _b !== void 0 ? _b : -1;\n if (!this._isAtEnd()) {\n this._current++;\n }\n return this._previous();\n }\n _peek() {\n return this._tokens[this._current];\n }\n _previous() {\n return this._tokens[this._current - 1];\n }\n _global_decl_or_directive() {\n // semicolon\n // global_variable_decl semicolon\n // global_constant_decl semicolon\n // type_alias semicolon\n // struct_decl\n // function_decl\n // enable_directive\n // Ignore any stand-alone semicolons\n while (this._match(TokenTypes.tokens.semicolon) && !this._isAtEnd())\n ;\n if (this._match(TokenTypes.keywords.alias)) {\n const type = this._type_alias();\n this._consume(TokenTypes.tokens.semicolon, \"Expected ';'\");\n return type;\n }\n if (this._match(TokenTypes.keywords.diagnostic)) {\n const directive = this._diagnostic();\n this._consume(TokenTypes.tokens.semicolon, \"Expected ';'\");\n return directive;\n }\n if (this._match(TokenTypes.keywords.requires)) {\n const requires = this._requires_directive();\n this._consume(TokenTypes.tokens.semicolon, \"Expected ';'\");\n return requires;\n }\n if (this._match(TokenTypes.keywords.enable)) {\n const enable = this._enable_directive();\n this._consume(TokenTypes.tokens.semicolon, \"Expected ';'\");\n return enable;\n }\n // The following statements have an optional attribute*\n const attrs = this._attribute();\n if (this._check(TokenTypes.keywords.var)) {\n const _var = this._global_variable_decl();\n if (_var != null) {\n _var.attributes = attrs;\n }\n this._consume(TokenTypes.tokens.semicolon, \"Expected ';'.\");\n return _var;\n }\n if (this._check(TokenTypes.keywords.override)) {\n const _override = this._override_variable_decl();\n if (_override != null) {\n _override.attributes = attrs;\n }\n this._consume(TokenTypes.tokens.semicolon, \"Expected ';'.\");\n return _override;\n }\n if (this._check(TokenTypes.keywords.let)) {\n const _let = this._global_let_decl();\n if (_let != null) {\n _let.attributes = attrs;\n }\n this._consume(TokenTypes.tokens.semicolon, \"Expected ';'.\");\n return _let;\n }\n if (this._check(TokenTypes.keywords.const)) {\n const _const = this._global_const_decl();\n if (_const != null) {\n _const.attributes = attrs;\n }\n this._consume(TokenTypes.tokens.semicolon, \"Expected ';'.\");\n return _const;\n }\n if (this._check(TokenTypes.keywords.struct)) {\n const _struct = this._struct_decl();\n if (_struct != null) {\n _struct.attributes = attrs;\n }\n return _struct;\n }\n if (this._check(TokenTypes.keywords.fn)) {\n const _fn = this._function_decl();\n if (_fn != null) {\n _fn.attributes = attrs;\n }\n return _fn;\n }\n return null;\n }\n _function_decl() {\n // attribute* function_header compound_statement\n // function_header: fn ident paren_left param_list? paren_right (arrow attribute* type_decl)?\n if (!this._match(TokenTypes.keywords.fn)) {\n return null;\n }\n const startLine = this._currentLine;\n const name = this._consume(TokenTypes.tokens.ident, \"Expected function name.\").toString();\n this._consume(TokenTypes.tokens.paren_left, \"Expected '(' for function arguments.\");\n const args = [];\n if (!this._check(TokenTypes.tokens.paren_right)) {\n do {\n if (this._check(TokenTypes.tokens.paren_right)) {\n break;\n }\n const argAttrs = this._attribute();\n const name = this._consume(TokenTypes.tokens.ident, \"Expected argument name.\").toString();\n this._consume(TokenTypes.tokens.colon, \"Expected ':' for argument type.\");\n const typeAttrs = this._attribute();\n const type = this._type_decl();\n if (type != null) {\n type.attributes = typeAttrs;\n args.push(new Argument(name, type, argAttrs));\n }\n } while (this._match(TokenTypes.tokens.comma));\n }\n this._consume(TokenTypes.tokens.paren_right, \"Expected ')' after function arguments.\");\n let _return = null;\n if (this._match(TokenTypes.tokens.arrow)) {\n const attrs = this._attribute();\n _return = this._type_decl();\n if (_return != null) {\n _return.attributes = attrs;\n }\n }\n const body = this._compound_statement();\n const endLine = this._currentLine;\n return new Function(name, args, _return, body, startLine, endLine);\n }\n _compound_statement() {\n // brace_left statement* brace_right\n const statements = [];\n this._consume(TokenTypes.tokens.brace_left, \"Expected '{' for block.\");\n while (!this._check(TokenTypes.tokens.brace_right)) {\n const statement = this._statement();\n if (statement !== null) {\n statements.push(statement);\n }\n }\n this._consume(TokenTypes.tokens.brace_right, \"Expected '}' for block.\");\n return statements;\n }\n _statement() {\n // semicolon\n // return_statement semicolon\n // if_statement\n // switch_statement\n // loop_statement\n // for_statement\n // func_call_statement semicolon\n // variable_statement semicolon\n // break_statement semicolon\n // continue_statement semicolon\n // continuing_statement compound_statement\n // discard semicolon\n // assignment_statement semicolon\n // compound_statement\n // increment_statement semicolon\n // decrement_statement semicolon\n // static_assert_statement semicolon\n // Ignore any stand-alone semicolons\n while (this._match(TokenTypes.tokens.semicolon) && !this._isAtEnd())\n ;\n if (this._check(TokenTypes.tokens.attr)) {\n this._attribute();\n }\n if (this._check(TokenTypes.keywords.if)) {\n return this._if_statement();\n }\n if (this._check(TokenTypes.keywords.switch)) {\n return this._switch_statement();\n }\n if (this._check(TokenTypes.keywords.loop)) {\n return this._loop_statement();\n }\n if (this._check(TokenTypes.keywords.for)) {\n return this._for_statement();\n }\n if (this._check(TokenTypes.keywords.while)) {\n return this._while_statement();\n }\n if (this._check(TokenTypes.keywords.continuing)) {\n return this._continuing_statement();\n }\n if (this._check(TokenTypes.keywords.static_assert)) {\n return this._static_assert_statement();\n }\n if (this._check(TokenTypes.tokens.brace_left)) {\n return this._compound_statement();\n }\n let result = null;\n if (this._check(TokenTypes.keywords.return)) {\n result = this._return_statement();\n }\n else if (this._check([\n TokenTypes.keywords.var,\n TokenTypes.keywords.let,\n TokenTypes.keywords.const,\n ])) {\n result = this._variable_statement();\n }\n else if (this._match(TokenTypes.keywords.discard)) {\n result = new Discard();\n }\n else if (this._match(TokenTypes.keywords.break)) {\n result = new Break();\n }\n else if (this._match(TokenTypes.keywords.continue)) {\n result = new Continue();\n }\n else {\n result =\n this._increment_decrement_statement() ||\n this._func_call_statement() ||\n this._assignment_statement();\n }\n if (result != null) {\n this._consume(TokenTypes.tokens.semicolon, \"Expected ';' after statement.\");\n }\n return result;\n }\n _static_assert_statement() {\n if (!this._match(TokenTypes.keywords.static_assert)) {\n return null;\n }\n const expression = this._optional_paren_expression();\n return new StaticAssert(expression);\n }\n _while_statement() {\n if (!this._match(TokenTypes.keywords.while)) {\n return null;\n }\n const condition = this._optional_paren_expression();\n if (this._check(TokenTypes.tokens.attr)) {\n this._attribute();\n }\n const block = this._compound_statement();\n return new While(condition, block);\n }\n _continuing_statement() {\n if (!this._match(TokenTypes.keywords.continuing)) {\n return null;\n }\n const block = this._compound_statement();\n return new Continuing(block);\n }\n _for_statement() {\n // for paren_left for_header paren_right compound_statement\n if (!this._match(TokenTypes.keywords.for)) {\n return null;\n }\n this._consume(TokenTypes.tokens.paren_left, \"Expected '('.\");\n // for_header: (variable_statement assignment_statement func_call_statement)? semicolon short_circuit_or_expression? semicolon (assignment_statement func_call_statement)?\n const init = !this._check(TokenTypes.tokens.semicolon)\n ? this._for_init()\n : null;\n this._consume(TokenTypes.tokens.semicolon, \"Expected ';'.\");\n const condition = !this._check(TokenTypes.tokens.semicolon)\n ? this._short_circuit_or_expression()\n : null;\n this._consume(TokenTypes.tokens.semicolon, \"Expected ';'.\");\n const increment = !this._check(TokenTypes.tokens.paren_right)\n ? this._for_increment()\n : null;\n this._consume(TokenTypes.tokens.paren_right, \"Expected ')'.\");\n if (this._check(TokenTypes.tokens.attr)) {\n this._attribute();\n }\n const body = this._compound_statement();\n return new For(init, condition, increment, body);\n }\n _for_init() {\n // (variable_statement assignment_statement func_call_statement)?\n return (this._variable_statement() ||\n this._func_call_statement() ||\n this._assignment_statement());\n }\n _for_increment() {\n // (assignment_statement func_call_statement increment_statement)?\n return (this._func_call_statement() ||\n this._increment_decrement_statement() ||\n this._assignment_statement());\n }\n _variable_statement() {\n // variable_decl\n // variable_decl equal short_circuit_or_expression\n // let (ident variable_ident_decl) equal short_circuit_or_expression\n // const (ident variable_ident_decl) equal short_circuit_or_expression\n if (this._check(TokenTypes.keywords.var)) {\n const _var = this._variable_decl();\n if (_var === null) {\n throw this._error(this._peek(), \"Variable declaration expected.\");\n }\n let value = null;\n if (this._match(TokenTypes.tokens.equal)) {\n value = this._short_circuit_or_expression();\n }\n return new Var(_var.name, _var.type, _var.storage, _var.access, value);\n }\n if (this._match(TokenTypes.keywords.let)) {\n const name = this._consume(TokenTypes.tokens.ident, \"Expected name for let.\").toString();\n let type = null;\n if (this._match(TokenTypes.tokens.colon)) {\n const typeAttrs = this._attribute();\n type = this._type_decl();\n if (type != null) {\n type.attributes = typeAttrs;\n }\n }\n this._consume(TokenTypes.tokens.equal, \"Expected '=' for let.\");\n const value = this._short_circuit_or_expression();\n return new Let(name, type, null, null, value);\n }\n if (this._match(TokenTypes.keywords.const)) {\n const name = this._consume(TokenTypes.tokens.ident, \"Expected name for const.\").toString();\n let type = null;\n if (this._match(TokenTypes.tokens.colon)) {\n const typeAttrs = this._attribute();\n type = this._type_decl();\n if (type != null) {\n type.attributes = typeAttrs;\n }\n }\n this._consume(TokenTypes.tokens.equal, \"Expected '=' for const.\");\n const value = this._short_circuit_or_expression();\n return new Const(name, type, null, null, value);\n }\n return null;\n }\n _increment_decrement_statement() {\n const savedPos = this._current;\n const _var = this._unary_expression();\n if (_var == null) {\n return null;\n }\n if (!this._check(TokenTypes.increment_operators)) {\n this._current = savedPos;\n return null;\n }\n const token = this._consume(TokenTypes.increment_operators, \"Expected increment operator\");\n return new Increment(token.type === TokenTypes.tokens.plus_plus\n ? IncrementOperator.increment\n : IncrementOperator.decrement, _var);\n }\n _assignment_statement() {\n // (unary_expression underscore) equal short_circuit_or_expression\n let _var = null;\n if (this._check(TokenTypes.tokens.brace_right)) {\n return null;\n }\n let isUnderscore = this._match(TokenTypes.tokens.underscore);\n if (!isUnderscore) {\n _var = this._unary_expression();\n }\n if (!isUnderscore && _var == null) {\n return null;\n }\n const type = this._consume(TokenTypes.assignment_operators, \"Expected assignment operator.\");\n const value = this._short_circuit_or_expression();\n return new Assign(AssignOperator.parse(type.lexeme), _var, value);\n }\n _func_call_statement() {\n // ident argument_expression_list\n if (!this._check(TokenTypes.tokens.ident)) {\n return null;\n }\n const savedPos = this._current;\n const name = this._consume(TokenTypes.tokens.ident, \"Expected function name.\");\n const args = this._argument_expression_list();\n if (args === null) {\n this._current = savedPos;\n return null;\n }\n return new Call(name.lexeme, args);\n }\n _loop_statement() {\n // loop brace_left statement* continuing_statement? brace_right\n if (!this._match(TokenTypes.keywords.loop)) {\n return null;\n }\n if (this._check(TokenTypes.tokens.attr)) {\n this._attribute();\n }\n this._consume(TokenTypes.tokens.brace_left, \"Expected '{' for loop.\");\n // statement*\n const statements = [];\n let statement = this._statement();\n while (statement !== null) {\n if (Array.isArray(statement)) {\n for (let s of statement) {\n statements.push(s);\n }\n }\n else {\n statements.push(statement);\n }\n statement = this._statement();\n }\n // continuing_statement: continuing compound_statement\n let continuing = null;\n if (this._match(TokenTypes.keywords.continuing)) {\n continuing = this._compound_statement();\n }\n this._consume(TokenTypes.tokens.brace_right, \"Expected '}' for loop.\");\n return new Loop(statements, continuing);\n }\n _switch_statement() {\n // switch optional_paren_expression brace_left switch_body+ brace_right\n if (!this._match(TokenTypes.keywords.switch)) {\n return null;\n }\n const condition = this._optional_paren_expression();\n if (this._check(TokenTypes.tokens.attr)) {\n this._attribute();\n }\n this._consume(TokenTypes.tokens.brace_left, \"Expected '{' for switch.\");\n const body = this._switch_body();\n if (body == null || body.length == 0) {\n throw this._error(this._previous(), \"Expected 'case' or 'default'.\");\n }\n this._consume(TokenTypes.tokens.brace_right, \"Expected '}' for switch.\");\n return new Switch(condition, body);\n }\n _switch_body() {\n // case case_selectors colon brace_left case_body? brace_right\n // default colon brace_left case_body? brace_right\n const cases = [];\n if (this._match(TokenTypes.keywords.case)) {\n const selector = this._case_selectors();\n this._match(TokenTypes.tokens.colon); // colon is optional\n if (this._check(TokenTypes.tokens.attr)) {\n this._attribute();\n }\n this._consume(TokenTypes.tokens.brace_left, \"Exected '{' for switch case.\");\n const body = this._case_body();\n this._consume(TokenTypes.tokens.brace_right, \"Exected '}' for switch case.\");\n cases.push(new Case(selector, body));\n }\n if (this._match(TokenTypes.keywords.default)) {\n this._match(TokenTypes.tokens.colon); // colon is optional\n if (this._check(TokenTypes.tokens.attr)) {\n this._attribute();\n }\n this._consume(TokenTypes.tokens.brace_left, \"Exected '{' for switch default.\");\n const body = this._case_body();\n this._consume(TokenTypes.tokens.brace_right, \"Exected '}' for switch default.\");\n cases.push(new Default(body));\n }\n if (this._check([TokenTypes.keywords.default, TokenTypes.keywords.case])) {\n const _cases = this._switch_body();\n cases.push(_cases[0]);\n }\n return cases;\n }\n _case_selectors() {\n // const_literal (comma const_literal)* comma?\n const selectors = [\n this._shift_expression(), //?.evaluate(this._context).toString() ?? \"\",\n ];\n while (this._match(TokenTypes.tokens.comma)) {\n selectors.push(this._shift_expression());\n }\n return selectors;\n }\n _case_body() {\n // statement case_body?\n // fallthrough semicolon\n if (this._match(TokenTypes.keywords.fallthrough)) {\n this._consume(TokenTypes.tokens.semicolon, \"Expected ';'\");\n return [];\n }\n let statement = this._statement();\n if (statement == null) {\n return [];\n }\n if (!(statement instanceof Array)) {\n statement = [statement];\n }\n const nextStatement = this._case_body();\n if (nextStatement.length == 0) {\n return statement;\n }\n return [...statement, nextStatement[0]];\n }\n _if_statement() {\n // if optional_paren_expression compound_statement elseif_statement? else_statement?\n if (!this._match(TokenTypes.keywords.if)) {\n return null;\n }\n const condition = this._optional_paren_expression();\n if (this._check(TokenTypes.tokens.attr)) {\n this._attribute();\n }\n const block = this._compound_statement();\n let elseif = [];\n if (this._match_elseif()) {\n if (this._check(TokenTypes.tokens.attr)) {\n this._attribute();\n }\n elseif = this._elseif_statement(elseif);\n }\n let _else = null;\n if (this._match(TokenTypes.keywords.else)) {\n if (this._check(TokenTypes.tokens.attr)) {\n this._attribute();\n }\n _else = this._compound_statement();\n }\n return new If(condition, block, elseif, _else);\n }\n _match_elseif() {\n if (this._tokens[this._current].type === TokenTypes.keywords.else &&\n this._tokens[this._current + 1].type === TokenTypes.keywords.if) {\n this._advance();\n this._advance();\n return true;\n }\n return false;\n }\n _elseif_statement(elseif = []) {\n // else_if optional_paren_expression compound_statement elseif_statement?\n const condition = this._optional_paren_expression();\n const block = this._compound_statement();\n elseif.push(new ElseIf(condition, block));\n if (this._match_elseif()) {\n if (this._check(TokenTypes.tokens.attr)) {\n this._attribute();\n }\n this._elseif_statement(elseif);\n }\n return elseif;\n }\n _return_statement() {\n // return short_circuit_or_expression?\n if (!this._match(TokenTypes.keywords.return)) {\n return null;\n }\n const value = this._short_circuit_or_expression();\n return new Return(value);\n }\n _short_circuit_or_expression() {\n // short_circuit_and_expression\n // short_circuit_or_expression or_or short_circuit_and_expression\n let expr = this._short_circuit_and_expr();\n while (this._match(TokenTypes.tokens.or_or)) {\n expr = new BinaryOperator(this._previous().toString(), expr, this._short_circuit_and_expr());\n }\n return expr;\n }\n _short_circuit_and_expr() {\n // inclusive_or_expression\n // short_circuit_and_expression and_and inclusive_or_expression\n let expr = this._inclusive_or_expression();\n while (this._match(TokenTypes.tokens.and_and)) {\n expr = new BinaryOperator(this._previous().toString(), expr, this._inclusive_or_expression());\n }\n return expr;\n }\n _inclusive_or_expression() {\n // exclusive_or_expression\n // inclusive_or_expression or exclusive_or_expression\n let expr = this._exclusive_or_expression();\n while (this._match(TokenTypes.tokens.or)) {\n expr = new BinaryOperator(this._previous().toString(), expr, this._exclusive_or_expression());\n }\n return expr;\n }\n _exclusive_or_expression() {\n // and_expression\n // exclusive_or_expression xor and_expression\n let expr = this._and_expression();\n while (this._match(TokenTypes.tokens.xor)) {\n expr = new BinaryOperator(this._previous().toString(), expr, this._and_expression());\n }\n return expr;\n }\n _and_expression() {\n // equality_expression\n // and_expression and equality_expression\n let expr = this._equality_expression();\n while (this._match(TokenTypes.tokens.and)) {\n expr = new BinaryOperator(this._previous().toString(), expr, this._equality_expression());\n }\n return expr;\n }\n _equality_expression() {\n // relational_expression\n // relational_expression equal_equal relational_expression\n // relational_expression not_equal relational_expression\n const expr = this._relational_expression();\n if (this._match([TokenTypes.tokens.equal_equal, TokenTypes.tokens.not_equal])) {\n return new BinaryOperator(this._previous().toString(), expr, this._relational_expression());\n }\n return expr;\n }\n _relational_expression() {\n // shift_expression\n // relational_expression less_than shift_expression\n // relational_expression greater_than shift_expression\n // relational_expression less_than_equal shift_expression\n // relational_expression greater_than_equal shift_expression\n let expr = this._shift_expression();\n while (this._match([\n TokenTypes.tokens.less_than,\n TokenTypes.tokens.greater_than,\n TokenTypes.tokens.less_than_equal,\n TokenTypes.tokens.greater_than_equal,\n ])) {\n expr = new BinaryOperator(this._previous().toString(), expr, this._shift_expression());\n }\n return expr;\n }\n _shift_expression() {\n // additive_expression\n // shift_expression shift_left additive_expression\n // shift_expression shift_right additive_expression\n let expr = this._additive_expression();\n while (this._match([TokenTypes.tokens.shift_left, TokenTypes.tokens.shift_right])) {\n expr = new BinaryOperator(this._previous().toString(), expr, this._additive_expression());\n }\n return expr;\n }\n _additive_expression() {\n // multiplicative_expression\n // additive_expression plus multiplicative_expression\n // additive_expression minus multiplicative_expression\n let expr = this._multiplicative_expression();\n while (this._match([TokenTypes.tokens.plus, TokenTypes.tokens.minus])) {\n expr = new BinaryOperator(this._previous().toString(), expr, this._multiplicative_expression());\n }\n return expr;\n }\n _multiplicative_expression() {\n // unary_expression\n // multiplicative_expression star unary_expression\n // multiplicative_expression forward_slash unary_expression\n // multiplicative_expression modulo unary_expression\n let expr = this._unary_expression();\n while (this._match([\n TokenTypes.tokens.star,\n TokenTypes.tokens.forward_slash,\n TokenTypes.tokens.modulo,\n ])) {\n expr = new BinaryOperator(this._previous().toString(), expr, this._unary_expression());\n }\n return expr;\n }\n _unary_expression() {\n // singular_expression\n // minus unary_expression\n // bang unary_expression\n // tilde unary_expression\n // star unary_expression\n // and unary_expression\n if (this._match([\n TokenTypes.tokens.minus,\n TokenTypes.tokens.bang,\n TokenTypes.tokens.tilde,\n TokenTypes.tokens.star,\n TokenTypes.tokens.and,\n ])) {\n return new UnaryOperator(this._previous().toString(), this._unary_expression());\n }\n return this._singular_expression();\n }\n _singular_expression() {\n // primary_expression postfix_expression ?\n const expr = this._primary_expression();\n const p = this._postfix_expression();\n if (p) {\n expr.postfix = p;\n }\n return expr;\n }\n _postfix_expression() {\n // bracket_left short_circuit_or_expression bracket_right postfix_expression?\n if (this._match(TokenTypes.tokens.bracket_left)) {\n const expr = this._short_circuit_or_expression();\n this._consume(TokenTypes.tokens.bracket_right, \"Expected ']'.\");\n const arrayIndex = new ArrayIndex(expr);\n const p = this._postfix_expression();\n if (p) {\n arrayIndex.postfix = p;\n }\n return arrayIndex;\n }\n // period ident postfix_expression?\n if (this._match(TokenTypes.tokens.period)) {\n const name = this._consume(TokenTypes.tokens.ident, \"Expected member name.\");\n const p = this._postfix_expression();\n const expr = new StringExpr(name.lexeme);\n if (p) {\n expr.postfix = p;\n }\n return expr;\n }\n return null;\n }\n _getStruct(name) {\n if (this._context.aliases.has(name)) {\n const alias = this._context.aliases.get(name).type;\n return alias;\n }\n if (this._context.structs.has(name)) {\n const struct = this._context.structs.get(name);\n return struct;\n }\n return null;\n }\n _primary_expression() {\n // ident argument_expression_list?\n if (this._match(TokenTypes.tokens.ident)) {\n const name = this._previous().toString();\n if (this._check(TokenTypes.tokens.paren_left)) {\n const args = this._argument_expression_list();\n const struct = this._getStruct(name);\n if (struct != null) {\n return new CreateExpr(struct, args);\n }\n return new CallExpr(name, args);\n }\n if (this._context.constants.has(name)) {\n const c = this._context.constants.get(name);\n return new ConstExpr(name, c.value);\n }\n return new VariableExpr(name);\n }\n // const_literal\n if (this._match(TokenTypes.const_literal)) {\n return new LiteralExpr(parseFloat(this._previous().toString()));\n }\n // paren_expression\n if (this._check(TokenTypes.tokens.paren_left)) {\n return this._paren_expression();\n }\n // bitcast less_than type_decl greater_than paren_expression\n if (this._match(TokenTypes.keywords.bitcast)) {\n this._consume(TokenTypes.tokens.less_than, \"Expected '<'.\");\n const type = this._type_decl();\n this._consume(TokenTypes.tokens.greater_than, \"Expected '>'.\");\n const value = this._paren_expression();\n return new BitcastExpr(type, value);\n }\n // type_decl argument_expression_list\n const type = this._type_decl();\n const args = this._argument_expression_list();\n return new TypecastExpr(type, args);\n }\n _argument_expression_list() {\n // paren_left ((short_circuit_or_expression comma)* short_circuit_or_expression comma?)? paren_right\n if (!this._match(TokenTypes.tokens.paren_left)) {\n return null;\n }\n const args = [];\n do {\n if (this._check(TokenTypes.tokens.paren_right)) {\n break;\n }\n const arg = this._short_circuit_or_expression();\n args.push(arg);\n } while (this._match(TokenTypes.tokens.comma));\n this._consume(TokenTypes.tokens.paren_right, \"Expected ')' for agument list\");\n return args;\n }\n _optional_paren_expression() {\n // [paren_left] short_circuit_or_expression [paren_right]\n this._match(TokenTypes.tokens.paren_left);\n const expr = this._short_circuit_or_expression();\n this._match(TokenTypes.tokens.paren_right);\n return new GroupingExpr([expr]);\n }\n _paren_expression() {\n // paren_left short_circuit_or_expression paren_right\n this._consume(TokenTypes.tokens.paren_left, \"Expected '('.\");\n const expr = this._short_circuit_or_expression();\n this._consume(TokenTypes.tokens.paren_right, \"Expected ')'.\");\n return new GroupingExpr([expr]);\n }\n _struct_decl() {\n // attribute* struct ident struct_body_decl\n if (!this._match(TokenTypes.keywords.struct)) {\n return null;\n }\n const startLine = this._currentLine;\n const name = this._consume(TokenTypes.tokens.ident, \"Expected name for struct.\").toString();\n // struct_body_decl: brace_left (struct_member comma)* struct_member comma? brace_right\n this._consume(TokenTypes.tokens.brace_left, \"Expected '{' for struct body.\");\n const members = [];\n while (!this._check(TokenTypes.tokens.brace_right)) {\n // struct_member: attribute* variable_ident_decl\n const memberAttrs = this._attribute();\n const memberName = this._consume(TokenTypes.tokens.ident, \"Expected variable name.\").toString();\n this._consume(TokenTypes.tokens.colon, \"Expected ':' for struct member type.\");\n const typeAttrs = this._attribute();\n const memberType = this._type_decl();\n if (memberType != null) {\n memberType.attributes = typeAttrs;\n }\n if (!this._check(TokenTypes.tokens.brace_right))\n this._consume(TokenTypes.tokens.comma, \"Expected ',' for struct member.\");\n else\n this._match(TokenTypes.tokens.comma); // trailing comma optional.\n members.push(new Member(memberName, memberType, memberAttrs));\n }\n this._consume(TokenTypes.tokens.brace_right, \"Expected '}' after struct body.\");\n const endLine = this._currentLine;\n const structNode = new Struct(name, members, startLine, endLine);\n this._context.structs.set(name, structNode);\n return structNode;\n }\n _global_variable_decl() {\n // attribute* variable_decl (equal const_expression)?\n const _var = this._variable_decl();\n if (_var && this._match(TokenTypes.tokens.equal)) {\n _var.value = this._const_expression();\n }\n return _var;\n }\n _override_variable_decl() {\n // attribute* override_decl (equal const_expression)?\n const _override = this._override_decl();\n if (_override && this._match(TokenTypes.tokens.equal)) {\n _override.value = this._const_expression();\n }\n return _override;\n }\n _global_const_decl() {\n // attribute* const (ident variable_ident_decl) global_const_initializer?\n if (!this._match(TokenTypes.keywords.const)) {\n return null;\n }\n const name = this._consume(TokenTypes.tokens.ident, \"Expected variable name\");\n let type = null;\n if (this._match(TokenTypes.tokens.colon)) {\n const attrs = this._attribute();\n type = this._type_decl();\n if (type != null) {\n type.attributes = attrs;\n }\n }\n let value = null;\n if (this._match(TokenTypes.tokens.equal)) {\n const valueExpr = this._short_circuit_or_expression();\n if (valueExpr instanceof CreateExpr) {\n value = valueExpr;\n }\n else if (valueExpr instanceof ConstExpr &&\n valueExpr.initializer instanceof CreateExpr) {\n value = valueExpr.initializer;\n }\n else {\n try {\n const constValue = valueExpr.evaluate(this._context);\n value = new LiteralExpr(constValue);\n }\n catch (_a) {\n value = valueExpr;\n }\n }\n }\n const c = new Const(name.toString(), type, \"\", \"\", value);\n this._context.constants.set(c.name, c);\n return c;\n }\n _global_let_decl() {\n // attribute* let (ident variable_ident_decl) global_const_initializer?\n if (!this._match(TokenTypes.keywords.let)) {\n return null;\n }\n const name = this._consume(TokenTypes.tokens.ident, \"Expected variable name\");\n let type = null;\n if (this._match(TokenTypes.tokens.colon)) {\n const attrs = this._attribute();\n type = this._type_decl();\n if (type != null) {\n type.attributes = attrs;\n }\n }\n let value = null;\n if (this._match(TokenTypes.tokens.equal)) {\n value = this._const_expression();\n }\n return new Let(name.toString(), type, \"\", \"\", value);\n }\n _const_expression() {\n // type_decl paren_left ((const_expression comma)* const_expression comma?)? paren_right\n // const_literal\n if (this._match(TokenTypes.const_literal)) {\n return new StringExpr(this._previous().toString());\n }\n const type = this._type_decl();\n this._consume(TokenTypes.tokens.paren_left, \"Expected '('.\");\n let args = [];\n while (!this._check(TokenTypes.tokens.paren_right)) {\n args.push(this._const_expression());\n if (!this._check(TokenTypes.tokens.comma)) {\n break;\n }\n this._advance();\n }\n this._consume(TokenTypes.tokens.paren_right, \"Expected ')'.\");\n return new CreateExpr(type, args);\n }\n _variable_decl() {\n // var variable_qualifier? (ident variable_ident_decl)\n if (!this._match(TokenTypes.keywords.var)) {\n return null;\n }\n // variable_qualifier: less_than storage_class (comma access_mode)? greater_than\n let storage = \"\";\n let access = \"\";\n if (this._match(TokenTypes.tokens.less_than)) {\n storage = this._consume(TokenTypes.storage_class, \"Expected storage_class.\").toString();\n if (this._match(TokenTypes.tokens.comma))\n access = this._consume(TokenTypes.access_mode, \"Expected access_mode.\").toString();\n this._consume(TokenTypes.tokens.greater_than, \"Expected '>'.\");\n }\n const name = this._consume(TokenTypes.tokens.ident, \"Expected variable name\");\n let type = null;\n if (this._match(TokenTypes.tokens.colon)) {\n const attrs = this._attribute();\n type = this._type_decl();\n if (type != null) {\n type.attributes = attrs;\n }\n }\n return new Var(name.toString(), type, storage, access, null);\n }\n _override_decl() {\n // override (ident variable_ident_decl)\n if (!this._match(TokenTypes.keywords.override)) {\n return null;\n }\n const name = this._consume(TokenTypes.tokens.ident, \"Expected variable name\");\n let type = null;\n if (this._match(TokenTypes.tokens.colon)) {\n const attrs = this._attribute();\n type = this._type_decl();\n if (type != null) {\n type.attributes = attrs;\n }\n }\n return new Override(name.toString(), type, null);\n }\n _diagnostic() {\n // diagnostic(severity_control_name, diagnostic_rule_name)\n this._consume(TokenTypes.tokens.paren_left, \"Expected '('\");\n const severity = this._consume(TokenTypes.tokens.ident, \"Expected severity control name.\");\n this._consume(TokenTypes.tokens.comma, \"Expected ','\");\n const rule = this._consume(TokenTypes.tokens.ident, \"Expected diagnostic rule name.\");\n this._consume(TokenTypes.tokens.paren_right, \"Expected ')'\");\n return new Diagnostic(severity.toString(), rule.toString());\n }\n _enable_directive() {\n // enable ident semicolon\n const name = this._consume(TokenTypes.tokens.ident, \"identity expected.\");\n return new Enable(name.toString());\n }\n _requires_directive() {\n // requires extension [, extension]* semicolon\n const extensions = [this._consume(TokenTypes.tokens.ident, \"identity expected.\").toString()];\n while (this._match(TokenTypes.tokens.comma)) {\n const name = this._consume(TokenTypes.tokens.ident, \"identity expected.\");\n extensions.push(name.toString());\n }\n return new Requires(extensions);\n }\n _type_alias() {\n // type ident equal type_decl\n const name = this._consume(TokenTypes.tokens.ident, \"identity expected.\");\n this._consume(TokenTypes.tokens.equal, \"Expected '=' for type alias.\");\n let aliasType = this._type_decl();\n if (aliasType === null) {\n throw this._error(this._peek(), \"Expected Type for Alias.\");\n }\n if (this._context.aliases.has(aliasType.name)) {\n aliasType = this._context.aliases.get(aliasType.name).type;\n }\n const aliasNode = new Alias(name.toString(), aliasType);\n this._context.aliases.set(aliasNode.name, aliasNode);\n return aliasNode;\n }\n _type_decl() {\n // ident\n // bool\n // float32\n // int32\n // uint32\n // vec2 less_than type_decl greater_than\n // vec3 less_than type_decl greater_than\n // vec4 less_than type_decl greater_than\n // mat2x2 less_than type_decl greater_than\n // mat2x3 less_than type_decl greater_than\n // mat2x4 less_than type_decl greater_than\n // mat3x2 less_than type_decl greater_than\n // mat3x3 less_than type_decl greater_than\n // mat3x4 less_than type_decl greater_than\n // mat4x2 less_than type_decl greater_than\n // mat4x3 less_than type_decl greater_than\n // mat4x4 less_than type_decl greater_than\n // atomic less_than type_decl greater_than\n // pointer less_than storage_class comma type_decl (comma access_mode)? greater_than\n // array_type_decl\n // texture_sampler_types\n if (this._check([\n TokenTypes.tokens.ident,\n ...TokenTypes.texel_format,\n TokenTypes.keywords.bool,\n TokenTypes.keywords.f32,\n TokenTypes.keywords.i32,\n TokenTypes.keywords.u32,\n ])) {\n const type = this._advance();\n const typeName = type.toString();\n if (this._context.structs.has(typeName)) {\n return this._context.structs.get(typeName);\n }\n if (this._context.aliases.has(typeName)) {\n return this._context.aliases.get(typeName).type;\n }\n return new Type(type.toString());\n }\n // texture_sampler_types\n let type = this._texture_sampler_types();\n if (type) {\n return type;\n }\n if (this._check(TokenTypes.template_types)) {\n let type = this._advance().toString();\n let format = null;\n let access = null;\n if (this._match(TokenTypes.tokens.less_than)) {\n format = this._type_decl();\n access = null;\n if (this._match(TokenTypes.tokens.comma)) {\n access = this._consume(TokenTypes.access_mode, \"Expected access_mode for pointer\").toString();\n }\n this._consume(TokenTypes.tokens.greater_than, \"Expected '>' for type.\");\n }\n return new TemplateType(type, format, access);\n }\n // pointer less_than storage_class comma type_decl (comma access_mode)? greater_than\n if (this._match(TokenTypes.keywords.ptr)) {\n let pointer = this._previous().toString();\n this._consume(TokenTypes.tokens.less_than, \"Expected '<' for pointer.\");\n const storage = this._consume(TokenTypes.storage_class, \"Expected storage_class for pointer\");\n this._consume(TokenTypes.tokens.comma, \"Expected ',' for pointer.\");\n const decl = this._type_decl();\n let access = null;\n if (this._match(TokenTypes.tokens.comma)) {\n access = this._consume(TokenTypes.access_mode, \"Expected access_mode for pointer\").toString();\n }\n this._consume(TokenTypes.tokens.greater_than, \"Expected '>' for pointer.\");\n return new PointerType(pointer, storage.toString(), decl, access);\n }\n // The following type_decl's have an optional attribyte_list*\n const attrs = this._attribute();\n // attribute* array\n // attribute* array less_than type_decl (comma element_count_expression)? greater_than\n if (this._match(TokenTypes.keywords.array)) {\n let format = null;\n let countInt = -1;\n const array = this._previous();\n let countNode = null;\n if (this._match(TokenTypes.tokens.less_than)) {\n format = this._type_decl();\n if (this._context.aliases.has(format.name)) {\n format = this._context.aliases.get(format.name).type;\n }\n let count = \"\";\n if (this._match(TokenTypes.tokens.comma)) {\n countNode = this._shift_expression();\n // If we can't evaluate the node, defer evaluating it until after the shader has\n // finished being parsed, because const statements can be declared **after** they\n // are used.\n try {\n count = countNode.evaluate(this._context).toString();\n countNode = null;\n }\n catch (e) {\n count = \"1\";\n }\n }\n this._consume(TokenTypes.tokens.greater_than, \"Expected '>' for array.\");\n countInt = count ? parseInt(count) : 0;\n }\n const arrayType = new ArrayType(array.toString(), attrs, format, countInt);\n if (countNode) {\n this._deferArrayCountEval.push({ arrayType, countNode });\n }\n return arrayType;\n }\n return null;\n }\n _texture_sampler_types() {\n // sampler_type\n if (this._match(TokenTypes.sampler_type)) {\n return new SamplerType(this._previous().toString(), null, null);\n }\n // depth_texture_type\n if (this._match(TokenTypes.depth_texture_type)) {\n return new SamplerType(this._previous().toString(), null, null);\n }\n // sampled_texture_type less_than type_decl greater_than\n // multisampled_texture_type less_than type_decl greater_than\n if (this._match(TokenTypes.sampled_texture_type) ||\n this._match(TokenTypes.multisampled_texture_type)) {\n const sampler = this._previous();\n this._consume(TokenTypes.tokens.less_than, \"Expected '<' for sampler type.\");\n const format = this._type_decl();\n this._consume(TokenTypes.tokens.greater_than, \"Expected '>' for sampler type.\");\n return new SamplerType(sampler.toString(), format, null);\n }\n // storage_texture_type less_than texel_format comma access_mode greater_than\n if (this._match(TokenTypes.storage_texture_type)) {\n const sampler = this._previous();\n this._consume(TokenTypes.tokens.less_than, \"Expected '<' for sampler type.\");\n const format = this._consume(TokenTypes.texel_format, \"Invalid texel format.\").toString();\n this._consume(TokenTypes.tokens.comma, \"Expected ',' after texel format.\");\n const access = this._consume(TokenTypes.access_mode, \"Expected access mode for storage texture type.\").toString();\n this._consume(TokenTypes.tokens.greater_than, \"Expected '>' for sampler type.\");\n return new SamplerType(sampler.toString(), format, access);\n }\n return null;\n }\n _attribute() {\n // attr ident paren_left (literal_or_ident comma)* literal_or_ident paren_right\n // attr ident\n let attributes = [];\n while (this._match(TokenTypes.tokens.attr)) {\n const name = this._consume(TokenTypes.attribute_name, \"Expected attribute name\");\n const attr = new Attribute(name.toString(), null);\n if (this._match(TokenTypes.tokens.paren_left)) {\n // literal_or_ident\n attr.value = this._consume(TokenTypes.literal_or_ident, \"Expected attribute value\").toString();\n if (this._check(TokenTypes.tokens.comma)) {\n this._advance();\n do {\n const v = this._consume(TokenTypes.literal_or_ident, \"Expected attribute value\").toString();\n if (!(attr.value instanceof Array)) {\n attr.value = [attr.value];\n }\n attr.value.push(v);\n } while (this._match(TokenTypes.tokens.comma));\n }\n this._consume(TokenTypes.tokens.paren_right, \"Expected ')'\");\n }\n attributes.push(attr);\n }\n // Deprecated:\n // attr_left (attribute comma)* attribute attr_right\n while (this._match(TokenTypes.tokens.attr_left)) {\n if (!this._check(TokenTypes.tokens.attr_right)) {\n do {\n const name = this._consume(TokenTypes.attribute_name, \"Expected attribute name\");\n const attr = new Attribute(name.toString(), null);\n if (this._match(TokenTypes.tokens.paren_left)) {\n // literal_or_ident\n attr.value = [\n this._consume(TokenTypes.literal_or_ident, \"Expected attribute value\").toString(),\n ];\n if (this._check(TokenTypes.tokens.comma)) {\n this._advance();\n do {\n const v = this._consume(TokenTypes.literal_or_ident, \"Expected attribute value\").toString();\n attr.value.push(v);\n } while (this._match(TokenTypes.tokens.comma));\n }\n this._consume(TokenTypes.tokens.paren_right, \"Expected ')'\");\n }\n attributes.push(attr);\n } while (this._match(TokenTypes.tokens.comma));\n }\n // Consume ]]\n this._consume(TokenTypes.tokens.attr_right, \"Expected ']]' after attribute declarations\");\n }\n if (attributes.length == 0) {\n return null;\n }\n return attributes;\n }\n}\n\n/**\n * @author Brendan Duncan / https://github.com/brendan-duncan\n */\nclass TypeInfo {\n constructor(name, attributes) {\n this.name = name;\n this.attributes = attributes;\n this.size = 0;\n }\n get isArray() {\n return false;\n }\n get isStruct() {\n return false;\n }\n get isTemplate() {\n return false;\n }\n}\nclass MemberInfo {\n constructor(name, type, attributes) {\n this.name = name;\n this.type = type;\n this.attributes = attributes;\n this.offset = 0;\n this.size = 0;\n }\n get isArray() {\n return this.type.isArray;\n }\n get isStruct() {\n return this.type.isStruct;\n }\n get isTemplate() {\n return this.type.isTemplate;\n }\n get align() {\n return this.type.isStruct ? this.type.align : 0;\n }\n get members() {\n return this.type.isStruct ? this.type.members : null;\n }\n get format() {\n return this.type.isArray\n ? this.type.format\n : this.type.isTemplate\n ? this.type.format\n : null;\n }\n get count() {\n return this.type.isArray ? this.type.count : 0;\n }\n get stride() {\n return this.type.isArray ? this.type.stride : this.size;\n }\n}\nclass StructInfo extends TypeInfo {\n constructor(name, attributes) {\n super(name, attributes);\n this.members = [];\n this.align = 0;\n this.startLine = -1;\n this.endLine = -1;\n this.inUse = false;\n }\n get isStruct() {\n return true;\n }\n}\nclass ArrayInfo extends TypeInfo {\n constructor(name, attributes) {\n super(name, attributes);\n this.count = 0;\n this.stride = 0;\n }\n get isArray() {\n return true;\n }\n}\nclass TemplateInfo extends TypeInfo {\n constructor(name, format, attributes, access) {\n super(name, attributes);\n this.format = format;\n this.access = access;\n }\n get isTemplate() {\n return true;\n }\n}\nvar ResourceType;\n(function (ResourceType) {\n ResourceType[ResourceType[\"Uniform\"] = 0] = \"Uniform\";\n ResourceType[ResourceType[\"Storage\"] = 1] = \"Storage\";\n ResourceType[ResourceType[\"Texture\"] = 2] = \"Texture\";\n ResourceType[ResourceType[\"Sampler\"] = 3] = \"Sampler\";\n ResourceType[ResourceType[\"StorageTexture\"] = 4] = \"StorageTexture\";\n})(ResourceType || (ResourceType = {}));\nclass VariableInfo {\n constructor(name, type, group, binding, attributes, resourceType, access) {\n this.name = name;\n this.type = type;\n this.group = group;\n this.binding = binding;\n this.attributes = attributes;\n this.resourceType = resourceType;\n this.access = access;\n }\n get isArray() {\n return this.type.isArray;\n }\n get isStruct() {\n return this.type.isStruct;\n }\n get isTemplate() {\n return this.type.isTemplate;\n }\n get size() {\n return this.type.size;\n }\n get align() {\n return this.type.isStruct ? this.type.align : 0;\n }\n get members() {\n return this.type.isStruct ? this.type.members : null;\n }\n get format() {\n return this.type.isArray\n ? this.type.format\n : this.type.isTemplate\n ? this.type.format\n : null;\n }\n get count() {\n return this.type.isArray ? this.type.count : 0;\n }\n get stride() {\n return this.type.isArray ? this.type.stride : this.size;\n }\n}\nclass AliasInfo {\n constructor(name, type) {\n this.name = name;\n this.type = type;\n }\n}\nclass _TypeSize {\n constructor(align, size) {\n this.align = align;\n this.size = size;\n }\n}\nclass InputInfo {\n constructor(name, type, locationType, location) {\n this.name = name;\n this.type = type;\n this.locationType = locationType;\n this.location = location;\n this.interpolation = null;\n }\n}\nclass OutputInfo {\n constructor(name, type, locationType, location) {\n this.name = name;\n this.type = type;\n this.locationType = locationType;\n this.location = location;\n }\n}\nclass FunctionInfo {\n constructor(name, stage = null) {\n this.stage = null;\n this.inputs = [];\n this.outputs = [];\n this.resources = [];\n this.startLine = -1;\n this.endLine = -1;\n this.inUse = false;\n this.calls = new Set();\n this.name = name;\n this.stage = stage;\n }\n}\nclass EntryFunctions {\n constructor() {\n this.vertex = [];\n this.fragment = [];\n this.compute = [];\n }\n}\nclass OverrideInfo {\n constructor(name, type, attributes, id) {\n this.name = name;\n this.type = type;\n this.attributes = attributes;\n this.id = id;\n }\n}\nclass _FunctionResources {\n constructor(node) {\n this.resources = null;\n this.inUse = false;\n this.info = null;\n this.node = node;\n }\n}\nclass WgslReflect {\n constructor(code) {\n /// All top-level uniform vars in the shader.\n this.uniforms = [];\n /// All top-level storage vars in the shader.\n this.storage = [];\n /// All top-level texture vars in the shader;\n this.textures = [];\n // All top-level sampler vars in the shader.\n this.samplers = [];\n /// All top-level type aliases in the shader.\n this.aliases = [];\n /// All top-level overrides in the shader.\n this.overrides = [];\n /// All top-level structs in the shader.\n this.structs = [];\n /// All entry functions in the shader: vertex, fragment, and/or compute.\n this.entry = new EntryFunctions();\n /// All functions in the shader, including entry functions.\n this.functions = [];\n this._types = new Map();\n this._functions = new Map();\n if (code) {\n this.update(code);\n }\n }\n _isStorageTexture(type) {\n return (type.name == \"texture_storage_1d\" ||\n type.name == \"texture_storage_2d\" ||\n type.name == \"texture_storage_2d_array\" ||\n type.name == \"texture_storage_3d\");\n }\n update(code) {\n const parser = new WgslParser();\n const ast = parser.parse(code);\n for (const node of ast) {\n if (node instanceof Function) {\n this._functions.set(node.name, new _FunctionResources(node));\n }\n }\n for (const node of ast) {\n if (node instanceof Struct) {\n const info = this._getTypeInfo(node, null);\n if (info instanceof StructInfo) {\n this.structs.push(info);\n }\n }\n }\n for (const node of ast) {\n if (node instanceof Alias) {\n this.aliases.push(this._getAliasInfo(node));\n continue;\n }\n if (node instanceof Override) {\n const v = node;\n const id = this._getAttributeNum(v.attributes, \"id\", 0);\n const type = v.type != null ? this._getTypeInfo(v.type, v.attributes) : null;\n this.overrides.push(new OverrideInfo(v.name, type, v.attributes, id));\n continue;\n }\n if (this._isUniformVar(node)) {\n const v = node;\n const g = this._getAttributeNum(v.attributes, \"group\", 0);\n const b = this._getAttributeNum(v.attributes, \"binding\", 0);\n const type = this._getTypeInfo(v.type, v.attributes);\n const varInfo = new VariableInfo(v.name, type, g, b, v.attributes, ResourceType.Uniform, v.access);\n this.uniforms.push(varInfo);\n continue;\n }\n if (this._isStorageVar(node)) {\n const v = node;\n const g = this._getAttributeNum(v.attributes, \"group\", 0);\n const b = this._getAttributeNum(v.attributes, \"binding\", 0);\n const type = this._getTypeInfo(v.type, v.attributes);\n const isStorageTexture = this._isStorageTexture(type);\n const varInfo = new VariableInfo(v.name, type, g, b, v.attributes, isStorageTexture ? ResourceType.StorageTexture : ResourceType.Storage, v.access);\n this.storage.push(varInfo);\n continue;\n }\n if (this._isTextureVar(node)) {\n const v = node;\n const g = this._getAttributeNum(v.attributes, \"group\", 0);\n const b = this._getAttributeNum(v.attributes, \"binding\", 0);\n const type = this._getTypeInfo(v.type, v.attributes);\n const isStorageTexture = this._isStorageTexture(type);\n const varInfo = new VariableInfo(v.name, type, g, b, v.attributes, isStorageTexture ? ResourceType.StorageTexture : ResourceType.Texture, v.access);\n if (isStorageTexture) {\n this.storage.push(varInfo);\n }\n else {\n this.textures.push(varInfo);\n }\n continue;\n }\n if (this._isSamplerVar(node)) {\n const v = node;\n const g = this._getAttributeNum(v.attributes, \"group\", 0);\n const b = this._getAttributeNum(v.attributes, \"binding\", 0);\n const type = this._getTypeInfo(v.type, v.attributes);\n const varInfo = new VariableInfo(v.name, type, g, b, v.attributes, ResourceType.Sampler, v.access);\n this.samplers.push(varInfo);\n continue;\n }\n if (node instanceof Function) {\n const vertexStage = this._getAttribute(node, \"vertex\");\n const fragmentStage = this._getAttribute(node, \"fragment\");\n const computeStage = this._getAttribute(node, \"compute\");\n const stage = vertexStage || fragmentStage || computeStage;\n const fn = new FunctionInfo(node.name, stage === null || stage === void 0 ? void 0 : stage.name);\n fn.startLine = node.startLine;\n fn.endLine = node.endLine;\n this.functions.push(fn);\n this._functions.get(node.name).info = fn;\n if (stage) {\n this._functions.get(node.name).inUse = true;\n fn.inUse = true;\n fn.resources = this._findResources(node, !!stage);\n fn.inputs = this._getInputs(node.args);\n fn.outputs = this._getOutputs(node.returnType);\n this.entry[stage.name].push(fn);\n }\n continue;\n }\n }\n for (const fn of this._functions.values()) {\n if (fn.info) {\n fn.info.inUse = fn.inUse;\n this._addCalls(fn.node, fn.info.calls);\n }\n }\n for (const u of this.uniforms) {\n this._markStructsInUse(u.type);\n }\n for (const s of this.storage) {\n this._markStructsInUse(s.type);\n }\n }\n _markStructsInUse(type) {\n if (type.isStruct) {\n type.inUse = true;\n for (const m of type.members) {\n this._markStructsInUse(m.type);\n }\n }\n else if (type.isArray) {\n this._markStructsInUse(type.format);\n }\n else if (type.isTemplate) {\n this._markStructsInUse(type.format);\n }\n else {\n const alias = this._getAlias(type.name);\n if (alias) {\n this._markStructsInUse(alias);\n }\n }\n }\n _addCalls(fn, calls) {\n var _a;\n for (const call of fn.calls) {\n const info = (_a = this._functions.get(call.name)) === null || _a === void 0 ? void 0 : _a.info;\n if (info) {\n calls.add(info);\n }\n }\n }\n /// Find a resource by its group and binding.\n findResource(group, binding) {\n for (const u of this.uniforms) {\n if (u.group == group && u.binding == binding) {\n return u;\n }\n }\n for (const s of this.storage) {\n if (s.group == group && s.binding == binding) {\n return s;\n }\n }\n for (const t of this.textures) {\n if (t.group == group && t.binding == binding) {\n return t;\n }\n }\n for (const s of this.samplers) {\n if (s.group == group && s.binding == binding) {\n return s;\n }\n }\n return null;\n }\n _findResource(name) {\n for (const u of this.uniforms) {\n if (u.name == name) {\n return u;\n }\n }\n for (const s of this.storage) {\n if (s.name == name) {\n return s;\n }\n }\n for (const t of this.textures) {\n if (t.name == name) {\n return t;\n }\n }\n for (const s of this.samplers) {\n if (s.name == name) {\n return s;\n }\n }\n return null;\n }\n _markStructsFromAST(type) {\n const info = this._getTypeInfo(type, null);\n this._markStructsInUse(info);\n }\n _findResources(fn, isEntry) {\n const resources = [];\n const self = this;\n const varStack = [];\n fn.search((node) => {\n if (node instanceof _BlockStart) {\n varStack.push({});\n }\n else if (node instanceof _BlockEnd) {\n varStack.pop();\n }\n else if (node instanceof Var) {\n const v = node;\n if (isEntry && v.type !== null) {\n this._markStructsFromAST(v.type);\n }\n if (varStack.length > 0) {\n varStack[varStack.length - 1][v.name] = v;\n }\n }\n else if (node instanceof CreateExpr) {\n const c = node;\n if (isEntry && c.type !== null) {\n this._markStructsFromAST(c.type);\n }\n }\n else if (node instanceof Let) {\n const v = node;\n if (isEntry && v.type !== null) {\n this._markStructsFromAST(v.type);\n }\n if (varStack.length > 0) {\n varStack[varStack.length - 1][v.name] = v;\n }\n }\n else if (node instanceof VariableExpr) {\n const v = node;\n // Check to see if the variable is a local variable before checking to see if it's\n // a resource.\n if (varStack.length > 0) {\n const varInfo = varStack[varStack.length - 1][v.name];\n if (varInfo) {\n return;\n }\n }\n const varInfo = self._findResource(v.name);\n if (varInfo) {\n resources.push(varInfo);\n }\n }\n else if (node instanceof CallExpr) {\n const c = node;\n const callFn = self._functions.get(c.name);\n if (callFn) {\n if (isEntry) {\n callFn.inUse = true;\n }\n fn.calls.add(callFn.node);\n if (callFn.resources === null) {\n callFn.resources = self._findResources(callFn.node, isEntry);\n }\n resources.push(...callFn.resources);\n }\n }\n else if (node instanceof Call) {\n const c = node;\n const callFn = self._functions.get(c.name);\n if (callFn) {\n if (isEntry) {\n callFn.inUse = true;\n }\n fn.calls.add(callFn.node);\n if (callFn.resources === null) {\n callFn.resources = self._findResources(callFn.node, isEntry);\n }\n resources.push(...callFn.resources);\n }\n }\n });\n return [...new Map(resources.map(r => [r.name, r])).values()];\n }\n getBindGroups() {\n const groups = [];\n function _makeRoom(group, binding) {\n if (group >= groups.length) {\n groups.length = group + 1;\n }\n if (groups[group] === undefined) {\n groups[group] = [];\n }\n if (binding >= groups[group].length) {\n groups[group].length = binding + 1;\n }\n }\n for (const u of this.uniforms) {\n _makeRoom(u.group, u.binding);\n const group = groups[u.group];\n group[u.binding] = u;\n }\n for (const u of this.storage) {\n _makeRoom(u.group, u.binding);\n const group = groups[u.group];\n group[u.binding] = u;\n }\n for (const t of this.textures) {\n _makeRoom(t.group, t.binding);\n const group = groups[t.group];\n group[t.binding] = t;\n }\n for (const t of this.samplers) {\n _makeRoom(t.group, t.binding);\n const group = groups[t.group];\n group[t.binding] = t;\n }\n return groups;\n }\n _getOutputs(type, outputs = undefined) {\n if (outputs === undefined) {\n outputs = [];\n }\n if (type instanceof Struct) {\n this._getStructOutputs(type, outputs);\n }\n else {\n const output = this._getOutputInfo(type);\n if (output !== null) {\n outputs.push(output);\n }\n }\n return outputs;\n }\n _getStructOutputs(struct, outputs) {\n for (const m of struct.members) {\n if (m.type instanceof Struct) {\n this._getStructOutputs(m.type, outputs);\n }\n else {\n const location = this._getAttribute(m, \"location\") || this._getAttribute(m, \"builtin\");\n if (location !== null) {\n const typeInfo = this._getTypeInfo(m.type, m.type.attributes);\n const locationValue = this._parseInt(location.value);\n const info = new OutputInfo(m.name, typeInfo, location.name, locationValue);\n outputs.push(info);\n }\n }\n }\n }\n _getOutputInfo(type) {\n const location = this._getAttribute(type, \"location\") ||\n this._getAttribute(type, \"builtin\");\n if (location !== null) {\n const typeInfo = this._getTypeInfo(type, type.attributes);\n const locationValue = this._parseInt(location.value);\n const info = new OutputInfo(\"\", typeInfo, location.name, locationValue);\n return info;\n }\n return null;\n }\n _getInputs(args, inputs = undefined) {\n if (inputs === undefined) {\n inputs = [];\n }\n for (const arg of args) {\n if (arg.type instanceof Struct) {\n this._getStructInputs(arg.type, inputs);\n }\n else {\n const input = this._getInputInfo(arg);\n if (input !== null) {\n inputs.push(input);\n }\n }\n }\n return inputs;\n }\n _getStructInputs(struct, inputs) {\n for (const m of struct.members) {\n if (m.type instanceof Struct) {\n this._getStructInputs(m.type, inputs);\n }\n else {\n const input = this._getInputInfo(m);\n if (input !== null) {\n inputs.push(input);\n }\n }\n }\n }\n _getInputInfo(node) {\n const location = this._getAttribute(node, \"location\") ||\n this._getAttribute(node, \"builtin\");\n if (location !== null) {\n const interpolation = this._getAttribute(node, \"interpolation\");\n const type = this._getTypeInfo(node.type, node.attributes);\n const locationValue = this._parseInt(location.value);\n const info = new InputInfo(node.name, type, location.name, locationValue);\n if (interpolation !== null) {\n info.interpolation = this._parseString(interpolation.value);\n }\n return info;\n }\n return null;\n }\n _parseString(s) {\n if (s instanceof Array) {\n s = s[0];\n }\n return s;\n }\n _parseInt(s) {\n if (s instanceof Array) {\n s = s[0];\n }\n const n = parseInt(s);\n return isNaN(n) ? s : n;\n }\n _getAlias(name) {\n for (const a of this.aliases) {\n if (a.name == name) {\n return a.type;\n }\n }\n return null;\n }\n _getAliasInfo(node) {\n return new AliasInfo(node.name, this._getTypeInfo(node.type, null));\n }\n _getTypeInfo(type, attributes) {\n if (this._types.has(type)) {\n return this._types.get(type);\n }\n if (type instanceof ArrayType) {\n const a = type;\n const t = this._getTypeInfo(a.format, a.attributes);\n const info = new ArrayInfo(a.name, attributes);\n info.format = t;\n info.count = a.count;\n this._types.set(type, info);\n this._updateTypeInfo(info);\n return info;\n }\n if (type instanceof Struct) {\n const s = type;\n const info = new StructInfo(s.name, attributes);\n info.startLine = s.startLine;\n info.endLine = s.endLine;\n for (const m of s.members) {\n const t = this._getTypeInfo(m.type, m.attributes);\n info.members.push(new MemberInfo(m.name, t, m.attributes));\n }\n this._types.set(type, info);\n this._updateTypeInfo(info);\n return info;\n }\n if (type instanceof SamplerType) {\n const s = type;\n const formatIsType = s.format instanceof Type;\n const format = s.format\n ? formatIsType\n ? this._getTypeInfo(s.format, null)\n : new TypeInfo(s.format, null)\n : null;\n const info = new TemplateInfo(s.name, format, attributes, s.access);\n this._types.set(type, info);\n this._updateTypeInfo(info);\n return info;\n }\n if (type instanceof TemplateType) {\n const t = type;\n const format = t.format ? this._getTypeInfo(t.format, null) : null;\n const info = new TemplateInfo(t.name, format, attributes, t.access);\n this._types.set(type, info);\n this._updateTypeInfo(info);\n return info;\n }\n const info = new TypeInfo(type.name, attributes);\n this._types.set(type, info);\n this._updateTypeInfo(info);\n return info;\n }\n _updateTypeInfo(type) {\n var _a, _b;\n const typeSize = this._getTypeSize(type);\n type.size = (_a = typeSize === null || typeSize === void 0 ? void 0 : typeSize.size) !== null && _a !== void 0 ? _a : 0;\n if (type instanceof ArrayInfo) {\n const formatInfo = this._getTypeSize(type[\"format\"]);\n type.stride = (_b = formatInfo === null || formatInfo === void 0 ? void 0 : formatInfo.size) !== null && _b !== void 0 ? _b : 0;\n this._updateTypeInfo(type[\"format\"]);\n }\n if (type instanceof StructInfo) {\n this._updateStructInfo(type);\n }\n }\n _updateStructInfo(struct) {\n var _a;\n let offset = 0;\n let lastSize = 0;\n let lastOffset = 0;\n let structAlign = 0;\n for (let mi = 0, ml = struct.members.length; mi < ml; ++mi) {\n const member = struct.members[mi];\n const sizeInfo = this._getTypeSize(member);\n if (!sizeInfo) {\n continue;\n }\n (_a = this._getAlias(member.type.name)) !== null && _a !== void 0 ? _a : member.type;\n const align = sizeInfo.align;\n const size = sizeInfo.size;\n offset = this._roundUp(align, offset + lastSize);\n lastSize = size;\n lastOffset = offset;\n structAlign = Math.max(structAlign, align);\n member.offset = offset;\n member.size = size;\n this._updateTypeInfo(member.type);\n }\n struct.size = this._roundUp(structAlign, lastOffset + lastSize);\n struct.align = structAlign;\n }\n _getTypeSize(type) {\n var _a;\n if (type === null || type === undefined) {\n return null;\n }\n const explicitSize = this._getAttributeNum(type.attributes, \"size\", 0);\n const explicitAlign = this._getAttributeNum(type.attributes, \"align\", 0);\n if (type instanceof MemberInfo) {\n type = type.type;\n }\n if (type instanceof TypeInfo) {\n const alias = this._getAlias(type.name);\n if (alias !== null) {\n type = alias;\n }\n }\n {\n const info = WgslReflect._typeInfo[type.name];\n if (info !== undefined) {\n const divisor = type[\"format\"] === \"f16\" ? 2 : 1;\n return new _TypeSize(Math.max(explicitAlign, info.align / divisor), Math.max(explicitSize, info.size / divisor));\n }\n }\n {\n const info = WgslReflect._typeInfo[type.name.substring(0, type.name.length - 1)];\n if (info) {\n const divisor = type.name[type.name.length - 1] === \"h\" ? 2 : 1;\n return new _TypeSize(Math.max(explicitAlign, info.align / divisor), Math.max(explicitSize, info.size / divisor));\n }\n }\n if (type instanceof ArrayInfo) {\n let arrayType = type;\n let align = 8;\n let size = 8;\n // Type AlignOf(T) Sizeof(T)\n // array AlignOf(E) N * roundUp(AlignOf(E), SizeOf(E))\n // array AlignOf(E) N * roundUp(AlignOf(E), SizeOf(E)) (N determined at runtime)\n //\n // @stride(Q)\n // array AlignOf(E) N * Q\n //\n // @stride(Q)\n // array AlignOf(E) Nruntime * Q\n //const E = type.format.name;\n const E = this._getTypeSize(arrayType.format);\n if (E !== null) {\n size = E.size;\n align = E.align;\n }\n const N = arrayType.count;\n const stride = this._getAttributeNum((_a = type === null || type === void 0 ? void 0 : type.attributes) !== null && _a !== void 0 ? _a : null, \"stride\", this._roundUp(align, size));\n size = N * stride;\n if (explicitSize) {\n size = explicitSize;\n }\n return new _TypeSize(Math.max(explicitAlign, align), Math.max(explicitSize, size));\n }\n if (type instanceof StructInfo) {\n let align = 0;\n let size = 0;\n // struct S AlignOf: max(AlignOfMember(S, M1), ... , AlignOfMember(S, MN))\n // SizeOf: roundUp(AlignOf(S), OffsetOfMember(S, L) + SizeOfMember(S, L))\n // Where L is the last member of the structure\n let offset = 0;\n let lastSize = 0;\n let lastOffset = 0;\n for (const m of type.members) {\n const mi = this._getTypeSize(m.type);\n if (mi !== null) {\n align = Math.max(mi.align, align);\n offset = this._roundUp(mi.align, offset + lastSize);\n lastSize = mi.size;\n lastOffset = offset;\n }\n }\n size = this._roundUp(align, lastOffset + lastSize);\n return new _TypeSize(Math.max(explicitAlign, align), Math.max(explicitSize, size));\n }\n return null;\n }\n _isUniformVar(node) {\n return node instanceof Var && node.storage == \"uniform\";\n }\n _isStorageVar(node) {\n return node instanceof Var && node.storage == \"storage\";\n }\n _isTextureVar(node) {\n return (node instanceof Var &&\n node.type !== null &&\n WgslReflect._textureTypes.indexOf(node.type.name) != -1);\n }\n _isSamplerVar(node) {\n return (node instanceof Var &&\n node.type !== null &&\n WgslReflect._samplerTypes.indexOf(node.type.name) != -1);\n }\n _getAttribute(node, name) {\n const obj = node;\n if (!obj || !obj[\"attributes\"]) {\n return null;\n }\n const attrs = obj[\"attributes\"];\n for (let a of attrs) {\n if (a.name == name) {\n return a;\n }\n }\n return null;\n }\n _getAttributeNum(attributes, name, defaultValue) {\n if (attributes === null) {\n return defaultValue;\n }\n for (let a of attributes) {\n if (a.name == name) {\n let v = a !== null && a.value !== null ? a.value : defaultValue;\n if (v instanceof Array) {\n v = v[0];\n }\n if (typeof v === \"number\") {\n return v;\n }\n if (typeof v === \"string\") {\n return parseInt(v);\n }\n return defaultValue;\n }\n }\n return defaultValue;\n }\n _roundUp(k, n) {\n return Math.ceil(n / k) * k;\n }\n}\n// Type AlignOf(T) Sizeof(T)\n// i32, u32, or f32 4 4\n// atomic 4 4\n// vec2 8 8\n// vec3 16 12\n// vec4 16 16\n// mat2x2 8 16\n// mat3x2 8 24\n// mat4x2 8 32\n// mat2x3 16 32\n// mat3x3 16 48\n// mat4x3 16 64\n// mat2x4 16 32\n// mat3x4 16 48\n// mat4x4 16 64\nWgslReflect._typeInfo = {\n f16: { align: 2, size: 2 },\n i32: { align: 4, size: 4 },\n u32: { align: 4, size: 4 },\n f32: { align: 4, size: 4 },\n atomic: { align: 4, size: 4 },\n vec2: { align: 8, size: 8 },\n vec3: { align: 16, size: 12 },\n vec4: { align: 16, size: 16 },\n mat2x2: { align: 8, size: 16 },\n mat3x2: { align: 8, size: 24 },\n mat4x2: { align: 8, size: 32 },\n mat2x3: { align: 16, size: 32 },\n mat3x3: { align: 16, size: 48 },\n mat4x3: { align: 16, size: 64 },\n mat2x4: { align: 16, size: 32 },\n mat3x4: { align: 16, size: 48 },\n mat4x4: { align: 16, size: 64 },\n};\nWgslReflect._textureTypes = TokenTypes.any_texture_type.map((t) => {\n return t.name;\n});\nWgslReflect._samplerTypes = TokenTypes.sampler_type.map((t) => {\n return t.name;\n});\n\nfunction getEntryPointForStage(defs, stage, stageFlags) {\n const { entryPoint: entryPointName } = stage;\n if (entryPointName) {\n const ep = defs.entryPoints[entryPointName];\n return (ep && ep.stage === stageFlags) ? ep : undefined;\n }\n return Object.values(defs.entryPoints).filter(ep => ep.stage === stageFlags)[0];\n}\nfunction getStageResources(defs, stage, stageFlags) {\n if (!stage) {\n return [];\n }\n const entryPoint = getEntryPointForStage(defs, stage, stageFlags);\n return entryPoint?.resources || [];\n}\nconst byBinding = (a, b) => Math.sign(a.binding - b.binding);\n/**\n * Gets GPUBindGroupLayoutDescriptors for the given pipeline.\n *\n * Important: Assumes you pipeline is valid (it doesn't check for errors).\n *\n * Note: In WebGPU some layouts must be specified manually. For example an unfiltered-float\n * sampler can not be derived since it is unknown at compile time pipeline creation time\n * which texture you'll use.\n *\n * MAINTENANCE_TODO: Add example\n *\n * @param defs ShaderDataDefinitions or an array of ShaderDataDefinitions as\n * returned from @link {makeShaderDataDefinitions}. If an array more than 1\n * definition it's assumed the vertex shader is in the first and the fragment\n * shader in the second.\n * @param desc A PipelineDescriptor. You should be able to pass in the same object you passed\n * to `createRenderPipeline` or `createComputePipeline`.\n * @returns An array of GPUBindGroupLayoutDescriptors which you can pass, one at a time, to\n * `createBindGroupLayout`. Note: the array will be sparse if there are gaps in group\n * numbers. Note: Each GPUBindGroupLayoutDescriptor.entries will be sorted by binding.\n */\nfunction makeBindGroupLayoutDescriptors(defs, desc) {\n defs = Array.isArray(defs) ? defs : [defs];\n const resources = [\n ...getStageResources(defs[0], desc.vertex, GPUShaderStage.VERTEX),\n ...getStageResources(defs[defs.length - 1], desc.fragment, GPUShaderStage.FRAGMENT),\n ...getStageResources(defs[0], desc.compute, GPUShaderStage.COMPUTE),\n ];\n const bindGroupLayoutDescriptorsByGroupByBinding = [];\n for (const resource of resources) {\n const bindingsToBindGroupEntry = bindGroupLayoutDescriptorsByGroupByBinding[resource.group] || new Map();\n bindGroupLayoutDescriptorsByGroupByBinding[resource.group] = bindingsToBindGroupEntry;\n // Should we error here if the 2 don't match?\n const entry = bindingsToBindGroupEntry.get(resource.entry.binding);\n bindingsToBindGroupEntry.set(resource.entry.binding, {\n ...resource.entry,\n visibility: resource.entry.visibility | (entry?.visibility || 0),\n });\n }\n const descriptors = bindGroupLayoutDescriptorsByGroupByBinding.map(v => ({ entries: [...v.values()].sort(byBinding) }));\n for (let i = 0; i < descriptors.length; ++i) {\n if (!descriptors[i]) {\n descriptors[i] = { entries: [] };\n }\n }\n return descriptors;\n}\nfunction getNamedVariables(reflect, variables) {\n return Object.fromEntries(variables.map(v => {\n const typeDefinition = addVariableType(reflect, v, 0);\n return [\n v.name,\n {\n typeDefinition,\n group: v.group,\n binding: v.binding,\n size: typeDefinition.size,\n },\n ];\n }));\n}\nfunction makeStructDefinition(reflect, structInfo, offset) {\n // StructDefinition\n const fields = Object.fromEntries(structInfo.members.map(m => {\n return [\n m.name,\n {\n offset: m.offset,\n type: addType(reflect, m.type, 0),\n },\n ];\n }));\n return {\n fields,\n size: structInfo.size,\n offset,\n };\n}\nfunction getTextureSampleType(type) {\n if (type.name.includes('depth')) {\n return 'depth';\n }\n // unfiltered-float\n switch (type.format?.name) {\n case 'f32': return 'float';\n case 'i32': return 'sint';\n case 'u32': return 'uint';\n default:\n throw new Error('unknown texture sample type');\n }\n}\nfunction getViewDimension(type) {\n if (type.name.includes('2d_array')) {\n return '2d-array';\n }\n if (type.name.includes('cube_array')) {\n return 'cube-array';\n }\n if (type.name.includes('3d')) {\n return '3d';\n }\n if (type.name.includes('1d')) {\n return '1d';\n }\n if (type.name.includes('cube')) {\n return 'cube';\n }\n return '2d';\n}\nfunction getStorageTextureAccess(type) {\n switch (type.access) {\n case 'read': return 'read-only';\n case 'write': return 'write-only';\n case 'read_write': return 'read-write';\n default:\n throw new Error('unknonw storage texture access');\n }\n}\nfunction getSamplerType(type) {\n // \"non-filtering\" can only be specified manually.\n return type.name.endsWith('_comparison')\n ? 'comparison'\n : 'filtering';\n}\nfunction getBindGroupLayoutEntry(resource, visibility) {\n const { binding, access, type } = resource;\n switch (resource.resourceType) {\n case ResourceType.Uniform:\n return {\n binding,\n visibility,\n buffer: {},\n };\n case ResourceType.Storage:\n return {\n binding,\n visibility,\n buffer: {\n type: (access === '' || access === 'read') ? 'read-only-storage' : 'storage',\n },\n };\n case ResourceType.Texture: {\n if (type.name === 'texture_external') {\n return {\n binding,\n visibility,\n externalTexture: {},\n };\n }\n const multisampled = type.name.includes('multisampled');\n return {\n binding,\n visibility,\n texture: {\n sampleType: getTextureSampleType(type),\n viewDimension: getViewDimension(type),\n multisampled,\n },\n };\n }\n case ResourceType.Sampler:\n return {\n binding,\n visibility,\n sampler: {\n type: getSamplerType(type),\n },\n };\n case ResourceType.StorageTexture:\n return {\n binding,\n visibility,\n storageTexture: {\n access: getStorageTextureAccess(type),\n format: type.format.name,\n viewDimension: getViewDimension(type),\n },\n };\n default:\n throw new Error('unknown resource type');\n }\n}\nfunction addEntryPoints(funcInfos, stage) {\n const entryPoints = {};\n for (const info of funcInfos) {\n entryPoints[info.name] = {\n stage,\n resources: info.resources.map(resource => {\n const { name, group } = resource;\n return {\n name,\n group,\n entry: getBindGroupLayoutEntry(resource, stage),\n };\n }),\n };\n }\n return entryPoints;\n}\n/**\n * Given a WGSL shader, returns data definitions for structures,\n * uniforms, and storage buffers\n *\n * Example:\n *\n * ```js\n * const code = `\n * struct MyStruct {\n * color: vec4f,\n * brightness: f32,\n * kernel: array,\n * };\n * @group(0) @binding(0) var myUniforms: MyUniforms;\n * `;\n * const defs = makeShaderDataDefinitions(code);\n * const myUniformValues = makeStructuredView(defs.uniforms.myUniforms);\n *\n * myUniformValues.set({\n * color: [1, 0, 1, 1],\n * brightness: 0.8,\n * kernel: [\n * 1, 0, -1,\n * 2, 0, -2,\n * 1, 0, -1,\n * ],\n * });\n * device.queue.writeBuffer(uniformBuffer, 0, myUniformValues.arrayBuffer);\n * ```\n *\n * @param code WGSL shader. Note: it is not required for this to be a complete shader\n * @returns definitions of the structures by name. Useful for passing to {@link makeStructuredView}\n */\nfunction makeShaderDataDefinitions(code) {\n const reflect = new WgslReflect(code);\n const structs = Object.fromEntries(reflect.structs.map(structInfo => {\n return [structInfo.name, makeStructDefinition(reflect, structInfo, 0)];\n }));\n const uniforms = getNamedVariables(reflect, reflect.uniforms);\n const storages = getNamedVariables(reflect, reflect.storage.filter(v => v.resourceType === ResourceType.Storage));\n const storageTextures = getNamedVariables(reflect, reflect.storage.filter(v => v.resourceType === ResourceType.StorageTexture));\n const textures = getNamedVariables(reflect, reflect.textures.filter(v => v.type.name !== 'texture_external'));\n const externalTextures = getNamedVariables(reflect, reflect.textures.filter(v => v.type.name === 'texture_external'));\n const samplers = getNamedVariables(reflect, reflect.samplers);\n const entryPoints = {\n ...addEntryPoints(reflect.entry.vertex, GPUShaderStage.VERTEX),\n ...addEntryPoints(reflect.entry.fragment, GPUShaderStage.FRAGMENT),\n ...addEntryPoints(reflect.entry.compute, GPUShaderStage.COMPUTE),\n };\n return {\n externalTextures,\n samplers,\n structs,\n storages,\n storageTextures,\n textures,\n uniforms,\n entryPoints,\n };\n}\nfunction assert(cond, msg = '') {\n if (!cond) {\n throw new Error(msg);\n }\n}\n/*\n write down what I want for a given type\n\n struct VSUniforms {\n foo: u32,\n };\n @group(4) @binding(1) var uni1: f32;\n @group(3) @binding(2) var uni2: array;\n @group(2) @binding(3) var uni3: VSUniforms;\n @group(1) @binding(4) var uni4: array;\n\n uni1: {\n type: 'f32',\n numElements: undefined\n },\n uni2: {\n type: 'array',\n elementType: 'f32'\n numElements: 5,\n },\n uni3: {\n type: 'struct',\n fields: {\n foo: {\n type: 'f32',\n numElements: undefined\n }\n },\n },\n uni4: {\n type: 'array',\n elementType:\n fields: {\n foo: {\n type: 'f32',\n numElements: undefined\n }\n },\n fields: {\n foo: {\n type: 'f32',\n numElements: undefined\n }\n },\n ...\n ]\n\n */\nfunction addVariableType(reflect, v, offset) {\n switch (v.resourceType) {\n case ResourceType.Uniform:\n case ResourceType.Storage:\n case ResourceType.StorageTexture:\n return addType(reflect, v.type, offset);\n default:\n return {\n size: 0,\n type: v.type.name,\n };\n }\n}\nfunction addType(reflect, typeInfo, offset) {\n if (typeInfo.isArray) {\n assert(!typeInfo.isStruct, 'struct array is invalid');\n assert(!typeInfo.isStruct, 'template array is invalid');\n const arrayInfo = typeInfo;\n // ArrayDefinition\n return {\n size: arrayInfo.size,\n elementType: addType(reflect, arrayInfo.format, offset),\n numElements: arrayInfo.count,\n };\n }\n else if (typeInfo.isStruct) {\n assert(!typeInfo.isTemplate, 'template struct is invalid');\n const structInfo = typeInfo;\n return makeStructDefinition(reflect, structInfo, offset);\n }\n else {\n // template is like vec4 or mat4x4\n const asTemplateInfo = typeInfo;\n const type = typeInfo.isTemplate\n ? `${asTemplateInfo.name}<${asTemplateInfo.format.name}>`\n : typeInfo.name;\n // IntrinsicDefinition\n return {\n size: typeInfo.size,\n type: type,\n };\n }\n}\n\nfunction guessTextureBindingViewDimensionForTexture(texture) {\n switch (texture.dimension) {\n case '1d':\n return '1d';\n case '3d':\n return '3d';\n default: // to shut up TS\n case '2d':\n return texture.depthOrArrayLayers > 1 ? '2d-array' : '2d';\n }\n}\nfunction normalizeGPUExtent3Dict(size) {\n return [size.width, size.height || 1, size.depthOrArrayLayers || 1];\n}\n/**\n * Converts a `GPUExtent3D` into an array of numbers\n *\n * `GPUExtent3D` has two forms `[width, height?, depth?]` or\n * `{width: number, height?: number, depthOrArrayLayers?: number}`\n *\n * You pass one of those in here and it returns an array of 3 numbers\n * so that your code doesn't have to deal with multiple forms.\n *\n * @param size\n * @returns an array of 3 numbers, [width, height, depthOrArrayLayers]\n */\nfunction normalizeGPUExtent3D(size) {\n return (Array.isArray(size) || isTypedArray(size))\n ? [...size, 1, 1].slice(0, 3)\n : normalizeGPUExtent3Dict(size);\n}\n/**\n * Given a GPUExtent3D returns the number of mip levels needed\n *\n * @param size\n * @returns number of mip levels needed for the given size\n */\nfunction numMipLevels(size, dimension) {\n const sizes = normalizeGPUExtent3D(size);\n const maxSize = Math.max(...sizes.slice(0, dimension === '3d' ? 3 : 2));\n return 1 + Math.log2(maxSize) | 0;\n}\nfunction getMipmapGenerationWGSL(textureBindingViewDimension) {\n let textureSnippet;\n let sampleSnippet;\n switch (textureBindingViewDimension) {\n case '2d':\n textureSnippet = 'texture_2d';\n sampleSnippet = 'textureSample(ourTexture, ourSampler, fsInput.texcoord)';\n break;\n case '2d-array':\n textureSnippet = 'texture_2d_array';\n sampleSnippet = `\n textureSample(\n ourTexture,\n ourSampler,\n fsInput.texcoord,\n uni.layer)`;\n break;\n case 'cube':\n textureSnippet = 'texture_cube';\n sampleSnippet = `\n textureSample(\n ourTexture,\n ourSampler,\n faceMat[uni.layer] * vec3f(fract(fsInput.texcoord), 1))`;\n break;\n case 'cube-array':\n textureSnippet = 'texture_cube_array';\n sampleSnippet = `\n textureSample(\n ourTexture,\n ourSampler,\n faceMat[uni.layer] * vec3f(fract(fsInput.texcoord), 1), uni.layer)`;\n break;\n default:\n throw new Error(`unsupported view: ${textureBindingViewDimension}`);\n }\n return `\n const faceMat = array(\n mat3x3f( 0, 0, -2, 0, -2, 0, 1, 1, 1), // pos-x\n mat3x3f( 0, 0, 2, 0, -2, 0, -1, 1, -1), // neg-x\n mat3x3f( 2, 0, 0, 0, 0, 2, -1, 1, -1), // pos-y\n mat3x3f( 2, 0, 0, 0, 0, -2, -1, -1, 1), // neg-y\n mat3x3f( 2, 0, 0, 0, -2, 0, -1, 1, 1), // pos-z\n mat3x3f(-2, 0, 0, 0, -2, 0, 1, 1, -1)); // neg-z\n\n struct VSOutput {\n @builtin(position) position: vec4f,\n @location(0) texcoord: vec2f,\n };\n\n @vertex fn vs(\n @builtin(vertex_index) vertexIndex : u32\n ) -> VSOutput {\n var pos = array(\n vec2f(-1.0, -1.0),\n vec2f(-1.0, 3.0),\n vec2f( 3.0, -1.0),\n );\n\n var vsOutput: VSOutput;\n let xy = pos[vertexIndex];\n vsOutput.position = vec4f(xy, 0.0, 1.0);\n vsOutput.texcoord = xy * vec2f(0.5, -0.5) + vec2f(0.5);\n return vsOutput;\n }\n\n struct Uniforms {\n layer: u32,\n };\n\n @group(0) @binding(0) var ourSampler: sampler;\n @group(0) @binding(1) var ourTexture: ${textureSnippet};\n @group(0) @binding(2) var uni: Uniforms;\n\n @fragment fn fs(fsInput: VSOutput) -> @location(0) vec4f {\n _ = uni.layer; // make sure this is used so all pipelines have the same bindings\n return ${sampleSnippet};\n }\n `;\n}\n// Use a WeakMap so the device can be destroyed and/or lost\nconst byDevice = new WeakMap();\n/**\n * Generates mip levels from level 0 to the last mip for an existing texture\n *\n * The texture must have been created with TEXTURE_BINDING and RENDER_ATTACHMENT\n * and been created with mip levels\n *\n * @param device A GPUDevice\n * @param texture The texture to create mips for\n * @param textureBindingViewDimension This is only needed in compatibility mode\n * and it is only needed when the texture is going to be used as a cube map.\n */\nfunction generateMipmap(device, texture, textureBindingViewDimension) {\n let perDeviceInfo = byDevice.get(device);\n if (!perDeviceInfo) {\n perDeviceInfo = {\n pipelineByFormatAndView: {},\n moduleByViewType: {},\n };\n byDevice.set(device, perDeviceInfo);\n }\n let { sampler, uniformBuffer, uniformValues, } = perDeviceInfo;\n const { pipelineByFormatAndView, moduleByViewType, } = perDeviceInfo;\n textureBindingViewDimension = textureBindingViewDimension || guessTextureBindingViewDimensionForTexture(texture);\n let module = moduleByViewType[textureBindingViewDimension];\n if (!module) {\n const code = getMipmapGenerationWGSL(textureBindingViewDimension);\n module = device.createShaderModule({\n label: `mip level generation for ${textureBindingViewDimension}`,\n code,\n });\n moduleByViewType[textureBindingViewDimension] = module;\n }\n if (!sampler) {\n sampler = device.createSampler({\n minFilter: 'linear',\n magFilter: 'linear',\n });\n uniformBuffer = device.createBuffer({\n size: 16,\n usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n });\n uniformValues = new Uint32Array(1);\n Object.assign(perDeviceInfo, { sampler, uniformBuffer, uniformValues });\n }\n const id = `${texture.format}.${textureBindingViewDimension}`;\n if (!pipelineByFormatAndView[id]) {\n pipelineByFormatAndView[id] = device.createRenderPipeline({\n label: `mip level generator pipeline for ${textureBindingViewDimension}`,\n layout: 'auto',\n vertex: {\n module,\n entryPoint: 'vs',\n },\n fragment: {\n module,\n entryPoint: 'fs',\n targets: [{ format: texture.format }],\n },\n });\n }\n const pipeline = pipelineByFormatAndView[id];\n for (let baseMipLevel = 1; baseMipLevel < texture.mipLevelCount; ++baseMipLevel) {\n for (let baseArrayLayer = 0; baseArrayLayer < texture.depthOrArrayLayers; ++baseArrayLayer) {\n uniformValues[0] = baseArrayLayer;\n device.queue.writeBuffer(uniformBuffer, 0, uniformValues);\n const bindGroup = device.createBindGroup({\n layout: pipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: sampler },\n {\n binding: 1,\n resource: texture.createView({\n dimension: textureBindingViewDimension,\n baseMipLevel: baseMipLevel - 1,\n mipLevelCount: 1,\n }),\n },\n { binding: 2, resource: { buffer: uniformBuffer } },\n ],\n });\n const renderPassDescriptor = {\n label: 'mip gen renderPass',\n colorAttachments: [\n {\n view: texture.createView({\n dimension: '2d',\n baseMipLevel,\n mipLevelCount: 1,\n baseArrayLayer,\n arrayLayerCount: 1,\n }),\n loadOp: 'clear',\n storeOp: 'store',\n },\n ],\n };\n const encoder = device.createCommandEncoder({\n label: 'mip gen encoder',\n });\n const pass = encoder.beginRenderPass(renderPassDescriptor);\n pass.setPipeline(pipeline);\n pass.setBindGroup(0, bindGroup);\n pass.draw(3);\n pass.end();\n const commandBuffer = encoder.finish();\n device.queue.submit([commandBuffer]);\n }\n }\n}\n\nconst kTypedArrayToAttribFormat = new Map([\n [Int8Array, { formats: ['sint8', 'snorm8'], defaultForType: 1 }],\n [Uint8Array, { formats: ['uint8', 'unorm8'], defaultForType: 1 }],\n [Int16Array, { formats: ['sint16', 'snorm16'], defaultForType: 1 }],\n [Uint16Array, { formats: ['uint16', 'unorm16'], defaultForType: 1 }],\n [Int32Array, { formats: ['sint32', 'snorm32'], defaultForType: 0 }],\n [Uint32Array, { formats: ['uint32', 'unorm32'], defaultForType: 0 }],\n [Float32Array, { formats: ['float32', 'float32'], defaultForType: 0 }],\n // TODO: Add Float16Array\n]);\nconst kVertexFormatPrefixToType = new Map([...kTypedArrayToAttribFormat.entries()].map(([Type, { formats: [s1, s2] }]) => [[s1, Type], [s2, Type]]).flat());\nfunction isIndices(name) {\n return name === \"indices\";\n}\nfunction makeTypedArrayFromArrayUnion(array, name) {\n if (isTypedArray(array)) {\n return array;\n }\n let asFullSpec = array;\n if (isTypedArray(asFullSpec.data)) {\n return asFullSpec.data;\n }\n if (Array.isArray(array) || typeof array === 'number') {\n asFullSpec = {\n data: array,\n };\n }\n let Type = asFullSpec.type;\n if (!Type) {\n if (isIndices(name)) {\n Type = Uint32Array;\n }\n else {\n Type = Float32Array;\n }\n }\n return new Type(asFullSpec.data); // ugh!\n}\nfunction getArray(array) {\n const arr = array.length ? array : array.data;\n return arr;\n}\nconst kNameToNumComponents = [\n { re: /coord|texture|uv/i, numComponents: 2 },\n { re: /color|colour/i, numComponents: 4 },\n];\nfunction guessNumComponentsFromNameImpl(name) {\n for (const { re, numComponents } of kNameToNumComponents) {\n if (re.test(name)) {\n return numComponents;\n }\n }\n return 3;\n}\nfunction guessNumComponentsFromName(name, length) {\n const numComponents = guessNumComponentsFromNameImpl(name);\n if (length % numComponents > 0) {\n throw new Error(`Can not guess numComponents for attribute '${name}'. Tried ${numComponents} but ${length} values is not evenly divisible by ${numComponents}. You should specify it.`);\n }\n return numComponents;\n}\nfunction getNumComponents(array, arrayName) {\n return array.numComponents || guessNumComponentsFromName(arrayName, getArray(array).length);\n}\nconst kVertexFormatRE = /(\\w+)(?:x(\\d))$/;\nfunction numComponentsAndTypeFromVertexFormat(format) {\n const m = kVertexFormatRE.exec(format);\n const [prefix, numComponents] = m ? [m[1], parseInt(m[2])] : [format, 1];\n return {\n Type: kVertexFormatPrefixToType.get(prefix),\n numComponents,\n };\n}\nfunction createTypedArrayOfSameType(typedArray, arrayBuffer) {\n const Ctor = Object.getPrototypeOf(typedArray).constructor;\n return new Ctor(arrayBuffer);\n}\n/**\n * Given a set of named arrays, generates an array `GPUBufferLayout`s\n *\n * Examples:\n *\n * ```js\n * const arrays = {\n * position: [1, 1, -1, 1, 1, 1, 1, -1, 1, 1, -1, -1, -1, 1, 1, -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, -1, 1, -1, -1, 1, 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1, -1, 1, -1, 1, 1, -1, 1, -1, -1, -1, -1, -1],\n * normal: [1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1],\n * texcoord: [1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1],\n * };\n *\n * const { bufferLayouts, typedArrays } = createBufferLayoutsFromArrays(arrays);\n * ```\n *\n * results in `bufferLayouts` being\n *\n * ```js\n * [\n * {\n * stepMode: 'vertex',\n * arrayStride: 32,\n * attributes: [\n * { shaderLocation: 0, offset: 0, format: 'float32x3' },\n * { shaderLocation: 1, offset: 12, format: 'float32x3' },\n * { shaderLocation: 2, offset: 24, format: 'float32x2' },\n * ],\n * },\n * ]\n * ```\n *\n * and `typedArrays` being\n *\n * ```\n * [\n * someFloat32Array0,\n * someFloat32Array1,\n * someFloat32Array2,\n * ]\n * ```\n *\n * See {@link Arrays} for details on the various types of arrays.\n *\n * Note: If typed arrays are passed in the same typed arrays will come out (copies will not be made)\n */\nfunction createBufferLayoutsFromArrays(arrays, options = {}) {\n const interleave = options.interleave === undefined ? true : options.interleave;\n const stepMode = options.stepMode || 'vertex';\n const shaderLocations = options.shaderLocation\n ? (Array.isArray(options.shaderLocation) ? options.shaderLocation : [options.shaderLocation])\n : [0];\n let currentOffset = 0;\n const bufferLayouts = [];\n const attributes = [];\n const typedArrays = [];\n Object.keys(arrays)\n .filter(arrayName => !isIndices(arrayName))\n .forEach(arrayName => {\n const array = arrays[arrayName];\n const data = makeTypedArrayFromArrayUnion(array, arrayName);\n const totalNumComponents = getNumComponents(array, arrayName);\n // if totalNumComponents > 4 then we clearly need to split this into multiple\n // attributes\n // (a) <= 4 doesn't mean don't split and\n // (b) how to split? We could divide by 4 and if it's not even then divide by 3\n // as a guess?\n // 5 is error? or 1x4 + 1x1?\n // 6 is 2x3\n // 7 is error? or 1x4 + 1x3?\n // 8 is 2x4\n // 9 is 3x3\n // 10 is error? or 2x4 + 1x2?\n // 11 is error? or 2x4 + 1x3?\n // 12 is 3x4 or 4x3?\n // 13 is error? or 3x4 + 1x1 or 4x3 + 1x1?\n // 14 is error? or 3x4 + 1x2 or 4x3 + 1x2?\n // 15 is error? or 3x4 + 1x3 or 4x3 + 1x3?\n // 16 is 4x4\n const by4 = totalNumComponents / 4;\n const by3 = totalNumComponents / 3;\n const step = by4 % 1 === 0 ? 4 : (by3 % 1 === 0 ? 3 : 4);\n for (let component = 0; component < totalNumComponents; component += step) {\n const numComponents = Math.min(step, totalNumComponents - component);\n const offset = currentOffset;\n currentOffset += numComponents * data.BYTES_PER_ELEMENT;\n const { defaultForType, formats } = kTypedArrayToAttribFormat.get(Object.getPrototypeOf(data).constructor);\n const normalize = array.normalize;\n const formatNdx = typeof normalize === 'undefined' ? defaultForType : (normalize ? 1 : 0);\n const format = `${formats[formatNdx]}${numComponents > 1 ? `x${numComponents}` : ''}`;\n // TODO: cleanup with generator?\n const shaderLocation = shaderLocations.shift();\n if (shaderLocations.length === 0) {\n shaderLocations.push(shaderLocation + 1);\n }\n attributes.push({\n offset,\n format,\n shaderLocation,\n });\n typedArrays.push({\n data,\n offset: component,\n stride: totalNumComponents,\n });\n }\n if (!interleave) {\n bufferLayouts.push({\n stepMode,\n arrayStride: currentOffset,\n attributes: attributes.slice(),\n });\n currentOffset = 0;\n attributes.length = 0;\n }\n });\n if (attributes.length) {\n bufferLayouts.push({\n stepMode,\n arrayStride: currentOffset,\n attributes: attributes,\n });\n }\n return {\n bufferLayouts,\n typedArrays,\n };\n}\nfunction getTypedArrayWithOffsetAndStride(ta, numComponents) {\n return (isTypedArray(ta)\n ? { data: ta, offset: 0, stride: numComponents }\n : ta);\n}\n/**\n * Given an array of `GPUVertexAttribute`s and a corresponding array\n * of TypedArrays, interleaves the contents of the typed arrays\n * into the given ArrayBuffer\n *\n * example:\n *\n * ```js\n * const attributes: GPUVertexAttribute[] = [\n * { shaderLocation: 0, offset: 0, format: 'float32x3' },\n * { shaderLocation: 1, offset: 12, format: 'float32x3' },\n * { shaderLocation: 2, offset: 24, format: 'float32x2' },\n * ];\n * const typedArrays = [\n * new Float32Array([1, 1, -1, 1, 1, 1, 1, -1, 1, 1, -1, -1, -1, 1, 1, -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, -1, 1, -1, -1, 1, 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1, -1, 1, -1, 1, 1, -1, 1, -1, -1, -1, -1, -1]),\n * new Float32Array([1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1]),\n * new Float32Array([1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1]),\n * ];\n * const arrayStride = (3 + 3 + 2) * 4; // pos + nrm + uv\n * const arrayBuffer = new ArrayBuffer(arrayStride * 24)\n * interleaveVertexData(attributes, typedArrays, arrayStride, arrayBuffer)\n * ```\n *\n * results in the contents of `arrayBuffer` to be the 3 TypedArrays interleaved\n *\n * See {@link Arrays} for details on the various types of arrays.\n *\n * Note: You can generate `attributes` and `typedArrays` above by calling\n * {@link createBufferLayoutsFromArrays}\n */\nfunction interleaveVertexData(attributes, typedArrays, arrayStride, arrayBuffer) {\n const views = new Map();\n const getView = (typedArray) => {\n const Ctor = Object.getPrototypeOf(typedArray).constructor;\n const view = views.get(Ctor);\n if (view) {\n return view;\n }\n const newView = new Ctor(arrayBuffer);\n views.set(Ctor, newView);\n return newView;\n };\n attributes.forEach((attribute, ndx) => {\n const { offset, format } = attribute;\n const { numComponents } = numComponentsAndTypeFromVertexFormat(format);\n const { data, offset: srcOffset, stride, } = getTypedArrayWithOffsetAndStride(typedArrays[ndx], numComponents);\n const view = getView(data);\n for (let i = 0; i < data.length; i += stride) {\n const ndx = i / stride;\n const dstOffset = (offset + ndx * arrayStride) / view.BYTES_PER_ELEMENT;\n const srcOff = i + srcOffset;\n const s = data.subarray(srcOff, srcOff + numComponents);\n view.set(s, dstOffset);\n }\n });\n}\n/**\n * Given arrays, create buffers, fills the buffers with data if provided, optionally\n * interleaves the data (the default).\n *\n * Example:\n *\n * ```js\n * const {\n * buffers,\n * bufferLayouts,\n * indexBuffer,\n * indexFormat,\n * numElements,\n * } = createBuffersAndAttributesFromArrays(device, {\n * position: [1, 1, -1, 1, 1, 1, 1, -1, 1, 1, -1, -1, -1, 1, 1, -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, -1, 1, -1, -1, 1, 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1, -1, 1, -1, 1, 1, -1, 1, -1, -1, -1, -1, -1],\n * normal: [1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1],\n * texcoord: [1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1],\n * indices: [0, 1, 2, 0, 2, 3, 4, 5, 6, 4, 6, 7, 8, 9, 10, 8, 10, 11, 12, 13, 14, 12, 14, 15, 16, 17, 18, 16, 18, 19, 20, 21, 22, 20, 22, 23],\n * });\n * ```\n *\n * Where `bufferLayouts` will be\n *\n * ```js\n * [\n * {\n * stepMode: 'vertex',\n * arrayStride: 32,\n * attributes: [\n * { shaderLocation: 0, offset: 0, format: 'float32x3' },\n * { shaderLocation: 1, offset: 12, format: 'float32x3' },\n * { shaderLocation: 2, offset: 24, format: 'float32x2' },\n * ],\n * },\n * ]\n * ```\n *\n * * `buffers` will have one `GPUBuffer` of usage `GPUBufferUsage.VERTEX`\n * * `indexBuffer` will be `GPUBuffer` of usage `GPUBufferUsage.INDEX`\n * * `indexFormat` will be `uint32` (use a full spec or a typedarray of `Uint16Array` if you want 16bit indices)\n * * `numElements` will be 36 (this is either the number entries in the array named `indices` or if no\n * indices are provided then it's the length of the first array divided by numComponents. See {@link Arrays})\n *\n * See {@link Arrays} for details on the various types of arrays.\n * Also see the cube and instancing examples.\n */\nfunction createBuffersAndAttributesFromArrays(device, arrays, options = {}) {\n const usage = (options.usage || 0);\n const { bufferLayouts, typedArrays, } = createBufferLayoutsFromArrays(arrays, options);\n const buffers = [];\n let numElements = -1;\n let bufferNdx = 0;\n for (const { attributes, arrayStride } of bufferLayouts) {\n const attribs = attributes;\n const attrib0 = attribs[0];\n const { numComponents } = numComponentsAndTypeFromVertexFormat(attrib0.format);\n const { data: data0, stride, } = getTypedArrayWithOffsetAndStride(typedArrays[bufferNdx], numComponents);\n if (numElements < 0) {\n numElements = data0.length / stride;\n }\n const size = arrayStride * numElements;\n const buffer = device.createBuffer({\n usage: usage | GPUBufferUsage.VERTEX,\n size,\n mappedAtCreation: true,\n });\n const arrayBuffer = buffer.getMappedRange();\n if (attribs.length === 1 && arrayStride === data0.BYTES_PER_ELEMENT * numComponents) {\n const view = createTypedArrayOfSameType(data0, arrayBuffer);\n view.set(data0);\n }\n else {\n interleaveVertexData(attribs, typedArrays.slice(bufferNdx), arrayStride, arrayBuffer);\n }\n buffer.unmap();\n buffers.push(buffer);\n bufferNdx += attribs.length;\n }\n const buffersAndAttributes = {\n numElements,\n bufferLayouts,\n buffers,\n };\n const indicesEntry = Object.entries(arrays).find(([arrayName]) => isIndices(arrayName));\n if (indicesEntry) {\n const indices = makeTypedArrayFromArrayUnion(indicesEntry[1], 'indices');\n const indexBuffer = device.createBuffer({\n size: indices.byteLength,\n usage: GPUBufferUsage.INDEX | usage,\n mappedAtCreation: true,\n });\n const dst = createTypedArrayOfSameType(indices, indexBuffer.getMappedRange());\n dst.set(indices);\n indexBuffer.unmap();\n buffersAndAttributes.indexBuffer = indexBuffer;\n buffersAndAttributes.indexFormat = indices instanceof Uint16Array ? 'uint16' : 'uint32';\n buffersAndAttributes.numElements = indices.length;\n }\n return buffersAndAttributes;\n}\n/**\n * Calls `passEncoder.setVertexBuffer` and optionally `passEncoder.setIndexBuffer`\n * for the buffers specified in `buffersAndAttributes`.\n *\n * This is extremely simple function. It is equivalent to\n *\n * ```js\n * buffersAndAttributes.buffers.forEach((buffer, i) => {\n * passEncoder.setVertexBuffer(firstVertexBufferIndex + i, buffer);\n * });\n*\n * if (buffersAndAttributes.indexBuffer) {\n * passEncoder.setIndexBuffer(buffersAndAttributes.indexBuffer, buffersAndAttributes.indexFormat!);\n * }\n * ```\n *\n * It exists solely for simple cases. If you have a complex case, call the passEncoder\n * yourself as appropriate.\n *\n * @param passEncoder a render pass encoder\n * @param buffersAndAttributes As returned from {@link createBuffersAndAttributesFromArrays}\n * @param firstVertexBufferIndex The first vertex buffer index. default = 0.\n */\nfunction setVertexAndIndexBuffers(passEncoder, buffersAndAttributes, firstVertexBufferIndex = 0) {\n buffersAndAttributes.buffers.forEach((buffer, i) => {\n passEncoder.setVertexBuffer(firstVertexBufferIndex + i, buffer);\n });\n if (buffersAndAttributes.indexBuffer) {\n passEncoder.setIndexBuffer(buffersAndAttributes.indexBuffer, buffersAndAttributes.indexFormat);\n }\n}\n/**\n * Calls {@link setVertexAndIndexBuffers} and then calls either `draw` or `drawIndexed`\n *\n * This is an extremely simple function. See {@link setVertexAndIndexBuffers}.\n * If you need something more complex, call pass encoder functions yourself as appropriate.\n *\n * @param passEncoder a render pass encoder\n * @param buffersAndAttributes As returned from {@link createBuffersAndAttributesFromArrays}\n */\nfunction drawArrays(passEncoder, buffersAndAttributes) {\n setVertexAndIndexBuffers(passEncoder, buffersAndAttributes);\n if (buffersAndAttributes.indexBuffer) {\n passEncoder.drawIndexed(buffersAndAttributes.numElements);\n }\n else {\n passEncoder.draw(buffersAndAttributes.numElements);\n }\n}\n\nfunction isTextureData(source) {\n const src = source;\n return isTypedArray(src.data) || Array.isArray(src.data);\n}\nfunction isTextureRawDataSource(source) {\n return isTypedArray(source) || Array.isArray(source) || isTextureData(source);\n}\nfunction toTypedArray(v, format) {\n if (isTypedArray(v)) {\n return v;\n }\n const { Type } = getTextureFormatInfo(format);\n return new Type(v);\n}\nfunction guessDimensions(width, height, numElements, dimension = '2d') {\n if (numElements % 1 !== 0) {\n throw new Error(\"can't guess dimensions\");\n }\n if (!width && !height) {\n const size = Math.sqrt(numElements / (dimension === 'cube' ? 6 : 1));\n if (size % 1 === 0) {\n width = size;\n height = size;\n }\n else {\n width = numElements;\n height = 1;\n }\n }\n else if (!height) {\n height = numElements / width;\n if (height % 1) {\n throw new Error(\"can't guess dimensions\");\n }\n }\n else if (!width) {\n width = numElements / height;\n if (width % 1) {\n throw new Error(\"can't guess dimensions\");\n }\n }\n const depth = numElements / width / height;\n if (depth % 1) {\n throw new Error(\"can't guess dimensions\");\n }\n return [width, height, depth];\n}\nfunction textureViewDimensionToDimension(viewDimension) {\n switch (viewDimension) {\n case '1d': return '1d';\n case '3d': return '3d';\n default: return '2d';\n }\n}\nconst kFormatToTypedArray = {\n '8snorm': Int8Array,\n '8unorm': Uint8Array,\n '8sint': Int8Array,\n '8uint': Uint8Array,\n '16snorm': Int16Array,\n '16unorm': Uint16Array,\n '16sint': Int16Array,\n '16uint': Uint16Array,\n '32snorm': Int32Array,\n '32unorm': Uint32Array,\n '32sint': Int32Array,\n '32uint': Uint32Array,\n '16float': Uint16Array,\n '32float': Float32Array,\n};\nconst kTextureFormatRE = /([a-z]+)(\\d+)([a-z]+)/;\nfunction getTextureFormatInfo(format) {\n // this is a hack! It will only work for common formats\n const [, channels, bits, typeName] = kTextureFormatRE.exec(format);\n // TODO: if the regex fails, use table for other formats?\n const numChannels = channels.length;\n const bytesPerChannel = parseInt(bits) / 8;\n const bytesPerElement = numChannels * bytesPerChannel;\n const Type = kFormatToTypedArray[`${bits}${typeName}`];\n return {\n channels,\n numChannels,\n bytesPerChannel,\n bytesPerElement,\n Type,\n };\n}\n/**\n * Gets the size of a mipLevel. Returns an array of 3 numbers [width, height, depthOrArrayLayers]\n */\nfunction getSizeForMipFromTexture(texture, mipLevel) {\n return [\n texture.width,\n texture.height,\n texture.depthOrArrayLayers,\n ].map(v => Math.max(1, Math.floor(v / 2 ** mipLevel)));\n}\n/**\n * Uploads Data to a texture\n */\nfunction uploadDataToTexture(device, texture, source, options) {\n const data = toTypedArray(source.data || source, texture.format);\n const mipLevel = 0;\n const size = getSizeForMipFromTexture(texture, mipLevel);\n const { bytesPerElement } = getTextureFormatInfo(texture.format);\n const origin = options.origin || [0, 0, 0];\n device.queue.writeTexture({ texture, origin }, data, { bytesPerRow: bytesPerElement * size[0], rowsPerImage: size[1] }, size);\n}\n/**\n * Copies a an array of \"sources\" (Video, Canvas, OffscreenCanvas, ImageBitmap)\n * to a texture and then optionally generates mip levels\n */\nfunction copySourcesToTexture(device, texture, sources, options = {}) {\n let tempTexture;\n sources.forEach((source, layer) => {\n const origin = [0, 0, layer + (options.baseArrayLayer || 0)];\n if (isTextureRawDataSource(source)) {\n uploadDataToTexture(device, texture, source, { origin });\n }\n else {\n const s = source;\n // work around limit that you can't call copyExternalImageToTexture for 3d texture.\n // sse https://github.com/gpuweb/gpuweb/issues/4697 for if we can remove this\n let dstTexture = texture;\n let copyOrigin = origin;\n if (texture.dimension === '3d') {\n tempTexture = tempTexture ?? device.createTexture({\n format: texture.format,\n usage: texture.usage | GPUTextureUsage.COPY_SRC,\n size: [texture.width, texture.height, 1],\n });\n dstTexture = tempTexture;\n copyOrigin = [0, 0, 0];\n }\n const { flipY, premultipliedAlpha, colorSpace } = options;\n device.queue.copyExternalImageToTexture({ source: s, flipY, }, { texture: dstTexture, premultipliedAlpha, colorSpace, origin: copyOrigin }, getSizeFromSource(s, options));\n if (tempTexture) {\n const encoder = device.createCommandEncoder();\n encoder.copyTextureToTexture({ texture: tempTexture }, { texture, origin }, tempTexture);\n device.queue.submit([encoder.finish()]);\n }\n }\n });\n if (tempTexture) {\n tempTexture.destroy();\n }\n if (texture.mipLevelCount > 1) {\n generateMipmap(device, texture);\n }\n}\n/**\n * Copies a \"source\" (Video, Canvas, OffscreenCanvas, ImageBitmap)\n * to a texture and then optionally generates mip levels\n */\nfunction copySourceToTexture(device, texture, source, options = {}) {\n copySourcesToTexture(device, texture, [source], options);\n}\n/**\n * Gets the size from a source. This is to smooth out the fact that different\n * sources have a different way to get their size.\n */\nfunction getSizeFromSource(source, options) {\n if (source instanceof HTMLVideoElement) {\n return [source.videoWidth, source.videoHeight, 1];\n }\n else {\n const maybeHasWidthAndHeight = source;\n const { width, height } = maybeHasWidthAndHeight;\n if (width > 0 && height > 0 && !isTextureRawDataSource(source)) {\n // this should cover Canvas, Image, ImageData, ImageBitmap, TextureCreationData\n return [width, height, 1];\n }\n const format = options.format || 'rgba8unorm';\n const { bytesPerElement, bytesPerChannel } = getTextureFormatInfo(format);\n const data = isTypedArray(source) || Array.isArray(source)\n ? source\n : source.data;\n const numBytes = isTypedArray(data)\n ? data.byteLength\n : (data.length * bytesPerChannel);\n const numElements = numBytes / bytesPerElement;\n return guessDimensions(width, height, numElements);\n }\n}\n/**\n * Create a texture from an array of sources (Video, Canvas, OffscreenCanvas, ImageBitmap)\n * and optionally create mip levels. If you set `mips: true` and don't set a mipLevelCount\n * then it will automatically make the correct number of mip levels.\n *\n * Example:\n *\n * ```js\n * const texture = createTextureFromSource(\n * device,\n * [\n * someCanvasOrVideoOrImageImageBitmap0,\n * someCanvasOrVideoOrImageImageBitmap1,\n * ],\n * {\n * usage: GPUTextureUsage.TEXTURE_BINDING |\n * GPUTextureUsage.RENDER_ATTACHMENT |\n * GPUTextureUsage.COPY_DST,\n * mips: true,\n * }\n * );\n * ```\n */\nfunction createTextureFromSources(device, sources, options = {}) {\n // NOTE: We assume all the sizes are the same. If they are not you'll get\n // an error.\n const size = getSizeFromSource(sources[0], options);\n size[2] = size[2] > 1 ? size[2] : sources.length;\n const texture = device.createTexture({\n dimension: textureViewDimensionToDimension(options.dimension),\n format: options.format || 'rgba8unorm',\n mipLevelCount: options.mipLevelCount\n ? options.mipLevelCount\n : options.mips ? numMipLevels(size) : 1,\n size,\n usage: (options.usage ?? 0) |\n GPUTextureUsage.TEXTURE_BINDING |\n GPUTextureUsage.COPY_DST |\n GPUTextureUsage.RENDER_ATTACHMENT,\n });\n copySourcesToTexture(device, texture, sources, options);\n return texture;\n}\n/**\n * Create a texture from a source (Video, Canvas, OffscreenCanvas, ImageBitmap)\n * and optionally create mip levels. If you set `mips: true` and don't set a mipLevelCount\n * then it will automatically make the correct number of mip levels.\n *\n * Example:\n *\n * ```js\n * const texture = createTextureFromSource(\n * device,\n * someCanvasOrVideoOrImageImageBitmap,\n * {\n * usage: GPUTextureUsage.TEXTURE_BINDING |\n * GPUTextureUsage.RENDER_ATTACHMENT |\n * GPUTextureUsage.COPY_DST,\n * mips: true,\n * }\n * );\n * ```\n */\nfunction createTextureFromSource(device, source, options = {}) {\n return createTextureFromSources(device, [source], options);\n}\n/**\n * Load an ImageBitmap\n * @param url\n * @param options\n * @returns the loaded ImageBitmap\n */\nasync function loadImageBitmap(url, options = {}) {\n const res = await fetch(url);\n const blob = await res.blob();\n const opt = {\n ...options,\n ...(options.colorSpaceConversion !== undefined && { colorSpaceConversion: 'none' }),\n };\n return await createImageBitmap(blob, opt);\n}\n/**\n * Load images and create a texture from them, optionally generating mip levels\n *\n * Assumes all the urls reference images of the same size.\n *\n * Example:\n *\n * ```js\n * const texture = await createTextureFromImage(\n * device,\n * [\n * 'https://someimage1.url',\n * 'https://someimage2.url',\n * ],\n * {\n * mips: true,\n * flipY: true,\n * },\n * );\n * ```\n */\nasync function createTextureFromImages(device, urls, options = {}) {\n // TODO: start once we've loaded one?\n // We need at least 1 to know the size of the texture to create\n const imgBitmaps = await Promise.all(urls.map(url => loadImageBitmap(url)));\n return createTextureFromSources(device, imgBitmaps, options);\n}\n/**\n * Load an image and create a texture from it, optionally generating mip levels\n *\n * Example:\n *\n * ```js\n * const texture = await createTextureFromImage(device, 'https://someimage.url', {\n * mips: true,\n * flipY: true,\n * });\n * ```\n */\nasync function createTextureFromImage(device, url, options = {}) {\n return createTextureFromImages(device, [url], options);\n}\n\n/*\n * Copyright 2023 Gregg Tavares\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n * copy of this software and associated documentation files (the \"Software\"),\n * to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense,\n * and/or sell copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\n * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n */\n/**\n * A class to provide `push` on a typed array.\n *\n * example:\n *\n * ```js\n * const positions = new TypedArrayWrapper(new Float32Array(300), 3);\n * positions.push(1, 2, 3); // add a position\n * positions.push([4, 5, 6]); // add a position\n * positions.push(new Float32Array(6)); // add 2 positions\n * const data = positions.typedArray;\n * ```\n */\nclass TypedArrayWrapper {\n typedArray;\n cursor = 0;\n numComponents;\n constructor(arr, numComponents) {\n this.typedArray = arr;\n this.numComponents = numComponents;\n }\n get numElements() {\n return this.typedArray.length / this.numComponents;\n }\n push(...data) {\n for (const value of data) {\n if (Array.isArray(value) || isTypedArray(value)) {\n const asArray = data;\n this.typedArray.set(asArray, this.cursor);\n this.cursor += asArray.length;\n }\n else {\n this.typedArray[this.cursor++] = value;\n }\n }\n }\n reset(index = 0) {\n this.cursor = index;\n }\n}\n/**\n * creates a typed array with a `push` function attached\n * so that you can easily *push* values.\n *\n * `push` can take multiple arguments. If an argument is an array each element\n * of the array will be added to the typed array.\n *\n * Example:\n *\n * const array = createAugmentedTypedArray(3, 2, Float32Array);\n * array.push(1, 2, 3);\n * array.push([4, 5, 6]);\n * // array now contains [1, 2, 3, 4, 5, 6]\n *\n * Also has `numComponents` and `numElements` properties.\n *\n * @param numComponents number of components\n * @param numElements number of elements. The total size of the array will be `numComponents * numElements`.\n * @param Type A constructor for the type. Default = `Float32Array`.\n */\nfunction createAugmentedTypedArray(numComponents, numElements, Type) {\n return new TypedArrayWrapper(new Type(numComponents * numElements), numComponents);\n}\n// I couldn't figure out how to make this because TypedArrayWrapper wants a type\n// but this is explicity kind of type-less.\nfunction createAugmentedTypedArrayFromExisting(numComponents, numElements, existingArray) {\n const Ctor = existingArray.constructor;\n const array = new Ctor(numComponents * numElements);\n return new TypedArrayWrapper(array, numComponents);\n}\n/**\n * Creates XY quad vertices\n *\n * The default with no parameters will return a 2x2 quad with values from -1 to +1.\n * If you want a unit quad with that goes from 0 to 1 you'd call it with\n *\n * createXYQuadVertices(1, 0.5, 0.5);\n *\n * If you want a unit quad centered above 0,0 you'd call it with\n *\n * primitives.createXYQuadVertices(1, 0, 0.5);\n *\n * @param params\n * @param params.size the size across the quad. Defaults to 2 which means vertices will go from -1 to +1\n * @param params.xOffset the amount to offset the quad in X. Default = 0\n * @param params.yOffset the amount to offset the quad in Y. Default = 0\n * @return the created XY Quad vertices\n */\nfunction createXYQuadVertices({ size: inSize = 2, xOffset = 0, yOffset = 0 } = {}) {\n const size = inSize * 0.5;\n return {\n position: {\n numComponents: 2,\n data: [\n xOffset + -1 * size, yOffset + -1 * size,\n xOffset + 1 * size, yOffset + -1 * size,\n xOffset + -1 * size, yOffset + 1 * size,\n xOffset + 1 * size, yOffset + 1 * size,\n ],\n },\n normal: [\n 0, 0, 1,\n 0, 0, 1,\n 0, 0, 1,\n 0, 0, 1,\n ],\n texcoord: [\n 0, 0,\n 1, 0,\n 0, 1,\n 1, 1,\n ],\n indices: [0, 1, 2, 2, 1, 3],\n };\n}\n/**\n * Creates XZ plane vertices.\n *\n * The created plane has position, normal, and texcoord data\n *\n * @param params\n * @param params.width Width of the plane. Default = 1\n * @param params.depth Depth of the plane. Default = 1\n * @param params.subdivisionsWidth Number of steps across the plane. Default = 1\n * @param params.subdivisionsDepth Number of steps down the plane. Default = 1\n * @return The created plane vertices.\n */\nfunction createPlaneVertices({ width = 1, depth = 1, subdivisionsWidth = 1, subdivisionsDepth = 1, } = {}) {\n const numVertices = (subdivisionsWidth + 1) * (subdivisionsDepth + 1);\n const positions = createAugmentedTypedArray(3, numVertices, Float32Array);\n const normals = createAugmentedTypedArray(3, numVertices, Float32Array);\n const texcoords = createAugmentedTypedArray(2, numVertices, Float32Array);\n for (let z = 0; z <= subdivisionsDepth; z++) {\n for (let x = 0; x <= subdivisionsWidth; x++) {\n const u = x / subdivisionsWidth;\n const v = z / subdivisionsDepth;\n positions.push(width * u - width * 0.5, 0, depth * v - depth * 0.5);\n normals.push(0, 1, 0);\n texcoords.push(u, v);\n }\n }\n const numVertsAcross = subdivisionsWidth + 1;\n const indices = createAugmentedTypedArray(3, subdivisionsWidth * subdivisionsDepth * 2, Uint16Array);\n for (let z = 0; z < subdivisionsDepth; z++) { // eslint-disable-line\n for (let x = 0; x < subdivisionsWidth; x++) { // eslint-disable-line\n // Make triangle 1 of quad.\n indices.push((z + 0) * numVertsAcross + x, (z + 1) * numVertsAcross + x, (z + 0) * numVertsAcross + x + 1);\n // Make triangle 2 of quad.\n indices.push((z + 1) * numVertsAcross + x, (z + 1) * numVertsAcross + x + 1, (z + 0) * numVertsAcross + x + 1);\n }\n }\n return {\n position: positions.typedArray,\n normal: normals.typedArray,\n texcoord: texcoords.typedArray,\n indices: indices.typedArray,\n };\n}\n/**\n * Creates sphere vertices.\n *\n * The created sphere has position, normal, and texcoord data\n *\n * @param params\n * @param params.radius radius of the sphere. Default = 1\n * @param params.subdivisionsAxis number of steps around the sphere. Default = 24\n * @param params.subdivisionsHeight number of vertically on the sphere. Default = 12\n * @param params.startLatitudeInRadians where to start the\n * top of the sphere. Default = 0\n * @param params.endLatitudeInRadians Where to end the\n * bottom of the sphere. Default = π\n * @param params.startLongitudeInRadians where to start\n * wrapping the sphere. Default = 0\n * @param params.endLongitudeInRadians where to end\n * wrapping the sphere. Default = 2π\n * @return The created sphere vertices.\n */\nfunction createSphereVertices({ radius = 1, subdivisionsAxis = 24, subdivisionsHeight = 12, startLatitudeInRadians = 0, endLatitudeInRadians = Math.PI, startLongitudeInRadians = 0, endLongitudeInRadians = Math.PI * 2, } = {}) {\n if (subdivisionsAxis <= 0 || subdivisionsHeight <= 0) {\n throw new Error('subdivisionAxis and subdivisionHeight must be > 0');\n }\n const latRange = endLatitudeInRadians - startLatitudeInRadians;\n const longRange = endLongitudeInRadians - startLongitudeInRadians;\n // We are going to generate our sphere by iterating through its\n // spherical coordinates and generating 2 triangles for each quad on a\n // ring of the sphere.\n const numVertices = (subdivisionsAxis + 1) * (subdivisionsHeight + 1);\n const positions = createAugmentedTypedArray(3, numVertices, Float32Array);\n const normals = createAugmentedTypedArray(3, numVertices, Float32Array);\n const texcoords = createAugmentedTypedArray(2, numVertices, Float32Array);\n // Generate the individual vertices in our vertex buffer.\n for (let y = 0; y <= subdivisionsHeight; y++) {\n for (let x = 0; x <= subdivisionsAxis; x++) {\n // Generate a vertex based on its spherical coordinates\n const u = x / subdivisionsAxis;\n const v = y / subdivisionsHeight;\n const theta = longRange * u + startLongitudeInRadians;\n const phi = latRange * v + startLatitudeInRadians;\n const sinTheta = Math.sin(theta);\n const cosTheta = Math.cos(theta);\n const sinPhi = Math.sin(phi);\n const cosPhi = Math.cos(phi);\n const ux = cosTheta * sinPhi;\n const uy = cosPhi;\n const uz = sinTheta * sinPhi;\n positions.push(radius * ux, radius * uy, radius * uz);\n normals.push(ux, uy, uz);\n texcoords.push(1 - u, v);\n }\n }\n const numVertsAround = subdivisionsAxis + 1;\n const indices = createAugmentedTypedArray(3, subdivisionsAxis * subdivisionsHeight * 2, Uint16Array);\n for (let x = 0; x < subdivisionsAxis; x++) { // eslint-disable-line\n for (let y = 0; y < subdivisionsHeight; y++) { // eslint-disable-line\n // Make triangle 1 of quad.\n indices.push((y + 0) * numVertsAround + x, (y + 0) * numVertsAround + x + 1, (y + 1) * numVertsAround + x);\n // Make triangle 2 of quad.\n indices.push((y + 1) * numVertsAround + x, (y + 0) * numVertsAround + x + 1, (y + 1) * numVertsAround + x + 1);\n }\n }\n return {\n position: positions.typedArray,\n normal: normals.typedArray,\n texcoord: texcoords.typedArray,\n indices: indices.typedArray,\n };\n}\n/**\n * Array of the indices of corners of each face of a cube.\n */\nconst CUBE_FACE_INDICES = [\n [3, 7, 5, 1],\n [6, 2, 0, 4],\n [6, 7, 3, 2],\n [0, 1, 5, 4],\n [7, 6, 4, 5],\n [2, 3, 1, 0], // back\n];\n/**\n * Creates the vertices and indices for a cube.\n *\n * The cube is created around the origin. (-size / 2, size / 2).\n *\n * @param params\n * @param params.size width, height and depth of the cube. Default = 1\n * @return The created vertices.\n */\nfunction createCubeVertices({ size = 1 } = {}) {\n const k = size / 2;\n const cornerVertices = [\n [-k, -k, -k],\n [+k, -k, -k],\n [-k, +k, -k],\n [+k, +k, -k],\n [-k, -k, +k],\n [+k, -k, +k],\n [-k, +k, +k],\n [+k, +k, +k],\n ];\n const faceNormals = [\n [+1, +0, +0],\n [-1, +0, +0],\n [+0, +1, +0],\n [+0, -1, +0],\n [+0, +0, +1],\n [+0, +0, -1],\n ];\n const uvCoords = [\n [1, 0],\n [0, 0],\n [0, 1],\n [1, 1],\n ];\n const numVertices = 6 * 4;\n const positions = createAugmentedTypedArray(3, numVertices, Float32Array);\n const normals = createAugmentedTypedArray(3, numVertices, Float32Array);\n const texcoords = createAugmentedTypedArray(2, numVertices, Float32Array);\n const indices = createAugmentedTypedArray(3, 6 * 2, Uint16Array);\n for (let f = 0; f < 6; ++f) {\n const faceIndices = CUBE_FACE_INDICES[f];\n for (let v = 0; v < 4; ++v) {\n const position = cornerVertices[faceIndices[v]];\n const normal = faceNormals[f];\n const uv = uvCoords[v];\n // Each face needs all four vertices because the normals and texture\n // coordinates are not all the same.\n positions.push(...position);\n normals.push(...normal);\n texcoords.push(...uv);\n }\n // Two triangles make a square face.\n const offset = 4 * f;\n indices.push(offset + 0, offset + 1, offset + 2);\n indices.push(offset + 0, offset + 2, offset + 3);\n }\n return {\n position: positions.typedArray,\n normal: normals.typedArray,\n texcoord: texcoords.typedArray,\n indices: indices.typedArray,\n };\n}\n/**\n * Creates vertices for a truncated cone, which is like a cylinder\n * except that it has different top and bottom radii. A truncated cone\n * can also be used to create cylinders and regular cones. The\n * truncated cone will be created centered about the origin, with the\n * y axis as its vertical axis. .\n *\n * @param bottomRadius Bottom radius of truncated cone. Default = 1\n * @param topRadius Top radius of truncated cone. Default = 0\n * @param height Height of truncated cone. Default = 1\n * @param radialSubdivisions The number of subdivisions around the\n * truncated cone. Default = 24\n * @param verticalSubdivisions The number of subdivisions down the\n * truncated cone. Default = 1\n * @param topCap Create top cap. Default = true.\n * @param bottomCap Create bottom cap. Default = true.\n * @return The created cone vertices.\n */\nfunction createTruncatedConeVertices({ bottomRadius = 1, topRadius = 0, height = 1, radialSubdivisions = 24, verticalSubdivisions = 1, topCap = true, bottomCap = true, } = {}) {\n if (radialSubdivisions < 3) {\n throw new Error('radialSubdivisions must be 3 or greater');\n }\n if (verticalSubdivisions < 1) {\n throw new Error('verticalSubdivisions must be 1 or greater');\n }\n const extra = (topCap ? 2 : 0) + (bottomCap ? 2 : 0);\n const numVertices = (radialSubdivisions + 1) * (verticalSubdivisions + 1 + extra);\n const positions = createAugmentedTypedArray(3, numVertices, Float32Array);\n const normals = createAugmentedTypedArray(3, numVertices, Float32Array);\n const texcoords = createAugmentedTypedArray(2, numVertices, Float32Array);\n const indices = createAugmentedTypedArray(3, radialSubdivisions * (verticalSubdivisions + extra / 2) * 2, Uint16Array);\n const vertsAroundEdge = radialSubdivisions + 1;\n // The slant of the cone is constant across its surface\n const slant = Math.atan2(bottomRadius - topRadius, height);\n const cosSlant = Math.cos(slant);\n const sinSlant = Math.sin(slant);\n const start = topCap ? -2 : 0;\n const end = verticalSubdivisions + (bottomCap ? 2 : 0);\n for (let yy = start; yy <= end; ++yy) {\n let v = yy / verticalSubdivisions;\n let y = height * v;\n let ringRadius;\n if (yy < 0) {\n y = 0;\n v = 1;\n ringRadius = bottomRadius;\n }\n else if (yy > verticalSubdivisions) {\n y = height;\n v = 1;\n ringRadius = topRadius;\n }\n else {\n ringRadius = bottomRadius +\n (topRadius - bottomRadius) * (yy / verticalSubdivisions);\n }\n if (yy === -2 || yy === verticalSubdivisions + 2) {\n ringRadius = 0;\n v = 0;\n }\n y -= height / 2;\n for (let ii = 0; ii < vertsAroundEdge; ++ii) {\n const sin = Math.sin(ii * Math.PI * 2 / radialSubdivisions);\n const cos = Math.cos(ii * Math.PI * 2 / radialSubdivisions);\n positions.push(sin * ringRadius, y, cos * ringRadius);\n if (yy < 0) {\n normals.push(0, -1, 0);\n }\n else if (yy > verticalSubdivisions) {\n normals.push(0, 1, 0);\n }\n else if (ringRadius === 0.0) {\n normals.push(0, 0, 0);\n }\n else {\n normals.push(sin * cosSlant, sinSlant, cos * cosSlant);\n }\n texcoords.push((ii / radialSubdivisions), 1 - v);\n }\n }\n for (let yy = 0; yy < verticalSubdivisions + extra; ++yy) { // eslint-disable-line\n if (yy === 1 && topCap || yy === verticalSubdivisions + extra - 2 && bottomCap) {\n continue;\n }\n for (let ii = 0; ii < radialSubdivisions; ++ii) { // eslint-disable-line\n indices.push(vertsAroundEdge * (yy + 0) + 0 + ii, vertsAroundEdge * (yy + 0) + 1 + ii, vertsAroundEdge * (yy + 1) + 1 + ii);\n indices.push(vertsAroundEdge * (yy + 0) + 0 + ii, vertsAroundEdge * (yy + 1) + 1 + ii, vertsAroundEdge * (yy + 1) + 0 + ii);\n }\n }\n return {\n position: positions.typedArray,\n normal: normals.typedArray,\n texcoord: texcoords.typedArray,\n indices: indices.typedArray,\n };\n}\n/**\n * Expands RLE data\n * @param rleData data in format of run-length, x, y, z, run-length, x, y, z\n * @param padding value to add each entry with.\n * @return the expanded rleData\n */\nfunction expandRLEData(rleData, padding = []) {\n padding = padding || [];\n const data = [];\n for (let ii = 0; ii < rleData.length; ii += 4) {\n const runLength = rleData[ii];\n const element = rleData.slice(ii + 1, ii + 4);\n element.push(...padding);\n for (let jj = 0; jj < runLength; ++jj) {\n data.push(...element);\n }\n }\n return data;\n}\n/**\n * Creates 3D 'F' vertices.\n * An 'F' is useful because you can easily tell which way it is oriented.\n * The created 'F' has position, normal, texcoord, and color arrays.\n *\n * @return The created vertices.\n */\nfunction create3DFVertices() {\n const positions = [\n // left column front\n 0, 0, 0,\n 0, 150, 0,\n 30, 0, 0,\n 0, 150, 0,\n 30, 150, 0,\n 30, 0, 0,\n // top rung front\n 30, 0, 0,\n 30, 30, 0,\n 100, 0, 0,\n 30, 30, 0,\n 100, 30, 0,\n 100, 0, 0,\n // middle rung front\n 30, 60, 0,\n 30, 90, 0,\n 67, 60, 0,\n 30, 90, 0,\n 67, 90, 0,\n 67, 60, 0,\n // left column back\n 0, 0, 30,\n 30, 0, 30,\n 0, 150, 30,\n 0, 150, 30,\n 30, 0, 30,\n 30, 150, 30,\n // top rung back\n 30, 0, 30,\n 100, 0, 30,\n 30, 30, 30,\n 30, 30, 30,\n 100, 0, 30,\n 100, 30, 30,\n // middle rung back\n 30, 60, 30,\n 67, 60, 30,\n 30, 90, 30,\n 30, 90, 30,\n 67, 60, 30,\n 67, 90, 30,\n // top\n 0, 0, 0,\n 100, 0, 0,\n 100, 0, 30,\n 0, 0, 0,\n 100, 0, 30,\n 0, 0, 30,\n // top rung front\n 100, 0, 0,\n 100, 30, 0,\n 100, 30, 30,\n 100, 0, 0,\n 100, 30, 30,\n 100, 0, 30,\n // under top rung\n 30, 30, 0,\n 30, 30, 30,\n 100, 30, 30,\n 30, 30, 0,\n 100, 30, 30,\n 100, 30, 0,\n // between top rung and middle\n 30, 30, 0,\n 30, 60, 30,\n 30, 30, 30,\n 30, 30, 0,\n 30, 60, 0,\n 30, 60, 30,\n // top of middle rung\n 30, 60, 0,\n 67, 60, 30,\n 30, 60, 30,\n 30, 60, 0,\n 67, 60, 0,\n 67, 60, 30,\n // front of middle rung\n 67, 60, 0,\n 67, 90, 30,\n 67, 60, 30,\n 67, 60, 0,\n 67, 90, 0,\n 67, 90, 30,\n // bottom of middle rung.\n 30, 90, 0,\n 30, 90, 30,\n 67, 90, 30,\n 30, 90, 0,\n 67, 90, 30,\n 67, 90, 0,\n // front of bottom\n 30, 90, 0,\n 30, 150, 30,\n 30, 90, 30,\n 30, 90, 0,\n 30, 150, 0,\n 30, 150, 30,\n // bottom\n 0, 150, 0,\n 0, 150, 30,\n 30, 150, 30,\n 0, 150, 0,\n 30, 150, 30,\n 30, 150, 0,\n // left side\n 0, 0, 0,\n 0, 0, 30,\n 0, 150, 30,\n 0, 0, 0,\n 0, 150, 30,\n 0, 150, 0,\n ];\n const texcoords = [\n // left column front\n 0.22, 0.19,\n 0.22, 0.79,\n 0.34, 0.19,\n 0.22, 0.79,\n 0.34, 0.79,\n 0.34, 0.19,\n // top rung front\n 0.34, 0.19,\n 0.34, 0.31,\n 0.62, 0.19,\n 0.34, 0.31,\n 0.62, 0.31,\n 0.62, 0.19,\n // middle rung front\n 0.34, 0.43,\n 0.34, 0.55,\n 0.49, 0.43,\n 0.34, 0.55,\n 0.49, 0.55,\n 0.49, 0.43,\n // left column back\n 0, 0,\n 1, 0,\n 0, 1,\n 0, 1,\n 1, 0,\n 1, 1,\n // top rung back\n 0, 0,\n 1, 0,\n 0, 1,\n 0, 1,\n 1, 0,\n 1, 1,\n // middle rung back\n 0, 0,\n 1, 0,\n 0, 1,\n 0, 1,\n 1, 0,\n 1, 1,\n // top\n 0, 0,\n 1, 0,\n 1, 1,\n 0, 0,\n 1, 1,\n 0, 1,\n // top rung front\n 0, 0,\n 1, 0,\n 1, 1,\n 0, 0,\n 1, 1,\n 0, 1,\n // under top rung\n 0, 0,\n 0, 1,\n 1, 1,\n 0, 0,\n 1, 1,\n 1, 0,\n // between top rung and middle\n 0, 0,\n 1, 1,\n 0, 1,\n 0, 0,\n 1, 0,\n 1, 1,\n // top of middle rung\n 0, 0,\n 1, 1,\n 0, 1,\n 0, 0,\n 1, 0,\n 1, 1,\n // front of middle rung\n 0, 0,\n 1, 1,\n 0, 1,\n 0, 0,\n 1, 0,\n 1, 1,\n // bottom of middle rung.\n 0, 0,\n 0, 1,\n 1, 1,\n 0, 0,\n 1, 1,\n 1, 0,\n // front of bottom\n 0, 0,\n 1, 1,\n 0, 1,\n 0, 0,\n 1, 0,\n 1, 1,\n // bottom\n 0, 0,\n 0, 1,\n 1, 1,\n 0, 0,\n 1, 1,\n 1, 0,\n // left side\n 0, 0,\n 0, 1,\n 1, 1,\n 0, 0,\n 1, 1,\n 1, 0,\n ];\n const normals = expandRLEData([\n // left column front\n // top rung front\n // middle rung front\n 18, 0, 0, 1,\n // left column back\n // top rung back\n // middle rung back\n 18, 0, 0, -1,\n // top\n 6, 0, 1, 0,\n // top rung front\n 6, 1, 0, 0,\n // under top rung\n 6, 0, -1, 0,\n // between top rung and middle\n 6, 1, 0, 0,\n // top of middle rung\n 6, 0, 1, 0,\n // front of middle rung\n 6, 1, 0, 0,\n // bottom of middle rung.\n 6, 0, -1, 0,\n // front of bottom\n 6, 1, 0, 0,\n // bottom\n 6, 0, -1, 0,\n // left side\n 6, -1, 0, 0,\n ]);\n const colors = expandRLEData([\n // left column front\n // top rung front\n // middle rung front\n 18, 200, 70, 120,\n // left column back\n // top rung back\n // middle rung back\n 18, 80, 70, 200,\n // top\n 6, 70, 200, 210,\n // top rung front\n 6, 200, 200, 70,\n // under top rung\n 6, 210, 100, 70,\n // between top rung and middle\n 6, 210, 160, 70,\n // top of middle rung\n 6, 70, 180, 210,\n // front of middle rung\n 6, 100, 70, 210,\n // bottom of middle rung.\n 6, 76, 210, 100,\n // front of bottom\n 6, 140, 210, 80,\n // bottom\n 6, 90, 130, 110,\n // left side\n 6, 160, 160, 220,\n ], [255]);\n const numVerts = positions.length / 3;\n const arrays = {\n position: createAugmentedTypedArray(3, numVerts, Float32Array),\n texcoord: createAugmentedTypedArray(2, numVerts, Float32Array),\n normal: createAugmentedTypedArray(3, numVerts, Float32Array),\n color: createAugmentedTypedArray(4, numVerts, Uint8Array),\n indices: createAugmentedTypedArray(3, numVerts / 3, Uint16Array),\n };\n arrays.position.push(positions);\n arrays.texcoord.push(texcoords);\n arrays.normal.push(normals);\n arrays.color.push(colors);\n for (let ii = 0; ii < numVerts; ++ii) {\n arrays.indices.push(ii);\n }\n return Object.fromEntries(Object.entries(arrays).map(([k, v]) => [k, v.typedArray]));\n}\n/**\n * Creates cylinder vertices. The cylinder will be created around the origin\n * along the y-axis.\n *\n * @param params\n * @param params.radius Radius of cylinder. Default = 1\n * @param params.height Height of cylinder. Default = 1\n * @param params.radialSubdivisions The number of subdivisions around the cylinder. Default = 24\n * @param params.verticalSubdivisions The number of subdivisions down the cylinder. Default = 1\n * @param params.topCap Create top cap. Default = true.\n * @param params.bottomCap Create bottom cap. Default = true.\n * @return The created vertices.\n */\nfunction createCylinderVertices({ radius = 1, height = 1, radialSubdivisions = 24, verticalSubdivisions = 1, topCap = true, bottomCap = true, } = {}) {\n return createTruncatedConeVertices({\n bottomRadius: radius,\n topRadius: radius,\n height,\n radialSubdivisions,\n verticalSubdivisions,\n topCap,\n bottomCap,\n });\n}\n/**\n * Creates vertices for a torus\n *\n * @param params\n * @param params.radius radius of center of torus circle. Default = 1\n * @param params.thickness radius of torus ring. Default = 0.24\n * @param params.radialSubdivisions The number of subdivisions around the torus. Default = 24\n * @param params.bodySubdivisions The number of subdivisions around the body torus. Default = 12\n * @param params.startAngle start angle in radians. Default = 0.\n * @param params.endAngle end angle in radians. Default = Math.PI * 2.\n * @return The created vertices.\n */\nfunction createTorusVertices({ radius = 1, thickness = 0.24, radialSubdivisions = 24, bodySubdivisions = 12, startAngle = 0, endAngle = Math.PI * 2, } = {}) {\n if (radialSubdivisions < 3) {\n throw new Error('radialSubdivisions must be 3 or greater');\n }\n if (bodySubdivisions < 3) {\n throw new Error('verticalSubdivisions must be 3 or greater');\n }\n const range = endAngle - startAngle;\n const radialParts = radialSubdivisions + 1;\n const bodyParts = bodySubdivisions + 1;\n const numVertices = radialParts * bodyParts;\n const positions = createAugmentedTypedArray(3, numVertices, Float32Array);\n const normals = createAugmentedTypedArray(3, numVertices, Float32Array);\n const texcoords = createAugmentedTypedArray(2, numVertices, Float32Array);\n const indices = createAugmentedTypedArray(3, (radialSubdivisions) * (bodySubdivisions) * 2, Uint16Array);\n for (let slice = 0; slice < bodyParts; ++slice) {\n const v = slice / bodySubdivisions;\n const sliceAngle = v * Math.PI * 2;\n const sliceSin = Math.sin(sliceAngle);\n const ringRadius = radius + sliceSin * thickness;\n const ny = Math.cos(sliceAngle);\n const y = ny * thickness;\n for (let ring = 0; ring < radialParts; ++ring) {\n const u = ring / radialSubdivisions;\n const ringAngle = startAngle + u * range;\n const xSin = Math.sin(ringAngle);\n const zCos = Math.cos(ringAngle);\n const x = xSin * ringRadius;\n const z = zCos * ringRadius;\n const nx = xSin * sliceSin;\n const nz = zCos * sliceSin;\n positions.push(x, y, z);\n normals.push(nx, ny, nz);\n texcoords.push(u, 1 - v);\n }\n }\n for (let slice = 0; slice < bodySubdivisions; ++slice) { // eslint-disable-line\n for (let ring = 0; ring < radialSubdivisions; ++ring) { // eslint-disable-line\n const nextRingIndex = 1 + ring;\n const nextSliceIndex = 1 + slice;\n indices.push(radialParts * slice + ring, radialParts * nextSliceIndex + ring, radialParts * slice + nextRingIndex);\n indices.push(radialParts * nextSliceIndex + ring, radialParts * nextSliceIndex + nextRingIndex, radialParts * slice + nextRingIndex);\n }\n }\n return {\n position: positions.typedArray,\n normal: normals.typedArray,\n texcoord: texcoords.typedArray,\n indices: indices.typedArray,\n };\n}\n/**\n * Creates disc vertices. The disc will be in the xz plane, centered at\n * the origin. When creating, at least 3 divisions, or pie\n * pieces, need to be specified, otherwise the triangles making\n * up the disc will be degenerate. You can also specify the\n * number of radial pieces `stacks`. A value of 1 for\n * stacks will give you a simple disc of pie pieces. If you\n * want to create an annulus you can set `innerRadius` to a\n * value > 0. Finally, `stackPower` allows you to have the widths\n * increase or decrease as you move away from the center. This\n * is particularly useful when using the disc as a ground plane\n * with a fixed camera such that you don't need the resolution\n * of small triangles near the perimeter. For example, a value\n * of 2 will produce stacks whose outside radius increases with\n * the square of the stack index. A value of 1 will give uniform\n * stacks.\n *\n * @param params\n * @param params.radius Radius of the ground plane. Default = 1\n * @param params.divisions Number of triangles in the ground plane (at least 3). Default = 24\n * @param params.stacks Number of radial divisions. Default = 1\n * @param params.innerRadius Default = 0\n * @param params.stackPower Power to raise stack size to for decreasing width. Default = 1\n * @return The created vertices.\n */\nfunction createDiscVertices({ radius = 1, divisions = 24, stacks = 1, innerRadius = 0, stackPower = 1, } = {}) {\n if (divisions < 3) {\n throw new Error('divisions must be at least 3');\n }\n // Note: We don't share the center vertex because that would\n // mess up texture coordinates.\n const numVertices = (divisions + 1) * (stacks + 1);\n const positions = createAugmentedTypedArray(3, numVertices, Float32Array);\n const normals = createAugmentedTypedArray(3, numVertices, Float32Array);\n const texcoords = createAugmentedTypedArray(2, numVertices, Float32Array);\n const indices = createAugmentedTypedArray(3, stacks * divisions * 2, Uint16Array);\n let firstIndex = 0;\n const radiusSpan = radius - innerRadius;\n const pointsPerStack = divisions + 1;\n // Build the disk one stack at a time.\n for (let stack = 0; stack <= stacks; ++stack) {\n const stackRadius = innerRadius + radiusSpan * Math.pow(stack / stacks, stackPower);\n for (let i = 0; i <= divisions; ++i) {\n const theta = 2.0 * Math.PI * i / divisions;\n const x = stackRadius * Math.cos(theta);\n const z = stackRadius * Math.sin(theta);\n positions.push(x, 0, z);\n normals.push(0, 1, 0);\n texcoords.push(1 - (i / divisions), stack / stacks);\n if (stack > 0 && i !== divisions) {\n // a, b, c and d are the indices of the vertices of a quad. unless\n // the current stack is the one closest to the center, in which case\n // the vertices a and b connect to the center vertex.\n const a = firstIndex + (i + 1);\n const b = firstIndex + i;\n const c = firstIndex + i - pointsPerStack;\n const d = firstIndex + (i + 1) - pointsPerStack;\n // Make a quad of the vertices a, b, c, d.\n indices.push(a, b, c);\n indices.push(a, c, d);\n }\n }\n firstIndex += divisions + 1;\n }\n return {\n position: positions.typedArray,\n normal: normals.typedArray,\n texcoord: texcoords.typedArray,\n indices: indices.typedArray,\n };\n}\nfunction allButIndices(name) {\n return name !== \"indices\";\n}\n/**\n * Given indexed vertices creates a new set of vertices un-indexed by expanding the vertices by index.\n */\nfunction deindex(arrays) {\n const indicesP = arrays.indices;\n const newVertices = {};\n const indices = makeTypedArrayFromArrayUnion(indicesP, 'indices');\n const numElements = indices.length;\n function expandToUnindexed(channel) {\n const srcBuffer = makeTypedArrayFromArrayUnion(arrays[channel], channel);\n const numComponents = getNumComponents(srcBuffer, channel);\n const dstBuffer = createAugmentedTypedArrayFromExisting(numComponents, numElements, srcBuffer);\n for (let ii = 0; ii < numElements; ++ii) {\n const ndx = indices[ii];\n const offset = ndx * numComponents;\n for (let jj = 0; jj < numComponents; ++jj) {\n dstBuffer.push(srcBuffer[offset + jj]);\n }\n }\n newVertices[channel] = dstBuffer.typedArray;\n }\n Object.keys(arrays).filter(allButIndices).forEach(expandToUnindexed);\n return newVertices;\n}\n// I don't want to pull in a whole math library\nconst normalize = ([x, y, z]) => {\n const len = x * x + y * y + z * z;\n return new Float32Array([x / len, y / len, z / len]);\n};\nconst subtract = (a, b) => {\n const r = new Float32Array(a.length);\n for (let i = 0; i < a.length; ++i) {\n r[i] = a[i] - b[i];\n }\n return r;\n};\nconst cross = (a, b) => {\n const r = new Float32Array(a.length);\n r[0] = a[1] * b[2] - a[2] * b[1];\n r[1] = a[2] * b[0] - a[0] * b[2];\n r[2] = a[0] * b[1] - a[1] * b[0];\n return r;\n};\n/**\n * Generate triangle normals from positions.\n * Assumes every 3 values is a position and every 3 positions come from the same triangle\n */\nfunction generateTriangleNormals(positions) {\n const normals = new Float32Array(positions.length);\n for (let ii = 0; ii < positions.length; ii += 9) {\n // pull out the 3 positions for this triangle\n const p0 = positions.subarray(ii, ii + 3);\n const p1 = positions.subarray(ii + 3, ii + 6);\n const p2 = positions.subarray(ii + 6, ii + 9);\n const n0 = normalize(subtract(p0, p1));\n const n1 = normalize(subtract(p0, p2));\n const n = cross(n0, n1);\n // copy them back in\n normals.set(n, ii);\n normals.set(n, ii + 3);\n normals.set(n, ii + 6);\n }\n return normals;\n}\n\nvar primitives = {\n __proto__: null,\n TypedArrayWrapper: TypedArrayWrapper,\n create3DFVertices: create3DFVertices,\n createCubeVertices: createCubeVertices,\n createCylinderVertices: createCylinderVertices,\n createDiscVertices: createDiscVertices,\n createPlaneVertices: createPlaneVertices,\n createSphereVertices: createSphereVertices,\n createTorusVertices: createTorusVertices,\n createTruncatedConeVertices: createTruncatedConeVertices,\n createXYQuadVertices: createXYQuadVertices,\n deindex: deindex,\n generateTriangleNormals: generateTriangleNormals\n};\n\nexport { TypedArrayViewGenerator, copySourceToTexture, copySourcesToTexture, createBufferLayoutsFromArrays, createBuffersAndAttributesFromArrays, createTextureFromImage, createTextureFromImages, createTextureFromSource, createTextureFromSources, drawArrays, generateMipmap, getNumComponents, getSizeAndAlignmentOfUnsizedArrayElement, getSizeForMipFromTexture, getSizeFromSource, interleaveVertexData, isTypedArray, loadImageBitmap, makeBindGroupLayoutDescriptors, makeShaderDataDefinitions, makeStructuredView, makeTypedArrayFromArrayUnion, makeTypedArrayViews, normalizeGPUExtent3D, numMipLevels, primitives, setIntrinsicsToView, setStructuredValues, setStructuredView, setTypedValues, setVertexAndIndexBuffers, subarray };\n//# sourceMappingURL=webgpu-utils.module.js.map\n","/* eslint-disable require-trailing-comma/require-trailing-comma */\nexport type DataInfo = {\n copySrc: boolean,\n copyDst: boolean,\n storage: boolean,\n readWriteStorage: boolean,\n};\n\nexport type ColorInfo = DataInfo & {\n type: 'float' | 'uint' | 'sint' | 'unfilterable-float',\n bytes: number,\n};\n\nexport type ColorRenderInfo = {\n blend: boolean,\n resolve: boolean,\n byteCost: number,\n alignment: number,\n};\n\nexport type StencilInfo = DataInfo & {\n type: 'uint',\n bytes: number,\n}\n\nexport type DepthInfo = DataInfo & {\n type: 'depth',\n bytes?: number,\n}\n\nexport type FormatInfo = {\n blockWidth: number,\n blockHeight: number,\n multisample?: boolean,\n bytesPerBlock?: number,\n color?: ColorInfo,\n colorRender?: ColorRenderInfo,\n stencil?: StencilInfo,\n depth?: DepthInfo,\n baseFormat?: string,\n feature?: string,\n};\n\n\n\n// exported from the WebGPU CTS by adding the following line to src/webgpu/format_info.ts\n//\n// console.log(JSON.stringify(kAllTextureFormatInfo, null, 2));\n\n/** `kDepthStencilFormatResolvedAspect[format][aspect]` returns the aspect-specific format for a\n * depth-stencil format, or `undefined` if the format doesn't have the aspect.\n */\nconst kDepthStencilFormatResolvedAspect = {\n // kUnsizedDepthStencilFormats\n depth24plus: {\n all: 'depth24plus',\n 'depth-only': 'depth24plus',\n 'stencil-only': undefined,\n },\n 'depth24plus-stencil8': {\n all: 'depth24plus-stencil8',\n 'depth-only': 'depth24plus',\n 'stencil-only': 'stencil8',\n },\n\n // kSizedDepthStencilFormats\n depth16unorm: {\n all: 'depth16unorm',\n 'depth-only': 'depth16unorm',\n 'stencil-only': undefined,\n },\n depth32float: {\n all: 'depth32float',\n 'depth-only': 'depth32float',\n 'stencil-only': undefined,\n },\n 'depth32float-stencil8': {\n all: 'depth32float-stencil8',\n 'depth-only': 'depth32float',\n 'stencil-only': 'stencil8',\n },\n stencil8: {\n all: 'stencil8',\n 'depth-only': undefined,\n 'stencil-only': 'stencil8',\n },\n};\n\nexport function getDepthStencilFormatResolvedAspect(format: GPUTextureFormat, aspect: GPUTextureAspect): GPUTextureFormat | undefined {\n const info = kDepthStencilFormatResolvedAspect[format as keyof typeof kDepthStencilFormatResolvedAspect];\n return info ? info[aspect] as GPUTextureFormat : undefined;\n}\n\nexport const kAllTextureFormatInfo: {[key: string]: FormatInfo} = {\n \"r8unorm\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 1\n },\n \"colorRender\": {\n \"blend\": true,\n \"resolve\": true,\n \"byteCost\": 1,\n \"alignment\": 1\n },\n \"multisample\": true,\n \"bytesPerBlock\": 1\n },\n \"r8snorm\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 1\n },\n \"multisample\": false,\n \"bytesPerBlock\": 1\n },\n \"r8uint\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"uint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 1\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 1,\n \"alignment\": 1\n },\n \"multisample\": true,\n \"bytesPerBlock\": 1\n },\n \"r8sint\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"sint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 1\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 1,\n \"alignment\": 1\n },\n \"multisample\": true,\n \"bytesPerBlock\": 1\n },\n \"rg8unorm\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 2\n },\n \"colorRender\": {\n \"blend\": true,\n \"resolve\": true,\n \"byteCost\": 2,\n \"alignment\": 1\n },\n \"multisample\": true,\n \"bytesPerBlock\": 2\n },\n \"rg8snorm\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 2\n },\n \"multisample\": false,\n \"bytesPerBlock\": 2\n },\n \"rg8uint\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"uint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 2\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 2,\n \"alignment\": 1\n },\n \"multisample\": true,\n \"bytesPerBlock\": 2\n },\n \"rg8sint\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"sint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 2\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 2,\n \"alignment\": 1\n },\n \"multisample\": true,\n \"bytesPerBlock\": 2\n },\n \"rgba8unorm\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": true,\n \"readWriteStorage\": false,\n \"bytes\": 4\n },\n \"colorRender\": {\n \"blend\": true,\n \"resolve\": true,\n \"byteCost\": 8,\n \"alignment\": 1\n },\n \"multisample\": true,\n \"baseFormat\": \"rgba8unorm\",\n \"bytesPerBlock\": 4\n },\n \"rgba8unorm-srgb\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 4\n },\n \"colorRender\": {\n \"blend\": true,\n \"resolve\": true,\n \"byteCost\": 8,\n \"alignment\": 1\n },\n \"multisample\": true,\n \"baseFormat\": \"rgba8unorm\",\n \"bytesPerBlock\": 4\n },\n \"rgba8snorm\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": true,\n \"readWriteStorage\": false,\n \"bytes\": 4\n },\n \"multisample\": false,\n \"bytesPerBlock\": 4\n },\n \"rgba8uint\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"uint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": true,\n \"readWriteStorage\": false,\n \"bytes\": 4\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 4,\n \"alignment\": 1\n },\n \"multisample\": true,\n \"bytesPerBlock\": 4\n },\n \"rgba8sint\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"sint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": true,\n \"readWriteStorage\": false,\n \"bytes\": 4\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 4,\n \"alignment\": 1\n },\n \"multisample\": true,\n \"bytesPerBlock\": 4\n },\n \"bgra8unorm\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 4\n },\n \"colorRender\": {\n \"blend\": true,\n \"resolve\": true,\n \"byteCost\": 8,\n \"alignment\": 1\n },\n \"multisample\": true,\n \"baseFormat\": \"bgra8unorm\",\n \"bytesPerBlock\": 4\n },\n \"bgra8unorm-srgb\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 4\n },\n \"colorRender\": {\n \"blend\": true,\n \"resolve\": true,\n \"byteCost\": 8,\n \"alignment\": 1\n },\n \"multisample\": true,\n \"baseFormat\": \"bgra8unorm\",\n \"bytesPerBlock\": 4\n },\n \"r16uint\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"uint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 2\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 2,\n \"alignment\": 2\n },\n \"multisample\": true,\n \"bytesPerBlock\": 2\n },\n \"r16sint\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"sint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 2\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 2,\n \"alignment\": 2\n },\n \"multisample\": true,\n \"bytesPerBlock\": 2\n },\n \"r16float\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 2\n },\n \"colorRender\": {\n \"blend\": true,\n \"resolve\": true,\n \"byteCost\": 2,\n \"alignment\": 2\n },\n \"multisample\": true,\n \"bytesPerBlock\": 2\n },\n \"rg16uint\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"uint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 4\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 4,\n \"alignment\": 2\n },\n \"multisample\": true,\n \"bytesPerBlock\": 4\n },\n \"rg16sint\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"sint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 4\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 4,\n \"alignment\": 2\n },\n \"multisample\": true,\n \"bytesPerBlock\": 4\n },\n \"rg16float\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 4\n },\n \"colorRender\": {\n \"blend\": true,\n \"resolve\": true,\n \"byteCost\": 4,\n \"alignment\": 2\n },\n \"multisample\": true,\n \"bytesPerBlock\": 4\n },\n \"rgba16uint\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"uint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": true,\n \"readWriteStorage\": false,\n \"bytes\": 8\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 8,\n \"alignment\": 2\n },\n \"multisample\": true,\n \"bytesPerBlock\": 8\n },\n \"rgba16sint\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"sint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": true,\n \"readWriteStorage\": false,\n \"bytes\": 8\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 8,\n \"alignment\": 2\n },\n \"multisample\": true,\n \"bytesPerBlock\": 8\n },\n \"rgba16float\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": true,\n \"readWriteStorage\": false,\n \"bytes\": 8\n },\n \"colorRender\": {\n \"blend\": true,\n \"resolve\": true,\n \"byteCost\": 8,\n \"alignment\": 2\n },\n \"multisample\": true,\n \"bytesPerBlock\": 8\n },\n \"r32uint\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"uint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": true,\n \"readWriteStorage\": true,\n \"bytes\": 4\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 4,\n \"alignment\": 4\n },\n \"multisample\": false,\n \"bytesPerBlock\": 4\n },\n \"r32sint\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"sint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": true,\n \"readWriteStorage\": true,\n \"bytes\": 4\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 4,\n \"alignment\": 4\n },\n \"multisample\": false,\n \"bytesPerBlock\": 4\n },\n \"r32float\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"unfilterable-float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": true,\n \"readWriteStorage\": true,\n \"bytes\": 4\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 4,\n \"alignment\": 4\n },\n \"multisample\": true,\n \"bytesPerBlock\": 4\n },\n \"rg32uint\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"uint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": true,\n \"readWriteStorage\": false,\n \"bytes\": 8\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 8,\n \"alignment\": 4\n },\n \"multisample\": false,\n \"bytesPerBlock\": 8\n },\n \"rg32sint\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"sint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": true,\n \"readWriteStorage\": false,\n \"bytes\": 8\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 8,\n \"alignment\": 4\n },\n \"multisample\": false,\n \"bytesPerBlock\": 8\n },\n \"rg32float\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"unfilterable-float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": true,\n \"readWriteStorage\": false,\n \"bytes\": 8\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 8,\n \"alignment\": 4\n },\n \"multisample\": false,\n \"bytesPerBlock\": 8\n },\n \"rgba32uint\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"uint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": true,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 16,\n \"alignment\": 4\n },\n \"multisample\": false,\n \"bytesPerBlock\": 16\n },\n \"rgba32sint\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"sint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": true,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 16,\n \"alignment\": 4\n },\n \"multisample\": false,\n \"bytesPerBlock\": 16\n },\n \"rgba32float\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"unfilterable-float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": true,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 16,\n \"alignment\": 4\n },\n \"multisample\": false,\n \"bytesPerBlock\": 16\n },\n \"rgb10a2uint\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"uint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 4\n },\n \"colorRender\": {\n \"blend\": false,\n \"resolve\": false,\n \"byteCost\": 8,\n \"alignment\": 4\n },\n \"multisample\": true,\n \"bytesPerBlock\": 4\n },\n \"rgb10a2unorm\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 4\n },\n \"colorRender\": {\n \"blend\": true,\n \"resolve\": true,\n \"byteCost\": 8,\n \"alignment\": 4\n },\n \"multisample\": true,\n \"bytesPerBlock\": 4\n },\n \"rg11b10ufloat\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 4\n },\n \"multisample\": false,\n \"bytesPerBlock\": 4\n },\n \"rgb9e5ufloat\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 4\n },\n \"multisample\": false,\n \"bytesPerBlock\": 4\n },\n \"stencil8\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"stencil\": {\n \"type\": \"uint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 1\n },\n \"multisample\": true,\n \"bytesPerBlock\": 1\n },\n \"depth16unorm\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"depth\": {\n \"type\": \"depth\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 2\n },\n \"multisample\": true,\n \"bytesPerBlock\": 2\n },\n \"depth32float\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"depth\": {\n \"type\": \"depth\",\n \"copySrc\": true,\n \"copyDst\": false,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 4\n },\n \"multisample\": true,\n \"bytesPerBlock\": 4\n },\n \"depth24plus\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"depth\": {\n \"type\": \"depth\",\n \"copySrc\": false,\n \"copyDst\": false,\n \"storage\": false,\n \"readWriteStorage\": false\n },\n \"multisample\": true\n },\n \"depth24plus-stencil8\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"depth\": {\n \"type\": \"depth\",\n \"copySrc\": false,\n \"copyDst\": false,\n \"storage\": false,\n \"readWriteStorage\": false\n },\n \"stencil\": {\n \"type\": \"uint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 1\n },\n \"multisample\": true\n },\n \"depth32float-stencil8\": {\n \"blockWidth\": 1,\n \"blockHeight\": 1,\n \"depth\": {\n \"type\": \"depth\",\n \"copySrc\": true,\n \"copyDst\": false,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 4\n },\n \"stencil\": {\n \"type\": \"uint\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 1\n },\n \"multisample\": true,\n \"feature\": \"depth32float-stencil8\"\n },\n \"bc1-rgba-unorm\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 8\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-bc\",\n \"baseFormat\": \"bc1-rgba-unorm\",\n \"bytesPerBlock\": 8\n },\n \"bc1-rgba-unorm-srgb\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 8\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-bc\",\n \"baseFormat\": \"bc1-rgba-unorm\",\n \"bytesPerBlock\": 8\n },\n \"bc2-rgba-unorm\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-bc\",\n \"baseFormat\": \"bc2-rgba-unorm\",\n \"bytesPerBlock\": 16\n },\n \"bc2-rgba-unorm-srgb\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-bc\",\n \"baseFormat\": \"bc2-rgba-unorm\",\n \"bytesPerBlock\": 16\n },\n \"bc3-rgba-unorm\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-bc\",\n \"baseFormat\": \"bc3-rgba-unorm\",\n \"bytesPerBlock\": 16\n },\n \"bc3-rgba-unorm-srgb\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-bc\",\n \"baseFormat\": \"bc3-rgba-unorm\",\n \"bytesPerBlock\": 16\n },\n \"bc4-r-unorm\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 8\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-bc\",\n \"bytesPerBlock\": 8\n },\n \"bc4-r-snorm\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 8\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-bc\",\n \"bytesPerBlock\": 8\n },\n \"bc5-rg-unorm\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-bc\",\n \"bytesPerBlock\": 16\n },\n \"bc5-rg-snorm\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-bc\",\n \"bytesPerBlock\": 16\n },\n \"bc6h-rgb-ufloat\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-bc\",\n \"bytesPerBlock\": 16\n },\n \"bc6h-rgb-float\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-bc\",\n \"bytesPerBlock\": 16\n },\n \"bc7-rgba-unorm\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-bc\",\n \"baseFormat\": \"bc7-rgba-unorm\",\n \"bytesPerBlock\": 16\n },\n \"bc7-rgba-unorm-srgb\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-bc\",\n \"baseFormat\": \"bc7-rgba-unorm\",\n \"bytesPerBlock\": 16\n },\n \"etc2-rgb8unorm\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 8\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-etc2\",\n \"baseFormat\": \"etc2-rgb8unorm\",\n \"bytesPerBlock\": 8\n },\n \"etc2-rgb8unorm-srgb\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 8\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-etc2\",\n \"baseFormat\": \"etc2-rgb8unorm\",\n \"bytesPerBlock\": 8\n },\n \"etc2-rgb8a1unorm\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 8\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-etc2\",\n \"baseFormat\": \"etc2-rgb8a1unorm\",\n \"bytesPerBlock\": 8\n },\n \"etc2-rgb8a1unorm-srgb\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 8\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-etc2\",\n \"baseFormat\": \"etc2-rgb8a1unorm\",\n \"bytesPerBlock\": 8\n },\n \"etc2-rgba8unorm\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-etc2\",\n \"baseFormat\": \"etc2-rgba8unorm\",\n \"bytesPerBlock\": 16\n },\n \"etc2-rgba8unorm-srgb\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-etc2\",\n \"baseFormat\": \"etc2-rgba8unorm\",\n \"bytesPerBlock\": 16\n },\n \"eac-r11unorm\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 8\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-etc2\",\n \"bytesPerBlock\": 8\n },\n \"eac-r11snorm\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 8\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-etc2\",\n \"bytesPerBlock\": 8\n },\n \"eac-rg11unorm\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-etc2\",\n \"bytesPerBlock\": 16\n },\n \"eac-rg11snorm\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-etc2\",\n \"bytesPerBlock\": 16\n },\n \"astc-4x4-unorm\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-4x4-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-4x4-unorm-srgb\": {\n \"blockWidth\": 4,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-4x4-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-5x4-unorm\": {\n \"blockWidth\": 5,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-5x4-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-5x4-unorm-srgb\": {\n \"blockWidth\": 5,\n \"blockHeight\": 4,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-5x4-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-5x5-unorm\": {\n \"blockWidth\": 5,\n \"blockHeight\": 5,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-5x5-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-5x5-unorm-srgb\": {\n \"blockWidth\": 5,\n \"blockHeight\": 5,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-5x5-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-6x5-unorm\": {\n \"blockWidth\": 6,\n \"blockHeight\": 5,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-6x5-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-6x5-unorm-srgb\": {\n \"blockWidth\": 6,\n \"blockHeight\": 5,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-6x5-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-6x6-unorm\": {\n \"blockWidth\": 6,\n \"blockHeight\": 6,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-6x6-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-6x6-unorm-srgb\": {\n \"blockWidth\": 6,\n \"blockHeight\": 6,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-6x6-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-8x5-unorm\": {\n \"blockWidth\": 8,\n \"blockHeight\": 5,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-8x5-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-8x5-unorm-srgb\": {\n \"blockWidth\": 8,\n \"blockHeight\": 5,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-8x5-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-8x6-unorm\": {\n \"blockWidth\": 8,\n \"blockHeight\": 6,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-8x6-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-8x6-unorm-srgb\": {\n \"blockWidth\": 8,\n \"blockHeight\": 6,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-8x6-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-8x8-unorm\": {\n \"blockWidth\": 8,\n \"blockHeight\": 8,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-8x8-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-8x8-unorm-srgb\": {\n \"blockWidth\": 8,\n \"blockHeight\": 8,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-8x8-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-10x5-unorm\": {\n \"blockWidth\": 10,\n \"blockHeight\": 5,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-10x5-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-10x5-unorm-srgb\": {\n \"blockWidth\": 10,\n \"blockHeight\": 5,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-10x5-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-10x6-unorm\": {\n \"blockWidth\": 10,\n \"blockHeight\": 6,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-10x6-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-10x6-unorm-srgb\": {\n \"blockWidth\": 10,\n \"blockHeight\": 6,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-10x6-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-10x8-unorm\": {\n \"blockWidth\": 10,\n \"blockHeight\": 8,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-10x8-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-10x8-unorm-srgb\": {\n \"blockWidth\": 10,\n \"blockHeight\": 8,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-10x8-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-10x10-unorm\": {\n \"blockWidth\": 10,\n \"blockHeight\": 10,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-10x10-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-10x10-unorm-srgb\": {\n \"blockWidth\": 10,\n \"blockHeight\": 10,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-10x10-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-12x10-unorm\": {\n \"blockWidth\": 12,\n \"blockHeight\": 10,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-12x10-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-12x10-unorm-srgb\": {\n \"blockWidth\": 12,\n \"blockHeight\": 10,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-12x10-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-12x12-unorm\": {\n \"blockWidth\": 12,\n \"blockHeight\": 12,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-12x12-unorm\",\n \"bytesPerBlock\": 16\n },\n \"astc-12x12-unorm-srgb\": {\n \"blockWidth\": 12,\n \"blockHeight\": 12,\n \"color\": {\n \"type\": \"float\",\n \"copySrc\": true,\n \"copyDst\": true,\n \"storage\": false,\n \"readWriteStorage\": false,\n \"bytes\": 16\n },\n \"multisample\": false,\n \"feature\": \"texture-compression-astc\",\n \"baseFormat\": \"astc-12x12-unorm\",\n \"bytesPerBlock\": 16\n }\n};\n","import {\n kAllTextureFormatInfo\n} from './format-info.js';\n\nfunction bitmaskToString(bitNames: Record, mask: number) {\n const names = [];\n for (const [k, v] of Object.entries(bitNames)) {\n if (mask & v) {\n names.push(k);\n }\n }\n return names.join('|');\n}\n\nexport function bufferUsageToString(mask: number) {\n return bitmaskToString(GPUBufferUsage as unknown as Record, mask);\n}\n\nexport function textureUsageToString(mask: number) {\n return bitmaskToString(GPUTextureUsage as unknown as Record, mask);\n}\n\nexport function unreachable(msg?: string): never {\n throw Error(`unreachable: ${msg || ''}`);\n}\n\nexport function roundUp(v: number, align: number) {\n return Math.ceil(v / align) * align;\n}\n\nexport function arraysEqual(a: T[], b: T[]) {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; ++i) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function trimNulls(a: (T | null)[]) {\n const ndx = a.findLastIndex(v => v !== null);\n return a.slice(0, ndx + 1);\n}\n\nexport function reifyGPUOrigin3D(e?: GPUOrigin3D) {\n e = e || [];\n const d = e as GPUOrigin3DDict;\n if (typeof d.x === 'number' || typeof d.y === 'number' || typeof d.z === 'number') {\n return [\n d.x ?? 0,\n d.y ?? 0,\n d.z ?? 0,\n ];\n }\n\n const a = [...(e as number[])];\n return [\n a[0] ?? 0,\n a[1] ?? 0,\n a[2] ?? 0,\n ];\n}\n\nexport function reifyGPUExtent3D(e: GPUExtent3D) {\n const d = e as GPUExtent3DDict;\n if (typeof d.width === 'number') {\n return [\n d.width,\n d.height ?? 1,\n d.depthOrArrayLayers ?? 1,\n ];\n }\n\n const a = [...(e as number[])];\n return [\n a[0],\n a[1] ?? 1,\n a[2] ?? 1,\n ];\n}\n\nexport function logicalMipLevelSpecificTextureExtent(texture: GPUTexture, mipLevel: number) {\n switch (texture.dimension) {\n case '1d':\n return [\n Math.max(1, texture.width >> mipLevel),\n 1,\n 1,\n ];\n case '2d':\n return [\n Math.max(1, texture.width >> mipLevel),\n Math.max(1, texture.height >> mipLevel),\n texture.depthOrArrayLayers,\n ];\n case '3d':\n return [\n Math.max(1, texture.width >> mipLevel),\n Math.max(1, texture.height >> mipLevel),\n Math.max(1, texture.depthOrArrayLayers >> mipLevel),\n ];\n default:\n unreachable();\n return [];\n }\n}\n\nexport function physicalMipLevelSpecificTextureExtent(texture: GPUTexture, mipLevel: number) {\n const {\n blockWidth,\n blockHeight,\n } = kAllTextureFormatInfo[texture.format];\n\n const [width, height, depthOrArrayLayers] = logicalMipLevelSpecificTextureExtent(texture, mipLevel);\n\n switch (texture.dimension) {\n case '1d':\n return [\n roundUp(width, blockWidth),\n 1,\n 1,\n ];\n case '2d':\n case '3d':\n return [\n roundUp(width, blockWidth),\n roundUp(height, blockHeight),\n depthOrArrayLayers,\n ];\n default:\n unreachable();\n return [];\n }\n}","import {\n bufferUsageToString,\n textureUsageToString,\n} from './utils.js';\nexport type LabeledObject =\n | GPUBindGroup\n | GPUBindGroupLayout\n | GPUBuffer\n | GPUCommandEncoder\n | GPUComputePassEncoder\n | GPUComputePipeline\n | GPUDevice\n | GPUQuerySet\n | GPUPipelineLayout\n | GPURenderPassEncoder\n | GPURenderPipeline\n | GPUShaderModule\n | GPUSampler\n | GPUTexture\n | GPUTextureView;\n\nfunction getProperties(o: any) {\n const keyValues = [];\n for (const k in o) {\n const v = o[k];\n if (typeof v !== 'function') {\n if (o instanceof GPUBuffer && k === 'usage') {\n keyValues.push(`${k}: ${v} (${bufferUsageToString(v)})`);\n } else if (o instanceof GPUTexture && k === 'usage') {\n keyValues.push(`${k}: ${v} (${textureUsageToString(v)})`);\n } else {\n keyValues.push(`${k}: ${JSON.stringify(v)}`);\n }\n }\n }\n return keyValues.join(', ');\n}\n\nexport function objToString(o: LabeledObject) {\n return `${o.constructor.name}(${o.label}){${getProperties(o)}}`;\n}\n\nexport function emitError(msg: string, objs: LabeledObject[] = []) {\n throw new Error(`${msg}\\n${(objs).map(o => objToString(o)).join('\\n')}`);\n}\n\nexport function assert(condition: boolean, msg?: string | (() => string), resources?: any[]): asserts condition {\n if (!condition) {\n const lines = (resources || []).map(r => ` ${objToString(r)}`).join('\\n');\n const m = msg ? (typeof msg === 'string' ? msg : msg()) : '';\n emitError(`${m}${lines ? `\\n${lines}` : ''}`);\n }\n}\n","import {\n assert\n} from './validation.js';\n\ntype EncoderState = 'open' | 'locked' | 'ended';\n\nexport type EncoderInfo = {\n state: EncoderState;\n}\n\nexport function validateEncoderState(encoder: GPUComputePassEncoder | GPURenderPassEncoder | GPUCommandEncoder | GPURenderBundleEncoder, state: EncoderState) {\n assert(state === 'open', () => `encoder state(${state}) is not \"open\"`, [encoder]);\n}\n\nconst s_commandEncoderToInfoMap = new WeakMap();\n\nexport function createCommandEncoder(commandEncoder: GPUCommandEncoder) {\n s_commandEncoderToInfoMap.set(commandEncoder, { state: 'open' });\n}\n\nexport function unlockCommandEncoder(commandEncoder: GPUCommandEncoder) {\n const info = s_commandEncoderToInfoMap.get(commandEncoder)!;\n assert(info.state === 'locked');\n info.state = 'open';\n}\n\nexport function lockCommandEncoder(commandEncoder: GPUCommandEncoder) {\n getCommandBufferInfoAndValidateState(commandEncoder).state = 'locked';\n}\n\nexport function finishCommandEncoder(commandEncoder: GPUCommandEncoder) {\n getCommandBufferInfoAndValidateState(commandEncoder).state = 'ended';\n}\n\nexport function getCommandBufferInfoAndValidateState(commandEncoder: GPUCommandEncoder) {\n const info = s_commandEncoderToInfoMap.get(commandEncoder)!;\n validateEncoderState(commandEncoder, info.state);\n return info;\n}\n\n\n//function validateBindGroups(this: PassEncoder, _: void) {\n// const {pipeline, bindGroups} = s_passToState.get(this)!;\n// if (!pipeline) {\n// emitError('no pipeline', [this]);\n// return;\n// }\n// // get bind group indices needed for current pipeline\n// const requiredGroupLayouts = s_pipelineToRequiredGroupLayouts.get(pipeline) || [];\n// for (const {ndx, layout: requiredLayout} of requiredGroupLayouts) {\n// const bindGroup = bindGroups[ndx];\n// if (!bindGroup) {\n// emitError(`no bindGroup at ndx: ${ndx}`);\n// return;\n// }\n//\n// {\n// const error = validateBindGroupIsGroupEquivalent(requiredLayout, bindGroup);\n// if (error) {\n// emitError(error);\n// return;\n// }\n// }\n//\n// {\n// const error = validateMinBindingSize(requiredLayout, bindGroup));\n// if (eror)\n// emitErr\n// }\n// }\n//}\n\n","/**\n * Adds a wrapper function to a class method that gets called before the actual function\n */\nexport function wrapFunctionBefore) => any>>(\n API: { prototype: T },\n fnName: K, fn: (args: Parameters) => void) {\n const origFn = API.prototype[fnName];\n API.prototype[fnName] = function (this: T, ...args: Parameters) {\n fn.call(this, args);\n return origFn.call(this, ...args);\n } as any;\n}\n\n/**\n * Adds a wrapper function to a class method that gets called after the actual function\n */\nexport function wrapFunctionAfter) => any>>(\n API: { prototype: T },\n fnName: K, fn: (obj: ReturnType, args: Parameters) => void) {\n const origFn = API.prototype[fnName];\n API.prototype[fnName] = function (this: T, ...args: Parameters) {\n const result = origFn.call(this, ...args);\n fn.call(this, result, args);\n return result;\n } as any;\n}\n\n/**\n * Adds a wrapper function to an async class method that gets called after the actual function\n */\nexport function wrapAsyncFunctionAfter) => any>>(\n API: { prototype: T },\n fnName: K, fn: (obj: Awaited>, args: Parameters) => void) {\n const origFn = API.prototype[fnName];\n API.prototype[fnName] = async function (this: T, ...args: Parameters) {\n const result = await origFn.call(this, ...args);\n fn.call(this, result, args);\n return result;\n } as any;\n}","// A normal GPUPipelineDescriptor just has references to GPUBindGroupLayout objects\n// but we need the GPUBindGroupLayoutDescriptor for each. They don't exist for\n\nimport { RenderPassLayoutInfo } from './render-commands-mixin.js';\nimport { arraysEqual, trimNulls } from './utils.js';\nimport { wrapFunctionAfter } from \"./wrap-api.js\";\n\ntype BindGroupLayoutDescriptor = {\n /** this is sparse! */\n entries: GPUBindGroupLayoutEntry[];\n};\n\nexport type BindGroupLayoutDescriptorPlus = {\n bindGroupLayoutDescriptor: BindGroupLayoutDescriptor,\n entriesById: Record;\n dynamicOffsetCount: number,\n signature: string,\n}\n\nexport type ReifiedPipelineLayoutDescriptor = {\n bindGroupLayoutDescriptors: BindGroupLayoutDescriptorPlus[];\n}\n\nexport const s_bindGroupLayoutToBindGroupLayoutDescriptorPlus = new WeakMap();\nexport const s_pipelineLayoutToBindGroupLayoutDescriptorsPlus = new WeakMap();\n\n// getBindGroupLayout always returns a different object which means we can't\n// use it as a key in a map to look up it's layout descriptor ┌∩┐(◣_◢)┌∩┐\nfunction trackNewBindGroupLayout(this: GPUComputePipeline | GPURenderPipeline, layout: GPUBindGroupLayout, [group]: [number]) {\n // We need to associate this with it's BindGroupLayoutDescriptorPlus\n const pipelineLayout = s_pipelineToReifiedPipelineLayoutDescriptor.get(this)!;\n const descPlus = pipelineLayout.bindGroupLayoutDescriptors[group];\n s_bindGroupLayoutToBindGroupLayoutDescriptorPlus.set(layout, descPlus);\n}\n\nwrapFunctionAfter(GPUComputePipeline, 'getBindGroupLayout', trackNewBindGroupLayout);\nwrapFunctionAfter(GPURenderPipeline, 'getBindGroupLayout', trackNewBindGroupLayout);\n\n// We're using JSON.stringify to make a hash/id\n// so we need the properties to be in the same order\nexport function createRenderPassLayout(\n colorFormats: (GPUTextureFormat | null | undefined)[],\n sampleCount: number,\n depthStencilFormat?: GPUTextureFormat,\n): RenderPassLayout {\n return {\n colorFormats,\n sampleCount,\n ...(depthStencilFormat && {depthStencilFormat}),\n };\n}\n\nexport type RenderPassLayout = {\n colorFormats: (GPUTextureFormat | null | undefined)[];\n depthStencilFormat?: GPUTextureFormat;\n sampleCount: number;\n};\n\ntype RenderPipelineDescriptor = {\n vertex: GPUVertexState,\n primitive?: GPUPrimitiveState,\n depthStencil?: GPUDepthStencilState,\n multisample?: GPUMultisampleState,\n fragment?: GPUFragmentState,\n passLayoutInfo: RenderPassLayoutInfo,\n};\n\nexport function renderPassLayoutsEqual(a: RenderPassLayout, b: RenderPassLayout) {\n return a.sampleCount === b.sampleCount &&\n a.depthStencilFormat === b.depthStencilFormat &&\n arraysEqual(a.colorFormats, b.colorFormats);\n}\n\n\nexport const s_renderPipelineToRenderPipelineDescriptor = new WeakMap();\nexport const s_pipelineToReifiedPipelineLayoutDescriptor = new WeakMap();\n\nfunction reifyConstants(c: Record) {\n return { ...c };\n}\n\nfunction reifyProgramableStage(ps: GPUProgrammableStage) {\n const { /*module,*/ entryPoint, constants } = ps;\n return {\n ...(entryPoint && { entryPoint }),\n ...(constants && { constants: reifyConstants(constants) }),\n } as GPUProgrammableStage;\n}\n\nfunction reifyVertexAttribute(attr: GPUVertexAttribute): GPUVertexAttribute {\n const { format, offset, shaderLocation } = attr;\n return { format, offset, shaderLocation };\n}\n\nfunction reifyVertexBufferLayout(buffer: GPUVertexBufferLayout): GPUVertexBufferLayout {\n const { arrayStride, stepMode = 'vertex', attributes } = buffer;\n return {\n arrayStride,\n stepMode,\n attributes: [...attributes].map(reifyVertexAttribute),\n };\n}\n\nfunction reifyVertexState(vertex: GPUVertexState): GPUVertexState {\n const { buffers } = vertex;\n return {\n ...reifyProgramableStage(vertex),\n ...(buffers && { buffers: [...buffers].map(b => b ? reifyVertexBufferLayout(b) : null) }),\n };\n}\n\nfunction reifyBlendComponent(bc: GPUBlendComponent): GPUBlendComponent {\n const { operation = 'add', srcFactor = 'one', dstFactor = 'zero' } = bc;\n return {\n operation,\n srcFactor,\n dstFactor,\n };\n}\n\nfunction reifyBlendState(blend: GPUBlendState): GPUBlendState {\n return {\n color: reifyBlendComponent(blend.color),\n alpha: reifyBlendComponent(blend.alpha),\n };\n}\n\nfunction reifyColorTargetState(cts: GPUColorTargetState): GPUColorTargetState {\n const { format, blend, writeMask } = cts;\n return {\n format,\n ...(blend && {blend: reifyBlendState(blend)}),\n writeMask: writeMask ?? 0xF,\n };\n}\nfunction reifyFragmentState(fragment: GPUFragmentState): GPUFragmentState {\n return {\n ...reifyProgramableStage(fragment),\n targets: [...fragment.targets].map(t => t ? reifyColorTargetState(t) : null),\n };\n}\n\nfunction reifyPrimitiveState(p: GPUPrimitiveState): GPUPrimitiveState {\n const {\n topology = 'triangle-list',\n stripIndexFormat,\n frontFace = 'ccw',\n cullMode = 'none',\n // unclippedDepth,\n } = p;\n return {\n topology,\n ...(stripIndexFormat && { stripIndexFormat }),\n frontFace,\n cullMode,\n };\n}\n\nfunction reifyStencilFaceState(sf: GPUStencilFaceState): GPUStencilFaceState {\n const {\n compare = \"always\",\n failOp = \"keep\",\n depthFailOp = \"keep\",\n passOp = \"keep\",\n } = sf;\n return {\n compare, failOp, depthFailOp, passOp,\n };\n}\n\nfunction reifyDepthStencilState(ds: GPUDepthStencilState): GPUDepthStencilState {\n const {\n format,\n depthWriteEnabled,\n depthCompare,\n stencilFront,\n stencilBack,\n stencilReadMask = 0xFFFFFFFF,\n stencilWriteMask = 0xFFFFFFFF,\n depthBias = 0,\n depthBiasSlopeScale = 0,\n depthBiasClamp = 0,\n } = ds;\n return {\n format,\n ...(depthCompare && { depthCompare }),\n ...(depthWriteEnabled !== undefined && { depthWriteEnabled }),\n ...(stencilFront && { stencilFront: reifyStencilFaceState(stencilFront) }),\n ...(stencilBack && { stencilBack: reifyStencilFaceState(stencilBack) }),\n stencilReadMask,\n stencilWriteMask,\n depthBias,\n depthBiasSlopeScale,\n depthBiasClamp,\n };\n}\n\nfunction reifyMultisampleState(ms: GPUMultisampleState): GPUMultisampleState {\n const {\n count = 1,\n mask = 0xFFFFFFFF,\n alphaToCoverageEnabled = false,\n } = ms;\n return { count, mask, alphaToCoverageEnabled };\n}\n\nfunction reifyRenderPipelineDescriptor(desc: GPURenderPipelineDescriptor): RenderPipelineDescriptor {\n const {\n vertex,\n fragment,\n primitive,\n depthStencil,\n multisample,\n } = desc;\n const renderPassLayout = createRenderPassLayout(\n fragment ? trimNulls([...fragment.targets].map(t => t ? t.format : null)) : [],\n multisample?.count || 1,\n depthStencil?.format);\n return {\n vertex: reifyVertexState(vertex),\n ...(fragment && reifyFragmentState(fragment)),\n ...(primitive && reifyPrimitiveState(primitive)),\n ...(depthStencil && reifyDepthStencilState(depthStencil)),\n ...(multisample && reifyMultisampleState(multisample)),\n passLayoutInfo: {\n renderPassLayout,\n passLayoutSignature: JSON.stringify(renderPassLayout),\n },\n };\n}\n\nexport function trackRenderPipelineDescriptor(pipeline: GPURenderPipeline, desc: GPURenderPipelineDescriptor) {\n s_renderPipelineToRenderPipelineDescriptor.set(pipeline, reifyRenderPipelineDescriptor(desc));\n}\n","import {\n DeviceResource,\n s_objToDevice,\n} from './object-to-device.js';\nimport { BindGroupLayoutDescriptorPlus } from './pipeline.js';\nimport {\n assert,\n objToString,\n} from './validation.js';\nimport {\n wrapFunctionBefore,\n} from './wrap-api.js';\n\nexport {\n DeviceResource,\n s_objToDevice,\n};\n\nexport type Destroyable = GPUTexture | GPUBuffer | GPUQuerySet | GPUDevice;\n\nconst s_destroyedResource = new WeakSet();\n\nexport function assertNotDestroyed(obj: Destroyable) {\n assert(!s_destroyedResource.has(obj), () => `${objToString(obj)} is destroyed`);\n}\n\nlet s_nextId = 1;\nconst s_objectToId = new WeakMap();\nexport function getIdForObject(obj: DeviceResource) {\n let id = s_objectToId.get(obj);\n if (id) {\n return id;\n }\n id = s_nextId++;\n s_objectToId.set(obj, id);\n return id;\n}\n\nwrapFunctionBefore(GPUBuffer, 'destroy', function (this: GPUBuffer) {\n s_destroyedResource.add(this);\n});\n\nwrapFunctionBefore(GPUTexture, 'destroy', function (this: GPUTexture) {\n s_destroyedResource.add(this);\n});\n\nwrapFunctionBefore(GPUQuerySet, 'destroy', function (this: GPUQuerySet) {\n s_destroyedResource.add(this);\n});\n\nwrapFunctionBefore(GPUDevice, 'destroy', function (this: GPUDevice) {\n s_destroyedResource.add(this);\n});\n\nexport type BindGroupInfo = {\n layoutPlus: BindGroupLayoutDescriptorPlus,\n entries: GPUBindGroupEntry[],\n};\n\nexport const s_bindGroupToInfo = new WeakMap();\n","import {\n getDepthStencilFormatResolvedAspect,\n} from './format-info.js';\nimport {\n wrapFunctionBefore,\n wrapFunctionAfter,\n} from './wrap-api.js';\n\nexport type TextureViewDescriptor = {\n format: GPUTextureFormat;\n dimension: GPUTextureViewDimension;\n aspect: GPUTextureAspect;\n baseMipLevel: GPUIntegerCoordinate;\n mipLevelCount: GPUIntegerCoordinate;\n baseArrayLayer: GPUIntegerCoordinate;\n arrayLayerCount: GPUIntegerCoordinate;\n};\nexport const s_textureViewToTexture = new WeakMap();\nexport const s_textureViewToDesc = new WeakMap();\n\nfunction resolveTextureAspect(format: GPUTextureFormat, aspect: GPUTextureAspect) {\n switch (aspect) {\n case 'all':\n return format;\n case 'depth-only':\n case 'stencil-only':\n return getDepthStencilFormatResolvedAspect(format, aspect);\n }\n return undefined;\n}\n\nfunction reifyTextureViewDescriptor(texture: GPUTexture, desc: GPUTextureViewDescriptor | undefined): TextureViewDescriptor {\n const dimension = desc?.dimension ?? (\n texture.dimension === '2d'\n ? (texture.depthOrArrayLayers === 1 ? '2d' : '2d-array')\n : texture.dimension\n );\n const aspect = desc?.aspect ?? 'all';\n let format = desc?.format;\n if (!format) {\n const f = resolveTextureAspect(texture.format, aspect);\n format = f ?? texture.format;\n }\n return {\n format,\n dimension,\n aspect,\n baseMipLevel: desc?.baseMipLevel ?? 0,\n mipLevelCount: desc?.mipLevelCount ?? (texture.mipLevelCount - (desc?.baseMipLevel ?? 0)),\n baseArrayLayer: desc?.baseArrayLayer ?? 0,\n arrayLayerCount: desc?.arrayLayerCount ?? (\n dimension === 'cube'\n ? 6\n : (dimension === '2d-array' || dimension === 'cube-array'\n ? texture.depthOrArrayLayers - (desc?.baseArrayLayer ?? 0)\n : 1\n )\n ),\n };\n}\n\nlet lastDesc: GPUTextureViewDescriptor | undefined;\nwrapFunctionBefore(GPUTexture, 'createView', function (this: GPUTexture, [desc]) {\n lastDesc = desc;\n});\n\nwrapFunctionAfter(GPUTexture, 'createView', function (this: GPUTexture, view: GPUTextureView) {\n s_textureViewToTexture.set(view, this);\n s_textureViewToDesc.set(view, reifyTextureViewDescriptor(this, lastDesc));\n});\n","import {\n EncoderInfo,\n validateEncoderState,\n} from './encoder-utils.js';\nimport {\n BindGroupLayoutDescriptorPlus,\n s_pipelineToReifiedPipelineLayoutDescriptor,\n} from './pipeline.js';\nimport {\n BindGroupInfo,\n assertNotDestroyed,\n getIdForObject,\n s_bindGroupToInfo,\n s_objToDevice,\n} from './shared-state.js';\nimport { s_textureViewToDesc, s_textureViewToTexture } from './texture.js';\nimport {\n assert,\n} from './validation.js';\nimport {\n wrapFunctionBefore,\n} from './wrap-api.js';\n\nexport type BindGroupBinding = {\n bindGroup: GPUBindGroup,\n dynamicOffsets?: Uint32Array,\n} | undefined;\n\nexport type PassInfo = EncoderInfo & {\n bindGroups: BindGroupBinding[],\n}\n\ntype BindingMixin =\n | GPUComputePassEncoder\n | GPURenderPassEncoder\n | GPURenderBundleEncoder;\n\ntype Ctor = {\n new (): never;\n prototype: T;\n};\n\nfunction getResourceFromBindingResource(bindingResource: GPUBindingResource) {\n if (bindingResource instanceof GPUTextureView) {\n return s_textureViewToTexture.get(bindingResource)!;\n } else if (bindingResource instanceof GPUSampler ||\n bindingResource instanceof GPUExternalTexture) {\n return bindingResource;\n } else {\n return bindingResource.buffer;\n }\n}\n\nconst autoIdRE = /^(.*?)autoId\\((\\d+)\\)/;\nfunction generateErrorMessageForMismatchedBindGroupLayouts(group: number, bindGroupInfo: BindGroupInfo, bindGroupLayoutDescriptor: BindGroupLayoutDescriptorPlus) {\n const bgAuto = autoIdRE.exec(bindGroupInfo.layoutPlus.signature);\n const bglAuto = autoIdRE.exec(bindGroupLayoutDescriptor.signature);\n if (bgAuto || bglAuto) {\n // are they both auto?\n if (!bgAuto === !bglAuto) {\n if (bgAuto![2] !== bglAuto![2]) {\n return `bindGroup in group(${group}) is not compatible with pipeline requirements for that group \\\nbecause they are from different layout: 'auto' pipelines.`;\n }\n } else {\n return `bindGroup in group(${group}) is not compatible with pipeline requirements for that group \\\nbecause bindGroup's layout ${bgAuto ? 'is' : 'is not'} from a layout: 'auto' pipeline \\\nand the pipeline's bindGroup layout requirements ${bglAuto ? 'is' : 'is not'} from a layout: 'auto' pipeline`;\n }\n }\n return `bindGroup in group(${group}) is not compatible with pipeline requirements for that group\n\nbindGroup.layout = ${JSON.stringify(bindGroupInfo.layoutPlus.bindGroupLayoutDescriptor, null, 2)}\n\npipeline.group[${group}] requirements = ${JSON.stringify(bindGroupLayoutDescriptor.bindGroupLayoutDescriptor, null, 2)}`;\n}\n\n//function validateEncoderBindGroupsDoNotAliasAWritableResource() {\n// //\n//}\n\nexport function validateEncoderBindGroups(bindGroups: BindGroupBinding[], pipeline?: GPURenderPipeline | GPUComputePipeline) {\n assert(!!pipeline, 'no pipeline set');\n const device = s_objToDevice.get(pipeline);\n\n const reifiedPipelineDescriptor = s_pipelineToReifiedPipelineLayoutDescriptor.get(pipeline)!;\n reifiedPipelineDescriptor.bindGroupLayoutDescriptors.forEach((bindGroupLayoutDescriptor, group) => {\n const binding = bindGroups[group];\n assert(!!binding, () => `required bindGroup missing from group(${group})`);\n const bindGroupInfo = s_bindGroupToInfo.get(binding.bindGroup)!;\n assert(\n bindGroupInfo.layoutPlus.signature === bindGroupLayoutDescriptor.signature,\n () => generateErrorMessageForMismatchedBindGroupLayouts(group, bindGroupInfo, bindGroupLayoutDescriptor),\n );\n for (const {binding, resource: bindingResource} of bindGroupInfo.entries) {\n const resource = getResourceFromBindingResource(bindingResource);\n if (resource instanceof GPUTexture || resource instanceof GPUBuffer) {\n assertNotDestroyed(resource);\n }\n assert(s_objToDevice.get(resource) === device, () => `texture at binding(${binding}) group(${group}) is not from same device`, [resource]);\n }\n });\n\n const bindGroupSpaceUsed = 0;\n return bindGroupSpaceUsed;\n}\n\nexport function validateBindGroupResourcesNotDestroyed(entries: GPUBindGroupEntry[]) {\n for (const {resource} of entries) {\n if (resource instanceof GPUTextureView) {\n const texture = s_textureViewToTexture.get(resource)!;\n assertNotDestroyed(texture);\n } else {\n const asBufferBinding = resource as GPUBufferBinding;\n const buffer = asBufferBinding.buffer;\n if (buffer instanceof GPUBuffer) {\n assertNotDestroyed(buffer);\n }\n }\n }\n}\n\n\n\ntype BoundBufferRange = {\n bindGroupLayoutEntry: GPUBindGroupLayoutEntry,\n resource: GPUBufferBinding,\n};\n\nfunction makeIdForBoundBufferRange(boundBufferRange: BoundBufferRange) {\n const { binding, visibility, buffer: b } = boundBufferRange.bindGroupLayoutEntry;\n const { type = 'uniform', hasDynamicOffset = false, minBindingSize = 0 } = b!;\n const { buffer, offset = 0, size } = boundBufferRange.resource;\n return `\n${binding}]\n${visibility}\n${type}\n${hasDynamicOffset}\n${minBindingSize}\n${getIdForObject(buffer)}\n${offset}\n${size}\n`;\n}\n\nfunction boundBufferRanges(info: BindGroupInfo, dynamicOffsets: Uint32Array) {\n const result = new Map();\n let dynamicOffsetIndex = 0;\n for (const bindGroupEntry of info.entries) {\n const bindGroupLayoutEntry = info.layoutPlus.entriesById[bindGroupEntry.binding];\n if (!bindGroupLayoutEntry.buffer) {\n continue;\n }\n const bound = {\n offset: 0,\n ...bindGroupEntry.resource,\n } as GPUBufferBinding;\n if (bindGroupLayoutEntry.buffer.hasDynamicOffset) {\n bound.offset! += dynamicOffsets[dynamicOffsetIndex++];\n }\n const boundBufferRange = {\n bindGroupLayoutEntry,\n resource: bound,\n };\n result.set(makeIdForBoundBufferRange(boundBufferRange), boundBufferRange);\n }\n return result;\n}\n\nfunction intersect(aStart: number, aLen: number, bStart: number, bLen: number) {\n const aEnd = aStart + aLen;\n const bEnd = bStart + bLen;\n return (aEnd > bStart) && (aStart < bEnd);\n}\n\nfunction isBufferBindingAliasing(a: GPUBufferBinding, b: GPUBufferBinding) {\n if (a.buffer !== b.buffer) {\n return false;\n }\n const aSize = a.size ?? a.buffer.size;\n const bSize = b.size ?? b.buffer.size;\n const aStart = a.offset ?? 0;\n const bStart = b.offset ?? 0;\n return intersect(aStart, aSize, bStart, bSize);\n}\n\nfunction aspectToBits(aspect: GPUTextureAspect): number {\n switch (aspect) {\n case 'stencil-only': return 1;\n case 'depth-only': return 2;\n case 'all': return 3;\n }\n throw new Error('unreachable');\n}\n\nfunction isTextureViewAliasing(a: GPUTextureView, b: GPUTextureView) {\n const aTex = s_textureViewToTexture.get(a);\n const bTex = s_textureViewToTexture.get(b);\n if (aTex !== bTex) {\n return false;\n }\n const aInfo = s_textureViewToDesc.get(a)!;\n const bInfo = s_textureViewToDesc.get(b)!;\n\n const aAspect = aspectToBits(aInfo.aspect);\n const bAspect = aspectToBits(bInfo.aspect);\n\n if ((aAspect & bAspect) === 0) {\n return false;\n }\n\n const layersIntersect = intersect(aInfo.baseArrayLayer, aInfo.arrayLayerCount, bInfo.baseArrayLayer, bInfo.arrayLayerCount);\n if (!layersIntersect) {\n return false;\n }\n return intersect(aInfo.baseMipLevel, aInfo.mipLevelCount, bInfo.baseMipLevel, bInfo.mipLevelCount);\n}\n\nconst kStages = [\n GPUShaderStage.VERTEX,\n GPUShaderStage.FRAGMENT,\n GPUShaderStage.COMPUTE,\n];\n\nexport function encoderBindGroupsAliasAWritableResource(\n bindGroups: BindGroupBinding[],\n dynamicOffsets: Uint32Array[],\n bindGroupLayoutDescriptorPlus: BindGroupLayoutDescriptorPlus[]) {\n for (const stage of kStages) {\n const bufferBindings = new Map();\n const textureViews = new Map();\n for (let bindGroupIndex = 0; bindGroupIndex < bindGroups.length; ++bindGroupIndex) {\n const bindGroupBinding = bindGroups[bindGroupIndex];\n if (!bindGroupBinding) {\n continue;\n }\n const bindGroupInfo = s_bindGroupToInfo.get(bindGroupBinding.bindGroup)!;\n\n // check buffers\n const bufferRanges = boundBufferRanges(bindGroupInfo, dynamicOffsets[bindGroupIndex]);\n for (const {bindGroupLayoutEntry, resource} of bufferRanges.values()) {\n if ((bindGroupLayoutEntry.visibility & stage) === 0) {\n continue;\n }\n const resourceWritable = bindGroupLayoutEntry.buffer!.type === 'storage';\n for (const [pastResource, pastResourceWritable] of bufferBindings.entries()) {\n if ((resourceWritable || pastResourceWritable) && isBufferBindingAliasing(pastResource, resource)) {\n return true;\n }\n }\n bufferBindings.set(resource, resourceWritable);\n }\n\n // check textures\n const textureEntries = bindGroupLayoutDescriptorPlus[bindGroupIndex].bindGroupLayoutDescriptor.entries.filter(e => (e.visibility & stage) !== 0 && (e.texture || e.storageTexture));\n for (const entry of textureEntries) {\n const resource = bindGroupInfo.entries[entry.binding].resource as GPUTextureView;\n const access = entry.storageTexture?.access;\n const resourceWritable = access === 'read-write' || access === 'write-only';\n if (!entry.storageTexture) {\n continue;\n }\n for (const [pastResource, pastResourceWritable] of textureViews.entries()) {\n if ((resourceWritable || pastResourceWritable) && isTextureViewAliasing(pastResource, resource)) {\n return true;\n }\n }\n textureViews.set(resource, resourceWritable);\n }\n }\n }\n return false;\n}\n\nfunction* forEachDynamicBinding(info: BindGroupInfo) {\n let dynamicOffsetIndex = 0;\n for (const entry of info.entries) {\n const bindingDescriptor = info.layoutPlus.entriesById[entry.binding];\n if (bindingDescriptor.buffer?.hasDynamicOffset) {\n const bufferBinding = entry.resource as GPUBufferBinding;\n const bufferLayout = bindingDescriptor.buffer;\n yield {bufferBinding, bufferLayout, dynamicOffsetIndex};\n ++dynamicOffsetIndex;\n }\n }\n}\n\nexport function wrapBindingCommandsMixin(\n API: Ctor,\n s_passToPassInfoMap: WeakMap) {\n\n wrapFunctionBefore(API, 'setBindGroup', function (this: T, [index, bindGroup, dynamicOffsetsArg, dynamicOffsetDataStart, dynamicOffsetDataLength]) {\n const info = s_passToPassInfoMap.get(this)!;\n validateEncoderState(this, info.state);\n const bindGroupBindings = info.bindGroups;\n\n const dynamicOffsetCount = bindGroup\n ? s_bindGroupToInfo.get(bindGroup)!.layoutPlus.dynamicOffsetCount\n : 0;\n dynamicOffsetsArg = dynamicOffsetsArg ? new Uint32Array(dynamicOffsetsArg) : new Uint32Array(0);\n dynamicOffsetDataStart = dynamicOffsetDataStart ?? 0;\n dynamicOffsetDataLength = dynamicOffsetDataLength ?? dynamicOffsetsArg.length;\n const dynamicOffsets = dynamicOffsetsArg.slice(dynamicOffsetDataStart, dynamicOffsetDataLength);\n\n assert(dynamicOffsets.length === dynamicOffsetCount, `there must be the same number of dynamicOffsets(${dynamicOffsets.length}) as the layout requires (${dynamicOffsetCount})`);\n\n const device = s_objToDevice.get(this)!;\n const maxIndex = device.limits.maxBindGroups;\n assert(index >= 0, () => `index(${index}) must be >= 0`);\n assert(index < maxIndex, () => `index(${index}) must be < device.limits.maxBindGroups(${maxIndex})`);\n if (bindGroup) {\n assert(device === s_objToDevice.get(bindGroup), () => `bindGroup must be from same device as ${parent.constructor.name}`, [bindGroup, parent]);\n\n // Validate resources are not destroyed\n const info = s_bindGroupToInfo.get(bindGroup)!;\n validateBindGroupResourcesNotDestroyed(info.entries);\n\n // Validate Dynamic Offsets\n for (const {bufferBinding, bufferLayout, dynamicOffsetIndex} of forEachDynamicBinding(info)) {\n const dynamicOffset = dynamicOffsets[dynamicOffsetIndex];\n assert((bufferBinding.offset || 0) + dynamicOffset + (bufferLayout.minBindingSize || 0) <= bufferBinding.buffer.size, 'dynamic offset is out of range');\n switch (bufferLayout.type) {\n case 'uniform':\n assert(dynamicOffset % device.limits.minUniformBufferOffsetAlignment === 0, () => `dynamicOffset[${dynamicOffsetIndex}](${dynamicOffset}) used for a uniform buffer is not a multiple of device.limits.minUniformBufferOffsetAlignment(${device.limits.minUniformBufferOffsetAlignment})`);\n break;\n case 'storage':\n case 'read-only-storage':\n assert(dynamicOffset % device.limits.minStorageBufferOffsetAlignment === 0, () => `dynamicOffset[${dynamicOffsetIndex}](${dynamicOffset}) used for a uniform buffer is not a multiple of device.limits.minStorageBufferOffsetAlignment(${device.limits.minStorageBufferOffsetAlignment})`);\n break;\n }\n }\n\n bindGroupBindings[index] = {\n bindGroup,\n dynamicOffsets,\n };\n } else {\n bindGroupBindings[index] = undefined;\n }\n });\n\n}\n\n","import {\n PassInfo,\n validateEncoderBindGroups,\n} from './binding-mixin.js';\nimport {\n validateEncoderState,\n} from './encoder-utils.js';\nimport {\n assertNotDestroyed,\n s_objToDevice,\n} from './shared-state.js';\nimport {\n assert,\n} from './validation.js';\nimport {\n RenderPassLayout,\n s_renderPipelineToRenderPipelineDescriptor,\n} from './pipeline.js';\nimport {\n bufferUsageToString,\n} from './utils.js';\nimport {\n wrapFunctionBefore,\n} from './wrap-api.js';\n\ntype RenderMixin = GPURenderPassEncoder | GPURenderBundleEncoder;\n\ntype BufferWithOffsetAndSize = {\n buffer: GPUBuffer,\n offset: number,\n size: number,\n};\n\nexport type RenderDrawInfo = PassInfo & {\n pipeline?: GPURenderPipeline,\n indexBuffer?: BufferWithOffsetAndSize,\n indexFormat?: GPUIndexFormat,\n vertexBuffers: (BufferWithOffsetAndSize | undefined)[],\n};\n\nfunction toArray(v: Iterable): T[] {\n return Array.isArray(v) ? v : [...v];\n}\n\ntype VertexBufferValidationFn = (slot: number, layout: GPUVertexBufferLayout, vertexBufferBinding: BufferWithOffsetAndSize) => void;\n\nfunction validateValidToDraw(mixin: RenderMixin, info: RenderDrawInfo, fn: VertexBufferValidationFn) {\n const bindGroupSpaceUsed = validateEncoderBindGroups(info.bindGroups, info.pipeline);\n const pipelineDescriptor = s_renderPipelineToRenderPipelineDescriptor.get(info.pipeline!)!;\n const device = s_objToDevice.get(mixin)!;\n let vertexBufferSpaceUsed = 0;\n if (pipelineDescriptor.vertex.buffers) {\n // buffers is sequence so no forEach, convert to array\n const buffers = toArray(pipelineDescriptor.vertex.buffers);\n buffers.forEach((buffer, slot) => {\n if (buffer) {\n const vertexBufferBinding = info.vertexBuffers[slot];\n assert(!!vertexBufferBinding, () => `no vertexBuffer in slot(${slot})`);\n assertNotDestroyed(vertexBufferBinding.buffer);\n fn(slot, buffer, vertexBufferBinding);\n // don't need to check that vertex buffer is same device as was checked at setVertexBuffer\n vertexBufferSpaceUsed = slot;\n }\n });\n }\n\n // TODO: test!\n assert(\n bindGroupSpaceUsed + vertexBufferSpaceUsed <= device.limits.maxBindGroupsPlusVertexBuffers,\n () => `bindGroupSpaceUsed(${bindGroupSpaceUsed}) + vertexBufferSpaceUsed(${vertexBufferSpaceUsed}) <= device.limits.maxBindGroupsPlusVertexBuffers(${device.limits.maxBindGroupsPlusVertexBuffers})`);\n}\n\nfunction validateValidToDrawIndexed(mixin: RenderMixin, info: RenderDrawInfo, fn: VertexBufferValidationFn) {\n assert(!!info.indexBuffer, 'indexBuffer is not set');\n const device = s_objToDevice.get(mixin)!;\n assertNotDestroyed(info.indexBuffer.buffer);\n assert(device === s_objToDevice.get(info.indexBuffer.buffer), 'indexBuffer is not from same device');\n validateValidToDraw(mixin, info, fn);\n\n const pipelineDescriptor = s_renderPipelineToRenderPipelineDescriptor.get(info.pipeline!)!;\n switch (pipelineDescriptor.primitive?.topology) {\n case 'line-strip':\n case 'triangle-strip':\n assert(\n info.indexFormat === pipelineDescriptor.primitive?.stripIndexFormat,\n () => `indexFormat(${info.indexFormat}) !== pipeline.primitive.stripIndexFormat(${pipelineDescriptor.primitive?.stripIndexFormat})`,\n );\n }\n}\n\nfunction bufferSizeFromBufferBinding({buffer, offset, size}: BufferWithOffsetAndSize) {\n offset = offset ?? 0;\n return size ?? buffer.size - offset;\n}\n\nconst kVertexFormatInfo = {\n \"uint8x2\": { components: 2, bytes: 2, type: \"vec2\" },\n \"uint8x4\": { components: 4, bytes: 4, type: \"vec4\" },\n \"sint8x2\": { components: 2, bytes: 2, type: \"vec2\" },\n \"sint8x4\": { components: 4, bytes: 4, type: \"vec4\" },\n \"unorm8x2\": { components: 2, bytes: 2, type: \"vec2\" },\n \"unorm8x4\": { components: 4, bytes: 4, type: \"vec4\" },\n \"snorm8x2\": { components: 2, bytes: 2, type: \"vec2\" },\n \"snorm8x4\": { components: 4, bytes: 4, type: \"vec4\" },\n \"uint16x2\": { components: 2, bytes: 4, type: \"vec2\" },\n \"uint16x4\": { components: 4, bytes: 8, type: \"vec4\" },\n \"sint16x2\": { components: 2, bytes: 4, type: \"vec2\" },\n \"sint16x4\": { components: 4, bytes: 8, type: \"vec4\" },\n \"unorm16x2\": { components: 2, bytes: 4, type: \"vec2\" },\n \"unorm16x4\": { components: 4, bytes: 8, type: \"vec4\" },\n \"snorm16x2\": { components: 2, bytes: 4, type: \"vec2\" },\n \"snorm16x4\": { components: 4, bytes: 8, type: \"vec4\" },\n \"float16x2\": { components: 2, bytes: 4, type: \"vec2\" },\n \"float16x4\": { components: 4, bytes: 8, type: \"vec4\" },\n \"float32\": { components: 1, bytes: 4, type: \"f32\" },\n \"float32x2\": { components: 2, bytes: 8, type: \"vec2\" },\n \"float32x3\": { components: 3, bytes: 12, type: \"vec3\" },\n \"float32x4\": { components: 4, bytes: 16, type: \"vec4\" },\n \"uint32\": { components: 1, bytes: 4, type: \"u32\" },\n \"uint32x2\": { components: 2, bytes: 8, type: \"vec2\" },\n \"uint32x3\": { components: 3, bytes: 12, type: \"vec3\" },\n \"uint32x4\": { components: 4, bytes: 16, type: \"vec4\" },\n \"sint32\": { components: 1, bytes: 4, type: \"i32\" },\n \"sint32x2\": { components: 2, bytes: 8, type: \"vec2\" },\n \"sint32x3\": { components: 3, bytes: 12, type: \"vec3\" },\n \"sint32x4\": { components: 4, bytes: 16, type: \"vec4\" },\n \"unorm10-10-10-2\": { components: 4, bytes:4, type:\"vec4\" },\n};\n\nfunction getLastStride(layout: GPUVertexBufferLayout) {\n let lastStride = 0;\n for (const {offset, format} of layout.attributes) {\n lastStride = Math.max(lastStride, offset + kVertexFormatInfo[format].bytes);\n }\n return lastStride;\n}\n\ntype Ctor = {\n new (): never;\n prototype: T;\n};\n\nexport type RenderPassLayoutInfo = {\n renderPassLayout: RenderPassLayout,\n passLayoutSignature: string,\n}\n\nexport function wrapRenderCommandsMixin(\n API: Ctor,\n s_renderPassToPassInfoMap: WeakMap,\n getRenderPassInfo: (pass: T) => RenderPassLayoutInfo) {\n\n wrapFunctionBefore(API, 'draw', function (this: T, [vertexCount, a_instanceCount, a_firstVertex, a_firstInstance]) {\n const instanceCount = a_instanceCount ?? 1;\n const firstVertex = a_firstVertex ?? 0;\n const firstInstance = a_firstInstance ?? 0;\n const info = s_renderPassToPassInfoMap.get(this)!;\n validateEncoderState(this, info.state);\n validateValidToDraw(this, info, (slot: number, layout: GPUVertexBufferLayout, vertexBufferBinding: BufferWithOffsetAndSize) => {\n const bufferSize = bufferSizeFromBufferBinding(vertexBufferBinding);\n const stride = layout.arrayStride;\n const lastStride = getLastStride(layout);\n const strideCount = layout.stepMode === 'instance'\n ? firstInstance + instanceCount\n : firstVertex + vertexCount;\n if (strideCount !== 0) {\n const bytesNeeded = (strideCount - 1) * stride + lastStride;\n assert(bytesNeeded <= bufferSize, () => `slot(${slot}) vertex buffer binding size ${bufferSize} is not large enough for bytes needed(${bytesNeeded})`);\n }\n });\n });\n\n wrapFunctionBefore(API, 'drawIndexed', function (this: T, [indexCount, a_instanceCount, a_firstIndex, /*a_baseVertex*/, a_firstInstance]) {\n const instanceCount = a_instanceCount ?? 1;\n const firstIndex = a_firstIndex ?? 0;\n // const baseVertex = a_baseVertex ?? 0;\n const firstInstance = a_firstInstance ?? 0;\n const info = s_renderPassToPassInfoMap.get(this)!;\n validateEncoderState(this, info.state);\n validateValidToDrawIndexed(this, info, (slot: number, layout: GPUVertexBufferLayout, vertexBufferBinding: BufferWithOffsetAndSize) => {\n const bufferSize = bufferSizeFromBufferBinding(vertexBufferBinding);\n const stride = layout.arrayStride;\n const lastStride = getLastStride(layout);\n const strideCount = firstInstance + instanceCount;\n if (layout.stepMode === 'instance') {\n const bytesNeeded = (strideCount - 1) * stride + lastStride;\n assert(bytesNeeded <= bufferSize, () => `slot(${slot}) vertex buffer binding size ${bufferSize} is not large enough for bytes needed(${bytesNeeded})`);\n }\n });\n const bufferSize = bufferSizeFromBufferBinding(info.indexBuffer!);\n const indexByteSize = info.indexFormat === 'uint16' ? 2 : 4;\n const bytesNeeded = firstIndex + indexCount * indexByteSize;\n assert(bytesNeeded <= bufferSize, () => `indexBuffer bound size(${bufferSize}) is not large enough for bytesNeeded(${bytesNeeded})`);\n });\n\n const kIndirectDrawParametersSize = 16;\n wrapFunctionBefore(API, 'drawIndirect', function (this: T, [indirectBuffer, indirectOffset]) {\n const info = s_renderPassToPassInfoMap.get(this)!;\n validateEncoderState(this, info.state);\n validateValidToDraw(this, info, () => {});\n assertNotDestroyed(indirectBuffer);\n const device = s_objToDevice.get(this)!;\n assert(device === s_objToDevice.get(indirectBuffer), 'indirectBuffer is not from same device', [indirectBuffer]);\n assert(!!(indirectBuffer.usage & GPUBufferUsage.INDIRECT), () => `buffer(${bufferUsageToString(indirectBuffer.usage)}) must have usage INDIRECT`, [indirectBuffer, this]);\n assert(indirectOffset + kIndirectDrawParametersSize <= indirectBuffer.size, `indirectOffset(${indirectOffset}) + sizeOfIndirectParameters(${kIndirectDrawParametersSize}) > indirectBuffer.size(${indirectBuffer.size})`, [indirectBuffer]);\n assert(indirectOffset % 4 === 0, () => `indirectOffset(${indirectOffset}) is not multiple of 4`);\n });\n\n const kIndirectDrawIndexedParametersSize = 20;\n wrapFunctionBefore(API, 'drawIndexedIndirect', function (this: T, [indirectBuffer, indirectOffset]) {\n const info = s_renderPassToPassInfoMap.get(this)!;\n validateEncoderState(this, info.state);\n validateValidToDrawIndexed(this, info, () => {});\n assertNotDestroyed(indirectBuffer);\n const device = s_objToDevice.get(this)!;\n assert(device === s_objToDevice.get(indirectBuffer), 'indirectBuffer is not from same device', [indirectBuffer]);\n assert(!!(indirectBuffer.usage & GPUBufferUsage.INDIRECT), () => `buffer(${bufferUsageToString(indirectBuffer.usage)}) must have usage INDIRECT`, [indirectBuffer, this]);\n assert(indirectOffset + kIndirectDrawIndexedParametersSize <= indirectBuffer.size, `indirectOffset(${indirectOffset}) + sizeOfIndirectParameters(${kIndirectDrawIndexedParametersSize}) > indirectBuffer.size(${indirectBuffer.size})`, [indirectBuffer]);\n assert(indirectOffset % 4 === 0, () => `indirectOffset(${indirectOffset}) is not multiple of 4`);\n });\n\n\n wrapFunctionBefore(API, 'setPipeline', function (this: T, [pipeline]) {\n const info = s_renderPassToPassInfoMap.get(this)!;\n validateEncoderState(this, info.state);\n assert(s_objToDevice.get(this) === s_objToDevice.get(pipeline), 'pipeline must be from same device as renderPassEncoder', [pipeline, this]);\n const pipelineDesc = s_renderPipelineToRenderPipelineDescriptor.get(pipeline)!;\n const passLayoutInfo = getRenderPassInfo(this);\n assert(pipelineDesc.passLayoutInfo.passLayoutSignature === passLayoutInfo.passLayoutSignature,\n () => `pipeline is not compatible with ${this.constructor.name}\n\n${this.constructor.name} expects ${JSON.stringify(passLayoutInfo.renderPassLayout, null, 2)}\n\npipeline is: ${JSON.stringify(pipelineDesc.passLayoutInfo.renderPassLayout, null, 2)}\n`,\n [pipeline, this],\n );\n info.pipeline = pipeline;\n });\n\n\n wrapFunctionBefore(API, 'setIndexBuffer', function (this: T, [buffer, format, offset, size]) {\n const info = s_renderPassToPassInfoMap.get(this)!;\n validateEncoderState(this, info.state);\n const device = s_objToDevice.get(this)!;\n offset = offset ?? 0;\n size = size ?? Math.max(0, buffer.size - offset);\n\n assert(device === s_objToDevice.get(buffer), 'buffer must be from the same device', [buffer, this]);\n assertNotDestroyed(buffer);\n assert(!!(buffer.usage & GPUBufferUsage.INDEX), () => `buffer(${bufferUsageToString(buffer.usage)}) must have usage INDEX`, [buffer, this]);\n const align = format === 'uint16' ? 2 : 4;\n assert(offset % align === 0, () => `offset(${offset}) must be multiple of index format: ${format}`, [buffer, this]);\n assert(offset + size <= buffer.size, () => `offset(${offset}) + size(${size}) is not <= buffer.size(${buffer.size})`, [buffer, this]);\n\n info.indexBuffer = {\n buffer,\n offset,\n size,\n };\n info.indexFormat = format;\n });\n\n wrapFunctionBefore(API, 'setVertexBuffer', function (this: T, [slot, buffer, offset, size]) {\n const info = s_renderPassToPassInfoMap.get(this)!;\n validateEncoderState(this, info.state);\n const device = s_objToDevice.get(this)!;\n const maxSlot = device.limits.maxVertexBuffers;\n const bufferSize = buffer?.size || 0;\n offset = offset ?? 0;\n size = size ?? Math.max(0, bufferSize - offset);\n assert(slot >= 0, () => `slot(${slot}) must be >= 0`, [this]);\n assert(slot < maxSlot, () => `slot(${slot}) must be < device.limits.maxVertexBuffers(${maxSlot})`, [this]);\n assert(offset % 4 === 0, () => `offset(${offset}) must be multiple of 4`, [this]);\n assert(offset + size <= bufferSize, () => `offset(${offset}) + size(${size}) is not <= buffer.size(${bufferSize})`, [this, ...(buffer ? [buffer] : [])]);\n if (!buffer) {\n info.vertexBuffers[slot] = undefined;\n } else {\n assert(device === s_objToDevice.get(buffer), 'buffer must be from the same device', [buffer, this]);\n assertNotDestroyed(buffer);\n assert(!!(buffer.usage & GPUBufferUsage.VERTEX), () => `buffer(${bufferUsageToString(buffer.usage)}) must have usage VERTEX`, [buffer, this]);\n info.vertexBuffers[slot] = {\n buffer,\n offset,\n size,\n };\n }\n });\n }","import {\n wrapBindingCommandsMixin\n} from './binding-mixin.js';\nimport {\n validateEncoderState,\n} from './encoder-utils.js';\nimport { createRenderPassLayout } from './pipeline.js';\nimport {\n RenderDrawInfo,\n RenderPassLayoutInfo,\n wrapRenderCommandsMixin,\n} from './render-commands-mixin.js';\nimport { s_objToDevice } from './shared-state.js';\nimport {\n trimNulls,\n} from './utils.js';\nimport {\n wrapFunctionAfter,\n wrapFunctionBefore,\n} from './wrap-api.js';\n\ntype BundleEncoderInfo = RenderDrawInfo & {\n desc: GPURenderBundleDescriptor,\n passLayoutInfo: RenderPassLayoutInfo,\n};\n\nconst s_bundleEncoderToPassInfoMap = new WeakMap();\nconst s_bundleToPassInfoMap = new WeakMap();\n\nfunction getRenderPassLayout(bundleEncoder: GPURenderBundleEncoder): RenderPassLayoutInfo {\n return s_bundleEncoderToPassInfoMap.get(bundleEncoder)!.passLayoutInfo;\n}\n\nexport function getRenderPassLayoutForRenderBundle(bundle: GPURenderBundle) {\n return s_bundleToPassInfoMap.get(bundle)!;\n}\n\nwrapRenderCommandsMixin(\n GPURenderBundleEncoder,\n s_bundleEncoderToPassInfoMap,\n getRenderPassLayout,\n);\n\nexport function createRenderBundleEncoder(encoder: GPURenderBundleEncoder, desc: GPURenderBundleEncoderDescriptor) {\n const { sampleCount = 1, depthStencilFormat, colorFormats } = desc;\n const renderPassLayout = createRenderPassLayout(\n trimNulls([...colorFormats]),\n sampleCount,\n depthStencilFormat);\n s_bundleEncoderToPassInfoMap.set(encoder, {\n state: 'open', // this is not needed. should we move it?\n desc: {...desc},\n vertexBuffers: [],\n bindGroups: [],\n passLayoutInfo: {\n renderPassLayout,\n passLayoutSignature: JSON.stringify(renderPassLayout),\n },\n });\n}\n\nwrapBindingCommandsMixin(GPURenderBundleEncoder, s_bundleEncoderToPassInfoMap);\n\nwrapFunctionBefore(GPURenderBundleEncoder, 'finish', function (this: GPURenderBundleEncoder) {\n const info = s_bundleEncoderToPassInfoMap.get(this)!;\n validateEncoderState(this, info.state);\n info.state = 'ended';\n});\n\nwrapFunctionAfter(GPURenderBundleEncoder, 'finish', function (this: GPURenderBundleEncoder, bundle: GPURenderBundle) {\n s_objToDevice.set(bundle, s_objToDevice.get(this)!);\n s_bundleToPassInfoMap.set(bundle, s_bundleEncoderToPassInfoMap.get(this)!);\n});","import {\n makeBindGroupLayoutDescriptors,\n makeShaderDataDefinitions,\n ShaderDataDefinitions,\n} from 'webgpu-utils';\n\nimport {\n validateBindGroupResourcesNotDestroyed,\n} from './binding-mixin.js';\nimport {\n createCommandEncoder,\n} from './encoder-utils.js';\nimport {\n BindGroupLayoutDescriptorPlus,\n s_bindGroupLayoutToBindGroupLayoutDescriptorPlus,\n s_pipelineToReifiedPipelineLayoutDescriptor,\n s_pipelineLayoutToBindGroupLayoutDescriptorsPlus,\n trackRenderPipelineDescriptor,\n} from './pipeline.js';\nimport {\n createRenderBundleEncoder,\n} from './render-bundle-encoder.js';\nimport {\n assertNotDestroyed,\n s_bindGroupToInfo,\n s_objToDevice,\n} from './shared-state.js';\nimport {\n assert\n} from './validation.js';\nimport {\n wrapFunctionAfter,\n wrapAsyncFunctionAfter,\n} from './wrap-api.js';\n\nconst s_shaderModuleToDefs = new WeakMap();\n\nfunction addDefs(defs: ShaderDataDefinitions[], stage: GPUProgrammableStage | undefined) {\n if (stage) {\n defs.push(s_shaderModuleToDefs.get(stage.module)!);\n }\n}\n\nfunction reifyBufferLayout(buffer: GPUBufferBindingLayout) {\n return {\n type: buffer.type ?? 'uniform',\n hasDynamicOffset: !!buffer.hasDynamicOffset,\n minBindingSize: buffer.minBindingSize ?? 0,\n };\n}\n\nfunction reifySamplerLayout(sampler: GPUSamplerBindingLayout) {\n return {\n type: sampler.type ?? 'filtering',\n };\n}\n\nfunction reifyTextureLayout(texture: GPUTextureBindingLayout) {\n return {\n sampleType: texture.sampleType ?? 'float',\n viewDimension: texture.viewDimension ?? '2d',\n multisampled: !!texture.multisampled,\n };\n}\n\nfunction reifyStorageTexture(storageTexture: GPUStorageTextureBindingLayout) {\n return {\n access: storageTexture.access ?? 'write-only',\n format: storageTexture.format,\n viewDimension: storageTexture.viewDimension ?? '2d',\n };\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction reifyExternalTexture(externalTexture: GPUExternalTextureBindingLayout) {\n return {\n };\n}\n\nfunction reifyBindGroupLayoutEntry({\n binding,\n visibility,\n buffer,\n sampler,\n texture,\n storageTexture,\n externalTexture,\n }: GPUBindGroupLayoutEntry): GPUBindGroupLayoutEntry {\n return {\n binding,\n visibility,\n ...(buffer && { buffer: reifyBufferLayout(buffer) }),\n ...(sampler && { sampler: reifySamplerLayout(sampler) }),\n ...(texture && { texture: reifyTextureLayout(texture) }),\n ...(storageTexture && { storageTexture: reifyStorageTexture(storageTexture) }),\n ...(externalTexture && { externalTexture: reifyExternalTexture(externalTexture) }),\n };\n}\n\nfunction bindGroupLayoutDescriptorToBindGroupLayoutDescriptorPlus(\n src: GPUBindGroupLayoutDescriptor,\n autoId: number): BindGroupLayoutDescriptorPlus {\n const bindGroupLayoutDescriptor = {\n entries: [...src.entries].map(reifyBindGroupLayoutEntry),\n };\n const entriesById = Object.fromEntries(bindGroupLayoutDescriptor.entries.map(e => [e.binding, e]));\n const dynamicOffsetCount = bindGroupLayoutDescriptor.entries.reduce((a, v) => a + (v.buffer?.hasDynamicOffset ? 1 : 0), 0);\n const signature = `${JSON.stringify(bindGroupLayoutDescriptor)}${autoId ? `:autoId(${autoId})` : ''})`;\n return {\n bindGroupLayoutDescriptor,\n entriesById,\n dynamicOffsetCount,\n signature,\n };\n}\n\nlet s_autoCount = 1;\nfunction getReifiedPipelineLayoutDescriptor(desc: GPUComputePipelineDescriptor | GPURenderPipelineDescriptor) {\n if (desc.layout === 'auto') {\n // It's auto so we need to make a reified pipeline descriptor\n const defs: ShaderDataDefinitions[] = [];\n addDefs(defs, (desc as GPURenderPipelineDescriptor).vertex);\n addDefs(defs, (desc as GPURenderPipelineDescriptor).fragment);\n addDefs(defs, (desc as GPUComputePipelineDescriptor).compute);\n const autoId = s_autoCount++;\n const bindGroupLayoutDescriptors = makeBindGroupLayoutDescriptors(defs, desc).map(b => bindGroupLayoutDescriptorToBindGroupLayoutDescriptorPlus(b, autoId));\n return {\n bindGroupLayoutDescriptors,\n };\n } else {\n const bindGroupLayoutDescriptors = s_pipelineLayoutToBindGroupLayoutDescriptorsPlus.get(desc.layout)!;\n return {\n bindGroupLayoutDescriptors,\n };\n }\n}\n\nfunction trackPipelineLayouts(device: GPUDevice, pipeline: GPUPipelineBase, desc: GPUComputePipelineDescriptor | GPURenderPipelineDescriptor) {\n s_pipelineToReifiedPipelineLayoutDescriptor.set(pipeline, getReifiedPipelineLayoutDescriptor(desc));\n}\n\nwrapFunctionAfter(GPUDevice, 'createShaderModule', function (this: GPUDevice, module: GPUShaderModule, [desc]: [GPUShaderModuleDescriptor]) {\n assertNotDestroyed(this);\n s_objToDevice.set(module, this);\n s_shaderModuleToDefs.set(module, makeShaderDataDefinitions(desc.code));\n});\n\nwrapFunctionAfter(GPUDevice, 'createBindGroup', function (this: GPUDevice, bindGroup: GPUBindGroup, [desc]: [GPUBindGroupDescriptor]) {\n s_objToDevice.set(bindGroup, this);\n const { layout } = desc;\n // copy the entries since the user might change them\n const entries = [];\n for (const {binding, resource} of [...desc.entries]) {\n const r = resource instanceof GPUSampler ||\n resource instanceof GPUTextureView ||\n resource instanceof GPUExternalTexture\n ? resource\n : { ...resource };\n const rb = r as GPUBufferBinding;\n if (rb.buffer instanceof GPUBuffer) {\n const offset = rb.offset || 0;\n const size = rb.size || rb.buffer.size - offset;\n assert(offset + size <= rb.buffer.size, () => `offset(${offset} + size(${size}) > buffer.size(${rb.buffer.size}))`, [rb.buffer]);\n }\n entries.push({\n binding,\n resource: r,\n });\n }\n entries.sort((a, b) => a.binding - b.binding);\n validateBindGroupResourcesNotDestroyed(entries);\n const layoutPlus = s_bindGroupLayoutToBindGroupLayoutDescriptorPlus.get(layout)!;\n s_bindGroupToInfo.set(bindGroup, {\n entries,\n layoutPlus,\n });\n});\n\nwrapFunctionAfter(GPUDevice, 'createBuffer', function (this: GPUDevice, buffer: GPUBuffer) {\n assertNotDestroyed(this);\n s_objToDevice.set(buffer, this);\n});\n\nwrapFunctionAfter(GPUDevice, 'createQuerySet', function (this: GPUDevice, querySet: GPUQuerySet) {\n assertNotDestroyed(this);\n s_objToDevice.set(querySet, this);\n});\n\nwrapFunctionAfter(GPUDevice, 'createSampler', function (this: GPUDevice, sampler: GPUSampler) {\n assertNotDestroyed(this);\n s_objToDevice.set(sampler, this);\n});\n\nwrapFunctionAfter(GPUDevice, 'createTexture', function (this: GPUDevice, texture: GPUTexture) {\n assertNotDestroyed(this);\n s_objToDevice.set(texture, this);\n});\n\nwrapFunctionAfter(GPUDevice, 'importExternalTexture', function (this: GPUDevice, externalTexture: GPUExternalTexture) {\n s_objToDevice.set(externalTexture, this);\n});\n\nwrapFunctionAfter(GPUDevice, 'createCommandEncoder', function (this: GPUDevice, commandEncoder: GPUCommandEncoder) {\n assertNotDestroyed(this);\n s_objToDevice.set(commandEncoder, this);\n createCommandEncoder(commandEncoder);\n});\n\nwrapFunctionAfter(GPUDevice, 'createRenderBundleEncoder', function (this: GPUDevice, bundleEncoder: GPURenderBundleEncoder, [desc]) {\n assertNotDestroyed(this);\n s_objToDevice.set(bundleEncoder, this);\n createRenderBundleEncoder(bundleEncoder, desc);\n});\n\nwrapFunctionAfter(GPUDevice, 'createRenderPipeline', function (this: GPUDevice, pipeline: GPURenderPipeline, [desc]) {\n assertNotDestroyed(this);\n s_objToDevice.set(pipeline, this);\n trackRenderPipelineDescriptor(pipeline, desc);\n trackPipelineLayouts(this, pipeline, desc);\n});\n\nwrapFunctionAfter(GPUDevice, 'createComputePipeline', function (this: GPUDevice, pipeline: GPUComputePipeline, [desc]) {\n assertNotDestroyed(this);\n s_objToDevice.set(pipeline, this);\n trackPipelineLayouts(this, pipeline, desc);\n});\n\nwrapAsyncFunctionAfter(GPUDevice, 'createRenderPipelineAsync', function (this: GPUDevice, pipeline: GPURenderPipeline, [desc]) {\n assertNotDestroyed(this);\n s_objToDevice.set(pipeline, this);\n trackRenderPipelineDescriptor(pipeline, desc);\n trackPipelineLayouts(this, pipeline, desc);\n});\n\nwrapAsyncFunctionAfter(GPUDevice, 'createComputePipelineAsync', function (this: GPUDevice, pipeline: GPUComputePipeline, [desc]) {\n assertNotDestroyed(this);\n s_objToDevice.set(pipeline, this);\n trackPipelineLayouts(this, pipeline, desc);\n});\n\nwrapFunctionAfter(GPUDevice, 'createBindGroupLayout', function (this: GPUDevice, bindGroupLayout: GPUBindGroupLayout, [desc]) {\n s_bindGroupLayoutToBindGroupLayoutDescriptorPlus.set(\n bindGroupLayout,\n bindGroupLayoutDescriptorToBindGroupLayoutDescriptorPlus(desc, 0),\n );\n});\n\nwrapFunctionAfter(GPUDevice, 'createPipelineLayout', function (this: GPUDevice, pipelineLayout: GPUPipelineLayout, [desc]) {\n // need to copy the description because the user may change it after\n const bglDescriptorsPlus: BindGroupLayoutDescriptorPlus[] =\n [...desc.bindGroupLayouts].map(bgl => s_bindGroupLayoutToBindGroupLayoutDescriptorPlus.get(bgl)!);\n s_pipelineLayoutToBindGroupLayoutDescriptorsPlus.set(pipelineLayout, bglDescriptorsPlus);\n}\n\n);\n\n","\nimport {\n s_objToDevice,\n} from './shared-state.js';\nimport {\n wrapFunctionAfter,\n wrapFunctionBefore,\n} from './wrap-api.js';\n\n\nwrapFunctionBefore(GPUCanvasContext, 'configure', function (this: GPUCanvasContext, [desc]) {\n s_objToDevice.set(this, desc.device);\n});\n\nwrapFunctionBefore(GPUCanvasContext, 'unconfigure', function (this: GPUCanvasContext) {\n s_objToDevice.delete(this);\n});\n\nwrapFunctionAfter(GPUCanvasContext, 'getCurrentTexture', function (this: GPUCanvasContext, texture: GPUTexture) {\n const device = s_objToDevice.get(this)!;\n s_objToDevice.set(texture, device);\n});\n","import {\n assertNotDestroyed,\n s_objToDevice,\n} from './shared-state.js';\nimport {\n assert,\n} from './validation.js';\n\nexport function validateTimestampWrites(device: GPUDevice, timestampWrites: GPUComputePassTimestampWrites | GPURenderPassTimestampWrites) {\n const { querySet, beginningOfPassWriteIndex, endOfPassWriteIndex } = timestampWrites;\n assertNotDestroyed(querySet);\n assert(s_objToDevice.get(querySet) === device, 'querySet not from same device', [querySet]);\n assert(querySet.type === 'timestamp', () => `querySet.type(${querySet.type}) !== 'timestamp'`);\n assert(beginningOfPassWriteIndex === undefined || beginningOfPassWriteIndex < querySet.count, () => `timestampWrites.beginningOfPassWriteIndex(${beginningOfPassWriteIndex}) is >= querySet.count(${querySet.count})`);\n assert(endOfPassWriteIndex === undefined || endOfPassWriteIndex < querySet.count, () => `timestampWrites.endOfPassWriteIndex(${endOfPassWriteIndex}) is >= querySet.count(${querySet.count})`);\n assert(\n beginningOfPassWriteIndex !== undefined || endOfPassWriteIndex !== undefined,\n () => `at least one of beginningOfPassWriteIndex(${beginningOfPassWriteIndex}) or endOfPassWriteIndex(${endOfPassWriteIndex})`);\n assert(beginningOfPassWriteIndex !== endOfPassWriteIndex,\n () => `beginningOfPassWriteIndex(${beginningOfPassWriteIndex}) and endOfPassWriteIndex(${endOfPassWriteIndex}) may not be the same`);\n}\n\n","import {\n PassInfo,\n validateEncoderBindGroups,\n wrapBindingCommandsMixin,\n} from './binding-mixin.js';\nimport {\n unlockCommandEncoder,\n validateEncoderState,\n} from './encoder-utils.js';\nimport {\n validateTimestampWrites,\n} from './query-support.js';\nimport {\n assertNotDestroyed,\n s_objToDevice,\n} from './shared-state.js';\nimport {\n bufferUsageToString,\n} from './utils.js';\nimport {\n assert,\n} from './validation.js';\nimport {\n wrapFunctionBefore,\n} from './wrap-api.js';\n\ntype ComputePassInfo = PassInfo & {\n commandEncoder: GPUCommandEncoder,\n pipeline?: GPUComputePipeline,\n};\n\nconst s_computePassToPassInfoMap = new WeakMap();\n\nexport function beginComputePass(commandEncoder: GPUCommandEncoder, passEncoder: GPUComputePassEncoder, desc: GPUComputePassDescriptor | undefined) {\n const device = s_objToDevice.get(commandEncoder)!;\n const { timestampWrites } = desc || {};\n\n if (timestampWrites) {\n validateTimestampWrites(device, timestampWrites);\n }\n\n s_computePassToPassInfoMap.set(passEncoder, {\n state: 'open',\n commandEncoder,\n bindGroups: [],\n });\n}\n\nwrapBindingCommandsMixin(GPUComputePassEncoder, s_computePassToPassInfoMap);\n\nwrapFunctionBefore(GPUComputePassEncoder, 'setPipeline', function (this: GPUComputePassEncoder, [pipeline]) {\n const info = s_computePassToPassInfoMap.get(this)!;\n validateEncoderState(this, info.state);\n assert(s_objToDevice.get(info.commandEncoder) === s_objToDevice.get(pipeline), 'pipeline must be from same device as computePassEncoder', [this, info.commandEncoder]);\n info.pipeline = pipeline;\n});\n\nwrapFunctionBefore(GPUComputePassEncoder, 'end', function (this: GPUComputePassEncoder) {\n const info = s_computePassToPassInfoMap.get(this)!;\n validateEncoderState(this, info.state);\n info.state = 'ended';\n unlockCommandEncoder(info.commandEncoder);\n});\n\nwrapFunctionBefore(GPUComputePassEncoder, 'dispatchWorkgroups', function (this: GPUComputePassEncoder, [workgroupCountX, workgroupCountY = 1, workgroupCountZ = 1]) {\n const info = s_computePassToPassInfoMap.get(this)!;\n validateEncoderState(this, info.state);\n validateEncoderBindGroups(info.bindGroups, info.pipeline);\n\n const device = s_objToDevice.get(this)!;\n assert(workgroupCountX < device.limits.maxComputeWorkgroupsPerDimension, () => `workGroupCountX(${workgroupCountX} > device.limits.maxComputeWorkgroupsPerDimension(${device.limits.maxComputeWorkgroupsPerDimension})`);\n assert(workgroupCountY < device.limits.maxComputeWorkgroupsPerDimension, () => `workGroupCountY(${workgroupCountY} > device.limits.maxComputeWorkgroupsPerDimension(${device.limits.maxComputeWorkgroupsPerDimension})`);\n assert(workgroupCountZ < device.limits.maxComputeWorkgroupsPerDimension, () => `workGroupCountZ(${workgroupCountZ} > device.limits.maxComputeWorkgroupsPerDimension(${device.limits.maxComputeWorkgroupsPerDimension})`);\n});\n\nconst kIndirectDispatchWorkgroupsParametersSize = 12;\nwrapFunctionBefore(GPUComputePassEncoder, 'dispatchWorkgroupsIndirect', function (this: GPUComputePassEncoder, [indirectBuffer, indirectOffset]) {\n const info = s_computePassToPassInfoMap.get(this)!;\n validateEncoderState(this, info.state);\n validateEncoderBindGroups(info.bindGroups, info.pipeline);\n assertNotDestroyed(indirectBuffer);\n const device = s_objToDevice.get(this)!;\n assert(device === s_objToDevice.get(indirectBuffer), 'indirectBuffer is not from same device', [indirectBuffer]);\n assert(!!(indirectBuffer.usage & GPUBufferUsage.INDIRECT), () => `buffer(${bufferUsageToString(indirectBuffer.usage)}) must have usage INDIRECT`, [indirectBuffer, this]);\n assert(indirectOffset + kIndirectDispatchWorkgroupsParametersSize <= indirectBuffer.size, `indirectOffset(${indirectOffset}) + sizeOfIndirectParameters(${kIndirectDispatchWorkgroupsParametersSize}) > indirectBuffer.size(${indirectBuffer.size})`, [indirectBuffer]);\n assert(indirectOffset % 4 === 0, () => `indirectOffset(${indirectOffset}) is not multiple of 4`);\n});\n","import {\n wrapBindingCommandsMixin,\n} from './binding-mixin.js';\nimport {\n unlockCommandEncoder,\n validateEncoderState,\n} from './encoder-utils.js';\nimport { kAllTextureFormatInfo } from './format-info.js';\nimport {\n createRenderPassLayout,\n} from './pipeline.js';\nimport {\n validateTimestampWrites,\n} from './query-support.js';\nimport {\n getRenderPassLayoutForRenderBundle\n} from './render-bundle-encoder.js';\nimport {\n RenderDrawInfo,\n RenderPassLayoutInfo,\n wrapRenderCommandsMixin,\n} from './render-commands-mixin.js';\nimport {\n assertNotDestroyed,\n s_objToDevice,\n} from './shared-state.js';\nimport {\n TextureViewDescriptor,\n s_textureViewToDesc,\n s_textureViewToTexture,\n} from './texture.js';\nimport {\n logicalMipLevelSpecificTextureExtent,\n roundUp,\n textureUsageToString,\n trimNulls,\n} from './utils.js';\nimport {\n assert,\n emitError,\n} from './validation.js';\nimport {\n wrapFunctionBefore,\n} from './wrap-api.js';\n\ntype InUseMipLevels = Set;\ntype InUseDepthOrArrayLayers = Map;\ntype InUseTextures = Map;\n\ntype RenderPassInfo = RenderDrawInfo & {\n commandEncoder: GPUCommandEncoder,\n targetWidth: number,\n targetHeight: number,\n passLayoutInfo: RenderPassLayoutInfo,\n occlusionQuerySet?: GPUQuerySet,\n occlusionIndices: Map,\n occlusionQueryActive?: Error,\n occlusionQueryActiveIndex: number,\n inuseTextures: InUseTextures,\n};\n\nconst s_renderPassToPassInfoMap = new WeakMap();\n\nfunction getRenderPassLayout(passEncoder: GPURenderPassEncoder): RenderPassLayoutInfo {\n return s_renderPassToPassInfoMap.get(passEncoder)!.passLayoutInfo;\n}\n\n/*\nfunction checkTextureNotInUse(inuseTextures: InUseTextures, texture: GPUTexture, fullView: TextureViewDescriptor) {\n const views = inuseTextures.get(texture);\n if (!views) {\n return;\n }\n}\n*/\n\nfunction markTextureInUse(inuseTextures: InUseTextures, texture: GPUTexture, view: GPUTextureView) {\n const fullView = s_textureViewToDesc.get(view)!;\n const inUseDepthOrArrayLayers = inuseTextures.get(texture) || new Map();\n inuseTextures.set(texture, inUseDepthOrArrayLayers);\n for (let l = 0; l < fullView.arrayLayerCount; ++l) {\n const layer = l + fullView.baseArrayLayer;\n const inUseMipLevels = inUseDepthOrArrayLayers.get(layer) || new Set();\n inUseDepthOrArrayLayers.set(layer, inUseMipLevels);\n for (let m = 0; m < fullView.mipLevelCount; ++m) {\n const mipLevel = m + fullView.baseMipLevel;\n assert(!inUseMipLevels.has(mipLevel), () => `mipLevel(${mipLevel}) of layer(${layer}) is already in use`, [texture]);\n inUseMipLevels.add(mipLevel);\n }\n }\n}\n\nfunction validateViewAspectIsAllAspectsOfTexture(texture: GPUTexture, aspect: GPUTextureAspect) {\n const {depth, stencil} = kAllTextureFormatInfo[texture.format];\n if (depth && stencil) {\n assert(aspect === 'all', 'aspect must be all for depth-stencil textures', [texture]);\n } else if (depth) {\n assert(aspect === 'all' || aspect === 'depth-only',\n 'aspect must be all or depth-only for depth textures', [texture]);\n } else if (stencil) {\n assert(aspect === 'all' || aspect === 'stencil-only',\n 'aspect must be all or stencil-only for stencil textures', [texture]);\n }\n}\n\nfunction validateRenderableTextureView(texture: GPUTexture, viewDesc: TextureViewDescriptor) {\n assert((texture.usage & GPUTextureUsage.RENDER_ATTACHMENT) !== 0,\n () => `texture.usage(${textureUsageToString(texture.usage)}) is missing RENDER_ATTACHMENT`, [texture]\n );\n const { dimension, mipLevelCount, arrayLayerCount, aspect } = viewDesc;\n assert(dimension === '2d' || dimension === '3d', () => `dimension(${dimension}) must be 2d or 3d`);\n assert(mipLevelCount === 1, () => `mipLevelCount(${mipLevelCount}) must be 1`);\n assert(arrayLayerCount === 1, () => `arrayLayerCount(${arrayLayerCount}) must be 1`);\n validateViewAspectIsAllAspectsOfTexture(texture, aspect);\n}\n\nfunction validateRenderPassColorAttachment(attachment: GPURenderPassColorAttachment, slot: number) {\n const {view, resolveTarget, depthSlice, loadOp } = attachment;\n const renderViewDesc = s_textureViewToDesc.get(view)!;\n const renderTexture = s_textureViewToTexture.get(view)!;\n const formatInfo = kAllTextureFormatInfo[renderViewDesc.format];\n validateRenderableTextureView(renderTexture, renderViewDesc);\n assert(!!formatInfo.colorRender, () => `format(${renderViewDesc.format}) is not color renderable`);\n if (renderViewDesc.dimension === '3d') {\n assert(!!depthSlice, () => `attachment(${slot})'s dimension is '3d' but depthSlice is missing`);\n const [, , d] = logicalMipLevelSpecificTextureExtent(renderTexture, renderViewDesc.baseMipLevel);\n assert(depthSlice < d, () => `depthSlice(${depthSlice}) must be < depth(${d}) at mipLevel(${renderViewDesc.mipLevelCount}) of texture`, [renderTexture]);\n } else {\n assert(depthSlice === undefined, `attachment(${slot}) is not 3d so depthSlice must NOT be provided`);\n }\n if (loadOp) {\n // check that clearValue is valid\n }\n if (resolveTarget) {\n const resolveViewDesc = s_textureViewToDesc.get(resolveTarget)!;\n const resolveTexture = s_textureViewToTexture.get(resolveTarget)!;\n const [tw, th] = logicalMipLevelSpecificTextureExtent(renderTexture, renderViewDesc.baseMipLevel);\n const [rw, rh] = logicalMipLevelSpecificTextureExtent(resolveTexture, resolveViewDesc.baseMipLevel);\n assert(tw === rw && th === rh, () => `resolveTarget render extent(${rw}, ${rh}) != view render extent (${tw}, ${th})`);\n assert(renderTexture.sampleCount > 1, 'resolveTarget is set so view texture must have sampleCount > 1', [renderTexture]);\n assert(resolveTexture.sampleCount === 1, 'resolveTarget.sampleCount must be 1', [resolveTarget]);\n validateRenderableTextureView(resolveTexture, resolveViewDesc);\n assert(resolveViewDesc.format === renderViewDesc.format, () => `resolveTarget.view.format(${resolveViewDesc.format}) must equal target.view.format(${renderViewDesc.format})`);\n assert(resolveTexture.format === renderTexture.format, () => `resolve texture format(${resolveTexture.format}) must equal target texture format(${renderTexture.format})`);\n const resolveFormatInfo = kAllTextureFormatInfo[resolveTexture.format];\n assert(!!resolveFormatInfo?.colorRender?.resolve, () => `resolve texture.format(${resolveTexture.format}) does not support resolving`);\n }\n}\n\nwrapRenderCommandsMixin(GPURenderPassEncoder, s_renderPassToPassInfoMap, getRenderPassLayout);\n\nexport function beginRenderPass(commandEncoder: GPUCommandEncoder, passEncoder: GPURenderPassEncoder, desc: GPURenderPassDescriptor) {\n let targetWidth: number | undefined;\n let targetHeight: number | undefined;\n const device = s_objToDevice.get(commandEncoder)!;\n\n const inuseTextures = new Map();\n const colorFormats: (GPUTextureFormat | null)[] = [];\n let passSampleCount: number | undefined;\n let depthStencilFormat: GPUTextureFormat | undefined;\n let bytesPerSample = 0;\n let numAttachments = 0;\n\n const checkRenderExtent = (texture: GPUTexture, view: GPUTextureView) => {\n const desc = s_textureViewToDesc.get(view)!;\n const [width, height] = logicalMipLevelSpecificTextureExtent(texture, desc.baseMipLevel);\n if (targetWidth === undefined) {\n targetWidth = width;\n targetHeight = height;\n } else if (targetWidth !== width || targetHeight !== height) {\n emitError('attachments are not all the same width and height', [view, texture, passEncoder, commandEncoder]);\n }\n };\n\n const addView = (attachment: GPURenderPassColorAttachment | GPURenderPassDepthStencilAttachment | null | undefined, isDepth?: boolean) => {\n if (!attachment) {\n if (!isDepth) {\n colorFormats.push(null);\n }\n return;\n }\n ++numAttachments;\n const {view} = attachment;\n const texture = s_textureViewToTexture.get(view)!;\n assertNotDestroyed(texture);\n assert(s_objToDevice.get(texture) === device, 'texture is not from same device as command encoder', [texture, commandEncoder]);\n const {sampleCount, format} = texture;\n const formatInfo = kAllTextureFormatInfo[format];\n markTextureInUse(inuseTextures, texture, view);\n const { colorRender, depth, stencil } = formatInfo;\n checkRenderExtent(texture, view);\n if (isDepth) {\n assert(!!depth || !!stencil, () => `format(${format}) is not a depth stencil format`);\n depthStencilFormat = format;\n } else {\n validateRenderPassColorAttachment(attachment as GPURenderPassColorAttachment, colorFormats.length - 1);\n colorFormats.push(format);\n bytesPerSample += roundUp(colorRender!.byteCost, colorRender!.alignment);\n }\n if (!passSampleCount) {\n passSampleCount = sampleCount;\n } else {\n assert(sampleCount === passSampleCount, 'all attachments do not have the same sampleCount');\n }\n };\n\n const { timestampWrites, colorAttachments, depthStencilAttachment, occlusionQuerySet } = desc;\n\n for (const colorAttachment of colorAttachments || []) {\n addView(colorAttachment);\n }\n\n addView(depthStencilAttachment, true);\n\n assert(numAttachments > 0, 'there must be at least 1 colorAttachment or depthStencilAttachment');\n assert(numAttachments <= device.limits.maxColorAttachments, () => `numAttachments(${numAttachments}) > device.limits.maxColorAttachments(${device.limits.maxColorAttachments})`);\n assert(bytesPerSample <= device.limits.maxColorAttachmentBytesPerSample,\n () => `color attachments bytesPerSample(${bytesPerSample}) > device.limits.maxColorAttachmentBytesPerSample(${device.limits.maxColorAttachmentBytesPerSample})`);\n\n if (timestampWrites) {\n validateTimestampWrites(device, timestampWrites);\n }\n\n if (occlusionQuerySet) {\n assertNotDestroyed(occlusionQuerySet);\n assert(device === s_objToDevice.get(occlusionQuerySet), 'occlusionQuerySet is not from same device', [occlusionQuerySet]);\n assert(occlusionQuerySet.type === 'occlusion', () => `occlusionQuerySet.type(${occlusionQuerySet.type}) is not 'occlusion'`, [occlusionQuerySet]);\n }\n\n const renderPassLayout = createRenderPassLayout(\n trimNulls(colorFormats),\n passSampleCount!,\n depthStencilFormat);\n\n s_renderPassToPassInfoMap.set(passEncoder, {\n state: 'open',\n commandEncoder,\n targetWidth: targetWidth || 0,\n targetHeight: targetHeight || 0,\n vertexBuffers: [],\n bindGroups: [],\n occlusionQuerySet,\n occlusionIndices: new Map(),\n occlusionQueryActiveIndex: -1,\n passLayoutInfo: {\n renderPassLayout,\n passLayoutSignature: JSON.stringify(renderPassLayout),\n },\n inuseTextures,\n });\n}\n\nwrapFunctionBefore(GPURenderPassEncoder, 'executeBundles', function (this: GPURenderPassEncoder, [bundles]) {\n const info = s_renderPassToPassInfoMap.get(this)!;\n validateEncoderState(this, info.state);\n const device = s_objToDevice.get(this)!;\n\n let bundleCount = 0;\n for (const bundle of bundles) {\n assert(s_objToDevice.get(bundle) === device, () => 'bundle[${count}] is not from same device as render pass encoder', [bundle]);\n const count = bundleCount;\n const bundleDesc = getRenderPassLayoutForRenderBundle(bundle)!;\n const passLayoutInfo = getRenderPassLayout(this);\n assert(bundleDesc.passLayoutInfo.passLayoutSignature === passLayoutInfo.passLayoutSignature,\n () => `bundle[${count}] is not compatible with ${this.constructor.name}\n\n${this.constructor.name} expects ${JSON.stringify(passLayoutInfo.renderPassLayout, null, 2)}\n\nbundle is: ${JSON.stringify(bundleDesc.passLayoutInfo.renderPassLayout, null, 2)}\n`,\n [bundle, this],\n );\n ++bundleCount;\n }\n\n info.bindGroups.length = 0;\n info.pipeline = undefined;\n info.indexBuffer = undefined;\n info.indexFormat = undefined;\n info.vertexBuffers.length = 0;\n});\n\nwrapFunctionBefore(GPURenderPassEncoder, 'beginOcclusionQuery', function (this: GPURenderPassEncoder, [queryIndex]) {\n const info = s_renderPassToPassInfoMap.get(this)!;\n validateEncoderState(this, info.state);\n const { occlusionIndices, occlusionQueryActive, occlusionQuerySet } = info;\n assert(!!occlusionQuerySet, 'no occlusionQuerySet in pass');\n assertNotDestroyed(occlusionQuerySet);\n assert(queryIndex < occlusionQuerySet.count, () => `queryIndex(${queryIndex}) >= occlusionQuerySet.count(${occlusionQuerySet.count})`, [occlusionQuerySet]);\n const queryErr = occlusionIndices.get(queryIndex);\n assert(!queryErr, () => `queryIndex(${queryIndex}) was already used in this pass at ${queryErr!.stack}`);\n assert(!occlusionQueryActive, () => `another query is already active from ${occlusionQueryActive!.stack}`);\n info.occlusionQueryActive = new Error();\n info.occlusionQueryActiveIndex = queryIndex;\n});\n\nwrapFunctionBefore(GPURenderPassEncoder, 'endOcclusionQuery', function (this: GPURenderPassEncoder) {\n const info = s_renderPassToPassInfoMap.get(this)!;\n validateEncoderState(this, info.state);\n const { occlusionIndices, occlusionQueryActive, occlusionQueryActiveIndex, occlusionQuerySet } = info;\n assert(!!info.occlusionQueryActive, 'no occlusion query is active');\n occlusionIndices.set(occlusionQueryActiveIndex, occlusionQueryActive!);\n if (occlusionQuerySet) {\n assertNotDestroyed(occlusionQuerySet);\n }\n info.occlusionQueryActive = undefined;\n});\n\nwrapBindingCommandsMixin(GPURenderPassEncoder, s_renderPassToPassInfoMap);\n\nwrapFunctionBefore(GPURenderPassEncoder, 'end', function (this: GPURenderPassEncoder) {\n const info = s_renderPassToPassInfoMap.get(this)!;\n validateEncoderState(this, info.state);\n info.state = 'ended';\n unlockCommandEncoder(info.commandEncoder)!;\n assert(!info.occlusionQueryActive, () => `occlusion queryIndex(${info.occlusionQueryActiveIndex}) is still active`);\n});\n\nwrapFunctionBefore(GPURenderPassEncoder, 'setViewport', function (this: GPURenderPassEncoder, [x, y, width, height, minDepth, maxDepth]: [number, number, number, number, number, number]) {\n const info = s_renderPassToPassInfoMap.get(this)!;\n validateEncoderState(this, info.state);\n const {\n targetWidth,\n targetHeight,\n } = info;\n\n assert(x >= 0, () => `x(${x}) < 0`, [this]);\n assert(y >= 0, () => `y(${y}) < 0`, [this]);\n assert(x + width <= targetWidth, () => `x(${x}) + width(${width}) > texture.width(${targetWidth})`, [this]);\n assert(y + height <= targetHeight, () => `y(${x}) + height(${height}) > texture.height(${targetHeight})`, [this]);\n assert(minDepth >= 0 && minDepth <= 1.0, () => `minDepth(${minDepth}) must be >= 0 and <= 1`);\n assert(maxDepth >= 0 && maxDepth <= 1.0, () => `maxDepth(${maxDepth}) must be >= 0 and <= 1`);\n assert(minDepth < maxDepth, () => `minDepth(${minDepth}) must be < maxDepth(${maxDepth})`);\n});\n\nwrapFunctionBefore(GPURenderPassEncoder, 'setScissorRect', function (this: GPURenderPassEncoder, [x, y, width, height]: [number, number, number, number]) {\n const info = s_renderPassToPassInfoMap.get(this)!;\n validateEncoderState(this, info.state);\n const {\n targetWidth,\n targetHeight,\n } = info;\n assert(x >= 0, () => `x(${x}) < 0`, [this]);\n assert(y >= 0, () => `y(${y}) < 0`, [this]);\n assert(x + width <= targetWidth, () => `x(${x}) + width(${width}) > texture.width(${targetWidth})`, [this]);\n assert(y + height <= targetHeight, () => `y(${x}) + height(${height}) > texture.height(${targetHeight})`, [this]);\n});\n\n","import {\n beginComputePass,\n} from './compute-pass-encoder.js';\nimport {\n lockCommandEncoder,\n finishCommandEncoder,\n getCommandBufferInfoAndValidateState,\n} from './encoder-utils.js';\nimport {\n kAllTextureFormatInfo\n} from './format-info.js';\nimport {\n beginRenderPass,\n} from './render-pass-encoder.js';\nimport { assertNotDestroyed, s_objToDevice } from './shared-state.js';\nimport { bufferUsageToString, physicalMipLevelSpecificTextureExtent, reifyGPUExtent3D, reifyGPUOrigin3D, textureUsageToString } from './utils.js';\nimport { assert } from './validation.js';\nimport {\n wrapFunctionAfter,\n wrapFunctionBefore,\n} from './wrap-api.js';\n\nwrapFunctionAfter(GPUCommandEncoder, 'beginComputePass', function (this: GPUCommandEncoder, passEncoder: GPUComputePassEncoder, [desc]) {\n s_objToDevice.set(passEncoder, s_objToDevice.get(this)!);\n lockCommandEncoder(this);\n beginComputePass(this, passEncoder, desc);\n});\n\nwrapFunctionAfter(GPUCommandEncoder, 'beginRenderPass', function (this: GPUCommandEncoder, passEncoder: GPURenderPassEncoder, [desc]) {\n s_objToDevice.set(passEncoder, s_objToDevice.get(this)!);\n lockCommandEncoder(this);\n beginRenderPass(this, passEncoder, desc);\n});\n\nwrapFunctionBefore(GPUCommandEncoder, 'finish', function (this: GPUCommandEncoder) {\n finishCommandEncoder(this);\n});\n\nwrapFunctionBefore(GPUCommandEncoder, 'copyBufferToBuffer', function (this: GPUCommandEncoder, [src, srcOffset, dst, dstOffset, size]) {\n getCommandBufferInfoAndValidateState(this);\n assertNotDestroyed(src);\n assertNotDestroyed(dst);\n const device = s_objToDevice.get(this);\n assert(device === s_objToDevice.get(src), 'src is not from same device as commandEncoder', [src, this]);\n assert(device === s_objToDevice.get(dst), 'dst is not from same device as commandEncoder', [dst, this]);\n assert(src !== dst, 'src must not be same buffer as dst', [src, dst]);\n assert(!!(src.usage & GPUBufferUsage.COPY_SRC), () => `src.usage(${bufferUsageToString(src.usage)} missing COPY_SRC)`, [src]);\n assert(!!(dst.usage & GPUBufferUsage.COPY_DST), () => `dst.usage(${bufferUsageToString(dst.usage)} missing COPY_DST)`, [dst]);\n assert(srcOffset + size <= src.size, () => `srcOffset(${srcOffset}) + size(${size}) > srcBuffer.size(${src.size})`, [src]);\n assert(dstOffset + size <= dst.size, () => `dstOffset(${dstOffset}) + size(${size}) > dstBuffer.size(${dst.size})`, [dst]);\n assert(size % 4 === 0, () => `size(${size}) is not multiple of 4`);\n assert(srcOffset % 4 === 0, () => `srcOffset(${srcOffset}) is not multiple of 4`);\n assert(dstOffset % 4 === 0, () => `dstOffset(${dstOffset}) is not multiple of 4`);\n});\n\nfunction validateImageCopyBuffer(icb: GPUImageCopyBuffer) {\n assertNotDestroyed(icb.buffer);\n const bytesPerRow = icb.bytesPerRow || 0;\n assert(bytesPerRow % 256 === 0, () => `src.bytesPerRow(${bytesPerRow}) not multiple of 256`, [icb.buffer]);\n}\n\nfunction validateImageCopyTexture(ict: GPUImageCopyTexture, copySize: GPUExtent3D) {\n assertNotDestroyed(ict.texture);\n\n const formatInfo = kAllTextureFormatInfo[ict.texture.format];\n const {\n blockWidth,\n blockHeight,\n } = formatInfo;\n\n const mipLevel = ict.mipLevel || 0;\n const [origX, origY] = reifyGPUOrigin3D(ict.origin);\n assert(mipLevel < ict.texture.mipLevelCount, () => `mipLevel(${mipLevel}) must be less than texture.mipLevelCount(${ict.texture.mipLevelCount})`, [ict.texture]);\n assert(origX % blockWidth === 0, () => `origin.x(${origX}) not multiple of blockWidth(${blockWidth})`, [ict.texture]);\n assert(origY % blockHeight === 0, () => `origin.y(${origY}) not multiple of blockHeight(${blockHeight})`, [ict.texture]);\n\n const [copyWidth, copyHeight, copyDepthOrArrayLayers] = reifyGPUExtent3D(copySize);\n\n if (formatInfo.depth && formatInfo.stencil && ict.texture.sampleCount > 1) {\n const [w, h, d] = physicalMipLevelSpecificTextureExtent(ict.texture, mipLevel);\n assert(copyWidth === w &&\n copyHeight === h &&\n copyDepthOrArrayLayers === d, 'copySize must match textureSize for depth-stencil textures', [ict.texture]);\n }\n}\n\nfunction validateTextureCopyRange(ict: GPUImageCopyTexture, copySize: GPUExtent3D) {\n const formatInfo = kAllTextureFormatInfo[ict.texture.format];\n const {\n blockWidth,\n blockHeight,\n } = formatInfo;\n const mipLevel = ict.mipLevel || 0;\n const [origX, origY, origZ] = reifyGPUOrigin3D(ict.origin);\n const [copyWidth, copyHeight, copyDepthOrArrayLayers] = reifyGPUExtent3D(copySize);\n const [w, h, d] = physicalMipLevelSpecificTextureExtent(ict.texture, mipLevel);\n\n const res = [ict.texture];\n assert(origX + copyWidth <= w, () => `origin.x(${origX}) + copySize.width(${copyWidth}) is > physical width(${w}) of mipLevel(${mipLevel})`, res);\n assert(origY + copyHeight <= h, () => `origin.y(${origY}) + copySize.height(${copyHeight}) is > physical height(${h}) of mipLevel(${mipLevel})`, res);\n assert(origZ + copyDepthOrArrayLayers <= d, () => `origin.z(${origZ}) + copySize.depthOrArrayBuffers(${copyDepthOrArrayLayers}) is > texture.depthOrArrayLayers(${d}) of mipLevel(${mipLevel})`, res);\n assert(copyWidth % blockWidth === 0, () => `copySize.width(${copyWidth}) is not multiple of blockWidth(${blockWidth})`, res);\n assert(copyHeight % blockHeight === 0, () => `copySize.height(${copyHeight}) is not multiple of blockHeight(${blockHeight})`, res);\n}\n\nfunction validateLinearTextureData(idl: GPUImageDataLayout, byteSize: number, format: GPUTextureFormat, copyExtent: GPUExtent3D) {\n const formatInfo = kAllTextureFormatInfo[format];\n const [copyWidth, copyHeight, copyDepthOrArrayLayers] = reifyGPUExtent3D(copyExtent);\n const { blockWidth, blockHeight } = formatInfo;\n const widthInBlocks = copyWidth / blockWidth;\n const heightInBlocks = copyHeight / blockHeight;\n const bytesInLastRow = widthInBlocks * formatInfo.bytesPerBlock!;\n\n assert(widthInBlocks % 1 === 0, () => `width(${copyWidth}) must be multiple of blockWidth${blockWidth}`);\n assert(heightInBlocks % 1 === 0, () => `height(${copyHeight}) must be multiple of blockHeight${blockHeight}`);\n if (heightInBlocks > 1) {\n assert(idl.bytesPerRow !== undefined, () => `bytesPerRow must be set if heightInBlocks(${heightInBlocks}) > 1`);\n }\n\n if (copyDepthOrArrayLayers > 1) {\n assert(idl.bytesPerRow !== undefined, () => `bytesPerRow must be set if copySize.depthOrArrayLayers(${copyDepthOrArrayLayers}) > 1`);\n }\n if (copyDepthOrArrayLayers > 1) {\n assert(idl.rowsPerImage !== undefined, () => `rowsPerImage must be set if copySize.depthOrArrayLayers(${copyDepthOrArrayLayers}) > 1`);\n }\n if (idl.bytesPerRow !== undefined) {\n assert(idl.bytesPerRow >= bytesInLastRow, () => `bytesPerRow(${idl.bytesPerRow}) must be >= bytes in the last row(${bytesInLastRow})`);\n }\n if (idl.rowsPerImage !== undefined) {\n assert(idl.rowsPerImage >= heightInBlocks, () => `rowsPerImage(${idl.rowsPerImage}) must be >= heightInBlocks(${heightInBlocks})`);\n }\n\n const bytesPerRow = idl.bytesPerRow ?? 0;\n const rowsPerImage = idl.rowsPerImage ?? 0;\n let requiredBytesInCopy = 0;\n if (copyDepthOrArrayLayers > 0) {\n // all layers except the last one\n requiredBytesInCopy += bytesPerRow * rowsPerImage * (copyDepthOrArrayLayers - 1);\n if (heightInBlocks > 0) {\n // last layer = all rows padded + last row\n requiredBytesInCopy += bytesPerRow * (heightInBlocks - 1) + bytesInLastRow;\n }\n }\n const offset = idl.offset ?? 0;\n assert(offset + requiredBytesInCopy <= byteSize, () => `offset(${offset}) + requiredBytesInCopy(${requiredBytesInCopy}) must be <= buffer.size(${byteSize})`);\n}\n\nfunction validateB2TorT2BCopy(encoder: GPUCommandEncoder, buf: GPUImageCopyBuffer, tex: GPUImageCopyTexture, copySize: GPUExtent3D, bufferIsSource: boolean) {\n const device = s_objToDevice.get(encoder);\n assert(device === s_objToDevice.get(buf.buffer), 'buffer is not from same device as commandEncoder', [buf.buffer, encoder]);\n assert(device === s_objToDevice.get(tex.texture), 'texture is not from same device as commandEncoder', [tex.texture, encoder]);\n\n validateImageCopyBuffer(buf);\n const [bufRequiredUsage, texRequiredUsage]: [keyof typeof GPUBufferUsage, keyof typeof GPUTextureUsage] = bufferIsSource\n ? ['COPY_SRC', 'COPY_DST']\n : ['COPY_DST', 'COPY_SRC'];\n assert(!!(buf.buffer.usage & GPUBufferUsage[bufRequiredUsage]), () => `src.usage(${bufferUsageToString(buf.buffer.usage)} missing ${bufRequiredUsage})`, [buf.buffer]);\n\n validateImageCopyTexture(tex, copySize);\n\n const formatInfo = kAllTextureFormatInfo[tex.texture.format];\n\n assert(!!(tex.texture.usage & GPUTextureUsage[texRequiredUsage]), () => `dst.texture.usage(${textureUsageToString(tex.texture.usage)} missing ${texRequiredUsage})`, [tex.texture]);\n assert(tex.texture.sampleCount === 1, 'sampleCount must be 1', [tex.texture]);\n\n let aspectSpecificFormat = tex.texture.format;\n const isDepthOrStencil = formatInfo.depth || formatInfo.stencil;\n if (isDepthOrStencil) {\n if (!formatInfo.stencil) {\n assert(tex.aspect !== 'stencil-only', 'can not use stencil-only aspect on non stencil texture', [tex.texture]);\n }\n if (!formatInfo.depth) {\n assert(tex.aspect !== 'depth-only', 'can not use depth-only aspect on non depth texture', [tex.texture]);\n }\n assert(tex.aspect === 'depth-only' || tex.aspect === 'stencil-only', 'must use one aspect');\n const aspect = tex.aspect === 'depth-only' ? 'depth' : 'stencil';\n const info = formatInfo[aspect];\n assert(!!info?.copyDst, `can not copy to ${tex.aspect} of texture of format(${tex.texture.format})`, [tex.texture]);\n\n if (aspectSpecificFormat === 'depth24plus-stencil8') {\n aspectSpecificFormat = tex.aspect === 'depth-only'\n ? 'depth24plus'\n : 'stencil8';\n } else if (aspectSpecificFormat === 'depth32float-stencil8') {\n aspectSpecificFormat = tex.aspect === 'depth-only'\n ? 'depth32float'\n : 'stencil8';\n }\n }\n\n validateTextureCopyRange(tex, copySize);\n\n const srcOffset = buf.offset || 0;\n if (!isDepthOrStencil) {\n const texelCopyBlockFootPrint = formatInfo.bytesPerBlock!;\n assert(srcOffset % texelCopyBlockFootPrint === 0, () => `src.offset(${srcOffset}) must multiple of blockSize(${texelCopyBlockFootPrint})`);\n } else {\n assert(srcOffset % 4 === 0, () => `src.offset(${srcOffset}) must by multiple of 4 for depth and/or stencil textures`);\n }\n\n validateLinearTextureData(buf, buf.buffer.size, aspectSpecificFormat, copySize);\n}\n\nfunction isCopyCompatible(format1: GPUTextureFormat, format2: GPUTextureFormat) {\n return format1.replace('-srgb', '') === format2.replace('-srgb', '');\n}\n\nfunction isIntersectingAxis(v1: number, v2: number, size: number) {\n const distance = Math.abs(v2 - v1);\n const gap = distance - size;\n return gap < 0;\n}\n\nwrapFunctionBefore(GPUCommandEncoder, 'copyBufferToTexture', function (this: GPUCommandEncoder, [src, dst, copySize]) {\n getCommandBufferInfoAndValidateState(this);\n validateB2TorT2BCopy(this, src, dst, copySize, true);\n});\n\nwrapFunctionBefore(GPUCommandEncoder, 'copyTextureToBuffer', function (this: GPUCommandEncoder, [src, dst, copySize]) {\n getCommandBufferInfoAndValidateState(this);\n validateB2TorT2BCopy(this, dst, src, copySize, false);\n});\n\nwrapFunctionBefore(GPUCommandEncoder, 'copyTextureToTexture', function (this: GPUCommandEncoder, [src, dst, copySize]) {\n getCommandBufferInfoAndValidateState(this);\n\n const device = s_objToDevice.get(this);\n assert(device === s_objToDevice.get(src.texture), 'src.texture is not from same device as commandEncoder', [src, this]);\n assert(device === s_objToDevice.get(dst.texture), 'dst.texture is not from same device as commandEncoder', [dst, this]);\n\n validateImageCopyTexture(src, copySize);\n assert(!!(src.texture.usage & GPUTextureUsage.COPY_SRC), () => `src.texture.usage(${textureUsageToString(src.texture.usage)} missing COPY_SRC`, [src.texture]);\n\n validateImageCopyTexture(dst, copySize);\n assert(!!(dst.texture.usage & GPUTextureUsage.COPY_DST), () => `src.texture.usage(${textureUsageToString(dst.texture.usage)} missing COPY_DST`, [dst.texture]);\n\n assert(src.texture.sampleCount === dst.texture.sampleCount, () => `src.texture.sampleCount(${src.texture.sampleCount}) must equal dst.texture.sampleCount(${dst.texture.sampleCount})`, [src.texture, dst.texture]);\n assert(isCopyCompatible(src.texture.format, dst.texture.format), () => `src.texture.format(${src.texture.format}) must be copy compatible with dst.texture.format(${dst.texture.format})`, [src.texture, dst.texture]);\n\n const formatInfo = kAllTextureFormatInfo[src.texture.format];\n const isDepthStencil = !!formatInfo.depth && !!formatInfo.stencil;\n if (isDepthStencil) {\n assert(src.aspect === 'all', () => `src.aspect must be 'all' when format(${src.texture.format}) is a depth-stencil format`, [src.texture]);\n assert(dst.aspect === 'all', () => `dst.aspect must be 'all' when format(${dst.texture.format}) is a depth-stencil format`, [dst.texture]);\n }\n\n validateTextureCopyRange(src, copySize);\n validateTextureCopyRange(dst, copySize);\n\n if (src.texture === dst.texture) {\n const srcOrigin = reifyGPUOrigin3D(src.origin);\n const dstOrigin = reifyGPUOrigin3D(dst.origin);\n const size = reifyGPUExtent3D(copySize);\n assert(\n !isIntersectingAxis(srcOrigin[0], dstOrigin[0], size[0]) &&\n !isIntersectingAxis(srcOrigin[1], dstOrigin[1], size[1]) &&\n !isIntersectingAxis(srcOrigin[2], dstOrigin[2], size[2]),\n () => `when src and dst textures are the same texture, copy boxes must not overlap`, [src.texture, dst.texture]);\n }\n});\n\nwrapFunctionBefore(GPUCommandEncoder, 'clearBuffer', function (this: GPUCommandEncoder, [buffer, offset, size]) {\n getCommandBufferInfoAndValidateState(this);\n assertNotDestroyed(buffer);\n offset = offset ?? 0;\n size = size ?? buffer.size - offset;\n assert(s_objToDevice.get(this) === s_objToDevice.get(buffer), 'buffer not from same device as encoder', [buffer, this]);\n assert(!!(buffer.usage & GPUBufferUsage.COPY_DST), () => `buffer.usage(${bufferUsageToString(buffer.usage)}) must have COPY_DST`, [buffer]);\n assert(size % 4 === 0, () => `size(${size}) must be multiple of 4`);\n assert(offset % 4 === 0, () => `offset(${offset}) must be multiple of 4`);\n assert(offset + size <= buffer.size, () => `offset(${offset}) + size(${size}) must be <= buffer.size(${buffer.size})`);\n});\n\nwrapFunctionBefore(GPUCommandEncoder, 'resolveQuerySet', function (this: GPUCommandEncoder, [querySet, firstQuery, queryCount, destination, destinationOffset]) {\n getCommandBufferInfoAndValidateState(this);\n assertNotDestroyed(querySet);\n assertNotDestroyed(destination);\n const device = s_objToDevice.get(this);\n assert(s_objToDevice.get(querySet) === device, 'querySet not from same device', [querySet]);\n assert(s_objToDevice.get(destination) === device, 'destination buffer not from same device', [destination]);\n assert((destination.usage & GPUBufferUsage.QUERY_RESOLVE) !== 0, () => `destination.usage(${bufferUsageToString(destination.usage)} does not contain QUERY_RESOLVE)`, [destination]);\n assert(firstQuery < querySet.count, () => `firstQuery(${firstQuery}) out of range for querySet.count(${querySet.count})`);\n assert(firstQuery + queryCount <= querySet.count, () => `firstQuery(${firstQuery}) + queryCount(${queryCount}) > querySet.count(${querySet.count})`);\n assert(destinationOffset % 256 === 0, () => `destinationOffset(${destinationOffset}) is not multiple of 256`);\n assert(destinationOffset + queryCount * 8 <= destination.size, () => `destinationOffset(${destinationOffset}) + queryCount(${queryCount}) * 8 > destination.size(${destination.size})`);\n});","import './error-scope-wrapper.js';\nimport './device.js';\nimport './canvas-context.js';\nimport './command-encoder.js';\nimport './compute-pass-encoder.js';\nimport './render-pass-encoder.js';\nimport './render-bundle-encoder.js';\nimport './texture.js';\n\nconsole.log('webgpu-debug-helper running');"],"names":["assert","getRenderPassLayout"],"mappings":"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","x_google_ignoreList":[2]} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 2c986b1..1f2f68d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "webgpu-debug-helper", - "version": "0.1.2", + "version": "0.1.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "webgpu-debug-helper", - "version": "0.1.2", + "version": "0.1.4", "license": "MIT", "dependencies": { "webgpu-utils": "^1.8.2" @@ -15,18 +15,20 @@ "@rollup/plugin-node-resolve": "^15.2.3", "@rollup/plugin-typescript": "^11.1.6", "@tsconfig/recommended": "^1.0.6", + "@types/node": "20.0.0", "@typescript-eslint/eslint-plugin": "^7.13.0", "@typescript-eslint/parser": "^7.13.0", "@webgpu/types": "^0.1.42", + "commander": "^12.1.0", "eslint": "^8.57.0", - "eslint-plugin-html": "^7.1.0", + "eslint-plugin-html": "^8.1.1", "eslint-plugin-one-variable-per-var": "^0.0.3", "eslint-plugin-optional-comma-spacing": "^0.0.4", "eslint-plugin-require-trailing-comma": "^0.0.1", "express": "^4.19.2", "markdown-it": "^13.0.2", "mocha": "^10.4.0", - "puppeteer": "^22.10.0", + "puppeteer": "^22.12.1", "rollup": "^4.18.0", "servez": "^2.1.6", "tslib": "^2.6.3", @@ -709,13 +711,10 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.14.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.2.tgz", - "integrity": "sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" - } + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.0.0.tgz", + "integrity": "sha512-cD2uPTDnQQCVpmRefonO98/PPijuOnnEy5oytWJFPY1N9aJCz2wJ5kSGWO+zJoed2cY2JxQh6yBuUq4vIn61hw==", + "dev": true }, "node_modules/@types/node-forge": { "version": "1.3.11", @@ -1099,9 +1098,9 @@ "dev": true }, "node_modules/bare-events": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.3.1.tgz", - "integrity": "sha512-sJnSOTVESURZ61XgEleqmP255T6zTYwHPwE4r6SssIh0U9/uDvfpdoJYpVUerJJZH2fueO+CdT8ZT+OC/7aZDA==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.4.2.tgz", + "integrity": "sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==", "dev": true, "optional": true }, @@ -1118,9 +1117,9 @@ } }, "node_modules/bare-os": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.3.0.tgz", - "integrity": "sha512-oPb8oMM1xZbhRQBngTgpcQ5gXw6kjOaRsSWsIeNyRxGed2w/ARyP7ScBYpWR1qfX2E5rS3gBw6OWcSQo+s+kUg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.0.tgz", + "integrity": "sha512-v8DTT08AS/G0F9xrhyLtepoo9EJBJ85FRSMbu1pQUlAf6A8T0tEEQGMVObWeqpjhSPXsE0VGlluFBJu2fdoTNg==", "dev": true, "optional": true }, @@ -1135,9 +1134,9 @@ } }, "node_modules/bare-stream": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.1.2.tgz", - "integrity": "sha512-az/7TFOh4Gk9Tqs1/xMFq5FuFoeZ9hZ3orsM2x69u8NXVUDXZnpdhG8mZY/Pv6DF954MGn+iIt4rFrG34eQsvg==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.1.3.tgz", + "integrity": "sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ==", "dev": true, "optional": true, "dependencies": { @@ -1425,14 +1424,14 @@ } }, "node_modules/chromium-bidi": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.5.19.tgz", - "integrity": "sha512-UA6zL77b7RYCjJkZBsZ0wlvCTD+jTjllZ8f6wdO4buevXgTZYjV+XLB9CiEa2OuuTGGTLnI7eN9I60YxuALGQg==", + "version": "0.5.24", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.5.24.tgz", + "integrity": "sha512-5xQNN2SVBdZv4TxeMLaI+PelrnZsHDhn8h2JtyriLr+0qHcZS8BMuo93qN6J1VmtmrgYP+rmcLHcbpnA8QJh+w==", "dev": true, "dependencies": { "mitt": "3.0.1", "urlpattern-polyfill": "10.0.0", - "zod": "3.22.4" + "zod": "3.23.8" }, "peerDependencies": { "devtools-protocol": "*" @@ -1477,12 +1476,12 @@ } }, "node_modules/commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/concat-map": { @@ -1684,9 +1683,9 @@ } }, "node_modules/devtools-protocol": { - "version": "0.0.1286932", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1286932.tgz", - "integrity": "sha512-wu58HMQll9voDjR4NlPyoDEw1syfzaBNHymMMZ/QOXiHRNluOnDgu9hp1yHOKYoMlxCh4lSSiugLITe6Fvu1eA==", + "version": "0.0.1299070", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1299070.tgz", + "integrity": "sha512-+qtL3eX50qsJ7c+qVyagqi7AWMoQCBGNfoyJZMwm/NSXVqLYbuitrWEEIzxfUmTNy7//Xe8yhMmQ+elj3uAqSg==", "dev": true }, "node_modules/diff": { @@ -1962,12 +1961,15 @@ } }, "node_modules/eslint-plugin-html": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-7.1.0.tgz", - "integrity": "sha512-fNLRraV/e6j8e3XYOC9xgND4j+U7b1Rq+OygMlLcMg+wI/IpVbF+ubQa3R78EjKB9njT6TQOlcK5rFKBVVtdfg==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-8.1.1.tgz", + "integrity": "sha512-6qmlJsc40D2m3Dn9oEH+0PAOkJhxVu0f5sVItqpCE0YWgYnyP4xCjBc3UWTHaJcY9ARkWOLIIuXLq0ndRnQOHw==", "dev": true, "dependencies": { - "htmlparser2": "^8.0.1" + "htmlparser2": "^9.1.0" + }, + "engines": { + "node": ">=16.0.0" } }, "node_modules/eslint-plugin-one-variable-per-var": { @@ -2671,9 +2673,9 @@ } }, "node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", + "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", "dev": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", @@ -2685,8 +2687,8 @@ "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" + "domutils": "^3.1.0", + "entities": "^4.5.0" } }, "node_modules/http-errors": { @@ -2719,9 +2721,9 @@ } }, "node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", "dev": true, "dependencies": { "agent-base": "^7.0.2", @@ -3474,9 +3476,9 @@ } }, "node_modules/pac-proxy-agent": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", - "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.2.tgz", + "integrity": "sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==", "dev": true, "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", @@ -3484,9 +3486,9 @@ "debug": "^4.3.4", "get-uri": "^6.0.1", "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.2", - "pac-resolver": "^7.0.0", - "socks-proxy-agent": "^8.0.2" + "https-proxy-agent": "^7.0.5", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.4" }, "engines": { "node": ">= 14" @@ -3692,16 +3694,16 @@ } }, "node_modules/puppeteer": { - "version": "22.10.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-22.10.0.tgz", - "integrity": "sha512-ZOkZd6a6t0BdKcWb0wAYHWQqCfdlN1PPnXOmg/XNrbo6gJhYWFX4qCNb6ahSn8TpAqBqLCoD4Q010F7GwOM7mA==", + "version": "22.12.1", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-22.12.1.tgz", + "integrity": "sha512-1GxY8dnEnHr1SLzdSDr0FCjM6JQfAh2E2I/EqzeF8a58DbGVk9oVjj4lFdqNoVbpgFSpAbz7VER9St7S1wDpNg==", "dev": true, "hasInstallScript": true, "dependencies": { "@puppeteer/browsers": "2.2.3", - "cosmiconfig": "9.0.0", - "devtools-protocol": "0.0.1286932", - "puppeteer-core": "22.10.0" + "cosmiconfig": "^9.0.0", + "devtools-protocol": "0.0.1299070", + "puppeteer-core": "22.12.1" }, "bin": { "puppeteer": "lib/esm/puppeteer/node/cli.js" @@ -3711,21 +3713,38 @@ } }, "node_modules/puppeteer-core": { - "version": "22.10.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-22.10.0.tgz", - "integrity": "sha512-I54J4Vy4I07UHsgB1QSmuFoF7KNQjJWcvFBPhtY+ezMdBfwgGDr8dzYrJa11aPgP9kxIUHjhktcMmmfJkOAtTw==", + "version": "22.12.1", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-22.12.1.tgz", + "integrity": "sha512-XmqeDPVdC5/3nGJys1jbgeoZ02wP0WV1GBlPtr/ULRbGXJFuqgXMcKQ3eeNtFpBzGRbpeoCGWHge1ZWKWl0Exw==", "dev": true, "dependencies": { "@puppeteer/browsers": "2.2.3", - "chromium-bidi": "0.5.19", - "debug": "4.3.4", - "devtools-protocol": "0.0.1286932", - "ws": "8.17.0" + "chromium-bidi": "0.5.24", + "debug": "^4.3.5", + "devtools-protocol": "0.0.1299070", + "ws": "^8.17.1" }, "engines": { "node": ">=18" } }, + "node_modules/puppeteer-core/node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", @@ -4204,6 +4223,15 @@ "server-destroy": "^1.0.1" } }, + "node_modules/servez/node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -4312,14 +4340,14 @@ } }, "node_modules/socks-proxy-agent": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz", - "integrity": "sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", + "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", "dev": true, "dependencies": { "agent-base": "^7.1.1", "debug": "^4.3.4", - "socks": "^2.7.1" + "socks": "^2.8.3" }, "engines": { "node": ">= 14" @@ -4598,12 +4626,6 @@ "through": "^2.3.8" } }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", @@ -4717,9 +4739,9 @@ "dev": true }, "node_modules/ws": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", - "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "dev": true, "engines": { "node": ">=10.0.0" @@ -4817,9 +4839,9 @@ } }, "node_modules/zod": { - "version": "3.22.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", - "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", "dev": true, "funding": { "url": "https://github.com/sponsors/colinhacks" diff --git a/package.json b/package.json index 736e579..f917556 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "webgpu-debug-helper", - "version": "0.1.2", + "version": "0.1.4", "description": "webgpu debug helper", "main": "dist/0.x/webgpu-debug-helper.js", "type": "module", @@ -17,7 +17,9 @@ "pre-push": "npm run lint && npm run build && npm run test", "watch": "rollup -c -w", "start": "node build/tools/serve.js", - "test": "node test/puppeteer.js" + "test": "node test/puppeteer.js", + "test-threejs": "node test/puppeteer.js --threejs", + "test-webgpu-samples": "node test/puppeteer.js --webgpu-samples" }, "repository": { "type": "git", @@ -42,18 +44,20 @@ "@rollup/plugin-node-resolve": "^15.2.3", "@rollup/plugin-typescript": "^11.1.6", "@tsconfig/recommended": "^1.0.6", + "@types/node": "20.0.0", "@typescript-eslint/eslint-plugin": "^7.13.0", "@typescript-eslint/parser": "^7.13.0", "@webgpu/types": "^0.1.42", + "commander": "^12.1.0", "eslint": "^8.57.0", - "eslint-plugin-html": "^7.1.0", + "eslint-plugin-html": "^8.1.1", "eslint-plugin-one-variable-per-var": "^0.0.3", "eslint-plugin-optional-comma-spacing": "^0.0.4", "eslint-plugin-require-trailing-comma": "^0.0.1", "express": "^4.19.2", "markdown-it": "^13.0.2", "mocha": "^10.4.0", - "puppeteer": "^22.10.0", + "puppeteer": "^22.12.1", "rollup": "^4.18.0", "servez": "^2.1.6", "tslib": "^2.6.3", diff --git a/rollup.config.js b/rollup.config.js index e8e8e5a..8cb8011 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -27,4 +27,17 @@ export default [ ], plugins, }, + { + input: `src/error-scope-wrapper.ts`, + output: [ + { + file: `show-errors/show-errors.js`, + format: 'umd', + sourcemap: false, + freeze: false, + banner: `/* show-errors@${pkg.version}, license MIT */`, + }, + ], + plugins, + }, ]; diff --git a/show-errors/show-errors.js b/show-errors/show-errors.js new file mode 100644 index 0000000..2eeff38 --- /dev/null +++ b/show-errors/show-errors.js @@ -0,0 +1,113 @@ +/* show-errors@0.1.4, license MIT */ +(function (factory) { + typeof define === 'function' && define.amd ? define(factory) : + factory(); +})((function () { 'use strict'; + + const s_objToDevice = new WeakMap(); + + /* eslint-disable no-inner-declarations */ + if (typeof GPUDevice !== 'undefined') { + const deviceToErrorScopeStack = new WeakMap(); + const origPushErrorScope = GPUDevice.prototype.pushErrorScope; + const origPopErrorScope = GPUDevice.prototype.popErrorScope; + function errorWrapper(device, fnName, origFn, ...args) { + const stack = new Error(); + origPushErrorScope.call(device, 'validation'); + const result = origFn.call(this, ...args); + const errorScopeStack = deviceToErrorScopeStack.get(device); + const currentErrorScope = errorScopeStack.findLast(scope => scope.filter === 'validation'); + const promise = origPopErrorScope.call(device) + .then(error => { + // If there was a currentErrorScope when we added pushed then remove our promise + if (currentErrorScope) { + const ndx = currentErrorScope.errors.indexOf(promise); + if (ndx) { + currentErrorScope.errors.splice(ndx, 1); + } + } + else { + // there was no currentErrorScope so emit the error + if (error) { + device.dispatchEvent(new GPUUncapturedErrorEvent('uncapturederror', { error })); + } + } + // show it + if (error) { + console.error('WebGPU ERROR in:', fnName, args); + console.error(error.message); + console.error(stack.stack); + } + // return it (as a promise) + return error; + }); + if (currentErrorScope) { + currentErrorScope.errors.push(promise); + } + return result; + } + function addErrorWrapper(api, fnName) { + const origFn = api.prototype[fnName]; + api.prototype[fnName] = function (...args) { + return errorWrapper.call(this, this, fnName.toString(), origFn, ...args); + }; + } + function addErrorWrapperWithDevice(api, fnName) { + const origFn = api.prototype[fnName]; + api.prototype[fnName] = function (...args) { + const device = s_objToDevice.get(this); + return errorWrapper.call(this, device, fnName.toString(), origFn, ...args); + }; + } + /** + * given a class returns all the method names. + */ + function getAPIFunctionNames(api) { + return Object.entries(Object.getOwnPropertyDescriptors(api.prototype)) + .filter(([, info]) => info.enumerable && typeof info.value === 'function') + .map(([name]) => name); + } + const skip = new Set([ + 'pushErrorScope', + 'popErrorScope', + 'destroy', + ]); + getAPIFunctionNames(GPUDevice) + .filter(n => !skip.has(n)) + .forEach(n => addErrorWrapper(GPUDevice, n)); + getAPIFunctionNames(GPUQueue) + .forEach(n => addErrorWrapperWithDevice(GPUQueue, n)); + GPUDevice.prototype.pushErrorScope = (function (origFn) { + return function (filter) { + origFn.call(this, filter); + const errorScopeStack = deviceToErrorScopeStack.get(this); + errorScopeStack.push({ filter, errors: [] }); + }; + })(GPUDevice.prototype.pushErrorScope); + GPUDevice.prototype.popErrorScope = (function (origFn) { + return async function () { + const errorScopeStack = deviceToErrorScopeStack.get(this); + const errorScope = errorScopeStack.pop(); + if (errorScope === undefined) { + throw new DOMException('popErrorScope called on empty error scope stack', 'OperationError'); + } + const errPromise = origFn.call(this); + return errorScope.errors.pop() ?? errPromise; + }; + })(GPUDevice.prototype.popErrorScope); + GPUAdapter.prototype.requestDevice = (function (origFn) { + return async function (...args) { + const device = await origFn.call(this, ...args); + if (device) { + device.addEventListener('uncapturederror', function (e) { + console.error(e.error.message); + }); + deviceToErrorScopeStack.set(device, []); + s_objToDevice.set(device.queue, device); + } + return device; + }; + })(GPUAdapter.prototype.requestDevice); + } + +})); diff --git a/src/binding-mixin.ts b/src/binding-mixin.ts index 213e86c..11690fa 100644 --- a/src/binding-mixin.ts +++ b/src/binding-mixin.ts @@ -147,7 +147,7 @@ function boundBufferRanges(info: BindGroupInfo, dynamicOffsets: Uint32Array) { const result = new Map(); let dynamicOffsetIndex = 0; for (const bindGroupEntry of info.entries) { - const bindGroupLayoutEntry = info.layoutPlus.bindGroupLayoutDescriptor.entries[bindGroupEntry.binding]; + const bindGroupLayoutEntry = info.layoutPlus.entriesById[bindGroupEntry.binding]; if (!bindGroupLayoutEntry.buffer) { continue; } @@ -274,9 +274,8 @@ export function encoderBindGroupsAliasAWritableResource( function* forEachDynamicBinding(info: BindGroupInfo) { let dynamicOffsetIndex = 0; - const layout = info.layoutPlus.bindGroupLayoutDescriptor; for (const entry of info.entries) { - const bindingDescriptor = layout.entries[entry.binding]; + const bindingDescriptor = info.layoutPlus.entriesById[entry.binding]; if (bindingDescriptor.buffer?.hasDynamicOffset) { const bufferBinding = entry.resource as GPUBufferBinding; const bufferLayout = bindingDescriptor.buffer; diff --git a/src/device.ts b/src/device.ts index c231b9b..9bd6ab1 100644 --- a/src/device.ts +++ b/src/device.ts @@ -101,12 +101,14 @@ function bindGroupLayoutDescriptorToBindGroupLayoutDescriptorPlus( src: GPUBindGroupLayoutDescriptor, autoId: number): BindGroupLayoutDescriptorPlus { const bindGroupLayoutDescriptor = { - entries: [...src.entries].map(reifyBindGroupLayoutEntry).sort((a, b) => a.binding - b.binding), + entries: [...src.entries].map(reifyBindGroupLayoutEntry), }; + const entriesById = Object.fromEntries(bindGroupLayoutDescriptor.entries.map(e => [e.binding, e])); const dynamicOffsetCount = bindGroupLayoutDescriptor.entries.reduce((a, v) => a + (v.buffer?.hasDynamicOffset ? 1 : 0), 0); const signature = `${JSON.stringify(bindGroupLayoutDescriptor)}${autoId ? `:autoId(${autoId})` : ''})`; return { bindGroupLayoutDescriptor, + entriesById, dynamicOffsetCount, signature, }; diff --git a/src/error-scope-wrapper.ts b/src/error-scope-wrapper.ts index f670ca3..4d25a00 100644 --- a/src/error-scope-wrapper.ts +++ b/src/error-scope-wrapper.ts @@ -1,134 +1,123 @@ +/* eslint-disable no-inner-declarations */ import { s_objToDevice -} from './shared-state.js'; - -const deviceToErrorScopeStack: WeakMap[]}[]> = new WeakMap(); -const origPushErrorScope = GPUDevice.prototype.pushErrorScope; -const origPopErrorScope = GPUDevice.prototype.popErrorScope; - -/* -function getFilterForGPUError(error: GPUError): GPUErrorFilter { - if (error instanceof GPUValidationError) { - return 'validation'; - } - if (error instanceof GPUOutOfMemoryError) { - return 'out-of-memory'; - } - if (error instanceof GPUInternalError) { - return 'internal'; - } - throw new Error('unknown GPUError type'); -} -*/ - -type AnyFunction = (...args: any[]) => any; - -function errorWrapper(this: any, device: GPUDevice, fnName: string, origFn: T, ...args: Parameters): ReturnType { - const stack = new Error(); - origPushErrorScope.call(device, 'validation'); - const result = origFn.call(this, ...args); - - const errorScopeStack = deviceToErrorScopeStack.get(device)!; - const currentErrorScope = errorScopeStack.findLast(scope => scope.filter === 'validation'); - - const promise = origPopErrorScope.call(device) - .then(error => { - // If there was a currentErrorScope when we added pushed then remove our promise - if (currentErrorScope) { - const ndx = currentErrorScope.errors.indexOf(promise); - if (ndx) { - currentErrorScope.errors.splice(ndx, 1); +} from './object-to-device.js'; + +if (typeof GPUDevice !== 'undefined') { + + const deviceToErrorScopeStack: WeakMap[]}[]> = new WeakMap(); + const origPushErrorScope = GPUDevice.prototype.pushErrorScope; + const origPopErrorScope = GPUDevice.prototype.popErrorScope; + + type AnyFunction = (...args: any[]) => any; + + function errorWrapper(this: any, device: GPUDevice, fnName: string, origFn: T, ...args: Parameters): ReturnType { + const stack = new Error(); + origPushErrorScope.call(device, 'validation'); + const result = origFn.call(this, ...args); + + const errorScopeStack = deviceToErrorScopeStack.get(device)!; + const currentErrorScope = errorScopeStack.findLast(scope => scope.filter === 'validation'); + + const promise = origPopErrorScope.call(device) + .then(error => { + // If there was a currentErrorScope when we added pushed then remove our promise + if (currentErrorScope) { + const ndx = currentErrorScope.errors.indexOf(promise); + if (ndx) { + currentErrorScope.errors.splice(ndx, 1); + } + } else { + // there was no currentErrorScope so emit the error + if (error) { + device.dispatchEvent(new GPUUncapturedErrorEvent('uncapturederror', { error })); + } } - } else { - // there was no currentErrorScope so emit the error + + // show it if (error) { - device.dispatchEvent(new GPUUncapturedErrorEvent('uncapturederror', { error })); + console.error('WebGPU ERROR in:', fnName, args); + console.error(error.message); + console.error(stack.stack); } - } - // show it - if (error) { - console.error('WebGPU ERROR in:', fnName, args); - console.error(error.message); - console.error(stack.stack); - } + // return it (as a promise) + return error; + }); - // return it (as a promise) - return error; - }); + if (currentErrorScope) { + currentErrorScope.errors.push(promise); + } + return result; + } - if (currentErrorScope) { - currentErrorScope.errors.push(promise); + function addErrorWrapper(api: T, fnName: keyof T['prototype'] & PropertyKey): void { + const origFn = api.prototype[fnName] as AnyFunction; + api.prototype[fnName] = function (this: any, ...args: any[]) { + return errorWrapper.call(this, this, fnName.toString(), origFn, ...args); + }; } - return result; -} - -function addErrorWrapper(api: T, fnName: keyof T['prototype'] & PropertyKey): void { - const origFn = api.prototype[fnName] as AnyFunction; - api.prototype[fnName] = function (this: any, ...args: any[]) { - return errorWrapper.call(this, this, fnName.toString(), origFn, ...args); - }; -} - -function addErrorWrapperWithDevice(api: T, fnName: keyof T['prototype'] & PropertyKey): void { - const origFn = api.prototype[fnName] as AnyFunction; - api.prototype[fnName] = function (this: any, ...args: any[]) { - const device = s_objToDevice.get(this as GPUQueue)!; - return errorWrapper.call(this, device, fnName.toString(), origFn, ...args); - }; -} - -/** - * given a class returns all the method names. - */ -function getAPIFunctionNames(api: T) { - return Object.entries(Object.getOwnPropertyDescriptors(api.prototype)) - .filter(([, info]) => info.enumerable && typeof info.value === 'function') - .map(([name]) => name as keyof T['prototype'] & PropertyKey); -} - -const skip = new Set([ - 'pushErrorScope', - 'popErrorScope', - 'destroy', -]); -getAPIFunctionNames(GPUDevice) - .filter(n => !skip.has(n)) - .forEach(n => addErrorWrapper(GPUDevice, n)); -getAPIFunctionNames(GPUQueue) - .forEach(n => addErrorWrapperWithDevice(GPUQueue, n)); - -GPUDevice.prototype.pushErrorScope = (function (origFn) { - return function (this: GPUDevice, filter: GPUErrorFilter) { - origFn.call(this, filter); - const errorScopeStack = deviceToErrorScopeStack.get(this); - errorScopeStack!.push({filter, errors: []}); - }; -})(GPUDevice.prototype.pushErrorScope); - -GPUDevice.prototype.popErrorScope = (function (origFn) { - return function (this: GPUDevice) { - const errorScopeStack = deviceToErrorScopeStack.get(this); - const errorScope = errorScopeStack!.pop(); - if (errorScope === undefined) { - throw new DOMException('popErrorScope called on empty error scope stack', 'OperationError'); - } - const errPromise = origFn.call(this); - return errorScope.errors.pop() ?? errPromise; - }; -})(GPUDevice.prototype.popErrorScope); - -GPUAdapter.prototype.requestDevice = (function (origFn) { - return async function (this: GPUAdapter, ...args) { - const device = await origFn.call(this, ...args); - if (device) { - device.addEventListener('uncapturederror', function (e) { - console.error((e as GPUUncapturedErrorEvent).error.message); - }); - deviceToErrorScopeStack.set(device, []); - s_objToDevice.set(device.queue, device); - } - return device; - }; -})(GPUAdapter.prototype.requestDevice); + function addErrorWrapperWithDevice(api: T, fnName: keyof T['prototype'] & PropertyKey): void { + const origFn = api.prototype[fnName] as AnyFunction; + api.prototype[fnName] = function (this: any, ...args: any[]) { + const device = s_objToDevice.get(this as GPUQueue)!; + return errorWrapper.call(this, device, fnName.toString(), origFn, ...args); + }; + } + + /** + * given a class returns all the method names. + */ + function getAPIFunctionNames(api: T) { + return Object.entries(Object.getOwnPropertyDescriptors(api.prototype)) + .filter(([, info]) => info.enumerable && typeof info.value === 'function') + .map(([name]) => name as keyof T['prototype'] & PropertyKey); + } + + const skip = new Set([ + 'pushErrorScope', + 'popErrorScope', + 'destroy', + ]); + getAPIFunctionNames(GPUDevice) + .filter(n => !skip.has(n)) + .forEach(n => addErrorWrapper(GPUDevice, n)); + getAPIFunctionNames(GPUQueue) + .forEach(n => addErrorWrapperWithDevice(GPUQueue, n)); + + GPUDevice.prototype.pushErrorScope = (function (origFn) { + return function (this: GPUDevice, filter: GPUErrorFilter) { + origFn.call(this, filter); + const errorScopeStack = deviceToErrorScopeStack.get(this); + errorScopeStack!.push({filter, errors: []}); + }; + })(GPUDevice.prototype.pushErrorScope); + + GPUDevice.prototype.popErrorScope = (function (origFn) { + return async function (this: GPUDevice) { + const errorScopeStack = deviceToErrorScopeStack.get(this); + const errorScope = errorScopeStack!.pop(); + if (errorScope === undefined) { + throw new DOMException('popErrorScope called on empty error scope stack', 'OperationError'); + } + const errPromise = origFn.call(this); + return errorScope.errors.pop() ?? errPromise; + }; + })(GPUDevice.prototype.popErrorScope); + + GPUAdapter.prototype.requestDevice = (function (origFn) { + return async function (this: GPUAdapter, ...args) { + const device = await origFn.call(this, ...args); + if (device) { + device.addEventListener('uncapturederror', function (e) { + console.error((e as GPUUncapturedErrorEvent).error.message); + }); + deviceToErrorScopeStack.set(device, []); + s_objToDevice.set(device.queue, device); + } + return device; + }; + })(GPUAdapter.prototype.requestDevice); + +} \ No newline at end of file diff --git a/src/object-to-device.ts b/src/object-to-device.ts new file mode 100644 index 0000000..2b107ce --- /dev/null +++ b/src/object-to-device.ts @@ -0,0 +1,21 @@ +export type DeviceResource = + | GPUBindGroup + | GPUBindGroupLayout + | GPUBuffer + | GPUCanvasContext + | GPUCommandEncoder + | GPUComputePassEncoder + | GPUComputePipeline + | GPUExternalTexture + | GPUPipelineLayout + | GPUQuerySet + | GPUQueue + | GPURenderBundle + | GPURenderBundleEncoder + | GPURenderPassEncoder + | GPURenderPipeline + | GPUSampler + | GPUShaderModule + | GPUTexture + +export const s_objToDevice = new WeakMap(); diff --git a/src/pipeline.ts b/src/pipeline.ts index 42efeed..7082ea5 100644 --- a/src/pipeline.ts +++ b/src/pipeline.ts @@ -6,11 +6,13 @@ import { arraysEqual, trimNulls } from './utils.js'; import { wrapFunctionAfter } from "./wrap-api.js"; type BindGroupLayoutDescriptor = { + /** this is sparse! */ entries: GPUBindGroupLayoutEntry[]; }; export type BindGroupLayoutDescriptorPlus = { bindGroupLayoutDescriptor: BindGroupLayoutDescriptor, + entriesById: Record; dynamicOffsetCount: number, signature: string, } diff --git a/src/shared-state.ts b/src/shared-state.ts index 739a905..9ac1797 100644 --- a/src/shared-state.ts +++ b/src/shared-state.ts @@ -1,3 +1,7 @@ +import { + DeviceResource, + s_objToDevice, +} from './object-to-device.js'; import { BindGroupLayoutDescriptorPlus } from './pipeline.js'; import { assert, @@ -7,27 +11,10 @@ import { wrapFunctionBefore, } from './wrap-api.js'; -export type DeviceResource = - | GPUBindGroup - | GPUBindGroupLayout - | GPUBuffer - | GPUCanvasContext - | GPUCommandEncoder - | GPUComputePassEncoder - | GPUComputePipeline - | GPUExternalTexture - | GPUPipelineLayout - | GPUQuerySet - | GPUQueue - | GPURenderBundle - | GPURenderBundleEncoder - | GPURenderPassEncoder - | GPURenderPipeline - | GPUSampler - | GPUShaderModule - | GPUTexture - -export const s_objToDevice = new WeakMap(); +export { + DeviceResource, + s_objToDevice, +}; export type Destroyable = GPUTexture | GPUBuffer | GPUQuerySet | GPUDevice; diff --git a/src/webgpu-debug-helper.ts b/src/webgpu-debug-helper.ts index 077e979..66c78f9 100644 --- a/src/webgpu-debug-helper.ts +++ b/src/webgpu-debug-helper.ts @@ -6,3 +6,5 @@ import './compute-pass-encoder.js'; import './render-pass-encoder.js'; import './render-bundle-encoder.js'; import './texture.js'; + +console.log('webgpu-debug-helper running'); \ No newline at end of file diff --git a/test/js/example-inject.js b/test/js/example-inject.js new file mode 100644 index 0000000..41b14b4 --- /dev/null +++ b/test/js/example-inject.js @@ -0,0 +1,34 @@ +// eslint-disable-next-line strict +"use strict"; + +function makePromise() { + const info = {}; + const promise = new Promise((resolve, reject) => { + Object.assign(info, {resolve, reject}); + }); + info.promise = promise; + return info; +} + +window.testsPromiseInfo = makePromise(); + +window.addEventListener('error', (event) => { + console.error(event); + window.testsPromiseInfo.reject(1); +}); + +// eslint-disable-next-line no-lone-blocks +{ + GPUAdapter.prototype.requestDevice = (function (origFn) { + return async function (...args) { + const device = await origFn.call(this, args); + if (device) { + device.addEventListener('uncapturederror', function (e) { + console.error(e.error.message); + window.testsPromiseInfo.reject(1); + }); + } + return device; + }; + })(GPUAdapter.prototype.requestDevice); +} diff --git a/test/puppeteer.js b/test/puppeteer.js index a2d8d3b..e756d0c 100755 --- a/test/puppeteer.js +++ b/test/puppeteer.js @@ -1,18 +1,117 @@ #!/usr/bin/env node +/* eslint-env node */ import puppeteer from 'puppeteer'; import path from 'path'; +import fs from 'fs'; import express from 'express'; import url from 'url'; -const app = express(); -const port = 3000; +import { program } from 'commander'; + const __dirname = path.dirname(url.fileURLToPath(import.meta.url)); // eslint-disable-line -app.use(express.static(path.dirname(__dirname))); -const server = app.listen(port, () => { - console.log(`Example app listening on port ${port}!`); - test(port); -}); +const fixedParseInt = v => parseInt(v); + +program + .usage('[options] [path-to-serve]') + .option('--skip-count ', 'num to skip', fixedParseInt, 0) + .option('--threejs', 'test three.js examples') + .option('--webgpu-samples', 'test webgpu-samples') + .option('--use-chrome', 'use chrome'); + +program.showHelpAfterError('(add --help for additional information)'); +program.parse(); + +function startServer(port, dir) { + return new Promise(resolve => { + const app = express(); + app.use(express.static(dir)); + const server = app.listen(port, () => { + console.log(`Example app listening on port ${port}!`); + resolve({server, port}); + }); + }); +} + +function exists(f) { + try { + fs.statSync(f); + return true; + } catch { + return false; + } +} + +const args = program.opts(); +const servers = []; + +const tests = []; + +if (args.threejs || args.webgpuSamples) { + const exampleInjectJS = + fs.readFileSync('test/js/example-inject.js', {encoding: 'utf-8'}) + + fs.readFileSync('dist/0.x/webgpu-debug-helper.js', {encoding: 'utf-8'}); + + // Some strange bug, even without webgpu-debug-helper these + // examples fail in puppeteer. + const skip = [ + // three.js + 'webgpu_instancing_morph.html', + 'webgpu_loader_gltf_compressed.html', + 'webgpu_materials.html', + 'webgpu_morphtargets.html', + 'webgpu_morphtargets_face.html', + 'webgpu_sandbox.html', + 'webgpu_video_panorama.html', + + // webgpu-samples + 'computeBoids', + 'cornell', + 'imageBlur', + 'skinnedMesh', + 'videoUploadingWebCodecs', + ]; + tests.length = 0; // clear tests + + if (args.threejs) { + const { server, port } = await startServer(3000, '../three.js'); + servers.push(server); + + tests.push( + ...fs.readdirSync(path.join(__dirname, '..', '..', 'three.js', 'examples')) + .filter(f => f.startsWith('webgpu_') && f.endsWith('.html') && !skip.includes(f)) + .map((f, i) => ({ + url: `http://localhost:${port}/examples/${f}`, + js: exampleInjectJS, + id: tests.length + 1 + i, + }))); + } + + if (args.webgpuSamples) { + const { server, port } = await startServer(3000, '../webgpu-samples/out'); + servers.push(server); + + const dir = path.join(__dirname, '..', '..', 'webgpu-samples', 'out', 'sample'); + tests.push( + ...fs.readdirSync(dir) + .filter(f => exists(path.join(dir, f, 'index.html')) && !skip.includes(f)) + .map((f, i) => ({ + url: `http://localhost:${port}/sample/${f}/index.html`, + js: exampleInjectJS, + id: tests.length + 1 + i, + }))); + } + + tests.splice(0, args.skipCount); + +} else { + const rootDir = path.dirname(__dirname); + const { server, port } = await startServer(3000, rootDir); + tests.push({url: `http://localhost:${port}/test/index.html?reporter=spec`}); + servers.push(server); +} + +test(tests); function makePromiseInfo() { const info = {}; @@ -24,8 +123,18 @@ function makePromiseInfo() { } -async function test(port) { - const browser = await puppeteer.launch(); +async function test(tests) { + const browser = await puppeteer.launch({ + //devtools: true, + headless: args.useChrome ? false : "new", + ...(args.useChrome ?? { executablePath: '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome' }), + args: [ + '--enable-unsafe-webgpu', + '--enable-webgpu-developer-features', + //'--use-angle=swiftshader', + '--user-agent=puppeteer', + ], + }); const page = await browser.newPage(); page.on('console', async e => { @@ -37,7 +146,7 @@ async function test(port) { let waitingPromiseInfo; // Get the "viewport" of the page, as reported by the page. - page.on('domcontentloaded', async() => { + page.on('domcontentloaded', async () => { const failures = await page.evaluate(() => { return window.testsPromiseInfo.promise; }); @@ -47,18 +156,30 @@ async function test(port) { waitingPromiseInfo.resolve(); }); - const urls = [ - `http://localhost:${port}/test/index.html?reporter=spec`, - ]; - - for (const url of urls) { + for (const {url, js, id} of tests) { waitingPromiseInfo = makePromiseInfo(); + console.log(`===== [ ${id ? `#${id}:` : ''} ${url} ] =====`); + let newScriptEval; + if (js) { + newScriptEval = await page.evaluateOnNewDocument(js); + } await page.goto(url); + await page.waitForNetworkIdle(); + if (js) { + await page.evaluate(() => { + setTimeout(() => { + window.testsPromiseInfo.resolve(0); + }, 500); + }); + } await waitingPromiseInfo.promise; + if (js) { + await page.removeScriptToEvaluateOnNewDocument(newScriptEval.identifier); + } } await browser.close(); - server.close(); + servers.forEach(s => s.close()); process.exit(totalFailures ? 1 : 0); // eslint-disable-line } diff --git a/test/tests/binding-mixin-tests.js b/test/tests/binding-mixin-tests.js index eaed616..7af1d18 100644 --- a/test/tests/binding-mixin-tests.js +++ b/test/tests/binding-mixin-tests.js @@ -181,8 +181,8 @@ async function createResourcesForAutoLayoutBindGroupTests(makePassAndPipeline, d device = device || await (await navigator.gpu.requestAdapter()).requestDevice(); const { pass, pipeline } = await makePassAndPipeline(device, { resourceWGSL: ` - @group(0) @binding(0) var u00: f32; - @group(0) @binding(1) var u01: f32; + @group(0) @binding(1) var u00: f32; + @group(0) @binding(2) var u01: f32; @group(1) @binding(0) var u10: vec4f; @group(2) @binding(0) var u20: vec4f; `, @@ -200,8 +200,8 @@ async function createResourcesForAutoLayoutBindGroupTests(makePassAndPipeline, d const bindGroup0 = device.createBindGroup({ layout: pipeline.getBindGroupLayout(0), entries: [ - { binding: 0, resource: { buffer: u00Buffer }}, - { binding: 1, resource: { buffer: u01Buffer }}, + { binding: 1, resource: { buffer: u00Buffer }}, + { binding: 2, resource: { buffer: u01Buffer }}, ], }); const bindGroup1 = device.createBindGroup({ @@ -240,8 +240,8 @@ async function createResourcesForExplicitLayoutBindGroupTests({ const bindGroupLayouts = [ { entries: [ - { binding: 0, visibility, buffer: {} }, { binding: 1, visibility, buffer: {} }, + { binding: 2, visibility, buffer: {} }, ], }, { @@ -262,8 +262,8 @@ async function createResourcesForExplicitLayoutBindGroupTests({ const { pass, pipeline } = await makePassAndPipeline(device, { layout, resourceWGSL: ` - @group(0) @binding(0) var u00: f32; - @group(0) @binding(1) var u01: f32; + @group(0) @binding(1) var u00: f32; + @group(0) @binding(2) var u01: f32; @group(1) @binding(0) var u10: vec4f; @group(2) @binding(0) var u20: vec4f; `, @@ -282,8 +282,8 @@ async function createResourcesForExplicitLayoutBindGroupTests({ const bindGroup0 = device.createBindGroup({ layout: bindGroupLayouts[0], entries: [ - { binding: 0, resource: { buffer: u00Buffer }}, - { binding: 1, resource: { buffer: u01Buffer }}, + { binding: 1, resource: { buffer: u00Buffer }}, + { binding: 2, resource: { buffer: u01Buffer }}, ], }); const bindGroup1 = device.createBindGroup({ @@ -322,7 +322,7 @@ export function addValidateBindGroupTests({ describe('auto layout', () => { - itWithDevice('works with auto layout', async (device) => { + itWithDevice('works with auto layout', async (device) => { const { pass, bindGroup0, bindGroup1, bindGroup2 } = await createResourcesForAutoLayoutBindGroupTests(makePassAndPipeline, device); pass.setBindGroup(0, bindGroup0); pass.setBindGroup(1, bindGroup1); @@ -333,7 +333,7 @@ export function addValidateBindGroupTests({ }); }); - itWithDevice('fails if missing bindGroup', async (device) => { + itWithDevice('fails if missing bindGroup', async (device) => { const { pass, bindGroup1, bindGroup2 } = await createResourcesForAutoLayoutBindGroupTests(makePassAndPipeline, device); pass.setBindGroup(1, bindGroup1); pass.setBindGroup(2, bindGroup2); @@ -343,7 +343,7 @@ export function addValidateBindGroupTests({ }); }); - itWithDevice('fails if resource is destroyed', async (device) => { + itWithDevice('fails if resource is destroyed', async (device) => { const { pass, u01Buffer, bindGroup0, bindGroup1, bindGroup2 } = await createResourcesForAutoLayoutBindGroupTests(makePassAndPipeline, device); pass.setBindGroup(0, bindGroup0); pass.setBindGroup(1, bindGroup1); @@ -355,7 +355,7 @@ export function addValidateBindGroupTests({ }); }); - itWithDevice('fails if layout is incompatible (auto layout)', async (device) => { + itWithDevice('fails if layout is incompatible (auto layout)', async (device) => { const { pass, bindGroup0, bindGroup2 } = await createResourcesForAutoLayoutBindGroupTests(makePassAndPipeline, device); const { bindGroup1 } = await createResourcesForAutoLayoutBindGroupTests(makePassAndPipeline, device); pass.setBindGroup(0, bindGroup0); @@ -367,7 +367,7 @@ export function addValidateBindGroupTests({ }); }); - itWithDevice('works if layout is compatible (auto layout)', async (device) => { + itWithDevice('works if layout is compatible (auto layout)', async (device) => { const { pass, bindGroup0, bindGroup1, bindGroup2 } = await createResourcesForAutoLayoutBindGroupTests(makePassAndPipeline, device); pass.setBindGroup(0, bindGroup0); pass.setBindGroup(1, bindGroup2); // 2 and 1 are swapped but @@ -378,7 +378,7 @@ export function addValidateBindGroupTests({ }); }); - itWithDevice('false if layout is incompatible (auto layout + manual bindGroupLayout)', async (device) => { + itWithDevice('false if layout is incompatible (auto layout + manual bindGroupLayout)', async (device) => { const { pass, bindGroup0, bindGroup1, u20Buffer } = await createResourcesForAutoLayoutBindGroupTests(makePassAndPipeline, device); const bindGroupLayout = device.createBindGroupLayout({ entries: [ @@ -408,7 +408,7 @@ export function addValidateBindGroupTests({ describe('explicit layout', () => { - itWithDevice('works with explicit layout', async (device) => { + itWithDevice('works with explicit layout', async (device) => { const { pass, bindGroup0, bindGroup1, bindGroup2 } = await createResourcesForExplicitLayoutBindGroupTests({ makePassAndPipeline, visibility, device }); pass.setBindGroup(0, bindGroup0); pass.setBindGroup(1, bindGroup1); @@ -419,7 +419,32 @@ export function addValidateBindGroupTests({ }); }); - itWithDevice('works with different explicit layout if they are compatible', async (device) => { + itWithDevice('fails with incompatible bind group (bindGroup has out of range bindings)', async (device) => { + const { pass, bindGroup1, bindGroup2, u00Buffer } = await createResourcesForExplicitLayoutBindGroupTests({ makePassAndPipeline, visibility, device }); + + const bindGroupLayout = device.createBindGroupLayout({ + entries: [ + { binding: 3, visibility, buffer: {} }, + ], + }); + + const bindGroup0 = device.createBindGroup({ + layout: bindGroupLayout, + entries: [ + { binding: 3, resource: { buffer: u00Buffer }}, + ], + }); + + pass.setBindGroup(0, bindGroup0); + pass.setBindGroup(1, bindGroup1); + pass.setBindGroup(2, bindGroup2); + + await expectValidationError(true, async () => { + await execute(pass); + }); + }); + + itWithDevice('works with different explicit layout if they are compatible', async (device) => { const { pass, bindGroup0, bindGroup1 } = await createResourcesForExplicitLayoutBindGroupTests({ makePassAndPipeline, visibility, device }); const { bindGroup2 } = await createResourcesForExplicitLayoutBindGroupTests({ makePassAndPipeline, device, visibility }); pass.setBindGroup(0, bindGroup0); @@ -431,7 +456,7 @@ export function addValidateBindGroupTests({ }); }); - itWithDevice('fails with incompatible bindGroup', async (device) => { + itWithDevice('fails with incompatible bindGroup', async (device) => { const { pass, bindGroup1, bindGroup2 } = await createResourcesForExplicitLayoutBindGroupTests({ makePassAndPipeline, visibility, device }); pass.setBindGroup(0, bindGroup1); // incompatible pass.setBindGroup(1, bindGroup1); diff --git a/test/tests/command-encoder/copyBufferToBuffer-tests.js b/test/tests/command-encoder/copyBufferToBuffer-tests.js index cbed95a..d2f7617 100644 --- a/test/tests/command-encoder/copyBufferToBuffer-tests.js +++ b/test/tests/command-encoder/copyBufferToBuffer-tests.js @@ -93,7 +93,7 @@ export default function () { ]; for (const {srcOffset = 0, dstOffset = 0, size = 16, desc} of tests) { itWithDevice(desc, async (device) => { - const encoder = await createCommandEncoder(device); + const encoder = await createCommandEncoder(device); const src = device.createBuffer({size: 16, usage: GPUBufferUsage.COPY_SRC}); const dst = device.createBuffer({size: 32, usage: GPUBufferUsage.COPY_DST}); await expectValidationError(true, async () => { diff --git a/test/tests/push-pop-error-tests.js b/test/tests/push-pop-error-tests.js index 33961cd..0178fe0 100644 --- a/test/tests/push-pop-error-tests.js +++ b/test/tests/push-pop-error-tests.js @@ -1,6 +1,6 @@ import {describe} from '../mocha-support.js'; import { itWithDevice } from '../js/utils.js'; -import { assertFalsy, assertInstanceOf } from '../assert.js'; +import { assertFalsy, assertInstanceOf, assertTruthy } from '../assert.js'; describe('test push/pop error scope', () => { @@ -80,4 +80,18 @@ describe('test push/pop error scope', () => { assertInstanceOf(uncapturedError, GPUValidationError); }); + itWithDevice('test we get rejection for empty stack, not an exception', async (device) => { + let wasRejected = false; + try { + await device.popErrorScope() + .then(() => assertFalsy(true, 'should not succeed')) + .catch(() => { + wasRejected = true; + }); + } catch { + assertFalsy(true, 'should not throw'); + } + assertTruthy(wasRejected, 'was rejected'); + }); + });