Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1 | /** |
| 2 | * @license |
| 3 | * Copyright 2019 The Emscripten Authors |
| 4 | * SPDX-License-Identifier: MIT |
| 5 | */ |
| 6 | |
| 7 | /* |
Kai Ninomiya | 1178400 | 2024-07-03 19:46:03 +0000 | [diff] [blame] | 8 | * Dawn's fork of Emscripten's WebGPU bindings. This will be contributed back to |
| 9 | * Emscripten after reaching approximately webgpu.h "1.0". |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 10 | * |
Kai Ninomiya | 1178400 | 2024-07-03 19:46:03 +0000 | [diff] [blame] | 11 | * IMPORTANT: See //src/emdawnwebgpu/README.md for info on how to use this. |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 12 | */ |
| 13 | |
| 14 | {{{ |
Kai Ninomiya | 1178400 | 2024-07-03 19:46:03 +0000 | [diff] [blame] | 15 | 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 Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 19 | // Helper functions for code generation |
| 20 | globalThis.gpu = { |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 21 | 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 Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 40 | 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 Kung | b339ed4 | 2024-09-06 02:49:19 +0000 | [diff] [blame] | 43 | // ShaderSourceSPIRV), there is no .nextInChain pointer, but |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 44 | // 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 52 | 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 Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 62 | |
| 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 Ninomiya | 1178400 | 2024-07-03 19:46:03 +0000 | [diff] [blame] | 70 | ...WEBGPU_ENUM_CONSTANT_TABLES, |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 71 | }; |
| 72 | null; |
| 73 | }}} |
| 74 | |
| 75 | var LibraryWebGPU = { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 76 | $WebGPU__deps: [], |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 77 | $WebGPU: { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 78 | // 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 Kung | 424cda2 | 2024-08-17 01:29:10 +0000 | [diff] [blame] | 89 | |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 90 | // Buffer unmapping callbacks are stored in a separate table to keep |
| 91 | // the jsObject table simple. |
| 92 | bufferOnUnmaps: [], |
Loko Kung | 424cda2 | 2024-08-17 01:29:10 +0000 | [diff] [blame] | 93 | |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 94 | // 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 Kung | 859fb30 | 2024-08-17 01:44:58 +0000 | [diff] [blame] | 103 | #if ASYNCIFY |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 104 | var futureId = futureIdH * 0x100000000 + futureIdL; |
| 105 | WebGPU.Internals.futures[futureId] = |
| 106 | new Promise((resolve) => promise.finally(() => resolve(futureId))); |
Loko Kung | 859fb30 | 2024-08-17 01:44:58 +0000 | [diff] [blame] | 107 | #endif |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 108 | }, |
| 109 | waitAnyPromisesList: [], |
Loko Kung | 859fb30 | 2024-08-17 01:44:58 +0000 | [diff] [blame] | 110 | }, |
Loko Kung | 859fb30 | 2024-08-17 01:44:58 +0000 | [diff] [blame] | 111 | |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 112 | // 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 140 | var devicePtr = _emwgpuCreateDevice(parentPtr, queuePtr); |
Lokbondo Kung | 7927ad0 | 2024-10-11 23:20:07 +0000 | [diff] [blame^] | 141 | WebGPU.Internals.jsObjectInsert(queuePtr, device.queue); |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 142 | 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 Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 160 | 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 Kung | 6e4a366 | 2024-10-11 21:44:57 +0000 | [diff] [blame] | 167 | setStringView: (ptr, data, length) => { |
| 168 | {{{ makeSetValue('ptr', C_STRUCTS.WGPUStringView.data, 'data', '*') }}}; |
| 169 | {{{ makeSetValue('ptr', C_STRUCTS.WGPUStringView.length, 'length', '*') }}}; |
| 170 | }, |
| 171 | |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 172 | 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 Ninomiya | 1178400 | 2024-07-03 19:46:03 +0000 | [diff] [blame] | 198 | {{{ gpu.makeCheck('ptr') }}} |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 199 | return { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 200 | "texture": WebGPU.getJsObject( |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 201 | {{{ 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 Ninomiya | 1178400 | 2024-07-03 19:46:03 +0000 | [diff] [blame] | 220 | {{{ gpu.makeCheck('ptr') }}} |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 221 | var layoutPtr = ptr + {{{ C_STRUCTS.WGPUImageCopyBuffer.layout }}}; |
| 222 | var bufferCopyView = WebGPU.makeTextureDataLayout(layoutPtr); |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 223 | bufferCopyView["buffer"] = WebGPU.getJsObject( |
| 224 | {{{ makeGetValue('ptr', C_STRUCTS.WGPUImageCopyBuffer.buffer, '*') }}}); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 225 | 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 241 | return WebGPU.getJsObject(layoutPtr); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 242 | }, |
| 243 | |
| 244 | makeProgrammableStageDescriptor: (ptr) => { |
| 245 | if (!ptr) return undefined; |
| 246 | {{{ gpu.makeCheckDescriptor('ptr') }}} |
| 247 | var desc = { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 248 | "module": WebGPU.getJsObject( |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 249 | {{{ 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 Ninomiya | 1178400 | 2024-07-03 19:46:03 +0000 | [diff] [blame] | 259 | 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 Ninomiya | 1178400 | 2024-07-03 19:46:03 +0000 | [diff] [blame] | 276 | |
Kai Ninomiya | a46bbf9 | 2024-09-05 23:02:32 +0000 | [diff] [blame] | 277 | function makePrimitiveState(psPtr) { |
| 278 | if (!psPtr) return undefined; |
| 279 | {{{ gpu.makeCheckDescriptor('psPtr') }}} |
Kai Ninomiya | 1178400 | 2024-07-03 19:46:03 +0000 | [diff] [blame] | 280 | return { |
| 281 | "topology": WebGPU.PrimitiveTopology[ |
Kai Ninomiya | a46bbf9 | 2024-09-05 23:02:32 +0000 | [diff] [blame] | 282 | {{{ gpu.makeGetU32('psPtr', C_STRUCTS.WGPUPrimitiveState.topology) }}}], |
Kai Ninomiya | 1178400 | 2024-07-03 19:46:03 +0000 | [diff] [blame] | 283 | "stripIndexFormat": WebGPU.IndexFormat[ |
Kai Ninomiya | a46bbf9 | 2024-09-05 23:02:32 +0000 | [diff] [blame] | 284 | {{{ gpu.makeGetU32('psPtr', C_STRUCTS.WGPUPrimitiveState.stripIndexFormat) }}}], |
Kai Ninomiya | 1178400 | 2024-07-03 19:46:03 +0000 | [diff] [blame] | 285 | "frontFace": WebGPU.FrontFace[ |
Kai Ninomiya | a46bbf9 | 2024-09-05 23:02:32 +0000 | [diff] [blame] | 286 | {{{ gpu.makeGetU32('psPtr', C_STRUCTS.WGPUPrimitiveState.frontFace) }}}], |
Kai Ninomiya | 1178400 | 2024-07-03 19:46:03 +0000 | [diff] [blame] | 287 | "cullMode": WebGPU.CullMode[ |
Kai Ninomiya | a46bbf9 | 2024-09-05 23:02:32 +0000 | [diff] [blame] | 288 | {{{ gpu.makeGetU32('psPtr', C_STRUCTS.WGPUPrimitiveState.cullMode) }}}], |
| 289 | "unclippedDepth": |
| 290 | {{{ gpu.makeGetBool('psPtr', C_STRUCTS.WGPUPrimitiveState.unclippedDepth) }}}, |
Kai Ninomiya | 1178400 | 2024-07-03 19:46:03 +0000 | [diff] [blame] | 291 | }; |
| 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 410 | "module": WebGPU.getJsObject( |
Kai Ninomiya | 1178400 | 2024-07-03 19:46:03 +0000 | [diff] [blame] | 411 | {{{ 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 438 | "module": WebGPU.getJsObject( |
Kai Ninomiya | 1178400 | 2024-07-03 19:46:03 +0000 | [diff] [blame] | 439 | {{{ 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 Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 472 | 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 Ninomiya | 1178400 | 2024-07-03 19:46:03 +0000 | [diff] [blame] | 483 | |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 484 | 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 Ninomiya | 1178400 | 2024-07-03 19:46:03 +0000 | [diff] [blame] | 500 | |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 501 | setLimitValueU64('maxUniformBufferBindingSize', {{{ C_STRUCTS.WGPULimits.maxUniformBufferBindingSize }}}); |
| 502 | setLimitValueU64('maxStorageBufferBindingSize', {{{ C_STRUCTS.WGPULimits.maxStorageBufferBindingSize }}}); |
Kai Ninomiya | 1178400 | 2024-07-03 19:46:03 +0000 | [diff] [blame] | 503 | |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 504 | setLimitValueU32('maxVertexBuffers', {{{ C_STRUCTS.WGPULimits.maxVertexBuffers }}}); |
Loko Kung | c1a2d1d | 2024-07-25 23:20:31 +0000 | [diff] [blame] | 505 | setLimitValueU64('maxBufferSize', {{{ C_STRUCTS.WGPULimits.maxBufferSize }}}); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 506 | 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 Ninomiya | 1178400 | 2024-07-03 19:46:03 +0000 | [diff] [blame] | 520 | // Maps from enum string back to enum number, for callbacks. |
| 521 | {{{ WEBGPU_STRING_TO_INT_TABLES }}} |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 522 | |
Kai Ninomiya | 1178400 | 2024-07-03 19:46:03 +0000 | [diff] [blame] | 523 | // Maps from enum number to enum string. |
| 524 | {{{ WEBGPU_INT_TO_STRING_TABLES }}} |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 525 | }, |
| 526 | |
Loko Kung | 424cda2 | 2024-08-17 01:29:10 +0000 | [diff] [blame] | 527 | // ---------------------------------------------------------------------------- |
Lokbondo Kung | bc3246b | 2024-08-20 19:12:29 +0000 | [diff] [blame] | 528 | // Definitions for standalone JS emwgpu functions (callable from webgpu.cpp and |
| 529 | // library_html5_html.js) |
Loko Kung | 424cda2 | 2024-08-17 01:29:10 +0000 | [diff] [blame] | 530 | // ---------------------------------------------------------------------------- |
| 531 | |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 532 | emwgpuDelete: (ptr) => { |
| 533 | delete WebGPU.Internals.jsObjects[ptr]; |
Lokbondo Kung | bc3246b | 2024-08-20 19:12:29 +0000 | [diff] [blame] | 534 | }, |
| 535 | |
Loko Kung | 859fb30 | 2024-08-17 01:44:58 +0000 | [diff] [blame] | 536 | #if ASYNCIFY |
| 537 | // Returns a FutureID that was resolved, or kNullFutureId if timed out. |
| 538 | emwgpuWaitAny__async: true, |
| 539 | emwgpuWaitAny: (futurePtr, futureCount, timeoutNSPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 540 | var promises = WebGPU.Internals.waitAnyPromisesList; |
Loko Kung | 859fb30 | 2024-08-17 01:44:58 +0000 | [diff] [blame] | 541 | 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 552 | if (!(futureId in WebGPU.Internals.futures)) { |
Loko Kung | 859fb30 | 2024-08-17 01:44:58 +0000 | [diff] [blame] | 553 | return futureId; |
| 554 | } |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 555 | promises[i] = WebGPU.Internals.futures[futureId]; |
Loko Kung | 859fb30 | 2024-08-17 01:44:58 +0000 | [diff] [blame] | 556 | } |
| 557 | |
| 558 | var result = Asyncify.handleAsync(async () => { |
| 559 | return await Promise.race(promises); |
| 560 | }); |
| 561 | |
| 562 | // Clean up internal futures state. |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 563 | delete WebGPU.Internals.futures[result]; |
| 564 | WebGPU.Internals.waitAnyPromisesList.length = 0; |
Loko Kung | 859fb30 | 2024-08-17 01:44:58 +0000 | [diff] [blame] | 565 | return result; |
| 566 | }, |
| 567 | #endif |
| 568 | |
Lokbondo Kung | acdcb8e | 2024-10-07 07:45:09 +0000 | [diff] [blame] | 569 | emwgpuGetPreferredFormat: () => { |
| 570 | var format = navigator["gpu"]["getPreferredCanvasFormat"](); |
| 571 | return WebGPU.Int_PreferredFormat[format]; |
| 572 | }, |
| 573 | |
Loko Kung | 424cda2 | 2024-08-17 01:29:10 +0000 | [diff] [blame] | 574 | // -------------------------------------------------------------------------- |
| 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 Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 582 | // -------------------------------------------------------------------------- |
Loko Kung | 424cda2 | 2024-08-17 01:29:10 +0000 | [diff] [blame] | 583 | // Standalone (non-method) functions |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 584 | // -------------------------------------------------------------------------- |
| 585 | |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 586 | 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 Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 596 | // -------------------------------------------------------------------------- |
| 597 | // Methods of Adapter |
| 598 | // -------------------------------------------------------------------------- |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 599 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 600 | wgpuAdapterEnumerateFeatures: (adapterPtr, featuresOutPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 601 | var adapter = WebGPU.getJsObject(adapterPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 602 | 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 Kung | 6e4a366 | 2024-10-11 21:44:57 +0000 | [diff] [blame] | 613 | wgpuAdapterGetInfo__deps: ['$stringToNewUTF8', '$lengthBytesUTF8'], |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 614 | wgpuAdapterGetInfo: (adapterPtr, info) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 615 | var adapter = WebGPU.getJsObject(adapterPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 616 | {{{ gpu.makeCheckDescriptor('info') }}} |
| 617 | |
Lokbondo Kung | 6e4a366 | 2024-10-11 21:44:57 +0000 | [diff] [blame] | 618 | // 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 Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 638 | {{{ 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 646 | var adapter = WebGPU.getJsObject(adapterPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 647 | WebGPU.fillLimitStruct(adapter.limits, limitsOutPtr); |
| 648 | return 1; |
| 649 | }, |
| 650 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 651 | wgpuAdapterHasFeature: (adapterPtr, featureEnumValue) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 652 | var adapter = WebGPU.getJsObject(adapterPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 653 | return adapter.features.has(WebGPU.FeatureName[featureEnumValue]); |
| 654 | }, |
| 655 | |
Lokbondo Kung | a8fbe98 | 2024-08-30 04:46:53 +0000 | [diff] [blame] | 656 | emwgpuAdapterRequestDevice__i53abi: false, |
Lokbondo Kung | da54247 | 2024-10-10 00:49:17 +0000 | [diff] [blame] | 657 | emwgpuAdapterRequestDevice__deps: ['emwgpuCreateQueue', 'emwgpuOnDeviceLostCompleted', 'emwgpuOnRequestDeviceCompleted', 'emwgpuOnUncapturedError'], |
Lokbondo Kung | a8fbe98 | 2024-08-30 04:46:53 +0000 | [diff] [blame] | 658 | emwgpuAdapterRequestDevice: ( |
| 659 | adapterPtr, |
| 660 | futureIdL, futureIdH, |
| 661 | deviceLostFutureIdL, deviceLostFutureIdH, |
| 662 | devicePtr, queuePtr, descriptor |
| 663 | ) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 664 | var adapter = WebGPU.getJsObject(adapterPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 665 | |
| 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 Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 739 | var labelPtr = {{{ makeGetValue('descriptor', C_STRUCTS.WGPUDeviceDescriptor.label, '*') }}}; |
| 740 | if (labelPtr) desc["label"] = UTF8ToString(labelPtr); |
| 741 | } |
| 742 | |
| 743 | {{{ runtimeKeepalivePush() }}} |
Lokbondo Kung | a8fbe98 | 2024-08-30 04:46:53 +0000 | [diff] [blame] | 744 | var hasDeviceLostFutureId = !!deviceLostFutureIdH || !!deviceLostFutureIdL; |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 745 | WebGPU.Internals.futureInsert(futureIdL, futureIdH, adapter.requestDevice(desc).then((device) => { |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 746 | {{{ runtimeKeepalivePop() }}} |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 747 | WebGPU.Internals.jsObjectInsert(queuePtr, device.queue); |
| 748 | WebGPU.Internals.jsObjectInsert(devicePtr, device); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 749 | |
Lokbondo Kung | a8fbe98 | 2024-08-30 04:46:53 +0000 | [diff] [blame] | 750 | // Set up device lost promise resolution. |
| 751 | if (hasDeviceLostFutureId) { |
Kai Ninomiya | e7ad6c4 | 2024-09-06 10:14:22 +0000 | [diff] [blame] | 752 | {{{ runtimeKeepalivePush() }}} |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 753 | WebGPU.Internals.futureInsert(deviceLostFutureIdL, deviceLostFutureIdH, device.lost.then((info) => { |
Kai Ninomiya | e7ad6c4 | 2024-09-06 10:14:22 +0000 | [diff] [blame] | 754 | {{{ runtimeKeepalivePop() }}} |
Lokbondo Kung | a8fbe98 | 2024-08-30 04:46:53 +0000 | [diff] [blame] | 755 | // Unset the uncaptured error handler. |
| 756 | device.onuncapturederror = (ev) => {}; |
Lokbondo Kung | b967094 | 2024-09-20 10:29:15 +0000 | [diff] [blame] | 757 | var sp = stackSave(); |
| 758 | var messagePtr = stringToUTF8OnStack(info.message); |
| 759 | _emwgpuOnDeviceLostCompleted(deviceLostFutureIdL, deviceLostFutureIdH, WebGPU.Int_DeviceLostReason[info.reason], messagePtr); |
| 760 | stackRestore(sp); |
Lokbondo Kung | a8fbe98 | 2024-08-30 04:46:53 +0000 | [diff] [blame] | 761 | })); |
| 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 Kung | b967094 | 2024-09-20 10:29:15 +0000 | [diff] [blame] | 775 | var sp = stackSave(); |
| 776 | var messagePtr = stringToUTF8OnStack(ev.error.message); |
| 777 | _emwgpuOnUncapturedError(devicePtr, type, messagePtr); |
| 778 | stackRestore(sp); |
Lokbondo Kung | a8fbe98 | 2024-08-30 04:46:53 +0000 | [diff] [blame] | 779 | }; |
| 780 | |
| 781 | _emwgpuOnRequestDeviceCompleted(futureIdL, futureIdH, {{{ gpu.RequestDeviceStatus.Success }}}, devicePtr, 0); |
| 782 | }, (ex) => { |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 783 | {{{ runtimeKeepalivePop() }}} |
Lokbondo Kung | b967094 | 2024-09-20 10:29:15 +0000 | [diff] [blame] | 784 | 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 Kung | a8fbe98 | 2024-08-30 04:46:53 +0000 | [diff] [blame] | 791 | })); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 792 | }, |
| 793 | |
| 794 | // -------------------------------------------------------------------------- |
| 795 | // Methods of BindGroup |
| 796 | // -------------------------------------------------------------------------- |
| 797 | |
| 798 | wgpuBindGroupSetLabel: (bindGroupPtr, labelPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 799 | var bindGroup = WebGPU.getJsObject(bindGroupPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 800 | bindGroup.label = UTF8ToString(labelPtr); |
| 801 | }, |
| 802 | |
| 803 | // -------------------------------------------------------------------------- |
| 804 | // Methods of BindGroupLayout |
| 805 | // -------------------------------------------------------------------------- |
| 806 | |
| 807 | wgpuBindGroupLayoutSetLabel: (bindGroupLayoutPtr, labelPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 808 | var bindGroupLayout = WebGPU.getJsObject(bindGroupLayoutPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 809 | bindGroupLayout.label = UTF8ToString(labelPtr); |
| 810 | }, |
| 811 | |
| 812 | // -------------------------------------------------------------------------- |
| 813 | // Methods of Buffer |
| 814 | // -------------------------------------------------------------------------- |
| 815 | |
Lokbondo Kung | da54247 | 2024-10-10 00:49:17 +0000 | [diff] [blame] | 816 | emwgpuBufferDestroy: (bufferPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 817 | 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 Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 822 | } |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 823 | delete WebGPU.Internals.bufferOnUnmaps[bufferPtr]; |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 824 | } |
| 825 | |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 826 | buffer.destroy(); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 827 | }, |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 828 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 829 | // 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 Kung | da54247 | 2024-10-10 00:49:17 +0000 | [diff] [blame] | 831 | emwgpuBufferGetConstMappedRange__deps: ['$warnOnce', 'memalign', 'free'], |
| 832 | emwgpuBufferGetConstMappedRange: (bufferPtr, offset, size) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 833 | var buffer = WebGPU.getJsObject(bufferPtr); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 834 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 835 | if (size === 0) warnOnce('getMappedRange size=0 no longer means WGPU_WHOLE_MAP_SIZE'); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 836 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 837 | {{{ gpu.convertSentinelToUndefined('size') }}} |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 838 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 839 | var mapped; |
| 840 | try { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 841 | mapped = buffer.getMappedRange(offset, size); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 842 | } catch (ex) { |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 843 | #if ASSERTIONS |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 844 | err(`wgpuBufferGetConstMappedRange(${offset}, ${size}) failed: ${ex}`); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 845 | #endif |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 846 | // 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 851 | WebGPU.Internals.bufferOnUnmaps[bufferPtr].push(() => _free(data)); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 852 | return data; |
| 853 | }, |
| 854 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 855 | // 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 Kung | da54247 | 2024-10-10 00:49:17 +0000 | [diff] [blame] | 857 | emwgpuBufferGetMappedRange__deps: ['$warnOnce', 'memalign', 'free'], |
| 858 | emwgpuBufferGetMappedRange: (bufferPtr, offset, size) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 859 | var buffer = WebGPU.getJsObject(bufferPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 860 | |
| 861 | if (size === 0) warnOnce('getMappedRange size=0 no longer means WGPU_WHOLE_MAP_SIZE'); |
| 862 | |
| 863 | {{{ gpu.convertSentinelToUndefined('size') }}} |
| 864 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 865 | var mapped; |
| 866 | try { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 867 | mapped = buffer.getMappedRange(offset, size); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 868 | } 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 878 | WebGPU.Internals.bufferOnUnmaps[bufferPtr].push(() => { |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 879 | new Uint8Array(mapped).set(HEAPU8.subarray(data, data + mapped.byteLength)); |
| 880 | _free(data); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 881 | }); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 882 | return data; |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 883 | }, |
| 884 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 885 | wgpuBufferGetSize: (bufferPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 886 | var buffer = WebGPU.getJsObject(bufferPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 887 | // 64-bit |
| 888 | return buffer.size; |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 889 | }, |
| 890 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 891 | wgpuBufferGetUsage: (bufferPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 892 | var buffer = WebGPU.getJsObject(bufferPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 893 | return buffer.usage; |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 894 | }, |
| 895 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 896 | // 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 Kung | da54247 | 2024-10-10 00:49:17 +0000 | [diff] [blame] | 898 | emwgpuBufferMapAsync__i53abi: false, |
| 899 | emwgpuBufferMapAsync__deps: ['emwgpuOnMapAsyncCompleted'], |
| 900 | emwgpuBufferMapAsync: (bufferPtr, futureIdL, futureIdH, mode, offset, size) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 901 | var buffer = WebGPU.getJsObject(bufferPtr); |
| 902 | WebGPU.Internals.bufferOnUnmaps[bufferPtr] = []; |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 903 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 904 | {{{ gpu.convertSentinelToUndefined('size') }}} |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 905 | |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 906 | {{{ runtimeKeepalivePush() }}} |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 907 | WebGPU.Internals.futureInsert(futureIdL, futureIdH, buffer.mapAsync(mode, offset, size).then(() => { |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 908 | {{{ runtimeKeepalivePop() }}} |
Lokbondo Kung | da54247 | 2024-10-10 00:49:17 +0000 | [diff] [blame] | 909 | _emwgpuOnMapAsyncCompleted(futureIdL, futureIdH, {{{ gpu.MapAsyncStatus.Success }}}, 0); |
| 910 | }, (ex) => { |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 911 | {{{ runtimeKeepalivePop() }}} |
Lokbondo Kung | da54247 | 2024-10-10 00:49:17 +0000 | [diff] [blame] | 912 | 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 919 | delete WebGPU.Internals.bufferOnUnmaps[bufferPtr]; |
Lokbondo Kung | da54247 | 2024-10-10 00:49:17 +0000 | [diff] [blame] | 920 | })); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 921 | }, |
| 922 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 923 | wgpuBufferSetLabel: (bufferPtr, labelPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 924 | var buffer = WebGPU.getJsObject(bufferPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 925 | buffer.label = UTF8ToString(labelPtr); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 926 | }, |
| 927 | |
Lokbondo Kung | da54247 | 2024-10-10 00:49:17 +0000 | [diff] [blame] | 928 | emwgpuBufferUnmap: (bufferPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 929 | var buffer = WebGPU.getJsObject(bufferPtr); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 930 | |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 931 | var onUnmap = WebGPU.Internals.bufferOnUnmaps[bufferPtr]; |
| 932 | if (!onUnmap) { |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 933 | // Already unmapped |
| 934 | return; |
| 935 | } |
| 936 | |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 937 | for (var i = 0; i < onUnmap.length; ++i) { |
| 938 | onUnmap[i](); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 939 | } |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 940 | delete WebGPU.Internals.bufferOnUnmaps[bufferPtr] |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 941 | |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 942 | buffer.unmap(); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 943 | }, |
| 944 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 945 | // -------------------------------------------------------------------------- |
| 946 | // Methods of CommandBuffer |
| 947 | // -------------------------------------------------------------------------- |
| 948 | |
| 949 | wgpuCommandBufferSetLabel: (commandBufferPtr, labelPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 950 | var commandBuffer = WebGPU.getJsObject(commandBufferPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 951 | commandBuffer.label = UTF8ToString(labelPtr); |
| 952 | }, |
| 953 | |
| 954 | // -------------------------------------------------------------------------- |
| 955 | // Methods of CommandEncoder |
| 956 | // -------------------------------------------------------------------------- |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 957 | |
Loko Kung | 424cda2 | 2024-08-17 01:29:10 +0000 | [diff] [blame] | 958 | wgpuCommandEncoderBeginComputePass__deps: ['emwgpuCreateComputePassEncoder'], |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 959 | wgpuCommandEncoderBeginComputePass: (encoderPtr, descriptor) => { |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 960 | var desc; |
| 961 | |
| 962 | function makeComputePassTimestampWrites(twPtr) { |
| 963 | if (twPtr === 0) return undefined; |
| 964 | |
| 965 | return { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 966 | "querySet": WebGPU.getJsObject( |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 967 | {{{ 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 984 | var commandEncoder = WebGPU.getJsObject(encoderPtr); |
Loko Kung | 424cda2 | 2024-08-17 01:29:10 +0000 | [diff] [blame] | 985 | var ptr = _emwgpuCreateComputePassEncoder(); |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 986 | WebGPU.Internals.jsObjectInsert(ptr, commandEncoder.beginComputePass(desc)); |
Loko Kung | 424cda2 | 2024-08-17 01:29:10 +0000 | [diff] [blame] | 987 | return ptr; |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 988 | }, |
| 989 | |
Loko Kung | 424cda2 | 2024-08-17 01:29:10 +0000 | [diff] [blame] | 990 | wgpuCommandEncoderBeginRenderPass__deps: ['emwgpuCreateRenderPassEncoder'], |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 991 | wgpuCommandEncoderBeginRenderPass: (encoderPtr, descriptor) => { |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 992 | {{{ 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1017 | "view": WebGPU.getJsObject(viewPtr), |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1018 | "depthSlice": depthSlice, |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1019 | "resolveTarget": WebGPU.getJsObject( |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1020 | {{{ 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1039 | "view": WebGPU.getJsObject( |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1040 | {{{ 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1060 | "querySet": WebGPU.getJsObject( |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1061 | {{{ 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 Kung | b339ed4 | 2024-09-06 02:49:19 +0000 | [diff] [blame] | 1075 | assert(sType === {{{ gpu.SType.RenderPassMaxDrawCount }}}); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1076 | assert(0 === {{{ makeGetValue('nextInChainPtr', C_STRUCTS.WGPUChainedStruct.next, '*') }}}); |
| 1077 | #endif |
Lokbondo Kung | b339ed4 | 2024-09-06 02:49:19 +0000 | [diff] [blame] | 1078 | var renderPassMaxDrawCount = nextInChainPtr; |
| 1079 | {{{ gpu.makeCheckDescriptor('renderPassMaxDrawCount') }}} |
| 1080 | maxDrawCount = {{{ gpu.makeGetU64('renderPassMaxDrawCount', C_STRUCTS.WGPURenderPassMaxDrawCount.maxDrawCount) }}}; |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1081 | } |
| 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1090 | "occlusionQuerySet": WebGPU.getJsObject( |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1091 | {{{ 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1104 | var commandEncoder = WebGPU.getJsObject(encoderPtr); |
Loko Kung | 424cda2 | 2024-08-17 01:29:10 +0000 | [diff] [blame] | 1105 | var ptr = _emwgpuCreateRenderPassEncoder(); |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1106 | WebGPU.Internals.jsObjectInsert(ptr, commandEncoder.beginRenderPass(desc)); |
Loko Kung | 424cda2 | 2024-08-17 01:29:10 +0000 | [diff] [blame] | 1107 | return ptr; |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1108 | }, |
| 1109 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1110 | wgpuCommandEncoderClearBuffer: (encoderPtr, bufferPtr, offset, size) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1111 | var commandEncoder = WebGPU.getJsObject(encoderPtr); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1112 | {{{ gpu.convertSentinelToUndefined('size') }}} |
| 1113 | |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1114 | var buffer = WebGPU.getJsObject(bufferPtr); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1115 | commandEncoder.clearBuffer(buffer, offset, size); |
| 1116 | }, |
| 1117 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1118 | wgpuCommandEncoderCopyBufferToBuffer: (encoderPtr, srcPtr, srcOffset, dstPtr, dstOffset, size) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1119 | var commandEncoder = WebGPU.getJsObject(encoderPtr); |
| 1120 | var src = WebGPU.getJsObject(srcPtr); |
| 1121 | var dst = WebGPU.getJsObject(dstPtr); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1122 | commandEncoder.copyBufferToBuffer(src, srcOffset, dst, dstOffset, size); |
| 1123 | }, |
| 1124 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1125 | wgpuCommandEncoderCopyBufferToTexture: (encoderPtr, srcPtr, dstPtr, copySizePtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1126 | var commandEncoder = WebGPU.getJsObject(encoderPtr); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1127 | var copySize = WebGPU.makeExtent3D(copySizePtr); |
| 1128 | commandEncoder.copyBufferToTexture( |
| 1129 | WebGPU.makeImageCopyBuffer(srcPtr), WebGPU.makeImageCopyTexture(dstPtr), copySize); |
| 1130 | }, |
| 1131 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1132 | wgpuCommandEncoderCopyTextureToBuffer: (encoderPtr, srcPtr, dstPtr, copySizePtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1133 | var commandEncoder = WebGPU.getJsObject(encoderPtr); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1134 | var copySize = WebGPU.makeExtent3D(copySizePtr); |
| 1135 | commandEncoder.copyTextureToBuffer( |
| 1136 | WebGPU.makeImageCopyTexture(srcPtr), WebGPU.makeImageCopyBuffer(dstPtr), copySize); |
| 1137 | }, |
| 1138 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1139 | wgpuCommandEncoderCopyTextureToTexture: (encoderPtr, srcPtr, dstPtr, copySizePtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1140 | var commandEncoder = WebGPU.getJsObject(encoderPtr); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1141 | var copySize = WebGPU.makeExtent3D(copySizePtr); |
| 1142 | commandEncoder.copyTextureToTexture( |
| 1143 | WebGPU.makeImageCopyTexture(srcPtr), WebGPU.makeImageCopyTexture(dstPtr), copySize); |
| 1144 | }, |
| 1145 | |
Loko Kung | 424cda2 | 2024-08-17 01:29:10 +0000 | [diff] [blame] | 1146 | wgpuCommandEncoderFinish__deps: ['emwgpuCreateCommandBuffer'], |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1147 | wgpuCommandEncoderFinish: (encoderPtr, descriptor) => { |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1148 | // TODO: Use the descriptor. |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1149 | var commandEncoder = WebGPU.getJsObject(encoderPtr); |
Loko Kung | 424cda2 | 2024-08-17 01:29:10 +0000 | [diff] [blame] | 1150 | var ptr = _emwgpuCreateCommandBuffer(); |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1151 | WebGPU.Internals.jsObjectInsert(ptr, commandEncoder.finish()); |
Loko Kung | 424cda2 | 2024-08-17 01:29:10 +0000 | [diff] [blame] | 1152 | return ptr; |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1153 | }, |
| 1154 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1155 | wgpuCommandEncoderInsertDebugMarker: (encoderPtr, markerLabelPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1156 | var encoder = WebGPU.getJsObject(encoderPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1157 | encoder.insertDebugMarker(UTF8ToString(markerLabelPtr)); |
| 1158 | }, |
| 1159 | |
| 1160 | wgpuCommandEncoderPopDebugGroup: (encoderPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1161 | var encoder = WebGPU.getJsObject(encoderPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1162 | encoder.popDebugGroup(); |
| 1163 | }, |
| 1164 | |
| 1165 | wgpuCommandEncoderPushDebugGroup: (encoderPtr, groupLabelPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1166 | var encoder = WebGPU.getJsObject(encoderPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1167 | encoder.pushDebugGroup(UTF8ToString(groupLabelPtr)); |
| 1168 | }, |
| 1169 | |
| 1170 | wgpuCommandEncoderResolveQuerySet: (encoderPtr, querySetPtr, firstQuery, queryCount, destinationPtr, destinationOffset) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1171 | var commandEncoder = WebGPU.getJsObject(encoderPtr); |
| 1172 | var querySet = WebGPU.getJsObject(querySetPtr); |
| 1173 | var destination = WebGPU.getJsObject(destinationPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1174 | |
| 1175 | commandEncoder.resolveQuerySet(querySet, firstQuery, queryCount, destination, destinationOffset); |
| 1176 | }, |
| 1177 | |
| 1178 | wgpuCommandEncoderSetLabel: (encoderPtr, labelPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1179 | var commandEncoder = WebGPU.getJsObject(encoderPtr); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1180 | commandEncoder.label = UTF8ToString(labelPtr); |
| 1181 | }, |
| 1182 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1183 | wgpuCommandEncoderWriteTimestamp: (encoderPtr, querySetPtr, queryIndex) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1184 | var commandEncoder = WebGPU.getJsObject(encoderPtr); |
| 1185 | var querySet = WebGPU.getJsObject(querySetPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1186 | commandEncoder.writeTimestamp(querySet, queryIndex); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1187 | }, |
| 1188 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1189 | // -------------------------------------------------------------------------- |
| 1190 | // Methods of ComputePassEncoder |
| 1191 | // -------------------------------------------------------------------------- |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1192 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1193 | wgpuComputePassEncoderDispatchWorkgroups: (passPtr, x, y, z) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1194 | var pass = WebGPU.getJsObject(passPtr); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1195 | pass.dispatchWorkgroups(x, y, z); |
| 1196 | }, |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1197 | |
| 1198 | wgpuComputePassEncoderDispatchWorkgroupsIndirect: (passPtr, indirectBufferPtr, indirectOffset) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1199 | var indirectBuffer = WebGPU.getJsObject(indirectBufferPtr); |
| 1200 | var pass = WebGPU.getJsObject(passPtr); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1201 | pass.dispatchWorkgroupsIndirect(indirectBuffer, indirectOffset); |
| 1202 | }, |
| 1203 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1204 | wgpuComputePassEncoderEnd: (passPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1205 | var pass = WebGPU.getJsObject(passPtr); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1206 | pass.end(); |
| 1207 | }, |
| 1208 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1209 | wgpuComputePassEncoderInsertDebugMarker: (encoderPtr, markerLabelPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1210 | var encoder = WebGPU.getJsObject(encoderPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1211 | encoder.insertDebugMarker(UTF8ToString(markerLabelPtr)); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1212 | }, |
| 1213 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1214 | wgpuComputePassEncoderPopDebugGroup: (encoderPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1215 | var encoder = WebGPU.getJsObject(encoderPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1216 | encoder.popDebugGroup(); |
| 1217 | }, |
| 1218 | |
| 1219 | wgpuComputePassEncoderPushDebugGroup: (encoderPtr, groupLabelPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1220 | var encoder = WebGPU.getJsObject(encoderPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1221 | encoder.pushDebugGroup(UTF8ToString(groupLabelPtr)); |
| 1222 | }, |
| 1223 | |
| 1224 | wgpuComputePassEncoderSetBindGroup: (passPtr, groupIndex, groupPtr, dynamicOffsetCount, dynamicOffsetsPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1225 | var pass = WebGPU.getJsObject(passPtr); |
| 1226 | var group = WebGPU.getJsObject(groupPtr); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1227 | 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 Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1237 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1238 | wgpuComputePassEncoderSetLabel: (passPtr, labelPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1239 | var pass = WebGPU.getJsObject(passPtr); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1240 | pass.label = UTF8ToString(labelPtr); |
| 1241 | }, |
| 1242 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1243 | wgpuComputePassEncoderSetPipeline: (passPtr, pipelinePtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1244 | var pass = WebGPU.getJsObject(passPtr); |
| 1245 | var pipeline = WebGPU.getJsObject(pipelinePtr); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1246 | pass.setPipeline(pipeline); |
| 1247 | }, |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1248 | |
| 1249 | wgpuComputePassEncoderWriteTimestamp: (encoderPtr, querySetPtr, queryIndex) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1250 | var encoder = WebGPU.getJsObject(encoderPtr); |
| 1251 | var querySet = WebGPU.getJsObject(querySetPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1252 | encoder.writeTimestamp(querySet, queryIndex); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1253 | }, |
| 1254 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1255 | // -------------------------------------------------------------------------- |
| 1256 | // Methods of ComputePipeline |
| 1257 | // -------------------------------------------------------------------------- |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1258 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1259 | wgpuComputePipelineGetBindGroupLayout__deps: ['emwgpuCreateBindGroupLayout'], |
| 1260 | wgpuComputePipelineGetBindGroupLayout: (pipelinePtr, groupIndex) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1261 | var pipeline = WebGPU.getJsObject(pipelinePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1262 | var ptr = _emwgpuCreateBindGroupLayout(); |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1263 | WebGPU.Internals.jsObjectInsert(ptr, pipeline.getBindGroupLayout(groupIndex)); |
Loko Kung | 424cda2 | 2024-08-17 01:29:10 +0000 | [diff] [blame] | 1264 | return ptr; |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1265 | }, |
| 1266 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1267 | wgpuComputePipelineSetLabel: (pipelinePtr, labelPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1268 | var pipeline = WebGPU.getJsObject(pipelinePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1269 | 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1299 | "buffer": WebGPU.getJsObject(bufferPtr), |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1300 | "offset": {{{ gpu.makeGetU64('entryPtr', C_STRUCTS.WGPUBindGroupEntry.offset) }}}, |
| 1301 | "size": size |
| 1302 | }, |
| 1303 | }; |
| 1304 | } else if (samplerPtr) { |
| 1305 | return { |
| 1306 | "binding": binding, |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1307 | "resource": WebGPU.getJsObject(samplerPtr), |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1308 | }; |
| 1309 | } else { |
| 1310 | return { |
| 1311 | "binding": binding, |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1312 | "resource": WebGPU.getJsObject(textureViewPtr), |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1313 | }; |
| 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1328 | "layout": WebGPU.getJsObject( |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1329 | {{{ 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1338 | var device = WebGPU.getJsObject(devicePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1339 | var ptr = _emwgpuCreateBindGroup(); |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1340 | WebGPU.Internals.jsObjectInsert(ptr, device.createBindGroup(desc)); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1341 | 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1441 | var device = WebGPU.getJsObject(devicePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1442 | var ptr = _emwgpuCreateBindGroupLayout(); |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1443 | WebGPU.Internals.jsObjectInsert(ptr, device.createBindGroupLayout(desc)); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1444 | return ptr; |
| 1445 | }, |
| 1446 | |
Lokbondo Kung | da54247 | 2024-10-10 00:49:17 +0000 | [diff] [blame] | 1447 | emwgpuDeviceCreateBuffer: (devicePtr, descriptor, bufferPtr) => { |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1448 | {{{ 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1461 | var device = WebGPU.getJsObject(devicePtr); |
| 1462 | WebGPU.Internals.jsObjectInsert(bufferPtr, device.createBuffer(desc)); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1463 | if (mappedAtCreation) { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1464 | WebGPU.Internals.bufferOnUnmaps[bufferPtr] = []; |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1465 | } |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1466 | }, |
| 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1479 | var device = WebGPU.getJsObject(devicePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1480 | var ptr = _emwgpuCreateCommandEncoder(); |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1481 | WebGPU.Internals.jsObjectInsert(ptr, device.createCommandEncoder(desc)); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1482 | return ptr; |
| 1483 | }, |
| 1484 | |
| 1485 | wgpuDeviceCreateComputePipeline__deps: ['emwgpuCreateComputePipeline'], |
| 1486 | wgpuDeviceCreateComputePipeline: (devicePtr, descriptor) => { |
| 1487 | var desc = WebGPU.makeComputePipelineDesc(descriptor); |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1488 | var device = WebGPU.getJsObject(devicePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1489 | var ptr = _emwgpuCreateComputePipeline(); |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1490 | WebGPU.Internals.jsObjectInsert(ptr, device.createComputePipeline(desc)); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1491 | return ptr; |
| 1492 | }, |
| 1493 | |
Lokbondo Kung | 7927ad0 | 2024-10-11 23:20:07 +0000 | [diff] [blame^] | 1494 | emwgpuDeviceCreateComputePipelineAsync__i53abi: false, |
Lokbondo Kung | da54247 | 2024-10-10 00:49:17 +0000 | [diff] [blame] | 1495 | emwgpuDeviceCreateComputePipelineAsync__deps: ['emwgpuCreateComputePipeline', 'emwgpuOnCreateComputePipelineCompleted'], |
Lokbondo Kung | ecf585f | 2024-09-25 18:03:44 +0000 | [diff] [blame] | 1496 | emwgpuDeviceCreateComputePipelineAsync: (devicePtr, futureIdL, futureIdH, descriptor) => { |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1497 | var desc = WebGPU.makeComputePipelineDesc(descriptor); |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1498 | var device = WebGPU.getJsObject(devicePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1499 | {{{ runtimeKeepalivePush() }}} |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1500 | WebGPU.Internals.futureInsert(futureIdL, futureIdH, device.createComputePipelineAsync(desc).then((pipeline) => { |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1501 | {{{ runtimeKeepalivePop() }}} |
Lokbondo Kung | ecf585f | 2024-09-25 18:03:44 +0000 | [diff] [blame] | 1502 | var pipelinePtr = _emwgpuCreateComputePipeline(); |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1503 | WebGPU.Internals.jsObjectInsert(pipelinePtr, pipeline); |
Lokbondo Kung | da54247 | 2024-10-10 00:49:17 +0000 | [diff] [blame] | 1504 | _emwgpuOnCreateComputePipelineCompleted(futureIdL, futureIdH, {{{ gpu.CreatePipelineAsyncStatus.Success }}}, pipelinePtr, 0); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1505 | }, (pipelineError) => { |
| 1506 | {{{ runtimeKeepalivePop() }}} |
Lokbondo Kung | ecf585f | 2024-09-25 18:03:44 +0000 | [diff] [blame] | 1507 | 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 Kung | da54247 | 2024-10-10 00:49:17 +0000 | [diff] [blame] | 1513 | _emwgpuOnCreateComputePipelineCompleted(futureIdL, futureIdH, status, 0, messagePtr); |
Lokbondo Kung | ecf585f | 2024-09-25 18:03:44 +0000 | [diff] [blame] | 1514 | stackRestore(sp); |
| 1515 | })); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1516 | }, |
| 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1525 | bgls.push(WebGPU.getJsObject( |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1526 | {{{ 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1535 | var device = WebGPU.getJsObject(devicePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1536 | var ptr = _emwgpuCreatePipelineLayout(); |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1537 | WebGPU.Internals.jsObjectInsert(ptr, device.createPipelineLayout(desc)); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1538 | 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1551 | var device = WebGPU.getJsObject(devicePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1552 | var ptr = _emwgpuCreateQuerySet(); |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1553 | WebGPU.Internals.jsObjectInsert(ptr, device.createQuerySet(desc)); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1554 | 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1589 | var device = WebGPU.getJsObject(devicePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1590 | var ptr = _emwgpuCreateRenderBundleEncoder(); |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1591 | WebGPU.Internals.jsObjectInsert(ptr, device.createRenderBundleEncoder(desc)); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1592 | return ptr; |
| 1593 | }, |
| 1594 | |
| 1595 | wgpuDeviceCreateRenderPipeline__deps: ['emwgpuCreateRenderPipeline'], |
| 1596 | wgpuDeviceCreateRenderPipeline: (devicePtr, descriptor) => { |
| 1597 | var desc = WebGPU.makeRenderPipelineDesc(descriptor); |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1598 | var device = WebGPU.getJsObject(devicePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1599 | var ptr = _emwgpuCreateRenderPipeline(); |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1600 | WebGPU.Internals.jsObjectInsert(ptr, device.createRenderPipeline(desc)); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1601 | return ptr; |
| 1602 | }, |
| 1603 | |
Lokbondo Kung | 7927ad0 | 2024-10-11 23:20:07 +0000 | [diff] [blame^] | 1604 | emwgpuDeviceCreateRenderPipelineAsync__i53abi: false, |
Lokbondo Kung | da54247 | 2024-10-10 00:49:17 +0000 | [diff] [blame] | 1605 | emwgpuDeviceCreateRenderPipelineAsync__deps: ['emwgpuCreateRenderPipeline', 'emwgpuOnCreateRenderPipelineCompleted'], |
Lokbondo Kung | ecf585f | 2024-09-25 18:03:44 +0000 | [diff] [blame] | 1606 | emwgpuDeviceCreateRenderPipelineAsync: (devicePtr, futureIdL, futureIdH, descriptor) => { |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1607 | var desc = WebGPU.makeRenderPipelineDesc(descriptor); |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1608 | var device = WebGPU.getJsObject(devicePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1609 | {{{ runtimeKeepalivePush() }}} |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1610 | WebGPU.Internals.futureInsert(futureIdL, futureIdH, device.createRenderPipelineAsync(desc).then((pipeline) => { |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1611 | {{{ runtimeKeepalivePop() }}} |
Lokbondo Kung | ecf585f | 2024-09-25 18:03:44 +0000 | [diff] [blame] | 1612 | var pipelinePtr = _emwgpuCreateRenderPipeline(); |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1613 | WebGPU.Internals.jsObjectInsert(pipelinePtr, pipeline); |
Lokbondo Kung | da54247 | 2024-10-10 00:49:17 +0000 | [diff] [blame] | 1614 | _emwgpuOnCreateRenderPipelineCompleted(futureIdL, futureIdH, {{{ gpu.CreatePipelineAsyncStatus.Success }}}, pipelinePtr, 0); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1615 | }, (pipelineError) => { |
| 1616 | {{{ runtimeKeepalivePop() }}} |
Lokbondo Kung | ecf585f | 2024-09-25 18:03:44 +0000 | [diff] [blame] | 1617 | 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 Kung | da54247 | 2024-10-10 00:49:17 +0000 | [diff] [blame] | 1623 | _emwgpuOnCreateRenderPipelineCompleted(futureIdL, futureIdH, status, 0, messagePtr); |
Lokbondo Kung | ecf585f | 2024-09-25 18:03:44 +0000 | [diff] [blame] | 1624 | stackRestore(sp); |
| 1625 | })); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1626 | }, |
| 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1657 | var device = WebGPU.getJsObject(devicePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1658 | var ptr = _emwgpuCreateSampler(); |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1659 | WebGPU.Internals.jsObjectInsert(ptr, device.createSampler(desc)); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1660 | 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 Kung | b339ed4 | 2024-09-06 02:49:19 +0000 | [diff] [blame] | 1680 | case {{{ gpu.SType.ShaderSourceSPIRV }}}: { |
| 1681 | var count = {{{ gpu.makeGetU32('nextInChainPtr', C_STRUCTS.WGPUShaderSourceSPIRV.codeSize) }}}; |
| 1682 | var start = {{{ makeGetValue('nextInChainPtr', C_STRUCTS.WGPUShaderSourceSPIRV.code, '*') }}}; |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1683 | 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 Kung | b339ed4 | 2024-09-06 02:49:19 +0000 | [diff] [blame] | 1692 | case {{{ gpu.SType.ShaderSourceWGSL }}}: { |
| 1693 | var sourcePtr = {{{ makeGetValue('nextInChainPtr', C_STRUCTS.WGPUShaderSourceWGSL.code, '*') }}}; |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1694 | 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1704 | var device = WebGPU.getJsObject(devicePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1705 | var ptr = _emwgpuCreateShaderModule(); |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1706 | WebGPU.Internals.jsObjectInsert(ptr, device.createShaderModule(desc)); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1707 | return ptr; |
| 1708 | }, |
| 1709 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1710 | 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1736 | var device = WebGPU.getJsObject(devicePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1737 | var ptr = _emwgpuCreateTexture(); |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1738 | WebGPU.Internals.jsObjectInsert(ptr, device.createTexture(desc)); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1739 | return ptr; |
| 1740 | }, |
| 1741 | |
| 1742 | wgpuDeviceDestroy: (devicePtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1743 | WebGPU.getJsObject(devicePtr).destroy() |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1744 | }, |
| 1745 | |
| 1746 | wgpuDeviceEnumerateFeatures: (devicePtr, featuresOutPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1747 | var device = WebGPU.getJsObject(devicePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1748 | 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1760 | var device = WebGPU.getJsObject(devicePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1761 | WebGPU.fillLimitStruct(device.limits, limitsOutPtr); |
| 1762 | return 1; |
| 1763 | }, |
| 1764 | |
| 1765 | wgpuDeviceHasFeature: (devicePtr, featureEnumValue) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1766 | var device = WebGPU.getJsObject(devicePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1767 | return device.features.has(WebGPU.FeatureName[featureEnumValue]); |
| 1768 | }, |
| 1769 | |
| 1770 | wgpuDevicePopErrorScope__deps: ['$callUserCallback'], |
| 1771 | wgpuDevicePopErrorScope: (devicePtr, callback, userdata) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1772 | var device = WebGPU.getJsObject(devicePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1773 | {{{ 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1803 | var device = WebGPU.getJsObject(devicePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1804 | device.pushErrorScope(WebGPU.ErrorFilter[filter]); |
| 1805 | }, |
| 1806 | |
| 1807 | wgpuDeviceSetLabel: (devicePtr, labelPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1808 | var device = WebGPU.getJsObject(devicePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1809 | device.label = UTF8ToString(labelPtr); |
| 1810 | }, |
| 1811 | |
Lokbondo Kung | a8fbe98 | 2024-08-30 04:46:53 +0000 | [diff] [blame] | 1812 | // TODO(42241415) Remove this after verifying that it's not used and/or updating users. |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1813 | wgpuDeviceSetUncapturedErrorCallback__deps: ['$callUserCallback'], |
| 1814 | wgpuDeviceSetUncapturedErrorCallback: (devicePtr, callback, userdata) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1815 | var device = WebGPU.getJsObject(devicePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1816 | 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 Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1839 | |
Loko Kung | 424cda2 | 2024-08-17 01:29:10 +0000 | [diff] [blame] | 1840 | wgpuInstanceCreateSurface__deps: ['$findCanvasEventTarget', 'emwgpuCreateSurface'], |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1841 | wgpuInstanceCreateSurface: (instancePtr, descriptor) => { |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1842 | {{{ gpu.makeCheck('descriptor') }}} |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1843 | var nextInChainPtr = {{{ makeGetValue('descriptor', C_STRUCTS.WGPUSurfaceDescriptor.nextInChain, '*') }}}; |
| 1844 | #if ASSERTIONS |
| 1845 | assert(nextInChainPtr !== 0); |
Lokbondo Kung | b339ed4 | 2024-09-06 02:49:19 +0000 | [diff] [blame] | 1846 | assert({{{ gpu.SType.SurfaceSourceCanvasHTMLSelector_Emscripten }}} === |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1847 | {{{ gpu.makeGetU32('nextInChainPtr', C_STRUCTS.WGPUChainedStruct.sType) }}}); |
| 1848 | #endif |
Lokbondo Kung | b339ed4 | 2024-09-06 02:49:19 +0000 | [diff] [blame] | 1849 | var sourceCanvasHTMLSelector = nextInChainPtr; |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1850 | |
Lokbondo Kung | b339ed4 | 2024-09-06 02:49:19 +0000 | [diff] [blame] | 1851 | {{{ gpu.makeCheckDescriptor('sourceCanvasHTMLSelector') }}} |
| 1852 | var selectorPtr = {{{ makeGetValue('sourceCanvasHTMLSelector', C_STRUCTS.WGPUSurfaceSourceCanvasHTMLSelector_Emscripten.selector, '*') }}}; |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1853 | {{{ 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 Kung | 424cda2 | 2024-08-17 01:29:10 +0000 | [diff] [blame] | 1867 | var ptr = _emwgpuCreateSurface(); |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1868 | WebGPU.Internals.jsObjectInsert(ptr, context); |
Loko Kung | 424cda2 | 2024-08-17 01:29:10 +0000 | [diff] [blame] | 1869 | return ptr; |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1870 | }, |
| 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 Kung | 859fb30 | 2024-08-17 01:44:58 +0000 | [diff] [blame] | 1879 | emwgpuInstanceRequestAdapter__i53abi: false, |
Lokbondo Kung | da54247 | 2024-10-10 00:49:17 +0000 | [diff] [blame] | 1880 | emwgpuInstanceRequestAdapter__deps: ['emwgpuCreateAdapter', 'emwgpuOnRequestAdapterCompleted'], |
Loko Kung | 859fb30 | 2024-08-17 01:44:58 +0000 | [diff] [blame] | 1881 | emwgpuInstanceRequestAdapter: (instancePtr, futureIdL, futureIdH, options) => { |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1882 | 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 Kung | b967094 | 2024-09-20 10:29:15 +0000 | [diff] [blame] | 1894 | 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 Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1898 | return; |
| 1899 | } |
| 1900 | |
| 1901 | {{{ runtimeKeepalivePush() }}} |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1902 | WebGPU.Internals.futureInsert(futureIdL, futureIdH, navigator["gpu"]["requestAdapter"](opts).then((adapter) => { |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1903 | {{{ runtimeKeepalivePop() }}} |
Loko Kung | 859fb30 | 2024-08-17 01:44:58 +0000 | [diff] [blame] | 1904 | if (adapter) { |
Lokbondo Kung | a8fbe98 | 2024-08-30 04:46:53 +0000 | [diff] [blame] | 1905 | var adapterPtr = _emwgpuCreateAdapter(instancePtr); |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1906 | WebGPU.Internals.jsObjectInsert(adapterPtr, adapter); |
Loko Kung | 859fb30 | 2024-08-17 01:44:58 +0000 | [diff] [blame] | 1907 | _emwgpuOnRequestAdapterCompleted(futureIdL, futureIdH, {{{ gpu.RequestAdapterStatus.Success }}}, adapterPtr, 0); |
| 1908 | } else { |
Lokbondo Kung | b967094 | 2024-09-20 10:29:15 +0000 | [diff] [blame] | 1909 | 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 Kung | 859fb30 | 2024-08-17 01:44:58 +0000 | [diff] [blame] | 1913 | } |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1914 | }, (ex) => { |
| 1915 | {{{ runtimeKeepalivePop() }}} |
Lokbondo Kung | b967094 | 2024-09-20 10:29:15 +0000 | [diff] [blame] | 1916 | var sp = stackSave(); |
| 1917 | var messagePtr = stringToUTF8OnStack(ex.message); |
| 1918 | _emwgpuOnRequestAdapterCompleted(futureIdL, futureIdH, {{{ gpu.RequestAdapterStatus.Error }}}, 0, messagePtr); |
| 1919 | stackRestore(sp); |
Loko Kung | 859fb30 | 2024-08-17 01:44:58 +0000 | [diff] [blame] | 1920 | })); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1921 | }, |
| 1922 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1923 | // -------------------------------------------------------------------------- |
| 1924 | // Methods of PipelineLayout |
| 1925 | // -------------------------------------------------------------------------- |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1926 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1927 | wgpuPipelineLayoutSetLabel: (pipelineLayoutPtr, labelPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1928 | var pipelineLayout = WebGPU.getJsObject(pipelineLayoutPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1929 | pipelineLayout.label = UTF8ToString(labelPtr); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1930 | }, |
| 1931 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1932 | // -------------------------------------------------------------------------- |
| 1933 | // Methods of QuerySet |
| 1934 | // -------------------------------------------------------------------------- |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1935 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1936 | wgpuQuerySetDestroy: (querySetPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1937 | WebGPU.getJsObject(querySetPtr).destroy(); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1938 | }, |
| 1939 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1940 | wgpuQuerySetGetCount: (querySetPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1941 | var querySet = WebGPU.getJsObject(querySetPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1942 | return querySet.count; |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1943 | }, |
| 1944 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1945 | wgpuQuerySetGetType: (querySetPtr, labelPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1946 | var querySet = WebGPU.getJsObject(querySetPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1947 | return querySet.type; |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1948 | }, |
| 1949 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1950 | wgpuQuerySetSetLabel: (querySetPtr, labelPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1951 | var querySet = WebGPU.getJsObject(querySetPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1952 | querySet.label = UTF8ToString(labelPtr); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1953 | }, |
| 1954 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1955 | // -------------------------------------------------------------------------- |
| 1956 | // Methods of Queue |
| 1957 | // -------------------------------------------------------------------------- |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1958 | |
Lokbondo Kung | 7927ad0 | 2024-10-11 23:20:07 +0000 | [diff] [blame^] | 1959 | emwgpuQueueOnSubmittedWorkDone__i53abi: false, |
| 1960 | emwgpuQueueOnSubmittedWorkDone__deps: ['emwgpuOnWorkDoneCompleted'], |
| 1961 | emwgpuQueueOnSubmittedWorkDone: (queuePtr, futureIdL, futureIdH) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1962 | var queue = WebGPU.getJsObject(queuePtr); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1963 | |
| 1964 | {{{ runtimeKeepalivePush() }}} |
Lokbondo Kung | 7927ad0 | 2024-10-11 23:20:07 +0000 | [diff] [blame^] | 1965 | WebGPU.Internals.futureInsert(futureIdL, futureIdH, queue.onSubmittedWorkDone().then(() => { |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1966 | {{{ runtimeKeepalivePop() }}} |
Lokbondo Kung | 7927ad0 | 2024-10-11 23:20:07 +0000 | [diff] [blame^] | 1967 | _emwgpuOnWorkDoneCompleted(futureIdL, futureIdH, {{{ gpu.QueueWorkDoneStatus.Success }}}); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1968 | }, () => { |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1969 | {{{ runtimeKeepalivePop() }}} |
Lokbondo Kung | 7927ad0 | 2024-10-11 23:20:07 +0000 | [diff] [blame^] | 1970 | _emwgpuOnWorkDoneCompleted(futureIdL, futureIdH, {{{ gpu.QueueWorkDoneStatus.Error }}}); |
| 1971 | })); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1972 | }, |
| 1973 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1974 | wgpuQueueSetLabel: (queuePtr, labelPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1975 | var queue = WebGPU.getJsObject(queuePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1976 | queue.label = UTF8ToString(labelPtr); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1977 | }, |
| 1978 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1979 | wgpuQueueSubmit: (queuePtr, commandCount, commands) => { |
| 1980 | #if ASSERTIONS |
| 1981 | assert(commands % 4 === 0); |
| 1982 | #endif |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1983 | var queue = WebGPU.getJsObject(queuePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1984 | var cmds = Array.from({{{ makeHEAPView(`${POINTER_BITS}`, 'commands', `commands + commandCount * ${POINTER_SIZE}`)}}}, |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1985 | (id) => WebGPU.getJsObject(id)); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1986 | queue.submit(cmds); |
| 1987 | }, |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 1988 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1989 | wgpuQueueWriteBuffer: (queuePtr, bufferPtr, bufferOffset, data, size) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1990 | var queue = WebGPU.getJsObject(queuePtr); |
| 1991 | var buffer = WebGPU.getJsObject(bufferPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 1992 | // 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 1999 | var queue = WebGPU.getJsObject(queuePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2000 | |
| 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2015 | var bundle = WebGPU.getJsObject(bundlePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2016 | bundle.label = UTF8ToString(labelPtr); |
| 2017 | }, |
| 2018 | |
| 2019 | // -------------------------------------------------------------------------- |
| 2020 | // Methods of RenderBundleEncoder |
| 2021 | // -------------------------------------------------------------------------- |
| 2022 | |
| 2023 | wgpuRenderBundleEncoderDraw: (passPtr, vertexCount, instanceCount, firstVertex, firstInstance) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2024 | var pass = WebGPU.getJsObject(passPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2025 | pass.draw(vertexCount, instanceCount, firstVertex, firstInstance); |
| 2026 | }, |
| 2027 | |
| 2028 | wgpuRenderBundleEncoderDrawIndexed: (passPtr, indexCount, instanceCount, firstIndex, baseVertex, firstInstance) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2029 | var pass = WebGPU.getJsObject(passPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2030 | pass.drawIndexed(indexCount, instanceCount, firstIndex, baseVertex, firstInstance); |
| 2031 | }, |
| 2032 | |
| 2033 | wgpuRenderBundleEncoderDrawIndexedIndirect: (passPtr, indirectBufferPtr, indirectOffset) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2034 | var indirectBuffer = WebGPU.getJsObject(indirectBufferPtr); |
| 2035 | var pass = WebGPU.getJsObject(passPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2036 | pass.drawIndexedIndirect(indirectBuffer, indirectOffset); |
| 2037 | }, |
| 2038 | |
| 2039 | wgpuRenderBundleEncoderDrawIndirect: (passPtr, indirectBufferPtr, indirectOffset) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2040 | var indirectBuffer = WebGPU.getJsObject(indirectBufferPtr); |
| 2041 | var pass = WebGPU.getJsObject(passPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2042 | 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2054 | var encoder = WebGPU.getJsObject(encoderPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2055 | var ptr = _emwgpuCreateRenderBundle(); |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2056 | WebGPU.Internals.jsObjectInsert(ptr, encoder.finish(desc)); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2057 | return ptr; |
| 2058 | }, |
| 2059 | |
| 2060 | wgpuRenderBundleEncoderInsertDebugMarker: (encoderPtr, markerLabelPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2061 | var encoder = WebGPU.getJsObject(encoderPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2062 | encoder.insertDebugMarker(UTF8ToString(markerLabelPtr)); |
| 2063 | }, |
| 2064 | |
| 2065 | wgpuRenderBundleEncoderPopDebugGroup: (encoderPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2066 | var encoder = WebGPU.getJsObject(encoderPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2067 | encoder.popDebugGroup(); |
| 2068 | }, |
| 2069 | |
| 2070 | wgpuRenderBundleEncoderPushDebugGroup: (encoderPtr, groupLabelPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2071 | var encoder = WebGPU.getJsObject(encoderPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2072 | encoder.pushDebugGroup(UTF8ToString(groupLabelPtr)); |
| 2073 | }, |
| 2074 | |
| 2075 | wgpuRenderBundleEncoderSetBindGroup: (passPtr, groupIndex, groupPtr, dynamicOffsetCount, dynamicOffsetsPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2076 | var pass = WebGPU.getJsObject(passPtr); |
| 2077 | var group = WebGPU.getJsObject(groupPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2078 | 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2090 | var pass = WebGPU.getJsObject(passPtr); |
| 2091 | var buffer = WebGPU.getJsObject(bufferPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2092 | {{{ gpu.convertSentinelToUndefined('size') }}} |
| 2093 | pass.setIndexBuffer(buffer, WebGPU.IndexFormat[format], offset, size); |
| 2094 | }, |
| 2095 | |
| 2096 | wgpuRenderBundleEncoderSetLabel: (passPtr, labelPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2097 | var pass = WebGPU.getJsObject(passPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2098 | pass.label = UTF8ToString(labelPtr); |
| 2099 | }, |
| 2100 | |
| 2101 | wgpuRenderBundleEncoderSetPipeline: (passPtr, pipelinePtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2102 | var pass = WebGPU.getJsObject(passPtr); |
| 2103 | var pipeline = WebGPU.getJsObject(pipelinePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2104 | pass.setPipeline(pipeline); |
| 2105 | }, |
| 2106 | |
| 2107 | wgpuRenderBundleEncoderSetVertexBuffer: (passPtr, slot, bufferPtr, offset, size) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2108 | var pass = WebGPU.getJsObject(passPtr); |
| 2109 | var buffer = WebGPU.getJsObject(bufferPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2110 | {{{ gpu.convertSentinelToUndefined('size') }}} |
| 2111 | pass.setVertexBuffer(slot, buffer, offset, size); |
| 2112 | }, |
| 2113 | |
| 2114 | // -------------------------------------------------------------------------- |
| 2115 | // Methods of RenderPassEncoder |
| 2116 | // -------------------------------------------------------------------------- |
| 2117 | |
| 2118 | wgpuRenderPassEncoderBeginOcclusionQuery: (passPtr, queryIndex) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2119 | var pass = WebGPU.getJsObject(passPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2120 | pass.beginOcclusionQuery(queryIndex); |
| 2121 | }, |
| 2122 | |
| 2123 | wgpuRenderPassEncoderDraw: (passPtr, vertexCount, instanceCount, firstVertex, firstInstance) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2124 | var pass = WebGPU.getJsObject(passPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2125 | pass.draw(vertexCount, instanceCount, firstVertex, firstInstance); |
| 2126 | }, |
| 2127 | |
| 2128 | wgpuRenderPassEncoderDrawIndexed: (passPtr, indexCount, instanceCount, firstIndex, baseVertex, firstInstance) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2129 | var pass = WebGPU.getJsObject(passPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2130 | pass.drawIndexed(indexCount, instanceCount, firstIndex, baseVertex, firstInstance); |
| 2131 | }, |
| 2132 | |
| 2133 | wgpuRenderPassEncoderDrawIndexedIndirect: (passPtr, indirectBufferPtr, indirectOffset) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2134 | var indirectBuffer = WebGPU.getJsObject(indirectBufferPtr); |
| 2135 | var pass = WebGPU.getJsObject(passPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2136 | pass.drawIndexedIndirect(indirectBuffer, indirectOffset); |
| 2137 | }, |
| 2138 | |
| 2139 | wgpuRenderPassEncoderDrawIndirect: (passPtr, indirectBufferPtr, indirectOffset) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2140 | var indirectBuffer = WebGPU.getJsObject(indirectBufferPtr); |
| 2141 | var pass = WebGPU.getJsObject(passPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2142 | pass.drawIndirect(indirectBuffer, indirectOffset); |
| 2143 | }, |
| 2144 | |
| 2145 | wgpuRenderPassEncoderEnd: (encoderPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2146 | var encoder = WebGPU.getJsObject(encoderPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2147 | encoder.end(); |
| 2148 | }, |
| 2149 | |
| 2150 | wgpuRenderPassEncoderEndOcclusionQuery: (passPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2151 | var pass = WebGPU.getJsObject(passPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2152 | pass.endOcclusionQuery(); |
| 2153 | }, |
| 2154 | |
| 2155 | wgpuRenderPassEncoderExecuteBundles: (passPtr, count, bundlesPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2156 | var pass = WebGPU.getJsObject(passPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2157 | |
| 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2163 | (id) => WebGPU.getJsObject(id)); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2164 | pass.executeBundles(bundles); |
| 2165 | }, |
| 2166 | |
| 2167 | wgpuRenderPassEncoderInsertDebugMarker: (encoderPtr, markerLabelPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2168 | var encoder = WebGPU.getJsObject(encoderPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2169 | encoder.insertDebugMarker(UTF8ToString(markerLabelPtr)); |
| 2170 | }, |
| 2171 | |
| 2172 | wgpuRenderPassEncoderPopDebugGroup: (encoderPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2173 | var encoder = WebGPU.getJsObject(encoderPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2174 | encoder.popDebugGroup(); |
| 2175 | }, |
| 2176 | |
| 2177 | wgpuRenderPassEncoderPushDebugGroup: (encoderPtr, groupLabelPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2178 | var encoder = WebGPU.getJsObject(encoderPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2179 | encoder.pushDebugGroup(UTF8ToString(groupLabelPtr)); |
| 2180 | }, |
| 2181 | |
| 2182 | wgpuRenderPassEncoderSetBindGroup: (passPtr, groupIndex, groupPtr, dynamicOffsetCount, dynamicOffsetsPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2183 | var pass = WebGPU.getJsObject(passPtr); |
| 2184 | var group = WebGPU.getJsObject(groupPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2185 | 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2197 | var pass = WebGPU.getJsObject(passPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2198 | var color = WebGPU.makeColor(colorPtr); |
| 2199 | pass.setBlendConstant(color); |
| 2200 | }, |
| 2201 | |
| 2202 | wgpuRenderPassEncoderSetIndexBuffer: (passPtr, bufferPtr, format, offset, size) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2203 | var pass = WebGPU.getJsObject(passPtr); |
| 2204 | var buffer = WebGPU.getJsObject(bufferPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2205 | {{{ gpu.convertSentinelToUndefined('size') }}} |
| 2206 | pass.setIndexBuffer(buffer, WebGPU.IndexFormat[format], offset, size); |
| 2207 | }, |
| 2208 | |
| 2209 | wgpuRenderPassEncoderSetLabel: (passPtr, labelPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2210 | var pass = WebGPU.getJsObject(passPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2211 | pass.label = UTF8ToString(labelPtr); |
| 2212 | }, |
| 2213 | |
| 2214 | wgpuRenderPassEncoderSetPipeline: (passPtr, pipelinePtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2215 | var pass = WebGPU.getJsObject(passPtr); |
| 2216 | var pipeline = WebGPU.getJsObject(pipelinePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2217 | pass.setPipeline(pipeline); |
| 2218 | }, |
| 2219 | |
| 2220 | wgpuRenderPassEncoderSetScissorRect: (passPtr, x, y, w, h) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2221 | var pass = WebGPU.getJsObject(passPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2222 | pass.setScissorRect(x, y, w, h); |
| 2223 | }, |
| 2224 | |
| 2225 | wgpuRenderPassEncoderSetStencilReference: (passPtr, reference) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2226 | var pass = WebGPU.getJsObject(passPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2227 | pass.setStencilReference(reference); |
| 2228 | }, |
| 2229 | |
| 2230 | wgpuRenderPassEncoderSetVertexBuffer: (passPtr, slot, bufferPtr, offset, size) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2231 | var pass = WebGPU.getJsObject(passPtr); |
| 2232 | var buffer = WebGPU.getJsObject(bufferPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2233 | {{{ gpu.convertSentinelToUndefined('size') }}} |
| 2234 | pass.setVertexBuffer(slot, buffer, offset, size); |
| 2235 | }, |
| 2236 | |
| 2237 | wgpuRenderPassEncoderSetViewport: (passPtr, x, y, w, h, minDepth, maxDepth) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2238 | var pass = WebGPU.getJsObject(passPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2239 | pass.setViewport(x, y, w, h, minDepth, maxDepth); |
| 2240 | }, |
| 2241 | |
| 2242 | wgpuRenderPassEncoderWriteTimestamp: (encoderPtr, querySetPtr, queryIndex) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2243 | var encoder = WebGPU.getJsObject(encoderPtr); |
| 2244 | var querySet = WebGPU.getJsObject(querySetPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2245 | encoder.writeTimestamp(querySet, queryIndex); |
| 2246 | }, |
| 2247 | |
| 2248 | // -------------------------------------------------------------------------- |
| 2249 | // Methods of RenderPipeline |
| 2250 | // -------------------------------------------------------------------------- |
| 2251 | |
| 2252 | wgpuRenderPipelineGetBindGroupLayout__deps: ['emwgpuCreateBindGroupLayout'], |
| 2253 | wgpuRenderPipelineGetBindGroupLayout: (pipelinePtr, groupIndex) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2254 | var pipeline = WebGPU.getJsObject(pipelinePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2255 | var ptr = _emwgpuCreateBindGroupLayout(); |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2256 | WebGPU.Internals.jsObjectInsert(ptr, pipeline.getBindGroupLayout(groupIndex)); |
| 2257 | return ptr; |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2258 | }, |
| 2259 | |
| 2260 | wgpuRenderPipelineSetLabel: (pipelinePtr, labelPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2261 | var pipeline = WebGPU.getJsObject(pipelinePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2262 | pipeline.label = UTF8ToString(labelPtr); |
| 2263 | }, |
| 2264 | |
| 2265 | // -------------------------------------------------------------------------- |
| 2266 | // Methods of Sampler |
| 2267 | // -------------------------------------------------------------------------- |
| 2268 | |
| 2269 | wgpuSamplerSetLabel: (samplerPtr, labelPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2270 | var sampler = WebGPU.getJsObject(samplerPtr); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 2271 | sampler.label = UTF8ToString(labelPtr); |
| 2272 | }, |
| 2273 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2274 | // -------------------------------------------------------------------------- |
| 2275 | // Methods of ShaderModule |
| 2276 | // -------------------------------------------------------------------------- |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 2277 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2278 | wgpuShaderModuleGetCompilationInfo__deps: ['$callUserCallback', '$stringToUTF8', '$lengthBytesUTF8', 'malloc', 'free'], |
| 2279 | wgpuShaderModuleGetCompilationInfo: (shaderModulePtr, callback, userdata) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2280 | var shaderModule = WebGPU.getJsObject(shaderModulePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2281 | {{{ 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2322 | var shaderModule = WebGPU.getJsObject(shaderModulePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2323 | shaderModule.label = UTF8ToString(labelPtr); |
| 2324 | }, |
| 2325 | |
| 2326 | // -------------------------------------------------------------------------- |
| 2327 | // Methods of Surface |
| 2328 | // -------------------------------------------------------------------------- |
| 2329 | |
| 2330 | wgpuSurfaceConfigure: (surfacePtr, config) => { |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 2331 | {{{ gpu.makeCheckDescriptor('config') }}} |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2332 | var devicePtr = {{{ makeGetValue('config', C_STRUCTS.WGPUSurfaceConfiguration.device, '*') }}}; |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2333 | var context = WebGPU.getJsObject(surfacePtr); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 2334 | |
| 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 Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 2339 | 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2357 | "device": WebGPU.getJsObject(devicePtr), |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 2358 | "format": WebGPU.TextureFormat[ |
| 2359 | {{{ gpu.makeGetU32('config', C_STRUCTS.WGPUSurfaceConfiguration.format) }}}], |
| 2360 | "usage": {{{ gpu.makeGetU32('config', C_STRUCTS.WGPUSurfaceConfiguration.usage) }}}, |
Kai Ninomiya | 6d1e213 | 2024-09-05 23:05:45 +0000 | [diff] [blame] | 2361 | "alphaMode": WebGPU.CompositeAlphaMode[ |
| 2362 | {{{ gpu.makeGetU32('config', C_STRUCTS.WGPUSurfaceConfiguration.alphaMode) }}}], |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 2363 | }; |
| 2364 | context.configure(configuration); |
| 2365 | }, |
| 2366 | |
Loko Kung | 424cda2 | 2024-08-17 01:29:10 +0000 | [diff] [blame] | 2367 | wgpuSurfaceGetCurrentTexture__deps: ['emwgpuCreateTexture'], |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2368 | wgpuSurfaceGetCurrentTexture: (surfacePtr, surfaceTexturePtr) => { |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 2369 | {{{ gpu.makeCheck('surfaceTexturePtr') }}} |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2370 | var context = WebGPU.getJsObject(surfacePtr); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 2371 | |
| 2372 | try { |
Loko Kung | 424cda2 | 2024-08-17 01:29:10 +0000 | [diff] [blame] | 2373 | var texturePtr = _emwgpuCreateTexture(); |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2374 | WebGPU.Internals.jsObjectInsert(texturePtr, context.getCurrentTexture()); |
Loko Kung | 424cda2 | 2024-08-17 01:29:10 +0000 | [diff] [blame] | 2375 | {{{ makeSetValue('surfaceTexturePtr', C_STRUCTS.WGPUSurfaceTexture.texture, 'texturePtr', '*') }}}; |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 2376 | {{{ makeSetValue('surfaceTexturePtr', C_STRUCTS.WGPUSurfaceTexture.suboptimal, '0', 'i32') }}}; |
Kai Ninomiya | 1178400 | 2024-07-03 19:46:03 +0000 | [diff] [blame] | 2377 | {{{ makeSetValue('surfaceTexturePtr', C_STRUCTS.WGPUSurfaceTexture.status, |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 2378 | 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 Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2391 | wgpuSurfacePresent: (surfacePtr) => { |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 2392 | // TODO: This could probably be emulated with ASYNCIFY. |
| 2393 | abort('wgpuSurfacePresent is unsupported (use requestAnimationFrame via html5.h instead)'); |
| 2394 | }, |
| 2395 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2396 | wgpuSurfaceUnconfigure: (surfacePtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2397 | var context = WebGPU.getJsObject(surfacePtr); |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 2398 | context.unconfigure(); |
| 2399 | }, |
| 2400 | |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2401 | // -------------------------------------------------------------------------- |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2402 | // 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 Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2428 | var texture = WebGPU.getJsObject(texturePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2429 | var ptr = _emwgpuCreateTextureView(); |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2430 | WebGPU.Internals.jsObjectInsert(ptr, texture.createView(desc)); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2431 | return ptr; |
| 2432 | }, |
| 2433 | |
| 2434 | wgpuTextureDestroy: (texturePtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2435 | WebGPU.getJsObject(texturePtr).destroy(); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2436 | }, |
| 2437 | |
| 2438 | wgpuTextureGetDepthOrArrayLayers: (texturePtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2439 | var texture = WebGPU.getJsObject(texturePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2440 | return texture.depthOrArrayLayers; |
| 2441 | }, |
| 2442 | |
| 2443 | wgpuTextureGetDimension: (texturePtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2444 | var texture = WebGPU.getJsObject(texturePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2445 | return WebGPU.TextureDimension.indexOf(texture.dimension); |
| 2446 | }, |
| 2447 | |
| 2448 | wgpuTextureGetFormat: (texturePtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2449 | var texture = WebGPU.getJsObject(texturePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2450 | // Should return the enum integer instead of string. |
| 2451 | return WebGPU.TextureFormat.indexOf(texture.format); |
| 2452 | }, |
| 2453 | |
| 2454 | wgpuTextureGetHeight: (texturePtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2455 | var texture = WebGPU.getJsObject(texturePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2456 | return texture.height; |
| 2457 | }, |
| 2458 | |
| 2459 | wgpuTextureGetMipLevelCount: (texturePtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2460 | var texture = WebGPU.getJsObject(texturePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2461 | return texture.mipLevelCount; |
| 2462 | }, |
| 2463 | |
| 2464 | wgpuTextureGetSampleCount: (texturePtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2465 | var texture = WebGPU.getJsObject(texturePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2466 | return texture.sampleCount; |
| 2467 | }, |
| 2468 | |
| 2469 | wgpuTextureGetUsage: (texturePtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2470 | var texture = WebGPU.getJsObject(texturePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2471 | return texture.usage; |
| 2472 | }, |
| 2473 | |
| 2474 | wgpuTextureGetWidth: (texturePtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2475 | var texture = WebGPU.getJsObject(texturePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2476 | return texture.width; |
| 2477 | }, |
| 2478 | |
| 2479 | wgpuTextureSetLabel: (texturePtr, labelPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2480 | var texture = WebGPU.getJsObject(texturePtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2481 | texture.label = UTF8ToString(labelPtr); |
| 2482 | }, |
| 2483 | |
| 2484 | // -------------------------------------------------------------------------- |
| 2485 | // Methods of TextureView |
| 2486 | // -------------------------------------------------------------------------- |
| 2487 | |
| 2488 | wgpuTextureViewSetLabel: (textureViewPtr, labelPtr) => { |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2489 | var textureView = WebGPU.getJsObject(textureViewPtr); |
Loko Kung | 5a9506d | 2024-08-17 01:44:45 +0000 | [diff] [blame] | 2490 | textureView.label = UTF8ToString(labelPtr); |
| 2491 | }, |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 2492 | }; |
| 2493 | |
| 2494 | // Inverted index used by EnumerateFeatures/HasFeature |
| 2495 | LibraryWebGPU.$WebGPU.FeatureNameString2Enum = {}; |
| 2496 | for (var value in LibraryWebGPU.$WebGPU.FeatureName) { |
| 2497 | LibraryWebGPU.$WebGPU.FeatureNameString2Enum[LibraryWebGPU.$WebGPU.FeatureName[value]] = value; |
| 2498 | } |
| 2499 | |
| 2500 | for (const key of Object.keys(LibraryWebGPU)) { |
| 2501 | if (typeof LibraryWebGPU[key] === 'function') { |
Loko Kung | 859fb30 | 2024-08-17 01:44:58 +0000 | [diff] [blame] | 2502 | if (!(key + '__i53abi' in LibraryWebGPU)) { |
| 2503 | LibraryWebGPU[key + '__i53abi'] = true; |
| 2504 | } |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 2505 | } |
| 2506 | } |
| 2507 | |
Lokbondo Kung | 83ebea3 | 2024-10-11 22:40:03 +0000 | [diff] [blame] | 2508 | // Based on autoAddDeps, this helper iterates the object and moves the |
| 2509 | // deps upwards into targetDeps and remove them from the object. |
| 2510 | function 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 | } |
| 2520 | moveDeps(LibraryWebGPU.$WebGPU, LibraryWebGPU.$WebGPU__deps) |
| 2521 | |
Kai Ninomiya | ace5a58 | 2024-07-02 20:52:25 +0000 | [diff] [blame] | 2522 | autoAddDeps(LibraryWebGPU, '$WebGPU'); |
Kai Ninomiya | 1178400 | 2024-07-03 19:46:03 +0000 | [diff] [blame] | 2523 | mergeInto(LibraryManager.library, LibraryWebGPU); |