blob: b4d9f3d12dd53cb51dee6162b724de8bfad7ed8a [file] [log] [blame]
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001/**
2 * @license
3 * Copyright 2019 The Emscripten Authors
4 * SPDX-License-Identifier: MIT
5 */
6
7/*
Kai Ninomiya11784002024-07-03 19:46:03 +00008 * Dawn's fork of Emscripten's WebGPU bindings. This will be contributed back to
9 * Emscripten after reaching approximately webgpu.h "1.0".
Kai Ninomiyaace5a582024-07-02 20:52:25 +000010 *
Kai Ninomiya11784002024-07-03 19:46:03 +000011 * IMPORTANT: See //src/emdawnwebgpu/README.md for info on how to use this.
Kai Ninomiyaace5a582024-07-02 20:52:25 +000012 */
13
14{{{
Kai Ninomiya11784002024-07-03 19:46:03 +000015 if (USE_WEBGPU || !__HAVE_EMDAWNWEBGPU_STRUCT_INFO || !__HAVE_EMDAWNWEBGPU_ENUM_TABLES || !__HAVE_EMDAWNWEBGPU_SIG_INFO) {
16 throw new Error("To use Dawn's library_webgpu.js, disable -sUSE_WEBGPU and first include Dawn's library_webgpu_struct_info.js and library_webgpu_enum_tables.js (before library_webgpu.js)");
17 }
18
Kai Ninomiyaace5a582024-07-02 20:52:25 +000019 // Helper functions for code generation
20 globalThis.gpu = {
Kai Ninomiyaace5a582024-07-02 20:52:25 +000021 convertSentinelToUndefined: function(name) {
22 return `if (${name} == -1) ${name} = undefined;`;
23 },
24
25 makeGetBool: function(struct, offset) {
26 return `!!(${makeGetValue(struct, offset, 'u32')})`;
27 },
28 makeGetU32: function(struct, offset) {
29 return makeGetValue(struct, offset, 'u32');
30 },
31 makeGetU64: function(struct, offset) {
32 var l = makeGetValue(struct, offset, 'u32');
33 var h = makeGetValue(`(${struct} + 4)`, offset, 'u32')
34 return `${h} * 0x100000000 + ${l}`
35 },
36 makeCheck: function(str) {
37 if (!ASSERTIONS) return '';
38 return `assert(${str});`;
39 },
Kai Ninomiyaace5a582024-07-02 20:52:25 +000040 makeCheckDescriptor: function(descriptor) {
41 // Assert descriptor is non-null, then that its nextInChain is null.
42 // For descriptors that aren't the first in the chain (e.g
Lokbondo Kungb339ed42024-09-06 02:49:19 +000043 // ShaderSourceSPIRV), there is no .nextInChain pointer, but
Kai Ninomiyaace5a582024-07-02 20:52:25 +000044 // instead a ChainedStruct object: .chain. So we need to check if
45 // .chain.nextInChain is null. As long as nextInChain and chain are always
46 // the first member in the struct, descriptor.nextInChain and
47 // descriptor.chain.nextInChain should have the same offset (0) to the
48 // descriptor pointer and we can check it to be null.
49 var OffsetOfNextInChainMember = 0;
50 return this.makeCheck(descriptor) + this.makeCheck(makeGetValue(descriptor, OffsetOfNextInChainMember, '*') + ' === 0');
51 },
Lokbondo Kung83ebea32024-10-11 22:40:03 +000052 makeImportJsObject: function(object) {
53 return `
54 importJs${object}__deps: ['emwgpuCreate${object}'],
55 importJs${object}: (obj, parentPtr = 0) => {
56 var ptr = _emwgpuCreate${object}(parentPtr);
57 WebGPU.Internals.jsObjects[ptr] = obj;
58 return ptr;
59 },
60 `
61 },
Kai Ninomiyaace5a582024-07-02 20:52:25 +000062
63 // Compile-time table for enum integer values used with templating.
64 // Must be in sync with webgpu.h.
65 // TODO: Generate this to keep it in sync with webgpu.h
66 COPY_STRIDE_UNDEFINED: 0xFFFFFFFF,
67 LIMIT_U32_UNDEFINED: 0xFFFFFFFF,
68 MIP_LEVEL_COUNT_UNDEFINED: 0xFFFFFFFF,
69 ARRAY_LAYER_COUNT_UNDEFINED: 0xFFFFFFFF,
Kai Ninomiya11784002024-07-03 19:46:03 +000070 ...WEBGPU_ENUM_CONSTANT_TABLES,
Kai Ninomiyaace5a582024-07-02 20:52:25 +000071 };
72 null;
73}}}
74
75var LibraryWebGPU = {
Lokbondo Kung83ebea32024-10-11 22:40:03 +000076 $WebGPU__deps: [],
Kai Ninomiyaace5a582024-07-02 20:52:25 +000077 $WebGPU: {
Lokbondo Kung83ebea32024-10-11 22:40:03 +000078 // Note that external users should not depend on any of the internal
79 // implementation details in this sub-object, as they are subject to
80 // change to support new features or optimizations. Instead, external
81 // users should rely only on the public APIs.
82 Internals: {
83 // Object management is consolidated into a single table that doesn't
84 // care about object type, and is keyed on the pointer address.
85 jsObjects: [],
86 jsObjectInsert: (ptr, jsObject) => {
87 WebGPU.Internals.jsObjects[ptr] = jsObject;
88 },
Loko Kung424cda22024-08-17 01:29:10 +000089
Lokbondo Kung83ebea32024-10-11 22:40:03 +000090 // Buffer unmapping callbacks are stored in a separate table to keep
91 // the jsObject table simple.
92 bufferOnUnmaps: [],
Loko Kung424cda22024-08-17 01:29:10 +000093
Lokbondo Kung83ebea32024-10-11 22:40:03 +000094 // Future to promise management, and temporary list allocated up-front for
95 // WaitAny implementation on the promises. Note that all FutureIDs
96 // (uint64_t) are passed either as a low and high value or by pointer
97 // because they need to be passed back and forth between JS and C++, and JS
98 // is currently unable to pass a value to a C++ function as a uint64_t.
99 // This might be possible with -sWASM_BIGINT, but I was unable to get that
100 // to work properly at the time of writing.
101 futures: [],
102 futureInsert: (futureIdL, futureIdH, promise) => {
Loko Kung859fb302024-08-17 01:44:58 +0000103#if ASYNCIFY
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000104 var futureId = futureIdH * 0x100000000 + futureIdL;
105 WebGPU.Internals.futures[futureId] =
106 new Promise((resolve) => promise.finally(() => resolve(futureId)));
Loko Kung859fb302024-08-17 01:44:58 +0000107#endif
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000108 },
109 waitAnyPromisesList: [],
Loko Kung859fb302024-08-17 01:44:58 +0000110 },
Loko Kung859fb302024-08-17 01:44:58 +0000111
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000112 // Public utility functions useful for translating between WASM/JS. Most of
113 // the import utilities are generated, with some exceptions that are
114 // explicitly implemented because they have some slight differences. Note
115 // that all import functions take the expected GPUObject JS types as the
116 // first argument and an optional second argument that is WGPUObject C type
117 // (i.e. pointer), that should extend EventSource from webgpu.cpp. The
118 // second argument is a "parent" object that's needed in order to handle
119 // WGPUFutures when using in non-AllowSpontaneous mode. For most objects,
120 // a WGPUDevice would suffice as a parent. For a WGPUDevice, either a
121 // WGPUAdapter or WGPUInstance would be valid.
122 getJsObject: (ptr) => {
123 if (!ptr) return undefined;
124#if ASSERTIONS
125 assert(ptr in WebGPU.Internals.jsObjects);
126#endif
127 return WebGPU.Internals.jsObjects[ptr];
128 },
129 {{{ gpu.makeImportJsObject('Adapter') }}}
130 {{{ gpu.makeImportJsObject('BindGroup') }}}
131 {{{ gpu.makeImportJsObject('BindGroupLayout') }}}
132 {{{ gpu.makeImportJsObject('Buffer') }}}
133 {{{ gpu.makeImportJsObject('CommandBuffer') }}}
134 {{{ gpu.makeImportJsObject('CommandEncoder') }}}
135 {{{ gpu.makeImportJsObject('ComputePassEncoder') }}}
136 {{{ gpu.makeImportJsObject('ComputePipeline') }}}
137 importJsDevice__deps: ['emwgpuCreateDevice', 'emwgpuCreateQueue'],
138 importJsDevice: (device, parentPtr = 0) => {
139 var queuePtr = _emwgpuCreateQueue(parentPtr);
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000140 var devicePtr = _emwgpuCreateDevice(parentPtr, queuePtr);
Lokbondo Kung7927ad02024-10-11 23:20:07 +0000141 WebGPU.Internals.jsObjectInsert(queuePtr, device.queue);
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000142 WebGPU.Internals.jsObjectInsert(devicePtr, device);
143 return devicePtr;
144 },
145 {{{ gpu.makeImportJsObject('BindGroup') }}}
146 {{{ gpu.makeImportJsObject('PipelineLayout') }}}
147 {{{ gpu.makeImportJsObject('QuerySet') }}}
148 {{{ gpu.makeImportJsObject('Queue') }}}
149 {{{ gpu.makeImportJsObject('RenderBundle') }}}
150 {{{ gpu.makeImportJsObject('RenderBundleEncoder') }}}
151 {{{ gpu.makeImportJsObject('RenderPassEncoder') }}}
152 {{{ gpu.makeImportJsObject('RenderPipeline') }}}
153 {{{ gpu.makeImportJsObject('Sampler') }}}
154 {{{ gpu.makeImportJsObject('ShaderModule') }}}
155 {{{ gpu.makeImportJsObject('Surface') }}}
156 {{{ gpu.makeImportJsObject('Texture') }}}
157 {{{ gpu.makeImportJsObject('TextureView') }}}
158
159 errorCallback__deps: ['$stackSave', '$stackRestore', '$stringToUTF8OnStack'],
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000160 errorCallback: (callback, type, message, userdata) => {
161 var sp = stackSave();
162 var messagePtr = stringToUTF8OnStack(message);
163 {{{ makeDynCall('vipp', 'callback') }}}(type, messagePtr, userdata);
164 stackRestore(sp);
165 },
166
Lokbondo Kung6e4a3662024-10-11 21:44:57 +0000167 setStringView: (ptr, data, length) => {
168 {{{ makeSetValue('ptr', C_STRUCTS.WGPUStringView.data, 'data', '*') }}};
169 {{{ makeSetValue('ptr', C_STRUCTS.WGPUStringView.length, 'length', '*') }}};
170 },
171
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000172 makeColor: (ptr) => {
173 return {
174 "r": {{{ makeGetValue('ptr', 0, 'double') }}},
175 "g": {{{ makeGetValue('ptr', 8, 'double') }}},
176 "b": {{{ makeGetValue('ptr', 16, 'double') }}},
177 "a": {{{ makeGetValue('ptr', 24, 'double') }}},
178 };
179 },
180
181 makeExtent3D: (ptr) => {
182 return {
183 "width": {{{ gpu.makeGetU32('ptr', C_STRUCTS.WGPUExtent3D.width) }}},
184 "height": {{{ gpu.makeGetU32('ptr', C_STRUCTS.WGPUExtent3D.height) }}},
185 "depthOrArrayLayers": {{{ gpu.makeGetU32('ptr', C_STRUCTS.WGPUExtent3D.depthOrArrayLayers) }}},
186 };
187 },
188
189 makeOrigin3D: (ptr) => {
190 return {
191 "x": {{{ gpu.makeGetU32('ptr', C_STRUCTS.WGPUOrigin3D.x) }}},
192 "y": {{{ gpu.makeGetU32('ptr', C_STRUCTS.WGPUOrigin3D.y) }}},
193 "z": {{{ gpu.makeGetU32('ptr', C_STRUCTS.WGPUOrigin3D.z) }}},
194 };
195 },
196
197 makeImageCopyTexture: (ptr) => {
Kai Ninomiya11784002024-07-03 19:46:03 +0000198 {{{ gpu.makeCheck('ptr') }}}
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000199 return {
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000200 "texture": WebGPU.getJsObject(
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000201 {{{ makeGetValue('ptr', C_STRUCTS.WGPUImageCopyTexture.texture, '*') }}}),
202 "mipLevel": {{{ gpu.makeGetU32('ptr', C_STRUCTS.WGPUImageCopyTexture.mipLevel) }}},
203 "origin": WebGPU.makeOrigin3D(ptr + {{{ C_STRUCTS.WGPUImageCopyTexture.origin }}}),
204 "aspect": WebGPU.TextureAspect[{{{ gpu.makeGetU32('ptr', C_STRUCTS.WGPUImageCopyTexture.aspect) }}}],
205 };
206 },
207
208 makeTextureDataLayout: (ptr) => {
209 {{{ gpu.makeCheckDescriptor('ptr') }}}
210 var bytesPerRow = {{{ gpu.makeGetU32('ptr', C_STRUCTS.WGPUTextureDataLayout.bytesPerRow) }}};
211 var rowsPerImage = {{{ gpu.makeGetU32('ptr', C_STRUCTS.WGPUTextureDataLayout.rowsPerImage) }}};
212 return {
213 "offset": {{{ gpu.makeGetU64('ptr', C_STRUCTS.WGPUTextureDataLayout.offset) }}},
214 "bytesPerRow": bytesPerRow === {{{ gpu.COPY_STRIDE_UNDEFINED }}} ? undefined : bytesPerRow,
215 "rowsPerImage": rowsPerImage === {{{ gpu.COPY_STRIDE_UNDEFINED }}} ? undefined : rowsPerImage,
216 };
217 },
218
219 makeImageCopyBuffer: (ptr) => {
Kai Ninomiya11784002024-07-03 19:46:03 +0000220 {{{ gpu.makeCheck('ptr') }}}
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000221 var layoutPtr = ptr + {{{ C_STRUCTS.WGPUImageCopyBuffer.layout }}};
222 var bufferCopyView = WebGPU.makeTextureDataLayout(layoutPtr);
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000223 bufferCopyView["buffer"] = WebGPU.getJsObject(
224 {{{ makeGetValue('ptr', C_STRUCTS.WGPUImageCopyBuffer.buffer, '*') }}});
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000225 return bufferCopyView;
226 },
227
228 makePipelineConstants: (constantCount, constantsPtr) => {
229 if (!constantCount) return;
230 var constants = {};
231 for (var i = 0; i < constantCount; ++i) {
232 var entryPtr = constantsPtr + {{{ C_STRUCTS.WGPUConstantEntry.__size__ }}} * i;
233 var key = UTF8ToString({{{ makeGetValue('entryPtr', C_STRUCTS.WGPUConstantEntry.key, '*') }}});
234 constants[key] = {{{ makeGetValue('entryPtr', C_STRUCTS.WGPUConstantEntry.value, 'double') }}};
235 }
236 return constants;
237 },
238
239 makePipelineLayout: (layoutPtr) => {
240 if (!layoutPtr) return 'auto';
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000241 return WebGPU.getJsObject(layoutPtr);
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000242 },
243
244 makeProgrammableStageDescriptor: (ptr) => {
245 if (!ptr) return undefined;
246 {{{ gpu.makeCheckDescriptor('ptr') }}}
247 var desc = {
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000248 "module": WebGPU.getJsObject(
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000249 {{{ makeGetValue('ptr', C_STRUCTS.WGPUProgrammableStageDescriptor.module, '*') }}}),
250 "constants": WebGPU.makePipelineConstants(
251 {{{ gpu.makeGetU32('ptr', C_STRUCTS.WGPUProgrammableStageDescriptor.constantCount) }}},
252 {{{ makeGetValue('ptr', C_STRUCTS.WGPUProgrammableStageDescriptor.constants, '*') }}}),
253 };
254 var entryPointPtr = {{{ makeGetValue('ptr', C_STRUCTS.WGPUProgrammableStageDescriptor.entryPoint, '*') }}};
255 if (entryPointPtr) desc["entryPoint"] = UTF8ToString(entryPointPtr);
256 return desc;
257 },
258
Kai Ninomiya11784002024-07-03 19:46:03 +0000259 makeComputePipelineDesc: (descriptor) => {
260 {{{ gpu.makeCheckDescriptor('descriptor') }}}
261
262 var desc = {
263 "label": undefined,
264 "layout": WebGPU.makePipelineLayout(
265 {{{ makeGetValue('descriptor', C_STRUCTS.WGPUComputePipelineDescriptor.layout, '*') }}}),
266 "compute": WebGPU.makeProgrammableStageDescriptor(
267 descriptor + {{{ C_STRUCTS.WGPUComputePipelineDescriptor.compute }}}),
268 };
269 var labelPtr = {{{ makeGetValue('descriptor', C_STRUCTS.WGPUComputePipelineDescriptor.label, '*') }}};
270 if (labelPtr) desc["label"] = UTF8ToString(labelPtr);
271 return desc;
272 },
273
274 makeRenderPipelineDesc: (descriptor) => {
275 {{{ gpu.makeCheckDescriptor('descriptor') }}}
Kai Ninomiya11784002024-07-03 19:46:03 +0000276
Kai Ninomiyaa46bbf92024-09-05 23:02:32 +0000277 function makePrimitiveState(psPtr) {
278 if (!psPtr) return undefined;
279 {{{ gpu.makeCheckDescriptor('psPtr') }}}
Kai Ninomiya11784002024-07-03 19:46:03 +0000280 return {
281 "topology": WebGPU.PrimitiveTopology[
Kai Ninomiyaa46bbf92024-09-05 23:02:32 +0000282 {{{ gpu.makeGetU32('psPtr', C_STRUCTS.WGPUPrimitiveState.topology) }}}],
Kai Ninomiya11784002024-07-03 19:46:03 +0000283 "stripIndexFormat": WebGPU.IndexFormat[
Kai Ninomiyaa46bbf92024-09-05 23:02:32 +0000284 {{{ gpu.makeGetU32('psPtr', C_STRUCTS.WGPUPrimitiveState.stripIndexFormat) }}}],
Kai Ninomiya11784002024-07-03 19:46:03 +0000285 "frontFace": WebGPU.FrontFace[
Kai Ninomiyaa46bbf92024-09-05 23:02:32 +0000286 {{{ gpu.makeGetU32('psPtr', C_STRUCTS.WGPUPrimitiveState.frontFace) }}}],
Kai Ninomiya11784002024-07-03 19:46:03 +0000287 "cullMode": WebGPU.CullMode[
Kai Ninomiyaa46bbf92024-09-05 23:02:32 +0000288 {{{ gpu.makeGetU32('psPtr', C_STRUCTS.WGPUPrimitiveState.cullMode) }}}],
289 "unclippedDepth":
290 {{{ gpu.makeGetBool('psPtr', C_STRUCTS.WGPUPrimitiveState.unclippedDepth) }}},
Kai Ninomiya11784002024-07-03 19:46:03 +0000291 };
292 }
293
294 function makeBlendComponent(bdPtr) {
295 if (!bdPtr) return undefined;
296 return {
297 "operation": WebGPU.BlendOperation[
298 {{{ gpu.makeGetU32('bdPtr', C_STRUCTS.WGPUBlendComponent.operation) }}}],
299 "srcFactor": WebGPU.BlendFactor[
300 {{{ gpu.makeGetU32('bdPtr', C_STRUCTS.WGPUBlendComponent.srcFactor) }}}],
301 "dstFactor": WebGPU.BlendFactor[
302 {{{ gpu.makeGetU32('bdPtr', C_STRUCTS.WGPUBlendComponent.dstFactor) }}}],
303 };
304 }
305
306 function makeBlendState(bsPtr) {
307 if (!bsPtr) return undefined;
308 return {
309 "alpha": makeBlendComponent(bsPtr + {{{ C_STRUCTS.WGPUBlendState.alpha }}}),
310 "color": makeBlendComponent(bsPtr + {{{ C_STRUCTS.WGPUBlendState.color }}}),
311 };
312 }
313
314 function makeColorState(csPtr) {
315 {{{ gpu.makeCheckDescriptor('csPtr') }}}
316 var formatInt = {{{ gpu.makeGetU32('csPtr', C_STRUCTS.WGPUColorTargetState.format) }}};
317 return formatInt === {{{ gpu.TextureFormat.Undefined }}} ? undefined : {
318 "format": WebGPU.TextureFormat[formatInt],
319 "blend": makeBlendState({{{ makeGetValue('csPtr', C_STRUCTS.WGPUColorTargetState.blend, '*') }}}),
320 "writeMask": {{{ gpu.makeGetU32('csPtr', C_STRUCTS.WGPUColorTargetState.writeMask) }}},
321 };
322 }
323
324 function makeColorStates(count, csArrayPtr) {
325 var states = [];
326 for (var i = 0; i < count; ++i) {
327 states.push(makeColorState(csArrayPtr + {{{ C_STRUCTS.WGPUColorTargetState.__size__ }}} * i));
328 }
329 return states;
330 }
331
332 function makeStencilStateFace(ssfPtr) {
333 {{{ gpu.makeCheck('ssfPtr') }}}
334 return {
335 "compare": WebGPU.CompareFunction[
336 {{{ gpu.makeGetU32('ssfPtr', C_STRUCTS.WGPUStencilFaceState.compare) }}}],
337 "failOp": WebGPU.StencilOperation[
338 {{{ gpu.makeGetU32('ssfPtr', C_STRUCTS.WGPUStencilFaceState.failOp) }}}],
339 "depthFailOp": WebGPU.StencilOperation[
340 {{{ gpu.makeGetU32('ssfPtr', C_STRUCTS.WGPUStencilFaceState.depthFailOp) }}}],
341 "passOp": WebGPU.StencilOperation[
342 {{{ gpu.makeGetU32('ssfPtr', C_STRUCTS.WGPUStencilFaceState.passOp) }}}],
343 };
344 }
345
346 function makeDepthStencilState(dssPtr) {
347 if (!dssPtr) return undefined;
348
349 {{{ gpu.makeCheck('dssPtr') }}}
350 return {
351 "format": WebGPU.TextureFormat[
352 {{{ gpu.makeGetU32('dssPtr', C_STRUCTS.WGPUDepthStencilState.format) }}}],
353 "depthWriteEnabled": {{{ gpu.makeGetBool('dssPtr', C_STRUCTS.WGPUDepthStencilState.depthWriteEnabled) }}},
354 "depthCompare": WebGPU.CompareFunction[
355 {{{ gpu.makeGetU32('dssPtr', C_STRUCTS.WGPUDepthStencilState.depthCompare) }}}],
356 "stencilFront": makeStencilStateFace(dssPtr + {{{ C_STRUCTS.WGPUDepthStencilState.stencilFront }}}),
357 "stencilBack": makeStencilStateFace(dssPtr + {{{ C_STRUCTS.WGPUDepthStencilState.stencilBack }}}),
358 "stencilReadMask": {{{ gpu.makeGetU32('dssPtr', C_STRUCTS.WGPUDepthStencilState.stencilReadMask) }}},
359 "stencilWriteMask": {{{ gpu.makeGetU32('dssPtr', C_STRUCTS.WGPUDepthStencilState.stencilWriteMask) }}},
360 "depthBias": {{{ makeGetValue('dssPtr', C_STRUCTS.WGPUDepthStencilState.depthBias, 'i32') }}},
361 "depthBiasSlopeScale": {{{ makeGetValue('dssPtr', C_STRUCTS.WGPUDepthStencilState.depthBiasSlopeScale, 'float') }}},
362 "depthBiasClamp": {{{ makeGetValue('dssPtr', C_STRUCTS.WGPUDepthStencilState.depthBiasClamp, 'float') }}},
363 };
364 }
365
366 function makeVertexAttribute(vaPtr) {
367 {{{ gpu.makeCheck('vaPtr') }}}
368 return {
369 "format": WebGPU.VertexFormat[
370 {{{ gpu.makeGetU32('vaPtr', C_STRUCTS.WGPUVertexAttribute.format) }}}],
371 "offset": {{{ gpu.makeGetU64('vaPtr', C_STRUCTS.WGPUVertexAttribute.offset) }}},
372 "shaderLocation": {{{ gpu.makeGetU32('vaPtr', C_STRUCTS.WGPUVertexAttribute.shaderLocation) }}},
373 };
374 }
375
376 function makeVertexAttributes(count, vaArrayPtr) {
377 var vas = [];
378 for (var i = 0; i < count; ++i) {
379 vas.push(makeVertexAttribute(vaArrayPtr + i * {{{ C_STRUCTS.WGPUVertexAttribute.__size__ }}}));
380 }
381 return vas;
382 }
383
384 function makeVertexBuffer(vbPtr) {
385 if (!vbPtr) return undefined;
386 var stepModeInt = {{{ gpu.makeGetU32('vbPtr', C_STRUCTS.WGPUVertexBufferLayout.stepMode) }}};
387 return stepModeInt === {{{ gpu.VertexStepMode.VertexBufferNotUsed }}} ? null : {
388 "arrayStride": {{{ gpu.makeGetU64('vbPtr', C_STRUCTS.WGPUVertexBufferLayout.arrayStride) }}},
389 "stepMode": WebGPU.VertexStepMode[stepModeInt],
390 "attributes": makeVertexAttributes(
391 {{{ gpu.makeGetU32('vbPtr', C_STRUCTS.WGPUVertexBufferLayout.attributeCount) }}},
392 {{{ makeGetValue('vbPtr', C_STRUCTS.WGPUVertexBufferLayout.attributes, '*') }}}),
393 };
394 }
395
396 function makeVertexBuffers(count, vbArrayPtr) {
397 if (!count) return undefined;
398
399 var vbs = [];
400 for (var i = 0; i < count; ++i) {
401 vbs.push(makeVertexBuffer(vbArrayPtr + i * {{{ C_STRUCTS.WGPUVertexBufferLayout.__size__ }}}));
402 }
403 return vbs;
404 }
405
406 function makeVertexState(viPtr) {
407 if (!viPtr) return undefined;
408 {{{ gpu.makeCheckDescriptor('viPtr') }}}
409 var desc = {
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000410 "module": WebGPU.getJsObject(
Kai Ninomiya11784002024-07-03 19:46:03 +0000411 {{{ makeGetValue('viPtr', C_STRUCTS.WGPUVertexState.module, '*') }}}),
412 "constants": WebGPU.makePipelineConstants(
413 {{{ gpu.makeGetU32('viPtr', C_STRUCTS.WGPUVertexState.constantCount) }}},
414 {{{ makeGetValue('viPtr', C_STRUCTS.WGPUVertexState.constants, '*') }}}),
415 "buffers": makeVertexBuffers(
416 {{{ gpu.makeGetU32('viPtr', C_STRUCTS.WGPUVertexState.bufferCount) }}},
417 {{{ makeGetValue('viPtr', C_STRUCTS.WGPUVertexState.buffers, '*') }}}),
418 };
419 var entryPointPtr = {{{ makeGetValue('viPtr', C_STRUCTS.WGPUVertexState.entryPoint, '*') }}};
420 if (entryPointPtr) desc["entryPoint"] = UTF8ToString(entryPointPtr);
421 return desc;
422 }
423
424 function makeMultisampleState(msPtr) {
425 if (!msPtr) return undefined;
426 {{{ gpu.makeCheckDescriptor('msPtr') }}}
427 return {
428 "count": {{{ gpu.makeGetU32('msPtr', C_STRUCTS.WGPUMultisampleState.count) }}},
429 "mask": {{{ gpu.makeGetU32('msPtr', C_STRUCTS.WGPUMultisampleState.mask) }}},
430 "alphaToCoverageEnabled": {{{ gpu.makeGetBool('msPtr', C_STRUCTS.WGPUMultisampleState.alphaToCoverageEnabled) }}},
431 };
432 }
433
434 function makeFragmentState(fsPtr) {
435 if (!fsPtr) return undefined;
436 {{{ gpu.makeCheckDescriptor('fsPtr') }}}
437 var desc = {
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000438 "module": WebGPU.getJsObject(
Kai Ninomiya11784002024-07-03 19:46:03 +0000439 {{{ makeGetValue('fsPtr', C_STRUCTS.WGPUFragmentState.module, '*') }}}),
440 "constants": WebGPU.makePipelineConstants(
441 {{{ gpu.makeGetU32('fsPtr', C_STRUCTS.WGPUFragmentState.constantCount) }}},
442 {{{ makeGetValue('fsPtr', C_STRUCTS.WGPUFragmentState.constants, '*') }}}),
443 "targets": makeColorStates(
444 {{{ gpu.makeGetU32('fsPtr', C_STRUCTS.WGPUFragmentState.targetCount) }}},
445 {{{ makeGetValue('fsPtr', C_STRUCTS.WGPUFragmentState.targets, '*') }}}),
446 };
447 var entryPointPtr = {{{ makeGetValue('fsPtr', C_STRUCTS.WGPUFragmentState.entryPoint, '*') }}};
448 if (entryPointPtr) desc["entryPoint"] = UTF8ToString(entryPointPtr);
449 return desc;
450 }
451
452 var desc = {
453 "label": undefined,
454 "layout": WebGPU.makePipelineLayout(
455 {{{ makeGetValue('descriptor', C_STRUCTS.WGPURenderPipelineDescriptor.layout, '*') }}}),
456 "vertex": makeVertexState(
457 descriptor + {{{ C_STRUCTS.WGPURenderPipelineDescriptor.vertex }}}),
458 "primitive": makePrimitiveState(
459 descriptor + {{{ C_STRUCTS.WGPURenderPipelineDescriptor.primitive }}}),
460 "depthStencil": makeDepthStencilState(
461 {{{ makeGetValue('descriptor', C_STRUCTS.WGPURenderPipelineDescriptor.depthStencil, '*') }}}),
462 "multisample": makeMultisampleState(
463 descriptor + {{{ C_STRUCTS.WGPURenderPipelineDescriptor.multisample }}}),
464 "fragment": makeFragmentState(
465 {{{ makeGetValue('descriptor', C_STRUCTS.WGPURenderPipelineDescriptor.fragment, '*') }}}),
466 };
467 var labelPtr = {{{ makeGetValue('descriptor', C_STRUCTS.WGPURenderPipelineDescriptor.label, '*') }}};
468 if (labelPtr) desc["label"] = UTF8ToString(labelPtr);
469 return desc;
470 },
471
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000472 fillLimitStruct: (limits, supportedLimitsOutPtr) => {
473 var limitsOutPtr = supportedLimitsOutPtr + {{{ C_STRUCTS.WGPUSupportedLimits.limits }}};
474
475 function setLimitValueU32(name, limitOffset) {
476 var limitValue = limits[name];
477 {{{ makeSetValue('limitsOutPtr', 'limitOffset', 'limitValue', 'i32') }}};
478 }
479 function setLimitValueU64(name, limitOffset) {
480 var limitValue = limits[name];
481 {{{ makeSetValue('limitsOutPtr', 'limitOffset', 'limitValue', 'i64') }}};
482 }
Kai Ninomiya11784002024-07-03 19:46:03 +0000483
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000484 setLimitValueU32('maxTextureDimension1D', {{{ C_STRUCTS.WGPULimits.maxTextureDimension1D }}});
485 setLimitValueU32('maxTextureDimension2D', {{{ C_STRUCTS.WGPULimits.maxTextureDimension2D }}});
486 setLimitValueU32('maxTextureDimension3D', {{{ C_STRUCTS.WGPULimits.maxTextureDimension3D }}});
487 setLimitValueU32('maxTextureArrayLayers', {{{ C_STRUCTS.WGPULimits.maxTextureArrayLayers }}});
488 setLimitValueU32('maxBindGroups', {{{ C_STRUCTS.WGPULimits.maxBindGroups }}});
489 setLimitValueU32('maxBindGroupsPlusVertexBuffers', {{{ C_STRUCTS.WGPULimits.maxBindGroupsPlusVertexBuffers }}});
490 setLimitValueU32('maxBindingsPerBindGroup', {{{ C_STRUCTS.WGPULimits.maxBindingsPerBindGroup }}});
491 setLimitValueU32('maxDynamicUniformBuffersPerPipelineLayout', {{{ C_STRUCTS.WGPULimits.maxDynamicUniformBuffersPerPipelineLayout }}});
492 setLimitValueU32('maxDynamicStorageBuffersPerPipelineLayout', {{{ C_STRUCTS.WGPULimits.maxDynamicStorageBuffersPerPipelineLayout }}});
493 setLimitValueU32('maxSampledTexturesPerShaderStage', {{{ C_STRUCTS.WGPULimits.maxSampledTexturesPerShaderStage }}});
494 setLimitValueU32('maxSamplersPerShaderStage', {{{ C_STRUCTS.WGPULimits.maxSamplersPerShaderStage }}});
495 setLimitValueU32('maxStorageBuffersPerShaderStage', {{{ C_STRUCTS.WGPULimits.maxStorageBuffersPerShaderStage }}});
496 setLimitValueU32('maxStorageTexturesPerShaderStage', {{{ C_STRUCTS.WGPULimits.maxStorageTexturesPerShaderStage }}});
497 setLimitValueU32('maxUniformBuffersPerShaderStage', {{{ C_STRUCTS.WGPULimits.maxUniformBuffersPerShaderStage }}});
498 setLimitValueU32('minUniformBufferOffsetAlignment', {{{ C_STRUCTS.WGPULimits.minUniformBufferOffsetAlignment }}});
499 setLimitValueU32('minStorageBufferOffsetAlignment', {{{ C_STRUCTS.WGPULimits.minStorageBufferOffsetAlignment }}});
Kai Ninomiya11784002024-07-03 19:46:03 +0000500
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000501 setLimitValueU64('maxUniformBufferBindingSize', {{{ C_STRUCTS.WGPULimits.maxUniformBufferBindingSize }}});
502 setLimitValueU64('maxStorageBufferBindingSize', {{{ C_STRUCTS.WGPULimits.maxStorageBufferBindingSize }}});
Kai Ninomiya11784002024-07-03 19:46:03 +0000503
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000504 setLimitValueU32('maxVertexBuffers', {{{ C_STRUCTS.WGPULimits.maxVertexBuffers }}});
Loko Kungc1a2d1d2024-07-25 23:20:31 +0000505 setLimitValueU64('maxBufferSize', {{{ C_STRUCTS.WGPULimits.maxBufferSize }}});
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000506 setLimitValueU32('maxVertexAttributes', {{{ C_STRUCTS.WGPULimits.maxVertexAttributes }}});
507 setLimitValueU32('maxVertexBufferArrayStride', {{{ C_STRUCTS.WGPULimits.maxVertexBufferArrayStride }}});
508 setLimitValueU32('maxInterStageShaderComponents', {{{ C_STRUCTS.WGPULimits.maxInterStageShaderComponents }}});
509 setLimitValueU32('maxInterStageShaderVariables', {{{ C_STRUCTS.WGPULimits.maxInterStageShaderVariables }}});
510 setLimitValueU32('maxColorAttachments', {{{ C_STRUCTS.WGPULimits.maxColorAttachments }}});
511 setLimitValueU32('maxColorAttachmentBytesPerSample', {{{ C_STRUCTS.WGPULimits.maxColorAttachmentBytesPerSample }}});
512 setLimitValueU32('maxComputeWorkgroupStorageSize', {{{ C_STRUCTS.WGPULimits.maxComputeWorkgroupStorageSize }}});
513 setLimitValueU32('maxComputeInvocationsPerWorkgroup', {{{ C_STRUCTS.WGPULimits.maxComputeInvocationsPerWorkgroup }}});
514 setLimitValueU32('maxComputeWorkgroupSizeX', {{{ C_STRUCTS.WGPULimits.maxComputeWorkgroupSizeX }}});
515 setLimitValueU32('maxComputeWorkgroupSizeY', {{{ C_STRUCTS.WGPULimits.maxComputeWorkgroupSizeY }}});
516 setLimitValueU32('maxComputeWorkgroupSizeZ', {{{ C_STRUCTS.WGPULimits.maxComputeWorkgroupSizeZ }}});
517 setLimitValueU32('maxComputeWorkgroupsPerDimension', {{{ C_STRUCTS.WGPULimits.maxComputeWorkgroupsPerDimension }}});
518 },
519
Kai Ninomiya11784002024-07-03 19:46:03 +0000520 // Maps from enum string back to enum number, for callbacks.
521 {{{ WEBGPU_STRING_TO_INT_TABLES }}}
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000522
Kai Ninomiya11784002024-07-03 19:46:03 +0000523 // Maps from enum number to enum string.
524 {{{ WEBGPU_INT_TO_STRING_TABLES }}}
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000525 },
526
Loko Kung424cda22024-08-17 01:29:10 +0000527 // ----------------------------------------------------------------------------
Lokbondo Kungbc3246b2024-08-20 19:12:29 +0000528 // Definitions for standalone JS emwgpu functions (callable from webgpu.cpp and
529 // library_html5_html.js)
Loko Kung424cda22024-08-17 01:29:10 +0000530 // ----------------------------------------------------------------------------
531
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000532 emwgpuDelete: (ptr) => {
533 delete WebGPU.Internals.jsObjects[ptr];
Lokbondo Kungbc3246b2024-08-20 19:12:29 +0000534 },
535
Loko Kung859fb302024-08-17 01:44:58 +0000536#if ASYNCIFY
537 // Returns a FutureID that was resolved, or kNullFutureId if timed out.
538 emwgpuWaitAny__async: true,
539 emwgpuWaitAny: (futurePtr, futureCount, timeoutNSPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000540 var promises = WebGPU.Internals.waitAnyPromisesList;
Loko Kung859fb302024-08-17 01:44:58 +0000541 if (timeoutNSPtr) {
542 var timeoutMS = {{{ gpu.makeGetU64('timeoutNSPtr', 0) }}} / 1000000;
543 promises.length = futureCount + 1;
544 promise[futureCount] = new Promise((resolve) => setTimeout(resolve, timeoutMS, 0));
545 } else {
546 promises.length = futureCount;
547 }
548
549 for (var i = 0; i < futureCount; ++i) {
550 // If any of the FutureIDs are not tracked, it means it must be done.
551 var futureId = {{{ gpu.makeGetU64('(futurePtr + i * 8)', 0) }}};
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000552 if (!(futureId in WebGPU.Internals.futures)) {
Loko Kung859fb302024-08-17 01:44:58 +0000553 return futureId;
554 }
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000555 promises[i] = WebGPU.Internals.futures[futureId];
Loko Kung859fb302024-08-17 01:44:58 +0000556 }
557
558 var result = Asyncify.handleAsync(async () => {
559 return await Promise.race(promises);
560 });
561
562 // Clean up internal futures state.
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000563 delete WebGPU.Internals.futures[result];
564 WebGPU.Internals.waitAnyPromisesList.length = 0;
Loko Kung859fb302024-08-17 01:44:58 +0000565 return result;
566 },
567#endif
568
Lokbondo Kungacdcb8e2024-10-07 07:45:09 +0000569 emwgpuGetPreferredFormat: () => {
570 var format = navigator["gpu"]["getPreferredCanvasFormat"]();
571 return WebGPU.Int_PreferredFormat[format];
572 },
573
Loko Kung424cda22024-08-17 01:29:10 +0000574 // --------------------------------------------------------------------------
575 // WebGPU function definitions, with methods organized by "class".
576 //
577 // Also note that the full set of functions declared in webgpu.h are only
578 // partially implemeted here. The remaining ones are implemented via
579 // webgpu.cpp.
580 // --------------------------------------------------------------------------
581
Loko Kung5a9506d2024-08-17 01:44:45 +0000582 // --------------------------------------------------------------------------
Loko Kung424cda22024-08-17 01:29:10 +0000583 // Standalone (non-method) functions
Loko Kung5a9506d2024-08-17 01:44:45 +0000584 // --------------------------------------------------------------------------
585
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000586 wgpuGetInstanceFeatures: (featuresPtr) => {
587 abort('TODO: wgpuGetInstanceFeatures unimplemented');
588 return 0;
589 },
590
591 wgpuGetProcAddress: (device, procName) => {
592 abort('TODO(#11526): wgpuGetProcAddress unimplemented');
593 return 0;
594 },
595
Loko Kung5a9506d2024-08-17 01:44:45 +0000596 // --------------------------------------------------------------------------
597 // Methods of Adapter
598 // --------------------------------------------------------------------------
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000599
Loko Kung5a9506d2024-08-17 01:44:45 +0000600 wgpuAdapterEnumerateFeatures: (adapterPtr, featuresOutPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000601 var adapter = WebGPU.getJsObject(adapterPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +0000602 if (featuresOutPtr !== 0) {
603 var offset = 0;
604 adapter.features.forEach(feature => {
605 var featureEnumValue = WebGPU.FeatureNameString2Enum[feature];
606 {{{ makeSetValue('featuresOutPtr', 'offset', 'featureEnumValue', 'i32') }}};
607 offset += 4;
608 });
609 }
610 return adapter.features.size;
611 },
612
Lokbondo Kung6e4a3662024-10-11 21:44:57 +0000613 wgpuAdapterGetInfo__deps: ['$stringToNewUTF8', '$lengthBytesUTF8'],
Loko Kung5a9506d2024-08-17 01:44:45 +0000614 wgpuAdapterGetInfo: (adapterPtr, info) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000615 var adapter = WebGPU.getJsObject(adapterPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +0000616 {{{ gpu.makeCheckDescriptor('info') }}}
617
Lokbondo Kung6e4a3662024-10-11 21:44:57 +0000618 // Append all the strings together to condense into a single malloc.
619 var strs = adapter.info.vendor + adapter.info.architecture + adapter.info.device + adapter.info.description;
620 var strPtr = stringToNewUTF8(strs);
621
622 var vendorLen = lengthBytesUTF8(adapter.info.vendor);
623 WebGPU.setStringView(info + {{{ C_STRUCTS.WGPUAdapterInfo.vendor }}}, strPtr, vendorLen);
624 strPtr += vendorLen;
625
626 var architectureLen = lengthBytesUTF8(adapter.info.architecture);
627 WebGPU.setStringView(info + {{{ C_STRUCTS.WGPUAdapterInfo.architecture }}}, strPtr, architectureLen);
628 strPtr += architectureLen;
629
630 var deviceLen = lengthBytesUTF8(adapter.info.device);
631 WebGPU.setStringView(info + {{{ C_STRUCTS.WGPUAdapterInfo.device }}}, strPtr, deviceLen);
632 strPtr += deviceLen;
633
634 var descriptionLen = lengthBytesUTF8(adapter.info.description);
635 WebGPU.setStringView(info + {{{ C_STRUCTS.WGPUAdapterInfo.description }}}, strPtr, descriptionLen);
636 strPtr += descriptionLen;
637
Loko Kung5a9506d2024-08-17 01:44:45 +0000638 {{{ makeSetValue('info', C_STRUCTS.WGPUAdapterInfo.backendType, gpu.BackendType.WebGPU, 'i32') }}};
639 var adapterType = adapter.isFallbackAdapter ? {{{ gpu.AdapterType.CPU }}} : {{{ gpu.AdapterType.Unknown }}};
640 {{{ makeSetValue('info', C_STRUCTS.WGPUAdapterInfo.adapterType, 'adapterType', 'i32') }}};
641 {{{ makeSetValue('info', C_STRUCTS.WGPUAdapterInfo.vendorID, '0', 'i32') }}};
642 {{{ makeSetValue('info', C_STRUCTS.WGPUAdapterInfo.deviceID, '0', 'i32') }}};
643 },
644
645 wgpuAdapterGetLimits: (adapterPtr, limitsOutPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000646 var adapter = WebGPU.getJsObject(adapterPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +0000647 WebGPU.fillLimitStruct(adapter.limits, limitsOutPtr);
648 return 1;
649 },
650
Loko Kung5a9506d2024-08-17 01:44:45 +0000651 wgpuAdapterHasFeature: (adapterPtr, featureEnumValue) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000652 var adapter = WebGPU.getJsObject(adapterPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +0000653 return adapter.features.has(WebGPU.FeatureName[featureEnumValue]);
654 },
655
Lokbondo Kunga8fbe982024-08-30 04:46:53 +0000656 emwgpuAdapterRequestDevice__i53abi: false,
Lokbondo Kungda542472024-10-10 00:49:17 +0000657 emwgpuAdapterRequestDevice__deps: ['emwgpuCreateQueue', 'emwgpuOnDeviceLostCompleted', 'emwgpuOnRequestDeviceCompleted', 'emwgpuOnUncapturedError'],
Lokbondo Kunga8fbe982024-08-30 04:46:53 +0000658 emwgpuAdapterRequestDevice: (
659 adapterPtr,
660 futureIdL, futureIdH,
661 deviceLostFutureIdL, deviceLostFutureIdH,
662 devicePtr, queuePtr, descriptor
663 ) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000664 var adapter = WebGPU.getJsObject(adapterPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +0000665
666 var desc = {};
667 if (descriptor) {
668 {{{ gpu.makeCheckDescriptor('descriptor') }}}
669 var requiredFeatureCount = {{{ gpu.makeGetU32('descriptor', C_STRUCTS.WGPUDeviceDescriptor.requiredFeatureCount) }}};
670 if (requiredFeatureCount) {
671 var requiredFeaturesPtr = {{{ makeGetValue('descriptor', C_STRUCTS.WGPUDeviceDescriptor.requiredFeatures, '*') }}};
672 desc["requiredFeatures"] = Array.from({{{ makeHEAPView('32', 'requiredFeaturesPtr', `requiredFeaturesPtr + requiredFeatureCount * ${POINTER_SIZE}`) }}},
673 (feature) => WebGPU.FeatureName[feature]);
674 }
675 var requiredLimitsPtr = {{{ makeGetValue('descriptor', C_STRUCTS.WGPUDeviceDescriptor.requiredLimits, '*') }}};
676 if (requiredLimitsPtr) {
677 {{{ gpu.makeCheckDescriptor('requiredLimitsPtr') }}}
678 var limitsPtr = requiredLimitsPtr + {{{ C_STRUCTS.WGPURequiredLimits.limits }}};
679 var requiredLimits = {};
680 function setLimitU32IfDefined(name, limitOffset) {
681 var ptr = limitsPtr + limitOffset;
682 var value = {{{ gpu.makeGetU32('ptr', 0) }}};
683 if (value != {{{ gpu.LIMIT_U32_UNDEFINED }}}) {
684 requiredLimits[name] = value;
685 }
686 }
687 function setLimitU64IfDefined(name, limitOffset) {
688 var ptr = limitsPtr + limitOffset;
689 // Handle WGPU_LIMIT_U64_UNDEFINED.
690 var limitPart1 = {{{ gpu.makeGetU32('ptr', 0) }}};
691 var limitPart2 = {{{ gpu.makeGetU32('ptr', 4) }}};
692 if (limitPart1 != 0xFFFFFFFF || limitPart2 != 0xFFFFFFFF) {
693 requiredLimits[name] = {{{ gpu.makeGetU64('ptr', 0) }}}
694 }
695 }
696
697 setLimitU32IfDefined("maxTextureDimension1D", {{{ C_STRUCTS.WGPULimits.maxTextureDimension1D }}});
698 setLimitU32IfDefined("maxTextureDimension2D", {{{ C_STRUCTS.WGPULimits.maxTextureDimension2D }}});
699 setLimitU32IfDefined("maxTextureDimension3D", {{{ C_STRUCTS.WGPULimits.maxTextureDimension3D }}});
700 setLimitU32IfDefined("maxTextureArrayLayers", {{{ C_STRUCTS.WGPULimits.maxTextureArrayLayers }}});
701 setLimitU32IfDefined("maxBindGroups", {{{ C_STRUCTS.WGPULimits.maxBindGroups }}});
702 setLimitU32IfDefined('maxBindGroupsPlusVertexBuffers', {{{ C_STRUCTS.WGPULimits.maxBindGroupsPlusVertexBuffers }}});
703 setLimitU32IfDefined("maxDynamicUniformBuffersPerPipelineLayout", {{{ C_STRUCTS.WGPULimits.maxDynamicUniformBuffersPerPipelineLayout }}});
704 setLimitU32IfDefined("maxDynamicStorageBuffersPerPipelineLayout", {{{ C_STRUCTS.WGPULimits.maxDynamicStorageBuffersPerPipelineLayout }}});
705 setLimitU32IfDefined("maxSampledTexturesPerShaderStage", {{{ C_STRUCTS.WGPULimits.maxSampledTexturesPerShaderStage }}});
706 setLimitU32IfDefined("maxSamplersPerShaderStage", {{{ C_STRUCTS.WGPULimits.maxSamplersPerShaderStage }}});
707 setLimitU32IfDefined("maxStorageBuffersPerShaderStage", {{{ C_STRUCTS.WGPULimits.maxStorageBuffersPerShaderStage }}});
708 setLimitU32IfDefined("maxStorageTexturesPerShaderStage", {{{ C_STRUCTS.WGPULimits.maxStorageTexturesPerShaderStage }}});
709 setLimitU32IfDefined("maxUniformBuffersPerShaderStage", {{{ C_STRUCTS.WGPULimits.maxUniformBuffersPerShaderStage }}});
710 setLimitU32IfDefined("minUniformBufferOffsetAlignment", {{{ C_STRUCTS.WGPULimits.minUniformBufferOffsetAlignment }}});
711 setLimitU32IfDefined("minStorageBufferOffsetAlignment", {{{ C_STRUCTS.WGPULimits.minStorageBufferOffsetAlignment }}});
712 setLimitU64IfDefined("maxUniformBufferBindingSize", {{{ C_STRUCTS.WGPULimits.maxUniformBufferBindingSize }}});
713 setLimitU64IfDefined("maxStorageBufferBindingSize", {{{ C_STRUCTS.WGPULimits.maxStorageBufferBindingSize }}});
714 setLimitU32IfDefined("maxVertexBuffers", {{{ C_STRUCTS.WGPULimits.maxVertexBuffers }}});
715 setLimitU64IfDefined("maxBufferSize", {{{ C_STRUCTS.WGPULimits.maxBufferSize }}});
716 setLimitU32IfDefined("maxVertexAttributes", {{{ C_STRUCTS.WGPULimits.maxVertexAttributes }}});
717 setLimitU32IfDefined("maxVertexBufferArrayStride", {{{ C_STRUCTS.WGPULimits.maxVertexBufferArrayStride }}});
718 setLimitU32IfDefined("maxInterStageShaderComponents", {{{ C_STRUCTS.WGPULimits.maxInterStageShaderComponents }}});
719 setLimitU32IfDefined("maxInterStageShaderVariables", {{{ C_STRUCTS.WGPULimits.maxInterStageShaderVariables }}});
720 setLimitU32IfDefined("maxColorAttachments", {{{ C_STRUCTS.WGPULimits.maxColorAttachments }}});
721 setLimitU32IfDefined("maxColorAttachmentBytesPerSample", {{{ C_STRUCTS.WGPULimits.maxColorAttachmentBytesPerSample }}});
722 setLimitU32IfDefined("maxComputeWorkgroupStorageSize", {{{ C_STRUCTS.WGPULimits.maxComputeWorkgroupStorageSize }}});
723 setLimitU32IfDefined("maxComputeInvocationsPerWorkgroup", {{{ C_STRUCTS.WGPULimits.maxComputeInvocationsPerWorkgroup }}});
724 setLimitU32IfDefined("maxComputeWorkgroupSizeX", {{{ C_STRUCTS.WGPULimits.maxComputeWorkgroupSizeX }}});
725 setLimitU32IfDefined("maxComputeWorkgroupSizeY", {{{ C_STRUCTS.WGPULimits.maxComputeWorkgroupSizeY }}});
726 setLimitU32IfDefined("maxComputeWorkgroupSizeZ", {{{ C_STRUCTS.WGPULimits.maxComputeWorkgroupSizeZ }}});
727 setLimitU32IfDefined("maxComputeWorkgroupsPerDimension", {{{ C_STRUCTS.WGPULimits.maxComputeWorkgroupsPerDimension }}});
728 desc["requiredLimits"] = requiredLimits;
729 }
730
731 var defaultQueuePtr = {{{ makeGetValue('descriptor', C_STRUCTS.WGPUDeviceDescriptor.defaultQueue, '*') }}};
732 if (defaultQueuePtr) {
733 var defaultQueueDesc = {};
734 var labelPtr = {{{ makeGetValue('defaultQueuePtr', C_STRUCTS.WGPUQueueDescriptor.label, '*') }}};
735 if (labelPtr) defaultQueueDesc["label"] = UTF8ToString(labelPtr);
736 desc["defaultQueue"] = defaultQueueDesc;
737 }
738
Loko Kung5a9506d2024-08-17 01:44:45 +0000739 var labelPtr = {{{ makeGetValue('descriptor', C_STRUCTS.WGPUDeviceDescriptor.label, '*') }}};
740 if (labelPtr) desc["label"] = UTF8ToString(labelPtr);
741 }
742
743 {{{ runtimeKeepalivePush() }}}
Lokbondo Kunga8fbe982024-08-30 04:46:53 +0000744 var hasDeviceLostFutureId = !!deviceLostFutureIdH || !!deviceLostFutureIdL;
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000745 WebGPU.Internals.futureInsert(futureIdL, futureIdH, adapter.requestDevice(desc).then((device) => {
Loko Kung5a9506d2024-08-17 01:44:45 +0000746 {{{ runtimeKeepalivePop() }}}
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000747 WebGPU.Internals.jsObjectInsert(queuePtr, device.queue);
748 WebGPU.Internals.jsObjectInsert(devicePtr, device);
Loko Kung5a9506d2024-08-17 01:44:45 +0000749
Lokbondo Kunga8fbe982024-08-30 04:46:53 +0000750 // Set up device lost promise resolution.
751 if (hasDeviceLostFutureId) {
Kai Ninomiyae7ad6c42024-09-06 10:14:22 +0000752 {{{ runtimeKeepalivePush() }}}
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000753 WebGPU.Internals.futureInsert(deviceLostFutureIdL, deviceLostFutureIdH, device.lost.then((info) => {
Kai Ninomiyae7ad6c42024-09-06 10:14:22 +0000754 {{{ runtimeKeepalivePop() }}}
Lokbondo Kunga8fbe982024-08-30 04:46:53 +0000755 // Unset the uncaptured error handler.
756 device.onuncapturederror = (ev) => {};
Lokbondo Kungb9670942024-09-20 10:29:15 +0000757 var sp = stackSave();
758 var messagePtr = stringToUTF8OnStack(info.message);
759 _emwgpuOnDeviceLostCompleted(deviceLostFutureIdL, deviceLostFutureIdH, WebGPU.Int_DeviceLostReason[info.reason], messagePtr);
760 stackRestore(sp);
Lokbondo Kunga8fbe982024-08-30 04:46:53 +0000761 }));
762 }
763
764 // Set up uncaptured error handlers.
765#if ASSERTIONS
766 assert(typeof GPUValidationError != 'undefined');
767 assert(typeof GPUOutOfMemoryError != 'undefined');
768 assert(typeof GPUInternalError != 'undefined');
769#endif
770 device.onuncapturederror = (ev) => {
771 var type = {{{ gpu.ErrorType.Unknown }}};;
772 if (ev.error instanceof GPUValidationError) type = {{{ gpu.ErrorType.Validation }}};
773 else if (ev.error instanceof GPUOutOfMemoryError) type = {{{ gpu.ErrorType.OutOfMemory }}};
774 else if (ev.error instanceof GPUInternalError) type = {{{ gpu.ErrorType.Internal }}};
Lokbondo Kungb9670942024-09-20 10:29:15 +0000775 var sp = stackSave();
776 var messagePtr = stringToUTF8OnStack(ev.error.message);
777 _emwgpuOnUncapturedError(devicePtr, type, messagePtr);
778 stackRestore(sp);
Lokbondo Kunga8fbe982024-08-30 04:46:53 +0000779 };
780
781 _emwgpuOnRequestDeviceCompleted(futureIdL, futureIdH, {{{ gpu.RequestDeviceStatus.Success }}}, devicePtr, 0);
782 }, (ex) => {
Loko Kung5a9506d2024-08-17 01:44:45 +0000783 {{{ runtimeKeepalivePop() }}}
Lokbondo Kungb9670942024-09-20 10:29:15 +0000784 var sp = stackSave();
785 var messagePtr = stringToUTF8OnStack(ex.message);
786 _emwgpuOnRequestDeviceCompleted(futureIdL, futureIdH, {{{ gpu.RequestDeviceStatus.Error }}}, devicePtr, messagePtr);
787 if (hasDeviceLostFutureId) {
788 _emwgpuOnDeviceLostCompleted(deviceLostFutureIdL, deviceLostFutureIdH, {{{ gpu.DeviceLostReason.FailedCreation }}}, messagePtr);
789 }
790 stackRestore(sp);
Lokbondo Kunga8fbe982024-08-30 04:46:53 +0000791 }));
Loko Kung5a9506d2024-08-17 01:44:45 +0000792 },
793
794 // --------------------------------------------------------------------------
795 // Methods of BindGroup
796 // --------------------------------------------------------------------------
797
798 wgpuBindGroupSetLabel: (bindGroupPtr, labelPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000799 var bindGroup = WebGPU.getJsObject(bindGroupPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +0000800 bindGroup.label = UTF8ToString(labelPtr);
801 },
802
803 // --------------------------------------------------------------------------
804 // Methods of BindGroupLayout
805 // --------------------------------------------------------------------------
806
807 wgpuBindGroupLayoutSetLabel: (bindGroupLayoutPtr, labelPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000808 var bindGroupLayout = WebGPU.getJsObject(bindGroupLayoutPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +0000809 bindGroupLayout.label = UTF8ToString(labelPtr);
810 },
811
812 // --------------------------------------------------------------------------
813 // Methods of Buffer
814 // --------------------------------------------------------------------------
815
Lokbondo Kungda542472024-10-10 00:49:17 +0000816 emwgpuBufferDestroy: (bufferPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000817 var buffer = WebGPU.getJsObject(bufferPtr);
818 var onUnmap = WebGPU.Internals.bufferOnUnmaps[bufferPtr];
819 if (onUnmap) {
820 for (var i = 0; i < onUnmap.length; ++i) {
821 onUnmap[i]();
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000822 }
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000823 delete WebGPU.Internals.bufferOnUnmaps[bufferPtr];
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000824 }
825
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000826 buffer.destroy();
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000827 },
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000828
Loko Kung5a9506d2024-08-17 01:44:45 +0000829 // In webgpu.h offset and size are passed in as size_t.
830 // And library_webgpu assumes that size_t is always 32bit in emscripten.
Lokbondo Kungda542472024-10-10 00:49:17 +0000831 emwgpuBufferGetConstMappedRange__deps: ['$warnOnce', 'memalign', 'free'],
832 emwgpuBufferGetConstMappedRange: (bufferPtr, offset, size) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000833 var buffer = WebGPU.getJsObject(bufferPtr);
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000834
Loko Kung5a9506d2024-08-17 01:44:45 +0000835 if (size === 0) warnOnce('getMappedRange size=0 no longer means WGPU_WHOLE_MAP_SIZE');
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000836
Loko Kung5a9506d2024-08-17 01:44:45 +0000837 {{{ gpu.convertSentinelToUndefined('size') }}}
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000838
Loko Kung5a9506d2024-08-17 01:44:45 +0000839 var mapped;
840 try {
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000841 mapped = buffer.getMappedRange(offset, size);
Loko Kung5a9506d2024-08-17 01:44:45 +0000842 } catch (ex) {
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000843#if ASSERTIONS
Loko Kung5a9506d2024-08-17 01:44:45 +0000844 err(`wgpuBufferGetConstMappedRange(${offset}, ${size}) failed: ${ex}`);
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000845#endif
Loko Kung5a9506d2024-08-17 01:44:45 +0000846 // TODO(kainino0x): Somehow inject a validation error?
847 return 0;
848 }
849 var data = _memalign(16, mapped.byteLength);
850 HEAPU8.set(new Uint8Array(mapped), data);
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000851 WebGPU.Internals.bufferOnUnmaps[bufferPtr].push(() => _free(data));
Loko Kung5a9506d2024-08-17 01:44:45 +0000852 return data;
853 },
854
Loko Kung5a9506d2024-08-17 01:44:45 +0000855 // In webgpu.h offset and size are passed in as size_t.
856 // And library_webgpu assumes that size_t is always 32bit in emscripten.
Lokbondo Kungda542472024-10-10 00:49:17 +0000857 emwgpuBufferGetMappedRange__deps: ['$warnOnce', 'memalign', 'free'],
858 emwgpuBufferGetMappedRange: (bufferPtr, offset, size) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000859 var buffer = WebGPU.getJsObject(bufferPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +0000860
861 if (size === 0) warnOnce('getMappedRange size=0 no longer means WGPU_WHOLE_MAP_SIZE');
862
863 {{{ gpu.convertSentinelToUndefined('size') }}}
864
Loko Kung5a9506d2024-08-17 01:44:45 +0000865 var mapped;
866 try {
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000867 mapped = buffer.getMappedRange(offset, size);
Loko Kung5a9506d2024-08-17 01:44:45 +0000868 } catch (ex) {
869#if ASSERTIONS
870 err(`wgpuBufferGetMappedRange(${offset}, ${size}) failed: ${ex}`);
871#endif
872 // TODO(kainino0x): Somehow inject a validation error?
873 return 0;
874 }
875
876 var data = _memalign(16, mapped.byteLength);
877 HEAPU8.fill(0, data, mapped.byteLength);
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000878 WebGPU.Internals.bufferOnUnmaps[bufferPtr].push(() => {
Loko Kung5a9506d2024-08-17 01:44:45 +0000879 new Uint8Array(mapped).set(HEAPU8.subarray(data, data + mapped.byteLength));
880 _free(data);
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000881 });
Loko Kung5a9506d2024-08-17 01:44:45 +0000882 return data;
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000883 },
884
Loko Kung5a9506d2024-08-17 01:44:45 +0000885 wgpuBufferGetSize: (bufferPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000886 var buffer = WebGPU.getJsObject(bufferPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +0000887 // 64-bit
888 return buffer.size;
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000889 },
890
Loko Kung5a9506d2024-08-17 01:44:45 +0000891 wgpuBufferGetUsage: (bufferPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000892 var buffer = WebGPU.getJsObject(bufferPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +0000893 return buffer.usage;
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000894 },
895
Loko Kung5a9506d2024-08-17 01:44:45 +0000896 // In webgpu.h offset and size are passed in as size_t.
897 // And library_webgpu assumes that size_t is always 32bit in emscripten.
Lokbondo Kungda542472024-10-10 00:49:17 +0000898 emwgpuBufferMapAsync__i53abi: false,
899 emwgpuBufferMapAsync__deps: ['emwgpuOnMapAsyncCompleted'],
900 emwgpuBufferMapAsync: (bufferPtr, futureIdL, futureIdH, mode, offset, size) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000901 var buffer = WebGPU.getJsObject(bufferPtr);
902 WebGPU.Internals.bufferOnUnmaps[bufferPtr] = [];
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000903
Loko Kung5a9506d2024-08-17 01:44:45 +0000904 {{{ gpu.convertSentinelToUndefined('size') }}}
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000905
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000906 {{{ runtimeKeepalivePush() }}}
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000907 WebGPU.Internals.futureInsert(futureIdL, futureIdH, buffer.mapAsync(mode, offset, size).then(() => {
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000908 {{{ runtimeKeepalivePop() }}}
Lokbondo Kungda542472024-10-10 00:49:17 +0000909 _emwgpuOnMapAsyncCompleted(futureIdL, futureIdH, {{{ gpu.MapAsyncStatus.Success }}}, 0);
910 }, (ex) => {
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000911 {{{ runtimeKeepalivePop() }}}
Lokbondo Kungda542472024-10-10 00:49:17 +0000912 var sp = stackSave();
913 var messagePtr = stringToUTF8OnStack(ex.message);
914 var status =
915 ex instanceof AbortError ? {{{ gpu.MapAsyncStatus.Aborted }}} :
916 ex instanceof OperationError ? {{{ gpu.MapAsyncStatus.Error }}} :
917 {{{ gpu.MapAsyncStatus.Unknown }}};
918 _emwgpuOnMapAsyncCompleted(futureIdL, futureIdH, status, messagePtr);
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000919 delete WebGPU.Internals.bufferOnUnmaps[bufferPtr];
Lokbondo Kungda542472024-10-10 00:49:17 +0000920 }));
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000921 },
922
Loko Kung5a9506d2024-08-17 01:44:45 +0000923 wgpuBufferSetLabel: (bufferPtr, labelPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000924 var buffer = WebGPU.getJsObject(bufferPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +0000925 buffer.label = UTF8ToString(labelPtr);
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000926 },
927
Lokbondo Kungda542472024-10-10 00:49:17 +0000928 emwgpuBufferUnmap: (bufferPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000929 var buffer = WebGPU.getJsObject(bufferPtr);
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000930
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000931 var onUnmap = WebGPU.Internals.bufferOnUnmaps[bufferPtr];
932 if (!onUnmap) {
Loko Kung5a9506d2024-08-17 01:44:45 +0000933 // Already unmapped
934 return;
935 }
936
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000937 for (var i = 0; i < onUnmap.length; ++i) {
938 onUnmap[i]();
Loko Kung5a9506d2024-08-17 01:44:45 +0000939 }
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000940 delete WebGPU.Internals.bufferOnUnmaps[bufferPtr]
Loko Kung5a9506d2024-08-17 01:44:45 +0000941
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000942 buffer.unmap();
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000943 },
944
Loko Kung5a9506d2024-08-17 01:44:45 +0000945 // --------------------------------------------------------------------------
946 // Methods of CommandBuffer
947 // --------------------------------------------------------------------------
948
949 wgpuCommandBufferSetLabel: (commandBufferPtr, labelPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000950 var commandBuffer = WebGPU.getJsObject(commandBufferPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +0000951 commandBuffer.label = UTF8ToString(labelPtr);
952 },
953
954 // --------------------------------------------------------------------------
955 // Methods of CommandEncoder
956 // --------------------------------------------------------------------------
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000957
Loko Kung424cda22024-08-17 01:29:10 +0000958 wgpuCommandEncoderBeginComputePass__deps: ['emwgpuCreateComputePassEncoder'],
Loko Kung5a9506d2024-08-17 01:44:45 +0000959 wgpuCommandEncoderBeginComputePass: (encoderPtr, descriptor) => {
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000960 var desc;
961
962 function makeComputePassTimestampWrites(twPtr) {
963 if (twPtr === 0) return undefined;
964
965 return {
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000966 "querySet": WebGPU.getJsObject(
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000967 {{{ makeGetValue('twPtr', C_STRUCTS.WGPUComputePassTimestampWrites.querySet, '*') }}}),
968 "beginningOfPassWriteIndex": {{{ gpu.makeGetU32('twPtr', C_STRUCTS.WGPUComputePassTimestampWrites.beginningOfPassWriteIndex) }}},
969 "endOfPassWriteIndex": {{{ gpu.makeGetU32('twPtr', C_STRUCTS.WGPUComputePassTimestampWrites.endOfPassWriteIndex) }}},
970 };
971 }
972
973 if (descriptor) {
974 {{{ gpu.makeCheckDescriptor('descriptor') }}}
975 desc = {
976 "label": undefined,
977 "timestampWrites": makeComputePassTimestampWrites(
978 {{{ makeGetValue('descriptor', C_STRUCTS.WGPUComputePassDescriptor.timestampWrites, '*') }}}),
979 };
980 var labelPtr = {{{ makeGetValue('descriptor', C_STRUCTS.WGPUComputePassDescriptor.label, '*') }}};
981 if (labelPtr) desc["label"] = UTF8ToString(labelPtr);
982
983 }
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000984 var commandEncoder = WebGPU.getJsObject(encoderPtr);
Loko Kung424cda22024-08-17 01:29:10 +0000985 var ptr = _emwgpuCreateComputePassEncoder();
Lokbondo Kung83ebea32024-10-11 22:40:03 +0000986 WebGPU.Internals.jsObjectInsert(ptr, commandEncoder.beginComputePass(desc));
Loko Kung424cda22024-08-17 01:29:10 +0000987 return ptr;
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000988 },
989
Loko Kung424cda22024-08-17 01:29:10 +0000990 wgpuCommandEncoderBeginRenderPass__deps: ['emwgpuCreateRenderPassEncoder'],
Loko Kung5a9506d2024-08-17 01:44:45 +0000991 wgpuCommandEncoderBeginRenderPass: (encoderPtr, descriptor) => {
Kai Ninomiyaace5a582024-07-02 20:52:25 +0000992 {{{ gpu.makeCheck('descriptor') }}}
993
994 function makeColorAttachment(caPtr) {
995 var viewPtr = {{{ gpu.makeGetU32('caPtr', C_STRUCTS.WGPURenderPassColorAttachment.view) }}};
996 if (viewPtr === 0) {
997 // view could be undefined.
998 return undefined;
999 }
1000
1001 var depthSlice = {{{ makeGetValue('caPtr', C_STRUCTS.WGPURenderPassColorAttachment.depthSlice, 'i32') }}};
1002 {{{ gpu.convertSentinelToUndefined('depthSlice') }}}
1003
1004 var loadOpInt = {{{ gpu.makeGetU32('caPtr', C_STRUCTS.WGPURenderPassColorAttachment.loadOp) }}};
1005 #if ASSERTIONS
1006 assert(loadOpInt !== {{{ gpu.LoadOp.Undefined }}});
1007 #endif
1008
1009 var storeOpInt = {{{ gpu.makeGetU32('caPtr', C_STRUCTS.WGPURenderPassColorAttachment.storeOp) }}};
1010 #if ASSERTIONS
1011 assert(storeOpInt !== {{{ gpu.StoreOp.Undefined }}});
1012 #endif
1013
1014 var clearValue = WebGPU.makeColor(caPtr + {{{ C_STRUCTS.WGPURenderPassColorAttachment.clearValue }}});
1015
1016 return {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001017 "view": WebGPU.getJsObject(viewPtr),
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001018 "depthSlice": depthSlice,
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001019 "resolveTarget": WebGPU.getJsObject(
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001020 {{{ gpu.makeGetU32('caPtr', C_STRUCTS.WGPURenderPassColorAttachment.resolveTarget) }}}),
1021 "clearValue": clearValue,
1022 "loadOp": WebGPU.LoadOp[loadOpInt],
1023 "storeOp": WebGPU.StoreOp[storeOpInt],
1024 };
1025 }
1026
1027 function makeColorAttachments(count, caPtr) {
1028 var attachments = [];
1029 for (var i = 0; i < count; ++i) {
1030 attachments.push(makeColorAttachment(caPtr + {{{ C_STRUCTS.WGPURenderPassColorAttachment.__size__ }}} * i));
1031 }
1032 return attachments;
1033 }
1034
1035 function makeDepthStencilAttachment(dsaPtr) {
1036 if (dsaPtr === 0) return undefined;
1037
1038 return {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001039 "view": WebGPU.getJsObject(
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001040 {{{ gpu.makeGetU32('dsaPtr', C_STRUCTS.WGPURenderPassDepthStencilAttachment.view) }}}),
1041 "depthClearValue": {{{ makeGetValue('dsaPtr', C_STRUCTS.WGPURenderPassDepthStencilAttachment.depthClearValue, 'float') }}},
1042 "depthLoadOp": WebGPU.LoadOp[
1043 {{{ gpu.makeGetU32('dsaPtr', C_STRUCTS.WGPURenderPassDepthStencilAttachment.depthLoadOp) }}}],
1044 "depthStoreOp": WebGPU.StoreOp[
1045 {{{ gpu.makeGetU32('dsaPtr', C_STRUCTS.WGPURenderPassDepthStencilAttachment.depthStoreOp) }}}],
1046 "depthReadOnly": {{{ gpu.makeGetBool('dsaPtr', C_STRUCTS.WGPURenderPassDepthStencilAttachment.depthReadOnly) }}},
1047 "stencilClearValue": {{{ gpu.makeGetU32('dsaPtr', C_STRUCTS.WGPURenderPassDepthStencilAttachment.stencilClearValue) }}},
1048 "stencilLoadOp": WebGPU.LoadOp[
1049 {{{ gpu.makeGetU32('dsaPtr', C_STRUCTS.WGPURenderPassDepthStencilAttachment.stencilLoadOp) }}}],
1050 "stencilStoreOp": WebGPU.StoreOp[
1051 {{{ gpu.makeGetU32('dsaPtr', C_STRUCTS.WGPURenderPassDepthStencilAttachment.stencilStoreOp) }}}],
1052 "stencilReadOnly": {{{ gpu.makeGetBool('dsaPtr', C_STRUCTS.WGPURenderPassDepthStencilAttachment.stencilReadOnly) }}},
1053 };
1054 }
1055
1056 function makeRenderPassTimestampWrites(twPtr) {
1057 if (twPtr === 0) return undefined;
1058
1059 return {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001060 "querySet": WebGPU.getJsObject(
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001061 {{{ makeGetValue('twPtr', C_STRUCTS.WGPURenderPassTimestampWrites.querySet, '*') }}}),
1062 "beginningOfPassWriteIndex": {{{ gpu.makeGetU32('twPtr', C_STRUCTS.WGPURenderPassTimestampWrites.beginningOfPassWriteIndex) }}},
1063 "endOfPassWriteIndex": {{{ gpu.makeGetU32('twPtr', C_STRUCTS.WGPURenderPassTimestampWrites.endOfPassWriteIndex) }}},
1064 };
1065 }
1066
1067 function makeRenderPassDescriptor(descriptor) {
1068 {{{ gpu.makeCheck('descriptor') }}}
1069 var nextInChainPtr = {{{ makeGetValue('descriptor', C_STRUCTS.WGPURenderPassDescriptor.nextInChain, '*') }}};
1070
1071 var maxDrawCount = undefined;
1072 if (nextInChainPtr !== 0) {
1073 var sType = {{{ gpu.makeGetU32('nextInChainPtr', C_STRUCTS.WGPUChainedStruct.sType) }}};
1074#if ASSERTIONS
Lokbondo Kungb339ed42024-09-06 02:49:19 +00001075 assert(sType === {{{ gpu.SType.RenderPassMaxDrawCount }}});
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001076 assert(0 === {{{ makeGetValue('nextInChainPtr', C_STRUCTS.WGPUChainedStruct.next, '*') }}});
1077#endif
Lokbondo Kungb339ed42024-09-06 02:49:19 +00001078 var renderPassMaxDrawCount = nextInChainPtr;
1079 {{{ gpu.makeCheckDescriptor('renderPassMaxDrawCount') }}}
1080 maxDrawCount = {{{ gpu.makeGetU64('renderPassMaxDrawCount', C_STRUCTS.WGPURenderPassMaxDrawCount.maxDrawCount) }}};
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001081 }
1082
1083 var desc = {
1084 "label": undefined,
1085 "colorAttachments": makeColorAttachments(
1086 {{{ gpu.makeGetU32('descriptor', C_STRUCTS.WGPURenderPassDescriptor.colorAttachmentCount) }}},
1087 {{{ makeGetValue('descriptor', C_STRUCTS.WGPURenderPassDescriptor.colorAttachments, '*') }}}),
1088 "depthStencilAttachment": makeDepthStencilAttachment(
1089 {{{ makeGetValue('descriptor', C_STRUCTS.WGPURenderPassDescriptor.depthStencilAttachment, '*') }}}),
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001090 "occlusionQuerySet": WebGPU.getJsObject(
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001091 {{{ makeGetValue('descriptor', C_STRUCTS.WGPURenderPassDescriptor.occlusionQuerySet, '*') }}}),
1092 "timestampWrites": makeRenderPassTimestampWrites(
1093 {{{ makeGetValue('descriptor', C_STRUCTS.WGPURenderPassDescriptor.timestampWrites, '*') }}}),
1094 "maxDrawCount": maxDrawCount,
1095 };
1096 var labelPtr = {{{ makeGetValue('descriptor', C_STRUCTS.WGPURenderPassDescriptor.label, '*') }}};
1097 if (labelPtr) desc["label"] = UTF8ToString(labelPtr);
1098
1099 return desc;
1100 }
1101
1102 var desc = makeRenderPassDescriptor(descriptor);
1103
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001104 var commandEncoder = WebGPU.getJsObject(encoderPtr);
Loko Kung424cda22024-08-17 01:29:10 +00001105 var ptr = _emwgpuCreateRenderPassEncoder();
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001106 WebGPU.Internals.jsObjectInsert(ptr, commandEncoder.beginRenderPass(desc));
Loko Kung424cda22024-08-17 01:29:10 +00001107 return ptr;
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001108 },
1109
Loko Kung5a9506d2024-08-17 01:44:45 +00001110 wgpuCommandEncoderClearBuffer: (encoderPtr, bufferPtr, offset, size) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001111 var commandEncoder = WebGPU.getJsObject(encoderPtr);
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001112 {{{ gpu.convertSentinelToUndefined('size') }}}
1113
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001114 var buffer = WebGPU.getJsObject(bufferPtr);
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001115 commandEncoder.clearBuffer(buffer, offset, size);
1116 },
1117
Loko Kung5a9506d2024-08-17 01:44:45 +00001118 wgpuCommandEncoderCopyBufferToBuffer: (encoderPtr, srcPtr, srcOffset, dstPtr, dstOffset, size) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001119 var commandEncoder = WebGPU.getJsObject(encoderPtr);
1120 var src = WebGPU.getJsObject(srcPtr);
1121 var dst = WebGPU.getJsObject(dstPtr);
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001122 commandEncoder.copyBufferToBuffer(src, srcOffset, dst, dstOffset, size);
1123 },
1124
Loko Kung5a9506d2024-08-17 01:44:45 +00001125 wgpuCommandEncoderCopyBufferToTexture: (encoderPtr, srcPtr, dstPtr, copySizePtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001126 var commandEncoder = WebGPU.getJsObject(encoderPtr);
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001127 var copySize = WebGPU.makeExtent3D(copySizePtr);
1128 commandEncoder.copyBufferToTexture(
1129 WebGPU.makeImageCopyBuffer(srcPtr), WebGPU.makeImageCopyTexture(dstPtr), copySize);
1130 },
1131
Loko Kung5a9506d2024-08-17 01:44:45 +00001132 wgpuCommandEncoderCopyTextureToBuffer: (encoderPtr, srcPtr, dstPtr, copySizePtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001133 var commandEncoder = WebGPU.getJsObject(encoderPtr);
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001134 var copySize = WebGPU.makeExtent3D(copySizePtr);
1135 commandEncoder.copyTextureToBuffer(
1136 WebGPU.makeImageCopyTexture(srcPtr), WebGPU.makeImageCopyBuffer(dstPtr), copySize);
1137 },
1138
Loko Kung5a9506d2024-08-17 01:44:45 +00001139 wgpuCommandEncoderCopyTextureToTexture: (encoderPtr, srcPtr, dstPtr, copySizePtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001140 var commandEncoder = WebGPU.getJsObject(encoderPtr);
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001141 var copySize = WebGPU.makeExtent3D(copySizePtr);
1142 commandEncoder.copyTextureToTexture(
1143 WebGPU.makeImageCopyTexture(srcPtr), WebGPU.makeImageCopyTexture(dstPtr), copySize);
1144 },
1145
Loko Kung424cda22024-08-17 01:29:10 +00001146 wgpuCommandEncoderFinish__deps: ['emwgpuCreateCommandBuffer'],
Loko Kung5a9506d2024-08-17 01:44:45 +00001147 wgpuCommandEncoderFinish: (encoderPtr, descriptor) => {
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001148 // TODO: Use the descriptor.
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001149 var commandEncoder = WebGPU.getJsObject(encoderPtr);
Loko Kung424cda22024-08-17 01:29:10 +00001150 var ptr = _emwgpuCreateCommandBuffer();
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001151 WebGPU.Internals.jsObjectInsert(ptr, commandEncoder.finish());
Loko Kung424cda22024-08-17 01:29:10 +00001152 return ptr;
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001153 },
1154
Loko Kung5a9506d2024-08-17 01:44:45 +00001155 wgpuCommandEncoderInsertDebugMarker: (encoderPtr, markerLabelPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001156 var encoder = WebGPU.getJsObject(encoderPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00001157 encoder.insertDebugMarker(UTF8ToString(markerLabelPtr));
1158 },
1159
1160 wgpuCommandEncoderPopDebugGroup: (encoderPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001161 var encoder = WebGPU.getJsObject(encoderPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00001162 encoder.popDebugGroup();
1163 },
1164
1165 wgpuCommandEncoderPushDebugGroup: (encoderPtr, groupLabelPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001166 var encoder = WebGPU.getJsObject(encoderPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00001167 encoder.pushDebugGroup(UTF8ToString(groupLabelPtr));
1168 },
1169
1170 wgpuCommandEncoderResolveQuerySet: (encoderPtr, querySetPtr, firstQuery, queryCount, destinationPtr, destinationOffset) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001171 var commandEncoder = WebGPU.getJsObject(encoderPtr);
1172 var querySet = WebGPU.getJsObject(querySetPtr);
1173 var destination = WebGPU.getJsObject(destinationPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00001174
1175 commandEncoder.resolveQuerySet(querySet, firstQuery, queryCount, destination, destinationOffset);
1176 },
1177
1178 wgpuCommandEncoderSetLabel: (encoderPtr, labelPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001179 var commandEncoder = WebGPU.getJsObject(encoderPtr);
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001180 commandEncoder.label = UTF8ToString(labelPtr);
1181 },
1182
Loko Kung5a9506d2024-08-17 01:44:45 +00001183 wgpuCommandEncoderWriteTimestamp: (encoderPtr, querySetPtr, queryIndex) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001184 var commandEncoder = WebGPU.getJsObject(encoderPtr);
1185 var querySet = WebGPU.getJsObject(querySetPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00001186 commandEncoder.writeTimestamp(querySet, queryIndex);
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001187 },
1188
Loko Kung5a9506d2024-08-17 01:44:45 +00001189 // --------------------------------------------------------------------------
1190 // Methods of ComputePassEncoder
1191 // --------------------------------------------------------------------------
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001192
Loko Kung5a9506d2024-08-17 01:44:45 +00001193 wgpuComputePassEncoderDispatchWorkgroups: (passPtr, x, y, z) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001194 var pass = WebGPU.getJsObject(passPtr);
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001195 pass.dispatchWorkgroups(x, y, z);
1196 },
Loko Kung5a9506d2024-08-17 01:44:45 +00001197
1198 wgpuComputePassEncoderDispatchWorkgroupsIndirect: (passPtr, indirectBufferPtr, indirectOffset) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001199 var indirectBuffer = WebGPU.getJsObject(indirectBufferPtr);
1200 var pass = WebGPU.getJsObject(passPtr);
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001201 pass.dispatchWorkgroupsIndirect(indirectBuffer, indirectOffset);
1202 },
1203
Loko Kung5a9506d2024-08-17 01:44:45 +00001204 wgpuComputePassEncoderEnd: (passPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001205 var pass = WebGPU.getJsObject(passPtr);
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001206 pass.end();
1207 },
1208
Loko Kung5a9506d2024-08-17 01:44:45 +00001209 wgpuComputePassEncoderInsertDebugMarker: (encoderPtr, markerLabelPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001210 var encoder = WebGPU.getJsObject(encoderPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00001211 encoder.insertDebugMarker(UTF8ToString(markerLabelPtr));
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001212 },
1213
Loko Kung5a9506d2024-08-17 01:44:45 +00001214 wgpuComputePassEncoderPopDebugGroup: (encoderPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001215 var encoder = WebGPU.getJsObject(encoderPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00001216 encoder.popDebugGroup();
1217 },
1218
1219 wgpuComputePassEncoderPushDebugGroup: (encoderPtr, groupLabelPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001220 var encoder = WebGPU.getJsObject(encoderPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00001221 encoder.pushDebugGroup(UTF8ToString(groupLabelPtr));
1222 },
1223
1224 wgpuComputePassEncoderSetBindGroup: (passPtr, groupIndex, groupPtr, dynamicOffsetCount, dynamicOffsetsPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001225 var pass = WebGPU.getJsObject(passPtr);
1226 var group = WebGPU.getJsObject(groupPtr);
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001227 if (dynamicOffsetCount == 0) {
1228 pass.setBindGroup(groupIndex, group);
1229 } else {
1230 var offsets = [];
1231 for (var i = 0; i < dynamicOffsetCount; i++, dynamicOffsetsPtr += 4) {
1232 offsets.push({{{ gpu.makeGetU32('dynamicOffsetsPtr', 0) }}});
1233 }
1234 pass.setBindGroup(groupIndex, group, offsets);
1235 }
1236 },
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001237
Loko Kung5a9506d2024-08-17 01:44:45 +00001238 wgpuComputePassEncoderSetLabel: (passPtr, labelPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001239 var pass = WebGPU.getJsObject(passPtr);
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001240 pass.label = UTF8ToString(labelPtr);
1241 },
1242
Loko Kung5a9506d2024-08-17 01:44:45 +00001243 wgpuComputePassEncoderSetPipeline: (passPtr, pipelinePtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001244 var pass = WebGPU.getJsObject(passPtr);
1245 var pipeline = WebGPU.getJsObject(pipelinePtr);
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001246 pass.setPipeline(pipeline);
1247 },
Loko Kung5a9506d2024-08-17 01:44:45 +00001248
1249 wgpuComputePassEncoderWriteTimestamp: (encoderPtr, querySetPtr, queryIndex) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001250 var encoder = WebGPU.getJsObject(encoderPtr);
1251 var querySet = WebGPU.getJsObject(querySetPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00001252 encoder.writeTimestamp(querySet, queryIndex);
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001253 },
1254
Loko Kung5a9506d2024-08-17 01:44:45 +00001255 // --------------------------------------------------------------------------
1256 // Methods of ComputePipeline
1257 // --------------------------------------------------------------------------
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001258
Loko Kung5a9506d2024-08-17 01:44:45 +00001259 wgpuComputePipelineGetBindGroupLayout__deps: ['emwgpuCreateBindGroupLayout'],
1260 wgpuComputePipelineGetBindGroupLayout: (pipelinePtr, groupIndex) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001261 var pipeline = WebGPU.getJsObject(pipelinePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00001262 var ptr = _emwgpuCreateBindGroupLayout();
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001263 WebGPU.Internals.jsObjectInsert(ptr, pipeline.getBindGroupLayout(groupIndex));
Loko Kung424cda22024-08-17 01:29:10 +00001264 return ptr;
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001265 },
1266
Loko Kung5a9506d2024-08-17 01:44:45 +00001267 wgpuComputePipelineSetLabel: (pipelinePtr, labelPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001268 var pipeline = WebGPU.getJsObject(pipelinePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00001269 pipeline.label = UTF8ToString(labelPtr);
1270 },
1271
1272 // --------------------------------------------------------------------------
1273 // Methods of Device
1274 // --------------------------------------------------------------------------
1275
1276 wgpuDeviceCreateBindGroup__deps: ['$readI53FromI64', 'emwgpuCreateBindGroup'],
1277 wgpuDeviceCreateBindGroup: (devicePtr, descriptor) => {
1278 {{{ gpu.makeCheckDescriptor('descriptor') }}}
1279
1280 function makeEntry(entryPtr) {
1281 {{{ gpu.makeCheck('entryPtr') }}}
1282
1283 var bufferPtr = {{{ gpu.makeGetU32('entryPtr', C_STRUCTS.WGPUBindGroupEntry.buffer) }}};
1284 var samplerPtr = {{{ gpu.makeGetU32('entryPtr', C_STRUCTS.WGPUBindGroupEntry.sampler) }}};
1285 var textureViewPtr = {{{ gpu.makeGetU32('entryPtr', C_STRUCTS.WGPUBindGroupEntry.textureView) }}};
1286#if ASSERTIONS
1287 assert((bufferPtr !== 0) + (samplerPtr !== 0) + (textureViewPtr !== 0) === 1);
1288#endif
1289
1290 var binding = {{{ gpu.makeGetU32('entryPtr', C_STRUCTS.WGPUBindGroupEntry.binding) }}};
1291
1292 if (bufferPtr) {
1293 var size = {{{ makeGetValue('entryPtr', C_STRUCTS.WGPUBindGroupEntry.size, 'i53') }}};
1294 {{{ gpu.convertSentinelToUndefined('size') }}}
1295
1296 return {
1297 "binding": binding,
1298 "resource": {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001299 "buffer": WebGPU.getJsObject(bufferPtr),
Loko Kung5a9506d2024-08-17 01:44:45 +00001300 "offset": {{{ gpu.makeGetU64('entryPtr', C_STRUCTS.WGPUBindGroupEntry.offset) }}},
1301 "size": size
1302 },
1303 };
1304 } else if (samplerPtr) {
1305 return {
1306 "binding": binding,
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001307 "resource": WebGPU.getJsObject(samplerPtr),
Loko Kung5a9506d2024-08-17 01:44:45 +00001308 };
1309 } else {
1310 return {
1311 "binding": binding,
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001312 "resource": WebGPU.getJsObject(textureViewPtr),
Loko Kung5a9506d2024-08-17 01:44:45 +00001313 };
1314 }
1315 }
1316
1317 function makeEntries(count, entriesPtrs) {
1318 var entries = [];
1319 for (var i = 0; i < count; ++i) {
1320 entries.push(makeEntry(entriesPtrs +
1321 {{{C_STRUCTS.WGPUBindGroupEntry.__size__}}} * i));
1322 }
1323 return entries;
1324 }
1325
1326 var desc = {
1327 "label": undefined,
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001328 "layout": WebGPU.getJsObject(
Loko Kung5a9506d2024-08-17 01:44:45 +00001329 {{{ makeGetValue('descriptor', C_STRUCTS.WGPUBindGroupDescriptor.layout, '*') }}}),
1330 "entries": makeEntries(
1331 {{{ gpu.makeGetU32('descriptor', C_STRUCTS.WGPUBindGroupDescriptor.entryCount) }}},
1332 {{{ makeGetValue('descriptor', C_STRUCTS.WGPUBindGroupDescriptor.entries, '*') }}}
1333 ),
1334 };
1335 var labelPtr = {{{ makeGetValue('descriptor', C_STRUCTS.WGPUBindGroupDescriptor.label, '*') }}};
1336 if (labelPtr) desc["label"] = UTF8ToString(labelPtr);
1337
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001338 var device = WebGPU.getJsObject(devicePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00001339 var ptr = _emwgpuCreateBindGroup();
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001340 WebGPU.Internals.jsObjectInsert(ptr, device.createBindGroup(desc));
Loko Kung5a9506d2024-08-17 01:44:45 +00001341 return ptr;
1342 },
1343
1344 wgpuDeviceCreateBindGroupLayout__deps: ['emwgpuCreateBindGroupLayout'],
1345 wgpuDeviceCreateBindGroupLayout: (devicePtr, descriptor) => {
1346 {{{ gpu.makeCheckDescriptor('descriptor') }}}
1347
1348 function makeBufferEntry(entryPtr) {
1349 {{{ gpu.makeCheck('entryPtr') }}}
1350
1351 var typeInt =
1352 {{{ gpu.makeGetU32('entryPtr', C_STRUCTS.WGPUBufferBindingLayout.type) }}};
1353 if (!typeInt) return undefined;
1354
1355 return {
1356 "type": WebGPU.BufferBindingType[typeInt],
1357 "hasDynamicOffset":
1358 {{{ gpu.makeGetBool('entryPtr', C_STRUCTS.WGPUBufferBindingLayout.hasDynamicOffset) }}},
1359 "minBindingSize":
1360 {{{ gpu.makeGetU64('entryPtr', C_STRUCTS.WGPUBufferBindingLayout.minBindingSize) }}},
1361 };
1362 }
1363
1364 function makeSamplerEntry(entryPtr) {
1365 {{{ gpu.makeCheck('entryPtr') }}}
1366
1367 var typeInt =
1368 {{{ gpu.makeGetU32('entryPtr', C_STRUCTS.WGPUSamplerBindingLayout.type) }}};
1369 if (!typeInt) return undefined;
1370
1371 return {
1372 "type": WebGPU.SamplerBindingType[typeInt],
1373 };
1374 }
1375
1376 function makeTextureEntry(entryPtr) {
1377 {{{ gpu.makeCheck('entryPtr') }}}
1378
1379 var sampleTypeInt =
1380 {{{ gpu.makeGetU32('entryPtr', C_STRUCTS.WGPUTextureBindingLayout.sampleType) }}};
1381 if (!sampleTypeInt) return undefined;
1382
1383 return {
1384 "sampleType": WebGPU.TextureSampleType[sampleTypeInt],
1385 "viewDimension": WebGPU.TextureViewDimension[
1386 {{{ gpu.makeGetU32('entryPtr', C_STRUCTS.WGPUTextureBindingLayout.viewDimension) }}}],
1387 "multisampled":
1388 {{{ gpu.makeGetBool('entryPtr', C_STRUCTS.WGPUTextureBindingLayout.multisampled) }}},
1389 };
1390 }
1391
1392 function makeStorageTextureEntry(entryPtr) {
1393 {{{ gpu.makeCheck('entryPtr') }}}
1394
1395 var accessInt =
1396 {{{ gpu.makeGetU32('entryPtr', C_STRUCTS.WGPUStorageTextureBindingLayout.access) }}}
1397 if (!accessInt) return undefined;
1398
1399 return {
1400 "access": WebGPU.StorageTextureAccess[accessInt],
1401 "format": WebGPU.TextureFormat[
1402 {{{ gpu.makeGetU32('entryPtr', C_STRUCTS.WGPUStorageTextureBindingLayout.format) }}}],
1403 "viewDimension": WebGPU.TextureViewDimension[
1404 {{{ gpu.makeGetU32('entryPtr', C_STRUCTS.WGPUStorageTextureBindingLayout.viewDimension) }}}],
1405 };
1406 }
1407
1408 function makeEntry(entryPtr) {
1409 {{{ gpu.makeCheck('entryPtr') }}}
1410
1411 return {
1412 "binding":
1413 {{{ gpu.makeGetU32('entryPtr', C_STRUCTS.WGPUBindGroupLayoutEntry.binding) }}},
1414 "visibility":
1415 {{{ gpu.makeGetU32('entryPtr', C_STRUCTS.WGPUBindGroupLayoutEntry.visibility) }}},
1416 "buffer": makeBufferEntry(entryPtr + {{{ C_STRUCTS.WGPUBindGroupLayoutEntry.buffer }}}),
1417 "sampler": makeSamplerEntry(entryPtr + {{{ C_STRUCTS.WGPUBindGroupLayoutEntry.sampler }}}),
1418 "texture": makeTextureEntry(entryPtr + {{{ C_STRUCTS.WGPUBindGroupLayoutEntry.texture }}}),
1419 "storageTexture": makeStorageTextureEntry(entryPtr + {{{ C_STRUCTS.WGPUBindGroupLayoutEntry.storageTexture }}}),
1420 };
1421 }
1422
1423 function makeEntries(count, entriesPtrs) {
1424 var entries = [];
1425 for (var i = 0; i < count; ++i) {
1426 entries.push(makeEntry(entriesPtrs +
1427 {{{ C_STRUCTS.WGPUBindGroupLayoutEntry.__size__ }}} * i));
1428 }
1429 return entries;
1430 }
1431
1432 var desc = {
1433 "entries": makeEntries(
1434 {{{ gpu.makeGetU32('descriptor', C_STRUCTS.WGPUBindGroupLayoutDescriptor.entryCount) }}},
1435 {{{ makeGetValue('descriptor', C_STRUCTS.WGPUBindGroupLayoutDescriptor.entries, '*') }}}
1436 ),
1437 };
1438 var labelPtr = {{{ makeGetValue('descriptor', C_STRUCTS.WGPUBindGroupLayoutDescriptor.label, '*') }}};
1439 if (labelPtr) desc["label"] = UTF8ToString(labelPtr);
1440
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001441 var device = WebGPU.getJsObject(devicePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00001442 var ptr = _emwgpuCreateBindGroupLayout();
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001443 WebGPU.Internals.jsObjectInsert(ptr, device.createBindGroupLayout(desc));
Loko Kung5a9506d2024-08-17 01:44:45 +00001444 return ptr;
1445 },
1446
Lokbondo Kungda542472024-10-10 00:49:17 +00001447 emwgpuDeviceCreateBuffer: (devicePtr, descriptor, bufferPtr) => {
Loko Kung5a9506d2024-08-17 01:44:45 +00001448 {{{ gpu.makeCheckDescriptor('descriptor') }}}
1449
1450 var mappedAtCreation = {{{ gpu.makeGetBool('descriptor', C_STRUCTS.WGPUBufferDescriptor.mappedAtCreation) }}};
1451
1452 var desc = {
1453 "label": undefined,
1454 "usage": {{{ gpu.makeGetU32('descriptor', C_STRUCTS.WGPUBufferDescriptor.usage) }}},
1455 "size": {{{ gpu.makeGetU64('descriptor', C_STRUCTS.WGPUBufferDescriptor.size) }}},
1456 "mappedAtCreation": mappedAtCreation,
1457 };
1458 var labelPtr = {{{ makeGetValue('descriptor', C_STRUCTS.WGPUBufferDescriptor.label, '*') }}};
1459 if (labelPtr) desc["label"] = UTF8ToString(labelPtr);
1460
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001461 var device = WebGPU.getJsObject(devicePtr);
1462 WebGPU.Internals.jsObjectInsert(bufferPtr, device.createBuffer(desc));
Loko Kung5a9506d2024-08-17 01:44:45 +00001463 if (mappedAtCreation) {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001464 WebGPU.Internals.bufferOnUnmaps[bufferPtr] = [];
Loko Kung5a9506d2024-08-17 01:44:45 +00001465 }
Loko Kung5a9506d2024-08-17 01:44:45 +00001466 },
1467
1468 wgpuDeviceCreateCommandEncoder__deps: ['emwgpuCreateCommandEncoder'],
1469 wgpuDeviceCreateCommandEncoder: (devicePtr, descriptor) => {
1470 var desc;
1471 if (descriptor) {
1472 {{{ gpu.makeCheckDescriptor('descriptor') }}}
1473 desc = {
1474 "label": undefined,
1475 };
1476 var labelPtr = {{{ makeGetValue('descriptor', C_STRUCTS.WGPUCommandEncoderDescriptor.label, '*') }}};
1477 if (labelPtr) desc["label"] = UTF8ToString(labelPtr);
1478 }
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001479 var device = WebGPU.getJsObject(devicePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00001480 var ptr = _emwgpuCreateCommandEncoder();
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001481 WebGPU.Internals.jsObjectInsert(ptr, device.createCommandEncoder(desc));
Loko Kung5a9506d2024-08-17 01:44:45 +00001482 return ptr;
1483 },
1484
1485 wgpuDeviceCreateComputePipeline__deps: ['emwgpuCreateComputePipeline'],
1486 wgpuDeviceCreateComputePipeline: (devicePtr, descriptor) => {
1487 var desc = WebGPU.makeComputePipelineDesc(descriptor);
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001488 var device = WebGPU.getJsObject(devicePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00001489 var ptr = _emwgpuCreateComputePipeline();
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001490 WebGPU.Internals.jsObjectInsert(ptr, device.createComputePipeline(desc));
Loko Kung5a9506d2024-08-17 01:44:45 +00001491 return ptr;
1492 },
1493
Lokbondo Kung7927ad02024-10-11 23:20:07 +00001494 emwgpuDeviceCreateComputePipelineAsync__i53abi: false,
Lokbondo Kungda542472024-10-10 00:49:17 +00001495 emwgpuDeviceCreateComputePipelineAsync__deps: ['emwgpuCreateComputePipeline', 'emwgpuOnCreateComputePipelineCompleted'],
Lokbondo Kungecf585f2024-09-25 18:03:44 +00001496 emwgpuDeviceCreateComputePipelineAsync: (devicePtr, futureIdL, futureIdH, descriptor) => {
Loko Kung5a9506d2024-08-17 01:44:45 +00001497 var desc = WebGPU.makeComputePipelineDesc(descriptor);
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001498 var device = WebGPU.getJsObject(devicePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00001499 {{{ runtimeKeepalivePush() }}}
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001500 WebGPU.Internals.futureInsert(futureIdL, futureIdH, device.createComputePipelineAsync(desc).then((pipeline) => {
Loko Kung5a9506d2024-08-17 01:44:45 +00001501 {{{ runtimeKeepalivePop() }}}
Lokbondo Kungecf585f2024-09-25 18:03:44 +00001502 var pipelinePtr = _emwgpuCreateComputePipeline();
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001503 WebGPU.Internals.jsObjectInsert(pipelinePtr, pipeline);
Lokbondo Kungda542472024-10-10 00:49:17 +00001504 _emwgpuOnCreateComputePipelineCompleted(futureIdL, futureIdH, {{{ gpu.CreatePipelineAsyncStatus.Success }}}, pipelinePtr, 0);
Loko Kung5a9506d2024-08-17 01:44:45 +00001505 }, (pipelineError) => {
1506 {{{ runtimeKeepalivePop() }}}
Lokbondo Kungecf585f2024-09-25 18:03:44 +00001507 var sp = stackSave();
1508 var messagePtr = stringToUTF8OnStack(pipelineError.message);
1509 var status =
1510 pipeline.reason === 'validation' ? {{{ gpu.CreatePipelineAsyncStatus.ValidationError }}} :
1511 pipeline.reason === 'internal' ? {{{ gpu.CreatePipelineAsyncStatus.InternalError }}} :
1512 {{{ gpu.CreatePipelineAsyncStatus.Unknown }}};
Lokbondo Kungda542472024-10-10 00:49:17 +00001513 _emwgpuOnCreateComputePipelineCompleted(futureIdL, futureIdH, status, 0, messagePtr);
Lokbondo Kungecf585f2024-09-25 18:03:44 +00001514 stackRestore(sp);
1515 }));
Loko Kung5a9506d2024-08-17 01:44:45 +00001516 },
1517
1518 wgpuDeviceCreatePipelineLayout__deps: ['emwgpuCreatePipelineLayout'],
1519 wgpuDeviceCreatePipelineLayout: (devicePtr, descriptor) => {
1520 {{{ gpu.makeCheckDescriptor('descriptor') }}}
1521 var bglCount = {{{ gpu.makeGetU32('descriptor', C_STRUCTS.WGPUPipelineLayoutDescriptor.bindGroupLayoutCount) }}};
1522 var bglPtr = {{{ makeGetValue('descriptor', C_STRUCTS.WGPUPipelineLayoutDescriptor.bindGroupLayouts, '*') }}};
1523 var bgls = [];
1524 for (var i = 0; i < bglCount; ++i) {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001525 bgls.push(WebGPU.getJsObject(
Loko Kung5a9506d2024-08-17 01:44:45 +00001526 {{{ makeGetValue('bglPtr', `${POINTER_SIZE} * i`, '*') }}}));
1527 }
1528 var desc = {
1529 "label": undefined,
1530 "bindGroupLayouts": bgls,
1531 };
1532 var labelPtr = {{{ makeGetValue('descriptor', C_STRUCTS.WGPUPipelineLayoutDescriptor.label, '*') }}};
1533 if (labelPtr) desc["label"] = UTF8ToString(labelPtr);
1534
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001535 var device = WebGPU.getJsObject(devicePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00001536 var ptr = _emwgpuCreatePipelineLayout();
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001537 WebGPU.Internals.jsObjectInsert(ptr, device.createPipelineLayout(desc));
Loko Kung5a9506d2024-08-17 01:44:45 +00001538 return ptr;
1539 },
1540
1541 wgpuDeviceCreateQuerySet__deps: ['emwgpuCreateQuerySet'],
1542 wgpuDeviceCreateQuerySet: (devicePtr, descriptor) => {
1543 {{{ gpu.makeCheckDescriptor('descriptor') }}}
1544
1545 var desc = {
1546 "type": WebGPU.QueryType[
1547 {{{ gpu.makeGetU32('descriptor', C_STRUCTS.WGPUQuerySetDescriptor.type) }}}],
1548 "count": {{{ gpu.makeGetU32('descriptor', C_STRUCTS.WGPUQuerySetDescriptor.count) }}},
1549 };
1550
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001551 var device = WebGPU.getJsObject(devicePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00001552 var ptr = _emwgpuCreateQuerySet();
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001553 WebGPU.Internals.jsObjectInsert(ptr, device.createQuerySet(desc));
Loko Kung5a9506d2024-08-17 01:44:45 +00001554 return ptr;
1555 },
1556
1557 wgpuDeviceCreateRenderBundleEncoder__deps: ['emwgpuCreateRenderBundleEncoder'],
1558 wgpuDeviceCreateRenderBundleEncoder: (devicePtr, descriptor) => {
1559 {{{ gpu.makeCheck('descriptor') }}}
1560
1561 function makeRenderBundleEncoderDescriptor(descriptor) {
1562 {{{ gpu.makeCheck('descriptor') }}}
1563
1564 function makeColorFormats(count, formatsPtr) {
1565 var formats = [];
1566 for (var i = 0; i < count; ++i, formatsPtr += 4) {
1567 // format could be undefined
1568 formats.push(WebGPU.TextureFormat[{{{ gpu.makeGetU32('formatsPtr', 0) }}}]);
1569 }
1570 return formats;
1571 }
1572
1573 var desc = {
1574 "label": undefined,
1575 "colorFormats": makeColorFormats(
1576 {{{ gpu.makeGetU32('descriptor', C_STRUCTS.WGPURenderBundleEncoderDescriptor.colorFormatCount) }}},
1577 {{{ makeGetValue('descriptor', C_STRUCTS.WGPURenderBundleEncoderDescriptor.colorFormats, '*') }}}),
1578 "depthStencilFormat": WebGPU.TextureFormat[{{{ gpu.makeGetU32('descriptor', C_STRUCTS.WGPURenderBundleEncoderDescriptor.depthStencilFormat) }}}],
1579 "sampleCount": {{{ gpu.makeGetU32('descriptor', C_STRUCTS.WGPURenderBundleEncoderDescriptor.sampleCount) }}},
1580 "depthReadOnly": {{{ gpu.makeGetBool('descriptor', C_STRUCTS.WGPURenderBundleEncoderDescriptor.depthReadOnly) }}},
1581 "stencilReadOnly": {{{ gpu.makeGetBool('descriptor', C_STRUCTS.WGPURenderBundleEncoderDescriptor.stencilReadOnly) }}},
1582 };
1583 var labelPtr = {{{ makeGetValue('descriptor', C_STRUCTS.WGPURenderBundleEncoderDescriptor.label, '*') }}};
1584 if (labelPtr) desc["label"] = UTF8ToString(labelPtr);
1585 return desc;
1586 }
1587
1588 var desc = makeRenderBundleEncoderDescriptor(descriptor);
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001589 var device = WebGPU.getJsObject(devicePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00001590 var ptr = _emwgpuCreateRenderBundleEncoder();
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001591 WebGPU.Internals.jsObjectInsert(ptr, device.createRenderBundleEncoder(desc));
Loko Kung5a9506d2024-08-17 01:44:45 +00001592 return ptr;
1593 },
1594
1595 wgpuDeviceCreateRenderPipeline__deps: ['emwgpuCreateRenderPipeline'],
1596 wgpuDeviceCreateRenderPipeline: (devicePtr, descriptor) => {
1597 var desc = WebGPU.makeRenderPipelineDesc(descriptor);
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001598 var device = WebGPU.getJsObject(devicePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00001599 var ptr = _emwgpuCreateRenderPipeline();
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001600 WebGPU.Internals.jsObjectInsert(ptr, device.createRenderPipeline(desc));
Loko Kung5a9506d2024-08-17 01:44:45 +00001601 return ptr;
1602 },
1603
Lokbondo Kung7927ad02024-10-11 23:20:07 +00001604 emwgpuDeviceCreateRenderPipelineAsync__i53abi: false,
Lokbondo Kungda542472024-10-10 00:49:17 +00001605 emwgpuDeviceCreateRenderPipelineAsync__deps: ['emwgpuCreateRenderPipeline', 'emwgpuOnCreateRenderPipelineCompleted'],
Lokbondo Kungecf585f2024-09-25 18:03:44 +00001606 emwgpuDeviceCreateRenderPipelineAsync: (devicePtr, futureIdL, futureIdH, descriptor) => {
Loko Kung5a9506d2024-08-17 01:44:45 +00001607 var desc = WebGPU.makeRenderPipelineDesc(descriptor);
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001608 var device = WebGPU.getJsObject(devicePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00001609 {{{ runtimeKeepalivePush() }}}
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001610 WebGPU.Internals.futureInsert(futureIdL, futureIdH, device.createRenderPipelineAsync(desc).then((pipeline) => {
Loko Kung5a9506d2024-08-17 01:44:45 +00001611 {{{ runtimeKeepalivePop() }}}
Lokbondo Kungecf585f2024-09-25 18:03:44 +00001612 var pipelinePtr = _emwgpuCreateRenderPipeline();
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001613 WebGPU.Internals.jsObjectInsert(pipelinePtr, pipeline);
Lokbondo Kungda542472024-10-10 00:49:17 +00001614 _emwgpuOnCreateRenderPipelineCompleted(futureIdL, futureIdH, {{{ gpu.CreatePipelineAsyncStatus.Success }}}, pipelinePtr, 0);
Loko Kung5a9506d2024-08-17 01:44:45 +00001615 }, (pipelineError) => {
1616 {{{ runtimeKeepalivePop() }}}
Lokbondo Kungecf585f2024-09-25 18:03:44 +00001617 var sp = stackSave();
1618 var messagePtr = stringToUTF8OnStack(pipelineError.message);
1619 var status =
1620 pipeline.reason === 'validation' ? {{{ gpu.CreatePipelineAsyncStatus.ValidationError }}} :
1621 pipeline.reason === 'internal' ? {{{ gpu.CreatePipelineAsyncStatus.InternalError }}} :
1622 {{{ gpu.CreatePipelineAsyncStatus.Unknown }}};
Lokbondo Kungda542472024-10-10 00:49:17 +00001623 _emwgpuOnCreateRenderPipelineCompleted(futureIdL, futureIdH, status, 0, messagePtr);
Lokbondo Kungecf585f2024-09-25 18:03:44 +00001624 stackRestore(sp);
1625 }));
Loko Kung5a9506d2024-08-17 01:44:45 +00001626 },
1627
1628 wgpuDeviceCreateSampler__deps: ['emwgpuCreateSampler'],
1629 wgpuDeviceCreateSampler: (devicePtr, descriptor) => {
1630 var desc;
1631 if (descriptor) {
1632 {{{ gpu.makeCheckDescriptor('descriptor') }}}
1633
1634 desc = {
1635 "label": undefined,
1636 "addressModeU": WebGPU.AddressMode[
1637 {{{ gpu.makeGetU32('descriptor', C_STRUCTS.WGPUSamplerDescriptor.addressModeU) }}}],
1638 "addressModeV": WebGPU.AddressMode[
1639 {{{ gpu.makeGetU32('descriptor', C_STRUCTS.WGPUSamplerDescriptor.addressModeV) }}}],
1640 "addressModeW": WebGPU.AddressMode[
1641 {{{ gpu.makeGetU32('descriptor', C_STRUCTS.WGPUSamplerDescriptor.addressModeW) }}}],
1642 "magFilter": WebGPU.FilterMode[
1643 {{{ gpu.makeGetU32('descriptor', C_STRUCTS.WGPUSamplerDescriptor.magFilter) }}}],
1644 "minFilter": WebGPU.FilterMode[
1645 {{{ gpu.makeGetU32('descriptor', C_STRUCTS.WGPUSamplerDescriptor.minFilter) }}}],
1646 "mipmapFilter": WebGPU.MipmapFilterMode[
1647 {{{ gpu.makeGetU32('descriptor', C_STRUCTS.WGPUSamplerDescriptor.mipmapFilter) }}}],
1648 "lodMinClamp": {{{ makeGetValue('descriptor', C_STRUCTS.WGPUSamplerDescriptor.lodMinClamp, 'float') }}},
1649 "lodMaxClamp": {{{ makeGetValue('descriptor', C_STRUCTS.WGPUSamplerDescriptor.lodMaxClamp, 'float') }}},
1650 "compare": WebGPU.CompareFunction[
1651 {{{ gpu.makeGetU32('descriptor', C_STRUCTS.WGPUSamplerDescriptor.compare) }}}],
1652 };
1653 var labelPtr = {{{ makeGetValue('descriptor', C_STRUCTS.WGPUSamplerDescriptor.label, '*') }}};
1654 if (labelPtr) desc["label"] = UTF8ToString(labelPtr);
1655 }
1656
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001657 var device = WebGPU.getJsObject(devicePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00001658 var ptr = _emwgpuCreateSampler();
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001659 WebGPU.Internals.jsObjectInsert(ptr, device.createSampler(desc));
Loko Kung5a9506d2024-08-17 01:44:45 +00001660 return ptr;
1661 },
1662
1663 wgpuDeviceCreateShaderModule__deps: ['emwgpuCreateShaderModule'],
1664 wgpuDeviceCreateShaderModule: (devicePtr, descriptor) => {
1665 {{{ gpu.makeCheck('descriptor') }}}
1666 var nextInChainPtr = {{{ makeGetValue('descriptor', C_STRUCTS.WGPUShaderModuleDescriptor.nextInChain, '*') }}};
1667#if ASSERTIONS
1668 assert(nextInChainPtr !== 0);
1669#endif
1670 var sType = {{{ gpu.makeGetU32('nextInChainPtr', C_STRUCTS.WGPUChainedStruct.sType) }}};
1671
1672 var desc = {
1673 "label": undefined,
1674 "code": "",
1675 };
1676 var labelPtr = {{{ makeGetValue('descriptor', C_STRUCTS.WGPUShaderModuleDescriptor.label, '*') }}};
1677 if (labelPtr) desc["label"] = UTF8ToString(labelPtr);
1678
1679 switch (sType) {
Lokbondo Kungb339ed42024-09-06 02:49:19 +00001680 case {{{ gpu.SType.ShaderSourceSPIRV }}}: {
1681 var count = {{{ gpu.makeGetU32('nextInChainPtr', C_STRUCTS.WGPUShaderSourceSPIRV.codeSize) }}};
1682 var start = {{{ makeGetValue('nextInChainPtr', C_STRUCTS.WGPUShaderSourceSPIRV.code, '*') }}};
Loko Kung5a9506d2024-08-17 01:44:45 +00001683 var offset = {{{ getHeapOffset('start', 'u32') }}};
1684#if PTHREADS
1685 // Chrome can't currently handle a SharedArrayBuffer view here, so make a copy.
1686 desc["code"] = HEAPU32.slice(offset, offset + count);
1687#else
1688 desc["code"] = HEAPU32.subarray(offset, offset + count);
1689#endif
1690 break;
1691 }
Lokbondo Kungb339ed42024-09-06 02:49:19 +00001692 case {{{ gpu.SType.ShaderSourceWGSL }}}: {
1693 var sourcePtr = {{{ makeGetValue('nextInChainPtr', C_STRUCTS.WGPUShaderSourceWGSL.code, '*') }}};
Loko Kung5a9506d2024-08-17 01:44:45 +00001694 if (sourcePtr) {
1695 desc["code"] = UTF8ToString(sourcePtr);
1696 }
1697 break;
1698 }
1699#if ASSERTIONS
1700 default: abort('unrecognized ShaderModule sType');
1701#endif
1702 }
1703
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001704 var device = WebGPU.getJsObject(devicePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00001705 var ptr = _emwgpuCreateShaderModule();
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001706 WebGPU.Internals.jsObjectInsert(ptr, device.createShaderModule(desc));
Loko Kung5a9506d2024-08-17 01:44:45 +00001707 return ptr;
1708 },
1709
Loko Kung5a9506d2024-08-17 01:44:45 +00001710 wgpuDeviceCreateTexture__deps: ['emwgpuCreateTexture'],
1711 wgpuDeviceCreateTexture: (devicePtr, descriptor) => {
1712 {{{ gpu.makeCheckDescriptor('descriptor') }}}
1713
1714 var desc = {
1715 "label": undefined,
1716 "size": WebGPU.makeExtent3D(descriptor + {{{ C_STRUCTS.WGPUTextureDescriptor.size }}}),
1717 "mipLevelCount": {{{ gpu.makeGetU32('descriptor', C_STRUCTS.WGPUTextureDescriptor.mipLevelCount) }}},
1718 "sampleCount": {{{ gpu.makeGetU32('descriptor', C_STRUCTS.WGPUTextureDescriptor.sampleCount) }}},
1719 "dimension": WebGPU.TextureDimension[
1720 {{{ gpu.makeGetU32('descriptor', C_STRUCTS.WGPUTextureDescriptor.dimension) }}}],
1721 "format": WebGPU.TextureFormat[
1722 {{{ gpu.makeGetU32('descriptor', C_STRUCTS.WGPUTextureDescriptor.format) }}}],
1723 "usage": {{{ gpu.makeGetU32('descriptor', C_STRUCTS.WGPUTextureDescriptor.usage) }}},
1724 };
1725 var labelPtr = {{{ makeGetValue('descriptor', C_STRUCTS.WGPUTextureDescriptor.label, '*') }}};
1726 if (labelPtr) desc["label"] = UTF8ToString(labelPtr);
1727
1728 var viewFormatCount = {{{ gpu.makeGetU32('descriptor', C_STRUCTS.WGPUTextureDescriptor.viewFormatCount) }}};
1729 if (viewFormatCount) {
1730 var viewFormatsPtr = {{{ makeGetValue('descriptor', C_STRUCTS.WGPUTextureDescriptor.viewFormats, '*') }}};
1731 // viewFormatsPtr pointer to an array of TextureFormat which is an enum of size uint32_t
1732 desc["viewFormats"] = Array.from({{{ makeHEAPView('32', 'viewFormatsPtr', `viewFormatsPtr + viewFormatCount * 4`) }}},
1733 function(format) { return WebGPU.TextureFormat[format]; });
1734 }
1735
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001736 var device = WebGPU.getJsObject(devicePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00001737 var ptr = _emwgpuCreateTexture();
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001738 WebGPU.Internals.jsObjectInsert(ptr, device.createTexture(desc));
Loko Kung5a9506d2024-08-17 01:44:45 +00001739 return ptr;
1740 },
1741
1742 wgpuDeviceDestroy: (devicePtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001743 WebGPU.getJsObject(devicePtr).destroy()
Loko Kung5a9506d2024-08-17 01:44:45 +00001744 },
1745
1746 wgpuDeviceEnumerateFeatures: (devicePtr, featuresOutPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001747 var device = WebGPU.getJsObject(devicePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00001748 if (featuresOutPtr !== 0) {
1749 var offset = 0;
1750 device.features.forEach(feature => {
1751 var featureEnumValue = WebGPU.FeatureNameString2Enum[feature];
1752 {{{ makeSetValue('featuresOutPtr', 'offset', 'featureEnumValue', 'i32') }}};
1753 offset += 4;
1754 });
1755 }
1756 return device.features.size;
1757 },
1758
1759 wgpuDeviceGetLimits: (devicePtr, limitsOutPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001760 var device = WebGPU.getJsObject(devicePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00001761 WebGPU.fillLimitStruct(device.limits, limitsOutPtr);
1762 return 1;
1763 },
1764
1765 wgpuDeviceHasFeature: (devicePtr, featureEnumValue) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001766 var device = WebGPU.getJsObject(devicePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00001767 return device.features.has(WebGPU.FeatureName[featureEnumValue]);
1768 },
1769
1770 wgpuDevicePopErrorScope__deps: ['$callUserCallback'],
1771 wgpuDevicePopErrorScope: (devicePtr, callback, userdata) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001772 var device = WebGPU.getJsObject(devicePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00001773 {{{ runtimeKeepalivePush() }}}
1774 device.popErrorScope().then((gpuError) => {
1775 {{{ runtimeKeepalivePop() }}}
1776 callUserCallback(() => {
1777 if (!gpuError) {
1778 {{{ makeDynCall('vipp', 'callback') }}}(
1779 {{{ gpu.ErrorType.NoError }}}, 0, userdata);
1780 } else if (gpuError instanceof GPUOutOfMemoryError) {
1781 {{{ makeDynCall('vipp', 'callback') }}}(
1782 {{{ gpu.ErrorType.OutOfMemory }}}, 0, userdata);
1783 } else {
1784#if ASSERTIONS
1785 // TODO: Implement GPUInternalError
1786 assert(gpuError instanceof GPUValidationError);
1787#endif
1788 WebGPU.errorCallback(callback, {{{ gpu.ErrorType.Validation }}}, gpuError.message, userdata);
1789 }
1790 });
1791 }, (ex) => {
1792 {{{ runtimeKeepalivePop() }}}
1793 callUserCallback(() => {
1794 // TODO: This can mean either the device was lost or the error scope stack was empty. Figure
1795 // out how to synthesize the DeviceLost error type. (Could be by simply tracking the error
1796 // scope depth, but that isn't ideal.)
1797 WebGPU.errorCallback(callback, {{{ gpu.ErrorType.Unknown }}}, ex.message, userdata);
1798 });
1799 });
1800 },
1801
1802 wgpuDevicePushErrorScope: (devicePtr, filter) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001803 var device = WebGPU.getJsObject(devicePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00001804 device.pushErrorScope(WebGPU.ErrorFilter[filter]);
1805 },
1806
1807 wgpuDeviceSetLabel: (devicePtr, labelPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001808 var device = WebGPU.getJsObject(devicePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00001809 device.label = UTF8ToString(labelPtr);
1810 },
1811
Lokbondo Kunga8fbe982024-08-30 04:46:53 +00001812 // TODO(42241415) Remove this after verifying that it's not used and/or updating users.
Loko Kung5a9506d2024-08-17 01:44:45 +00001813 wgpuDeviceSetUncapturedErrorCallback__deps: ['$callUserCallback'],
1814 wgpuDeviceSetUncapturedErrorCallback: (devicePtr, callback, userdata) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001815 var device = WebGPU.getJsObject(devicePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00001816 device.onuncapturederror = function(ev) {
1817 // This will skip the callback if the runtime is no longer alive.
1818 callUserCallback(() => {
1819 // WGPUErrorType type, const char* message, void* userdata
1820 var Validation = 0x00000001;
1821 var OutOfMemory = 0x00000002;
1822 var type;
1823#if ASSERTIONS
1824 assert(typeof GPUValidationError != 'undefined');
1825 assert(typeof GPUOutOfMemoryError != 'undefined');
1826#endif
1827 if (ev.error instanceof GPUValidationError) type = Validation;
1828 else if (ev.error instanceof GPUOutOfMemoryError) type = OutOfMemory;
1829 // TODO: Implement GPUInternalError
1830
1831 WebGPU.errorCallback(callback, type, ev.error.message, userdata);
1832 });
1833 };
1834 },
1835
1836 // --------------------------------------------------------------------------
1837 // Methods of Instance
1838 // --------------------------------------------------------------------------
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001839
Loko Kung424cda22024-08-17 01:29:10 +00001840 wgpuInstanceCreateSurface__deps: ['$findCanvasEventTarget', 'emwgpuCreateSurface'],
Loko Kung5a9506d2024-08-17 01:44:45 +00001841 wgpuInstanceCreateSurface: (instancePtr, descriptor) => {
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001842 {{{ gpu.makeCheck('descriptor') }}}
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001843 var nextInChainPtr = {{{ makeGetValue('descriptor', C_STRUCTS.WGPUSurfaceDescriptor.nextInChain, '*') }}};
1844#if ASSERTIONS
1845 assert(nextInChainPtr !== 0);
Lokbondo Kungb339ed42024-09-06 02:49:19 +00001846 assert({{{ gpu.SType.SurfaceSourceCanvasHTMLSelector_Emscripten }}} ===
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001847 {{{ gpu.makeGetU32('nextInChainPtr', C_STRUCTS.WGPUChainedStruct.sType) }}});
1848#endif
Lokbondo Kungb339ed42024-09-06 02:49:19 +00001849 var sourceCanvasHTMLSelector = nextInChainPtr;
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001850
Lokbondo Kungb339ed42024-09-06 02:49:19 +00001851 {{{ gpu.makeCheckDescriptor('sourceCanvasHTMLSelector') }}}
1852 var selectorPtr = {{{ makeGetValue('sourceCanvasHTMLSelector', C_STRUCTS.WGPUSurfaceSourceCanvasHTMLSelector_Emscripten.selector, '*') }}};
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001853 {{{ gpu.makeCheck('selectorPtr') }}}
1854 var canvas = findCanvasEventTarget(selectorPtr);
1855#if OFFSCREENCANVAS_SUPPORT
1856 if (canvas.offscreenCanvas) canvas = canvas.offscreenCanvas;
1857#endif
1858 var context = canvas.getContext('webgpu');
1859#if ASSERTIONS
1860 assert(context);
1861#endif
1862 if (!context) return 0;
1863
1864 var labelPtr = {{{ makeGetValue('descriptor', C_STRUCTS.WGPUSurfaceDescriptor.label, '*') }}};
1865 if (labelPtr) context.surfaceLabelWebGPU = UTF8ToString(labelPtr);
1866
Loko Kung424cda22024-08-17 01:29:10 +00001867 var ptr = _emwgpuCreateSurface();
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001868 WebGPU.Internals.jsObjectInsert(ptr, context);
Loko Kung424cda22024-08-17 01:29:10 +00001869 return ptr;
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001870 },
1871
1872 wgpuInstanceHasWGSLLanguageFeature: (instance, featureEnumValue) => {
1873 if (!('wgslLanguageFeatures' in navigator["gpu"])) {
1874 return false;
1875 }
1876 return navigator["gpu"]["wgslLanguageFeatures"].has(WebGPU.WGSLFeatureName[featureEnumValue]);
1877 },
1878
Loko Kung859fb302024-08-17 01:44:58 +00001879 emwgpuInstanceRequestAdapter__i53abi: false,
Lokbondo Kungda542472024-10-10 00:49:17 +00001880 emwgpuInstanceRequestAdapter__deps: ['emwgpuCreateAdapter', 'emwgpuOnRequestAdapterCompleted'],
Loko Kung859fb302024-08-17 01:44:58 +00001881 emwgpuInstanceRequestAdapter: (instancePtr, futureIdL, futureIdH, options) => {
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001882 var opts;
1883 if (options) {
1884 {{{ gpu.makeCheckDescriptor('options') }}}
1885 opts = {
1886 "powerPreference": WebGPU.PowerPreference[
1887 {{{ gpu.makeGetU32('options', C_STRUCTS.WGPURequestAdapterOptions.powerPreference) }}}],
1888 "forceFallbackAdapter":
1889 {{{ gpu.makeGetBool('options', C_STRUCTS.WGPURequestAdapterOptions.forceFallbackAdapter) }}},
1890 };
1891 }
1892
1893 if (!('gpu' in navigator)) {
Lokbondo Kungb9670942024-09-20 10:29:15 +00001894 var sp = stackSave();
1895 var messagePtr = stringToUTF8OnStack('WebGPU not available on this browser (navigator.gpu is not available)');
1896 _emwgpuOnRequestAdapterCompleted(futureIdL, futureIdH, {{{ gpu.RequestAdapterStatus.Unavailable }}}, 0, messagePtr);
1897 stackRestore(sp);
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001898 return;
1899 }
1900
1901 {{{ runtimeKeepalivePush() }}}
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001902 WebGPU.Internals.futureInsert(futureIdL, futureIdH, navigator["gpu"]["requestAdapter"](opts).then((adapter) => {
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001903 {{{ runtimeKeepalivePop() }}}
Loko Kung859fb302024-08-17 01:44:58 +00001904 if (adapter) {
Lokbondo Kunga8fbe982024-08-30 04:46:53 +00001905 var adapterPtr = _emwgpuCreateAdapter(instancePtr);
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001906 WebGPU.Internals.jsObjectInsert(adapterPtr, adapter);
Loko Kung859fb302024-08-17 01:44:58 +00001907 _emwgpuOnRequestAdapterCompleted(futureIdL, futureIdH, {{{ gpu.RequestAdapterStatus.Success }}}, adapterPtr, 0);
1908 } else {
Lokbondo Kungb9670942024-09-20 10:29:15 +00001909 var sp = stackSave();
1910 var messagePtr = stringToUTF8OnStack('WebGPU not available on this browser (requestAdapter returned null)');
1911 _emwgpuOnRequestAdapterCompleted(futureIdL, futureIdH, {{{ gpu.RequestAdapterStatus.Unavailable }}}, 0, messagePtr);
1912 stackRestore(sp);
Loko Kung859fb302024-08-17 01:44:58 +00001913 }
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001914 }, (ex) => {
1915 {{{ runtimeKeepalivePop() }}}
Lokbondo Kungb9670942024-09-20 10:29:15 +00001916 var sp = stackSave();
1917 var messagePtr = stringToUTF8OnStack(ex.message);
1918 _emwgpuOnRequestAdapterCompleted(futureIdL, futureIdH, {{{ gpu.RequestAdapterStatus.Error }}}, 0, messagePtr);
1919 stackRestore(sp);
Loko Kung859fb302024-08-17 01:44:58 +00001920 }));
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001921 },
1922
Loko Kung5a9506d2024-08-17 01:44:45 +00001923 // --------------------------------------------------------------------------
1924 // Methods of PipelineLayout
1925 // --------------------------------------------------------------------------
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001926
Loko Kung5a9506d2024-08-17 01:44:45 +00001927 wgpuPipelineLayoutSetLabel: (pipelineLayoutPtr, labelPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001928 var pipelineLayout = WebGPU.getJsObject(pipelineLayoutPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00001929 pipelineLayout.label = UTF8ToString(labelPtr);
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001930 },
1931
Loko Kung5a9506d2024-08-17 01:44:45 +00001932 // --------------------------------------------------------------------------
1933 // Methods of QuerySet
1934 // --------------------------------------------------------------------------
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001935
Loko Kung5a9506d2024-08-17 01:44:45 +00001936 wgpuQuerySetDestroy: (querySetPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001937 WebGPU.getJsObject(querySetPtr).destroy();
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001938 },
1939
Loko Kung5a9506d2024-08-17 01:44:45 +00001940 wgpuQuerySetGetCount: (querySetPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001941 var querySet = WebGPU.getJsObject(querySetPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00001942 return querySet.count;
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001943 },
1944
Loko Kung5a9506d2024-08-17 01:44:45 +00001945 wgpuQuerySetGetType: (querySetPtr, labelPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001946 var querySet = WebGPU.getJsObject(querySetPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00001947 return querySet.type;
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001948 },
1949
Loko Kung5a9506d2024-08-17 01:44:45 +00001950 wgpuQuerySetSetLabel: (querySetPtr, labelPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001951 var querySet = WebGPU.getJsObject(querySetPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00001952 querySet.label = UTF8ToString(labelPtr);
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001953 },
1954
Loko Kung5a9506d2024-08-17 01:44:45 +00001955 // --------------------------------------------------------------------------
1956 // Methods of Queue
1957 // --------------------------------------------------------------------------
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001958
Lokbondo Kung7927ad02024-10-11 23:20:07 +00001959 emwgpuQueueOnSubmittedWorkDone__i53abi: false,
1960 emwgpuQueueOnSubmittedWorkDone__deps: ['emwgpuOnWorkDoneCompleted'],
1961 emwgpuQueueOnSubmittedWorkDone: (queuePtr, futureIdL, futureIdH) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001962 var queue = WebGPU.getJsObject(queuePtr);
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001963
1964 {{{ runtimeKeepalivePush() }}}
Lokbondo Kung7927ad02024-10-11 23:20:07 +00001965 WebGPU.Internals.futureInsert(futureIdL, futureIdH, queue.onSubmittedWorkDone().then(() => {
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001966 {{{ runtimeKeepalivePop() }}}
Lokbondo Kung7927ad02024-10-11 23:20:07 +00001967 _emwgpuOnWorkDoneCompleted(futureIdL, futureIdH, {{{ gpu.QueueWorkDoneStatus.Success }}});
Loko Kung5a9506d2024-08-17 01:44:45 +00001968 }, () => {
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001969 {{{ runtimeKeepalivePop() }}}
Lokbondo Kung7927ad02024-10-11 23:20:07 +00001970 _emwgpuOnWorkDoneCompleted(futureIdL, futureIdH, {{{ gpu.QueueWorkDoneStatus.Error }}});
1971 }));
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001972 },
1973
Loko Kung5a9506d2024-08-17 01:44:45 +00001974 wgpuQueueSetLabel: (queuePtr, labelPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001975 var queue = WebGPU.getJsObject(queuePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00001976 queue.label = UTF8ToString(labelPtr);
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001977 },
1978
Loko Kung5a9506d2024-08-17 01:44:45 +00001979 wgpuQueueSubmit: (queuePtr, commandCount, commands) => {
1980#if ASSERTIONS
1981 assert(commands % 4 === 0);
1982#endif
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001983 var queue = WebGPU.getJsObject(queuePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00001984 var cmds = Array.from({{{ makeHEAPView(`${POINTER_BITS}`, 'commands', `commands + commandCount * ${POINTER_SIZE}`)}}},
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001985 (id) => WebGPU.getJsObject(id));
Loko Kung5a9506d2024-08-17 01:44:45 +00001986 queue.submit(cmds);
1987 },
Kai Ninomiyaace5a582024-07-02 20:52:25 +00001988
Loko Kung5a9506d2024-08-17 01:44:45 +00001989 wgpuQueueWriteBuffer: (queuePtr, bufferPtr, bufferOffset, data, size) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001990 var queue = WebGPU.getJsObject(queuePtr);
1991 var buffer = WebGPU.getJsObject(bufferPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00001992 // There is a size limitation for ArrayBufferView. Work around by passing in a subarray
1993 // instead of the whole heap. crbug.com/1201109
1994 var subarray = HEAPU8.subarray(data, data + size);
1995 queue.writeBuffer(buffer, bufferOffset, subarray, 0, size);
1996 },
1997
1998 wgpuQueueWriteTexture: (queuePtr, destinationPtr, data, dataSize, dataLayoutPtr, writeSizePtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00001999 var queue = WebGPU.getJsObject(queuePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002000
2001 var destination = WebGPU.makeImageCopyTexture(destinationPtr);
2002 var dataLayout = WebGPU.makeTextureDataLayout(dataLayoutPtr);
2003 var writeSize = WebGPU.makeExtent3D(writeSizePtr);
2004 // This subarray isn't strictly necessary, but helps work around an issue
2005 // where Chromium makes a copy of the entire heap. crbug.com/1134457
2006 var subarray = HEAPU8.subarray(data, data + dataSize);
2007 queue.writeTexture(destination, subarray, dataLayout, writeSize);
2008 },
2009
2010 // --------------------------------------------------------------------------
2011 // Methods of RenderBundle
2012 // --------------------------------------------------------------------------
2013
2014 wgpuRenderBundleSetLabel: (bundlePtr, labelPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002015 var bundle = WebGPU.getJsObject(bundlePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002016 bundle.label = UTF8ToString(labelPtr);
2017 },
2018
2019 // --------------------------------------------------------------------------
2020 // Methods of RenderBundleEncoder
2021 // --------------------------------------------------------------------------
2022
2023 wgpuRenderBundleEncoderDraw: (passPtr, vertexCount, instanceCount, firstVertex, firstInstance) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002024 var pass = WebGPU.getJsObject(passPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002025 pass.draw(vertexCount, instanceCount, firstVertex, firstInstance);
2026 },
2027
2028 wgpuRenderBundleEncoderDrawIndexed: (passPtr, indexCount, instanceCount, firstIndex, baseVertex, firstInstance) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002029 var pass = WebGPU.getJsObject(passPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002030 pass.drawIndexed(indexCount, instanceCount, firstIndex, baseVertex, firstInstance);
2031 },
2032
2033 wgpuRenderBundleEncoderDrawIndexedIndirect: (passPtr, indirectBufferPtr, indirectOffset) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002034 var indirectBuffer = WebGPU.getJsObject(indirectBufferPtr);
2035 var pass = WebGPU.getJsObject(passPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002036 pass.drawIndexedIndirect(indirectBuffer, indirectOffset);
2037 },
2038
2039 wgpuRenderBundleEncoderDrawIndirect: (passPtr, indirectBufferPtr, indirectOffset) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002040 var indirectBuffer = WebGPU.getJsObject(indirectBufferPtr);
2041 var pass = WebGPU.getJsObject(passPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002042 pass.drawIndirect(indirectBuffer, indirectOffset);
2043 },
2044
2045 wgpuRenderBundleEncoderFinish__deps: ['emwgpuCreateRenderBundle'],
2046 wgpuRenderBundleEncoderFinish: (encoderPtr, descriptor) => {
2047 var desc;
2048 if (descriptor) {
2049 {{{ gpu.makeCheckDescriptor('descriptor') }}}
2050 desc = {};
2051 var labelPtr = {{{ makeGetValue('descriptor', C_STRUCTS.WGPURenderBundleDescriptor.label, '*') }}};
2052 if (labelPtr) desc["label"] = UTF8ToString(labelPtr);
2053 }
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002054 var encoder = WebGPU.getJsObject(encoderPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002055 var ptr = _emwgpuCreateRenderBundle();
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002056 WebGPU.Internals.jsObjectInsert(ptr, encoder.finish(desc));
Loko Kung5a9506d2024-08-17 01:44:45 +00002057 return ptr;
2058 },
2059
2060 wgpuRenderBundleEncoderInsertDebugMarker: (encoderPtr, markerLabelPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002061 var encoder = WebGPU.getJsObject(encoderPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002062 encoder.insertDebugMarker(UTF8ToString(markerLabelPtr));
2063 },
2064
2065 wgpuRenderBundleEncoderPopDebugGroup: (encoderPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002066 var encoder = WebGPU.getJsObject(encoderPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002067 encoder.popDebugGroup();
2068 },
2069
2070 wgpuRenderBundleEncoderPushDebugGroup: (encoderPtr, groupLabelPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002071 var encoder = WebGPU.getJsObject(encoderPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002072 encoder.pushDebugGroup(UTF8ToString(groupLabelPtr));
2073 },
2074
2075 wgpuRenderBundleEncoderSetBindGroup: (passPtr, groupIndex, groupPtr, dynamicOffsetCount, dynamicOffsetsPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002076 var pass = WebGPU.getJsObject(passPtr);
2077 var group = WebGPU.getJsObject(groupPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002078 if (dynamicOffsetCount == 0) {
2079 pass.setBindGroup(groupIndex, group);
2080 } else {
2081 var offsets = [];
2082 for (var i = 0; i < dynamicOffsetCount; i++, dynamicOffsetsPtr += 4) {
2083 offsets.push({{{ gpu.makeGetU32('dynamicOffsetsPtr', 0) }}});
2084 }
2085 pass.setBindGroup(groupIndex, group, offsets);
2086 }
2087 },
2088
2089 wgpuRenderBundleEncoderSetIndexBuffer: (passPtr, bufferPtr, format, offset, size) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002090 var pass = WebGPU.getJsObject(passPtr);
2091 var buffer = WebGPU.getJsObject(bufferPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002092 {{{ gpu.convertSentinelToUndefined('size') }}}
2093 pass.setIndexBuffer(buffer, WebGPU.IndexFormat[format], offset, size);
2094 },
2095
2096 wgpuRenderBundleEncoderSetLabel: (passPtr, labelPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002097 var pass = WebGPU.getJsObject(passPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002098 pass.label = UTF8ToString(labelPtr);
2099 },
2100
2101 wgpuRenderBundleEncoderSetPipeline: (passPtr, pipelinePtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002102 var pass = WebGPU.getJsObject(passPtr);
2103 var pipeline = WebGPU.getJsObject(pipelinePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002104 pass.setPipeline(pipeline);
2105 },
2106
2107 wgpuRenderBundleEncoderSetVertexBuffer: (passPtr, slot, bufferPtr, offset, size) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002108 var pass = WebGPU.getJsObject(passPtr);
2109 var buffer = WebGPU.getJsObject(bufferPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002110 {{{ gpu.convertSentinelToUndefined('size') }}}
2111 pass.setVertexBuffer(slot, buffer, offset, size);
2112 },
2113
2114 // --------------------------------------------------------------------------
2115 // Methods of RenderPassEncoder
2116 // --------------------------------------------------------------------------
2117
2118 wgpuRenderPassEncoderBeginOcclusionQuery: (passPtr, queryIndex) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002119 var pass = WebGPU.getJsObject(passPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002120 pass.beginOcclusionQuery(queryIndex);
2121 },
2122
2123 wgpuRenderPassEncoderDraw: (passPtr, vertexCount, instanceCount, firstVertex, firstInstance) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002124 var pass = WebGPU.getJsObject(passPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002125 pass.draw(vertexCount, instanceCount, firstVertex, firstInstance);
2126 },
2127
2128 wgpuRenderPassEncoderDrawIndexed: (passPtr, indexCount, instanceCount, firstIndex, baseVertex, firstInstance) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002129 var pass = WebGPU.getJsObject(passPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002130 pass.drawIndexed(indexCount, instanceCount, firstIndex, baseVertex, firstInstance);
2131 },
2132
2133 wgpuRenderPassEncoderDrawIndexedIndirect: (passPtr, indirectBufferPtr, indirectOffset) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002134 var indirectBuffer = WebGPU.getJsObject(indirectBufferPtr);
2135 var pass = WebGPU.getJsObject(passPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002136 pass.drawIndexedIndirect(indirectBuffer, indirectOffset);
2137 },
2138
2139 wgpuRenderPassEncoderDrawIndirect: (passPtr, indirectBufferPtr, indirectOffset) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002140 var indirectBuffer = WebGPU.getJsObject(indirectBufferPtr);
2141 var pass = WebGPU.getJsObject(passPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002142 pass.drawIndirect(indirectBuffer, indirectOffset);
2143 },
2144
2145 wgpuRenderPassEncoderEnd: (encoderPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002146 var encoder = WebGPU.getJsObject(encoderPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002147 encoder.end();
2148 },
2149
2150 wgpuRenderPassEncoderEndOcclusionQuery: (passPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002151 var pass = WebGPU.getJsObject(passPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002152 pass.endOcclusionQuery();
2153 },
2154
2155 wgpuRenderPassEncoderExecuteBundles: (passPtr, count, bundlesPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002156 var pass = WebGPU.getJsObject(passPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002157
2158#if ASSERTIONS
2159 assert(bundlesPtr % 4 === 0);
2160#endif
2161
2162 var bundles = Array.from({{{ makeHEAPView(`${POINTER_BITS}`, 'bundlesPtr', `bundlesPtr + count * ${POINTER_SIZE}`) }}},
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002163 (id) => WebGPU.getJsObject(id));
Loko Kung5a9506d2024-08-17 01:44:45 +00002164 pass.executeBundles(bundles);
2165 },
2166
2167 wgpuRenderPassEncoderInsertDebugMarker: (encoderPtr, markerLabelPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002168 var encoder = WebGPU.getJsObject(encoderPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002169 encoder.insertDebugMarker(UTF8ToString(markerLabelPtr));
2170 },
2171
2172 wgpuRenderPassEncoderPopDebugGroup: (encoderPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002173 var encoder = WebGPU.getJsObject(encoderPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002174 encoder.popDebugGroup();
2175 },
2176
2177 wgpuRenderPassEncoderPushDebugGroup: (encoderPtr, groupLabelPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002178 var encoder = WebGPU.getJsObject(encoderPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002179 encoder.pushDebugGroup(UTF8ToString(groupLabelPtr));
2180 },
2181
2182 wgpuRenderPassEncoderSetBindGroup: (passPtr, groupIndex, groupPtr, dynamicOffsetCount, dynamicOffsetsPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002183 var pass = WebGPU.getJsObject(passPtr);
2184 var group = WebGPU.getJsObject(groupPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002185 if (dynamicOffsetCount == 0) {
2186 pass.setBindGroup(groupIndex, group);
2187 } else {
2188 var offsets = [];
2189 for (var i = 0; i < dynamicOffsetCount; i++, dynamicOffsetsPtr += 4) {
2190 offsets.push({{{ gpu.makeGetU32('dynamicOffsetsPtr', 0) }}});
2191 }
2192 pass.setBindGroup(groupIndex, group, offsets);
2193 }
2194 },
2195
2196 wgpuRenderPassEncoderSetBlendConstant: (passPtr, colorPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002197 var pass = WebGPU.getJsObject(passPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002198 var color = WebGPU.makeColor(colorPtr);
2199 pass.setBlendConstant(color);
2200 },
2201
2202 wgpuRenderPassEncoderSetIndexBuffer: (passPtr, bufferPtr, format, offset, size) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002203 var pass = WebGPU.getJsObject(passPtr);
2204 var buffer = WebGPU.getJsObject(bufferPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002205 {{{ gpu.convertSentinelToUndefined('size') }}}
2206 pass.setIndexBuffer(buffer, WebGPU.IndexFormat[format], offset, size);
2207 },
2208
2209 wgpuRenderPassEncoderSetLabel: (passPtr, labelPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002210 var pass = WebGPU.getJsObject(passPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002211 pass.label = UTF8ToString(labelPtr);
2212 },
2213
2214 wgpuRenderPassEncoderSetPipeline: (passPtr, pipelinePtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002215 var pass = WebGPU.getJsObject(passPtr);
2216 var pipeline = WebGPU.getJsObject(pipelinePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002217 pass.setPipeline(pipeline);
2218 },
2219
2220 wgpuRenderPassEncoderSetScissorRect: (passPtr, x, y, w, h) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002221 var pass = WebGPU.getJsObject(passPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002222 pass.setScissorRect(x, y, w, h);
2223 },
2224
2225 wgpuRenderPassEncoderSetStencilReference: (passPtr, reference) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002226 var pass = WebGPU.getJsObject(passPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002227 pass.setStencilReference(reference);
2228 },
2229
2230 wgpuRenderPassEncoderSetVertexBuffer: (passPtr, slot, bufferPtr, offset, size) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002231 var pass = WebGPU.getJsObject(passPtr);
2232 var buffer = WebGPU.getJsObject(bufferPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002233 {{{ gpu.convertSentinelToUndefined('size') }}}
2234 pass.setVertexBuffer(slot, buffer, offset, size);
2235 },
2236
2237 wgpuRenderPassEncoderSetViewport: (passPtr, x, y, w, h, minDepth, maxDepth) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002238 var pass = WebGPU.getJsObject(passPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002239 pass.setViewport(x, y, w, h, minDepth, maxDepth);
2240 },
2241
2242 wgpuRenderPassEncoderWriteTimestamp: (encoderPtr, querySetPtr, queryIndex) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002243 var encoder = WebGPU.getJsObject(encoderPtr);
2244 var querySet = WebGPU.getJsObject(querySetPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002245 encoder.writeTimestamp(querySet, queryIndex);
2246 },
2247
2248 // --------------------------------------------------------------------------
2249 // Methods of RenderPipeline
2250 // --------------------------------------------------------------------------
2251
2252 wgpuRenderPipelineGetBindGroupLayout__deps: ['emwgpuCreateBindGroupLayout'],
2253 wgpuRenderPipelineGetBindGroupLayout: (pipelinePtr, groupIndex) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002254 var pipeline = WebGPU.getJsObject(pipelinePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002255 var ptr = _emwgpuCreateBindGroupLayout();
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002256 WebGPU.Internals.jsObjectInsert(ptr, pipeline.getBindGroupLayout(groupIndex));
2257 return ptr;
Loko Kung5a9506d2024-08-17 01:44:45 +00002258 },
2259
2260 wgpuRenderPipelineSetLabel: (pipelinePtr, labelPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002261 var pipeline = WebGPU.getJsObject(pipelinePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002262 pipeline.label = UTF8ToString(labelPtr);
2263 },
2264
2265 // --------------------------------------------------------------------------
2266 // Methods of Sampler
2267 // --------------------------------------------------------------------------
2268
2269 wgpuSamplerSetLabel: (samplerPtr, labelPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002270 var sampler = WebGPU.getJsObject(samplerPtr);
Kai Ninomiyaace5a582024-07-02 20:52:25 +00002271 sampler.label = UTF8ToString(labelPtr);
2272 },
2273
Loko Kung5a9506d2024-08-17 01:44:45 +00002274 // --------------------------------------------------------------------------
2275 // Methods of ShaderModule
2276 // --------------------------------------------------------------------------
Kai Ninomiyaace5a582024-07-02 20:52:25 +00002277
Loko Kung5a9506d2024-08-17 01:44:45 +00002278 wgpuShaderModuleGetCompilationInfo__deps: ['$callUserCallback', '$stringToUTF8', '$lengthBytesUTF8', 'malloc', 'free'],
2279 wgpuShaderModuleGetCompilationInfo: (shaderModulePtr, callback, userdata) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002280 var shaderModule = WebGPU.getJsObject(shaderModulePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002281 {{{ runtimeKeepalivePush() }}}
2282 shaderModule.getCompilationInfo().then((compilationInfo) => {
2283 {{{ runtimeKeepalivePop() }}}
2284 callUserCallback(() => {
2285 var compilationMessagesPtr = _malloc({{{ C_STRUCTS.WGPUCompilationMessage.__size__ }}} * compilationInfo.messages.length);
2286 var messageStringPtrs = []; // save these to free later
2287 for (var i = 0; i < compilationInfo.messages.length; ++i) {
2288 var compilationMessage = compilationInfo.messages[i];
2289 var compilationMessagePtr = compilationMessagesPtr + {{{ C_STRUCTS.WGPUCompilationMessage.__size__ }}} * i;
2290 var messageSize = lengthBytesUTF8(compilationMessage.message) + 1;
2291 var messagePtr = _malloc(messageSize);
2292 messageStringPtrs.push(messagePtr);
2293 stringToUTF8(compilationMessage.message, messagePtr, messageSize);
2294 {{{ makeSetValue('compilationMessagePtr', C_STRUCTS.WGPUCompilationMessage.message, 'messagePtr', '*') }}};
2295 {{{ makeSetValue('compilationMessagePtr', C_STRUCTS.WGPUCompilationMessage.type, 'WebGPU.Int_CompilationMessageType[compilationMessage.type]', 'i32') }}};
2296 {{{ makeSetValue('compilationMessagePtr', C_STRUCTS.WGPUCompilationMessage.lineNum, 'compilationMessage.lineNum', 'i64') }}};
2297 {{{ makeSetValue('compilationMessagePtr', C_STRUCTS.WGPUCompilationMessage.linePos, 'compilationMessage.linePos', 'i64') }}};
2298 {{{ makeSetValue('compilationMessagePtr', C_STRUCTS.WGPUCompilationMessage.offset, 'compilationMessage.offset', 'i64') }}};
2299 {{{ makeSetValue('compilationMessagePtr', C_STRUCTS.WGPUCompilationMessage.length, 'compilationMessage.length', 'i64') }}};
2300 // TODO: Convert JavaScript's UTF-16-code-unit offsets to UTF-8-code-unit offsets.
2301 // https://github.com/webgpu-native/webgpu-headers/issues/246
2302 {{{ makeSetValue('compilationMessagePtr', C_STRUCTS.WGPUCompilationMessage.utf16LinePos, 'compilationMessage.linePos', 'i64') }}};
2303 {{{ makeSetValue('compilationMessagePtr', C_STRUCTS.WGPUCompilationMessage.utf16Offset, 'compilationMessage.offset', 'i64') }}};
2304 {{{ makeSetValue('compilationMessagePtr', C_STRUCTS.WGPUCompilationMessage.utf16Length, 'compilationMessage.length', 'i64') }}};
2305 }
2306 var compilationInfoPtr = _malloc({{{ C_STRUCTS.WGPUCompilationInfo.__size__ }}});
2307 {{{ makeSetValue('compilationInfoPtr', C_STRUCTS.WGPUCompilationInfo.messageCount, 'compilationInfo.messages.length', '*') }}}
2308 {{{ makeSetValue('compilationInfoPtr', C_STRUCTS.WGPUCompilationInfo.messages, 'compilationMessagesPtr', '*') }}};
2309
2310 {{{ makeDynCall('vipp', 'callback') }}}({{{ gpu.CompilationInfoRequestStatus.Success }}}, compilationInfoPtr, userdata);
2311
2312 messageStringPtrs.forEach((ptr) => {
2313 _free(ptr);
2314 });
2315 _free(compilationMessagesPtr);
2316 _free(compilationInfoPtr);
2317 });
2318 });
2319 },
2320
2321 wgpuShaderModuleSetLabel: (shaderModulePtr, labelPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002322 var shaderModule = WebGPU.getJsObject(shaderModulePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002323 shaderModule.label = UTF8ToString(labelPtr);
2324 },
2325
2326 // --------------------------------------------------------------------------
2327 // Methods of Surface
2328 // --------------------------------------------------------------------------
2329
2330 wgpuSurfaceConfigure: (surfacePtr, config) => {
Kai Ninomiyaace5a582024-07-02 20:52:25 +00002331 {{{ gpu.makeCheckDescriptor('config') }}}
Loko Kung5a9506d2024-08-17 01:44:45 +00002332 var devicePtr = {{{ makeGetValue('config', C_STRUCTS.WGPUSurfaceConfiguration.device, '*') }}};
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002333 var context = WebGPU.getJsObject(surfacePtr);
Kai Ninomiyaace5a582024-07-02 20:52:25 +00002334
2335#if ASSERTIONS
2336 var viewFormatCount = {{{ gpu.makeGetU32('config', C_STRUCTS.WGPUSurfaceConfiguration.viewFormatCount) }}};
2337 var viewFormats = {{{ makeGetValue('config', C_STRUCTS.WGPUSurfaceConfiguration.viewFormats, '*') }}};
2338 assert(viewFormatCount === 0 && viewFormats === 0, "TODO: Support viewFormats.");
Kai Ninomiyaace5a582024-07-02 20:52:25 +00002339 assert({{{ gpu.PresentMode.Fifo }}} ===
2340 {{{ gpu.makeGetU32('config', C_STRUCTS.WGPUSurfaceConfiguration.presentMode) }}});
2341#endif
2342
2343 var canvasSize = [
2344 {{{ gpu.makeGetU32('config', C_STRUCTS.WGPUSurfaceConfiguration.width) }}},
2345 {{{ gpu.makeGetU32('config', C_STRUCTS.WGPUSurfaceConfiguration.height) }}}
2346 ];
2347
2348 if (canvasSize[0] !== 0) {
2349 context["canvas"]["width"] = canvasSize[0];
2350 }
2351
2352 if (canvasSize[1] !== 0) {
2353 context["canvas"]["height"] = canvasSize[1];
2354 }
2355
2356 var configuration = {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002357 "device": WebGPU.getJsObject(devicePtr),
Kai Ninomiyaace5a582024-07-02 20:52:25 +00002358 "format": WebGPU.TextureFormat[
2359 {{{ gpu.makeGetU32('config', C_STRUCTS.WGPUSurfaceConfiguration.format) }}}],
2360 "usage": {{{ gpu.makeGetU32('config', C_STRUCTS.WGPUSurfaceConfiguration.usage) }}},
Kai Ninomiya6d1e2132024-09-05 23:05:45 +00002361 "alphaMode": WebGPU.CompositeAlphaMode[
2362 {{{ gpu.makeGetU32('config', C_STRUCTS.WGPUSurfaceConfiguration.alphaMode) }}}],
Kai Ninomiyaace5a582024-07-02 20:52:25 +00002363 };
2364 context.configure(configuration);
2365 },
2366
Loko Kung424cda22024-08-17 01:29:10 +00002367 wgpuSurfaceGetCurrentTexture__deps: ['emwgpuCreateTexture'],
Loko Kung5a9506d2024-08-17 01:44:45 +00002368 wgpuSurfaceGetCurrentTexture: (surfacePtr, surfaceTexturePtr) => {
Kai Ninomiyaace5a582024-07-02 20:52:25 +00002369 {{{ gpu.makeCheck('surfaceTexturePtr') }}}
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002370 var context = WebGPU.getJsObject(surfacePtr);
Kai Ninomiyaace5a582024-07-02 20:52:25 +00002371
2372 try {
Loko Kung424cda22024-08-17 01:29:10 +00002373 var texturePtr = _emwgpuCreateTexture();
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002374 WebGPU.Internals.jsObjectInsert(texturePtr, context.getCurrentTexture());
Loko Kung424cda22024-08-17 01:29:10 +00002375 {{{ makeSetValue('surfaceTexturePtr', C_STRUCTS.WGPUSurfaceTexture.texture, 'texturePtr', '*') }}};
Kai Ninomiyaace5a582024-07-02 20:52:25 +00002376 {{{ makeSetValue('surfaceTexturePtr', C_STRUCTS.WGPUSurfaceTexture.suboptimal, '0', 'i32') }}};
Kai Ninomiya11784002024-07-03 19:46:03 +00002377 {{{ makeSetValue('surfaceTexturePtr', C_STRUCTS.WGPUSurfaceTexture.status,
Kai Ninomiyaace5a582024-07-02 20:52:25 +00002378 gpu.SurfaceGetCurrentTextureStatus.Success, 'i32') }}};
2379 } catch (ex) {
2380#if ASSERTIONS
2381 err(`wgpuSurfaceGetCurrentTexture() failed: ${ex}`);
2382#endif
2383 {{{ makeSetValue('surfaceTexturePtr', C_STRUCTS.WGPUSurfaceTexture.texture, '0', '*') }}};
2384 {{{ makeSetValue('surfaceTexturePtr', C_STRUCTS.WGPUSurfaceTexture.suboptimal, '0', 'i32') }}};
2385 // TODO(https://github.com/webgpu-native/webgpu-headers/issues/291): What should the status be here?
2386 {{{ makeSetValue('surfaceTexturePtr', C_STRUCTS.WGPUSurfaceTexture.status,
2387 gpu.SurfaceGetCurrentTextureStatus.DeviceLost, 'i32') }}};
2388 }
2389 },
2390
Loko Kung5a9506d2024-08-17 01:44:45 +00002391 wgpuSurfacePresent: (surfacePtr) => {
Kai Ninomiyaace5a582024-07-02 20:52:25 +00002392 // TODO: This could probably be emulated with ASYNCIFY.
2393 abort('wgpuSurfacePresent is unsupported (use requestAnimationFrame via html5.h instead)');
2394 },
2395
Loko Kung5a9506d2024-08-17 01:44:45 +00002396 wgpuSurfaceUnconfigure: (surfacePtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002397 var context = WebGPU.getJsObject(surfacePtr);
Kai Ninomiyaace5a582024-07-02 20:52:25 +00002398 context.unconfigure();
2399 },
2400
Loko Kung5a9506d2024-08-17 01:44:45 +00002401 // --------------------------------------------------------------------------
Loko Kung5a9506d2024-08-17 01:44:45 +00002402 // Methods of Texture
2403 // --------------------------------------------------------------------------
2404
2405 wgpuTextureCreateView__deps: ['emwgpuCreateTextureView'],
2406 wgpuTextureCreateView: (texturePtr, descriptor) => {
2407 var desc;
2408 if (descriptor) {
2409 {{{ gpu.makeCheckDescriptor('descriptor') }}}
2410 var mipLevelCount = {{{ gpu.makeGetU32('descriptor', C_STRUCTS.WGPUTextureViewDescriptor.mipLevelCount) }}};
2411 var arrayLayerCount = {{{ gpu.makeGetU32('descriptor', C_STRUCTS.WGPUTextureViewDescriptor.arrayLayerCount) }}};
2412 desc = {
2413 "format": WebGPU.TextureFormat[
2414 {{{ gpu.makeGetU32('descriptor', C_STRUCTS.WGPUTextureViewDescriptor.format) }}}],
2415 "dimension": WebGPU.TextureViewDimension[
2416 {{{ gpu.makeGetU32('descriptor', C_STRUCTS.WGPUTextureViewDescriptor.dimension) }}}],
2417 "baseMipLevel": {{{ gpu.makeGetU32('descriptor', C_STRUCTS.WGPUTextureViewDescriptor.baseMipLevel) }}},
2418 "mipLevelCount": mipLevelCount === {{{ gpu.MIP_LEVEL_COUNT_UNDEFINED }}} ? undefined : mipLevelCount,
2419 "baseArrayLayer": {{{ gpu.makeGetU32('descriptor', C_STRUCTS.WGPUTextureViewDescriptor.baseArrayLayer) }}},
2420 "arrayLayerCount": arrayLayerCount === {{{ gpu.ARRAY_LAYER_COUNT_UNDEFINED }}} ? undefined : arrayLayerCount,
2421 "aspect": WebGPU.TextureAspect[
2422 {{{ gpu.makeGetU32('descriptor', C_STRUCTS.WGPUTextureViewDescriptor.aspect) }}}],
2423 };
2424 var labelPtr = {{{ makeGetValue('descriptor', C_STRUCTS.WGPUTextureViewDescriptor.label, '*') }}};
2425 if (labelPtr) desc["label"] = UTF8ToString(labelPtr);
2426 }
2427
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002428 var texture = WebGPU.getJsObject(texturePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002429 var ptr = _emwgpuCreateTextureView();
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002430 WebGPU.Internals.jsObjectInsert(ptr, texture.createView(desc));
Loko Kung5a9506d2024-08-17 01:44:45 +00002431 return ptr;
2432 },
2433
2434 wgpuTextureDestroy: (texturePtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002435 WebGPU.getJsObject(texturePtr).destroy();
Loko Kung5a9506d2024-08-17 01:44:45 +00002436 },
2437
2438 wgpuTextureGetDepthOrArrayLayers: (texturePtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002439 var texture = WebGPU.getJsObject(texturePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002440 return texture.depthOrArrayLayers;
2441 },
2442
2443 wgpuTextureGetDimension: (texturePtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002444 var texture = WebGPU.getJsObject(texturePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002445 return WebGPU.TextureDimension.indexOf(texture.dimension);
2446 },
2447
2448 wgpuTextureGetFormat: (texturePtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002449 var texture = WebGPU.getJsObject(texturePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002450 // Should return the enum integer instead of string.
2451 return WebGPU.TextureFormat.indexOf(texture.format);
2452 },
2453
2454 wgpuTextureGetHeight: (texturePtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002455 var texture = WebGPU.getJsObject(texturePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002456 return texture.height;
2457 },
2458
2459 wgpuTextureGetMipLevelCount: (texturePtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002460 var texture = WebGPU.getJsObject(texturePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002461 return texture.mipLevelCount;
2462 },
2463
2464 wgpuTextureGetSampleCount: (texturePtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002465 var texture = WebGPU.getJsObject(texturePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002466 return texture.sampleCount;
2467 },
2468
2469 wgpuTextureGetUsage: (texturePtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002470 var texture = WebGPU.getJsObject(texturePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002471 return texture.usage;
2472 },
2473
2474 wgpuTextureGetWidth: (texturePtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002475 var texture = WebGPU.getJsObject(texturePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002476 return texture.width;
2477 },
2478
2479 wgpuTextureSetLabel: (texturePtr, labelPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002480 var texture = WebGPU.getJsObject(texturePtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002481 texture.label = UTF8ToString(labelPtr);
2482 },
2483
2484 // --------------------------------------------------------------------------
2485 // Methods of TextureView
2486 // --------------------------------------------------------------------------
2487
2488 wgpuTextureViewSetLabel: (textureViewPtr, labelPtr) => {
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002489 var textureView = WebGPU.getJsObject(textureViewPtr);
Loko Kung5a9506d2024-08-17 01:44:45 +00002490 textureView.label = UTF8ToString(labelPtr);
2491 },
Kai Ninomiyaace5a582024-07-02 20:52:25 +00002492};
2493
2494// Inverted index used by EnumerateFeatures/HasFeature
2495LibraryWebGPU.$WebGPU.FeatureNameString2Enum = {};
2496for (var value in LibraryWebGPU.$WebGPU.FeatureName) {
2497 LibraryWebGPU.$WebGPU.FeatureNameString2Enum[LibraryWebGPU.$WebGPU.FeatureName[value]] = value;
2498}
2499
2500for (const key of Object.keys(LibraryWebGPU)) {
2501 if (typeof LibraryWebGPU[key] === 'function') {
Loko Kung859fb302024-08-17 01:44:58 +00002502 if (!(key + '__i53abi' in LibraryWebGPU)) {
2503 LibraryWebGPU[key + '__i53abi'] = true;
2504 }
Kai Ninomiyaace5a582024-07-02 20:52:25 +00002505 }
2506}
2507
Lokbondo Kung83ebea32024-10-11 22:40:03 +00002508// Based on autoAddDeps, this helper iterates the object and moves the
2509// deps upwards into targetDeps and remove them from the object.
2510function moveDeps(object, targetDeps) {
2511 for (var item in object) {
2512 if (!item.endsWith('__deps')) {
2513 if (object[item + '__deps']) {
2514 targetDeps.push(...object[item + '__deps']);
2515 delete object[item + '__deps']
2516 }
2517 }
2518 }
2519}
2520moveDeps(LibraryWebGPU.$WebGPU, LibraryWebGPU.$WebGPU__deps)
2521
Kai Ninomiyaace5a582024-07-02 20:52:25 +00002522autoAddDeps(LibraryWebGPU, '$WebGPU');
Kai Ninomiya11784002024-07-03 19:46:03 +00002523mergeInto(LibraryManager.library, LibraryWebGPU);