| {{{ | |
| // Helper functions for code generation | |
| globalThis.html5_gpu = { | |
| makeImportExport: (snake_case, CamelCase) => { | |
| return ` | |
| LibraryHTML5WebGPU.emscripten_webgpu_import_${snake_case}__deps = ['$WebGPU', '$JsValStore']; | |
| LibraryHTML5WebGPU.emscripten_webgpu_import_${snake_case} = (handle) => | |
| WebGPU.mgr${CamelCase}.create(JsValStore.get(handle)); | |
| LibraryHTML5WebGPU.emscripten_webgpu_export_${snake_case}__deps = ['$WebGPU', '$JsValStore']; | |
| LibraryHTML5WebGPU.emscripten_webgpu_export_${snake_case} = (handle) => | |
| JsValStore.add(WebGPU.mgr${CamelCase}.get(handle));` | |
| }, | |
| }; | |
| null; | |
| }}} | |
| var LibraryHTML5WebGPU = { | |
| $JsValStore: { | |
| values: {}, | |
| next_id: 1, | |
| add(js_val) { | |
| var id; | |
| do { | |
| id = JsValStore.next_id++; | |
| if (JsValStore.next_id > 2147483647) JsValStore.next_id = 1; // Wraparound signed int32. | |
| } while (id in JsValStore.values); | |
| JsValStore.values[id] = js_val; | |
| return id; | |
| }, | |
| remove(id) { | |
| #if ASSERTIONS | |
| assert(id in JsValStore.values); | |
| #endif | |
| delete JsValStore.values[id]; | |
| }, | |
| get(id) { | |
| #if ASSERTIONS | |
| assert(id === 0 || id in JsValStore.values); | |
| #endif | |
| return JsValStore.values[id]; | |
| }, | |
| }, | |
| emscripten_webgpu_release_js_handle__deps: ['$JsValStore'], | |
| emscripten_webgpu_release_js_handle: (id) => JsValStore.remove(id), | |
| emscripten_webgpu_get_device__deps: ['$WebGPU'], | |
| emscripten_webgpu_get_device: () => { | |
| #if ASSERTIONS | |
| assert(Module['preinitializedWebGPUDevice']); | |
| #endif | |
| if (WebGPU.preinitializedDeviceId === undefined) { | |
| var device = Module['preinitializedWebGPUDevice']; | |
| var deviceWrapper = { queueId: WebGPU.mgrQueue.create(device["queue"]) }; | |
| WebGPU.preinitializedDeviceId = WebGPU.mgrDevice.create(device, deviceWrapper); | |
| } | |
| WebGPU.mgrDevice.reference(WebGPU.preinitializedDeviceId); | |
| return WebGPU.preinitializedDeviceId; | |
| }, | |
| }; | |
| {{{ html5_gpu.makeImportExport('surface', 'Surface') }}} | |
| {{{ html5_gpu.makeImportExport('swap_chain', 'SwapChain') }}} | |
| {{{ html5_gpu.makeImportExport('device', 'Device') }}} | |
| {{{ html5_gpu.makeImportExport('queue', 'Queue') }}} | |
| {{{ html5_gpu.makeImportExport('command_buffer', 'CommandBuffer') }}} | |
| {{{ html5_gpu.makeImportExport('command_encoder', 'CommandEncoder') }}} | |
| {{{ html5_gpu.makeImportExport('render_pass_encoder', 'RenderPassEncoder') }}} | |
| {{{ html5_gpu.makeImportExport('compute_pass_encoder', 'ComputePassEncoder') }}} | |
| {{{ html5_gpu.makeImportExport('bind_group', 'BindGroup') }}} | |
| {{{ html5_gpu.makeImportExport('buffer', 'Buffer') }}} | |
| {{{ html5_gpu.makeImportExport('sampler', 'Sampler') }}} | |
| {{{ html5_gpu.makeImportExport('texture', 'Texture') }}} | |
| {{{ html5_gpu.makeImportExport('texture_view', 'TextureView') }}} | |
| {{{ html5_gpu.makeImportExport('query_set', 'QuerySet') }}} | |
| {{{ html5_gpu.makeImportExport('bind_group_layout', 'BindGroupLayout') }}} | |
| {{{ html5_gpu.makeImportExport('pipeline_layout', 'PipelineLayout') }}} | |
| {{{ html5_gpu.makeImportExport('render_pipeline', 'RenderPipeline') }}} | |
| {{{ html5_gpu.makeImportExport('compute_pipeline', 'ComputePipeline') }}} | |
| {{{ html5_gpu.makeImportExport('shader_module', 'ShaderModule') }}} | |
| {{{ html5_gpu.makeImportExport('render_bundle_encoder', 'RenderBundleEncoder') }}} | |
| {{{ html5_gpu.makeImportExport('render_bundle', 'RenderBundle') }}} | |
| mergeInto(LibraryManager.library, LibraryHTML5WebGPU); |