Path: blob/main/src/vs/editor/browser/gpu/gpuDisposable.ts
3294 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import type { IReference } from '../../../base/common/lifecycle.js';6import { isFunction } from '../../../base/common/types.js';78export namespace GPULifecycle {9export async function requestDevice(fallback?: (message: string) => void): Promise<IReference<GPUDevice>> {10try {11if (!navigator.gpu) {12throw new Error('This browser does not support WebGPU');13}14const adapter = (await navigator.gpu.requestAdapter())!;15if (!adapter) {16throw new Error('This browser supports WebGPU but it appears to be disabled');17}18return wrapDestroyableInDisposable(await adapter.requestDevice());19} catch (e) {20if (fallback) {21fallback(e.message);22}23throw e;24}25}2627export function createBuffer(device: GPUDevice, descriptor: GPUBufferDescriptor, initialValues?: Float32Array | (() => Float32Array)): IReference<GPUBuffer> {28const buffer = device.createBuffer(descriptor);29if (initialValues) {30device.queue.writeBuffer(buffer, 0, (isFunction(initialValues) ? initialValues() : initialValues) as Float32Array<ArrayBuffer>);31}32return wrapDestroyableInDisposable(buffer);33}3435export function createTexture(device: GPUDevice, descriptor: GPUTextureDescriptor): IReference<GPUTexture> {36return wrapDestroyableInDisposable(device.createTexture(descriptor));37}38}3940function wrapDestroyableInDisposable<T extends { destroy(): void }>(value: T): IReference<T> {41return {42object: value,43dispose: () => value.destroy()44};45}464748