UNPKG

23.4 kBSource Map (JSON)View Raw
1{"version":3,"sources":["../../src/webgpu/WebGPUComputeModel.ts"],"names":["AST_TOKEN_TYPES","isSafari","STORAGE_CLASS","createEntity","WebGPUConstants","isNil","WebGPUBuffer","WebGPUComputeModel","engine","context","entity","uniformGPUBufferLayout","uniformBuffer","vertexBuffers","outputBuffer","bindGroupEntries","bindGroup","computePipeline","compileComputePipelineStageDescriptor","shader","computeStage","buffers","uniforms","filter","uniform","storageClass","StorageBuffer","Uniform","bufferBindingIndex","length","offset","mergedUniformData","forEach","data","push","name","originDataLength","padding","space","i","Array","Float32Array","usage","BufferUsage","CopyDst","binding","resource","buffer","get","type","Vector4FloatArray","FloatArray","gpuBuffer","output","isFinite","Number","Storage","CopySrc","typedArrayConstructor","isReferer","model","refer","undefined","device","createComputePipeline","console","log","createBindGroup","layout","getBindGroupLayout","entries","destroy","Object","keys","bufferName","byteCount","BYTES_PER_ELEMENT","gpuReadBuffer","createBuffer","size","GPUBufferUsage","COPY_DST","MAP_READ","encoder","createCommandEncoder","copyBufferToBuffer","queue","getQueue","defaultQueue","submit","finish","mapAsync","MapMode","Read","arraybuffer","getMappedRange","typedArray","slice","unmap","currentComputePass","setPipeline","setBindGroup","dispatch","subData","uniformName","find","l","inputName","inputBuffer","source","shaderVersion","compileRawShaderToSpirV","glslang","compileGLSL","computeCode","computeShader","options","useWGSL","compileShaderToSpirV","module","createShaderModule","code","isWHLSL","entryPoint"],"mappings":"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","sourcesContent":["import {\n AST_TOKEN_TYPES,\n gl,\n GLSLContext,\n IComputeModel,\n isSafari,\n STORAGE_CLASS,\n createEntity,\n} from '@antv/g-webgpu-core';\nimport * as WebGPUConstants from '@webgpu/types/dist/constants';\nimport { isNumber } from 'lodash';\nimport isNil from 'lodash/isNil';\nimport { WebGPUEngine } from '.';\nimport WebGPUBuffer from './WebGPUBuffer';\n\nexport default class WebGPUComputeModel implements IComputeModel {\n private entity = createEntity();\n /**\n * 用于后续渲染时动态更新\n */\n private uniformGPUBufferLayout: Array<{\n name: string;\n offset: number;\n }> = [];\n\n private uniformBuffer: WebGPUBuffer;\n private vertexBuffers: Record<string, WebGPUBuffer> = {};\n private outputBuffer: WebGPUBuffer;\n private bindGroupEntries: GPUBindGroupEntry[];\n private bindGroup: GPUBindGroup;\n\n private computePipeline: GPUComputePipeline;\n\n constructor(private engine: WebGPUEngine, private context: GLSLContext) {}\n\n public async init() {\n const { computeStage } = await this.compileComputePipelineStageDescriptor(\n this.context.shader!,\n );\n\n const buffers = this.context.uniforms.filter(\n (uniform) => uniform.storageClass === STORAGE_CLASS.StorageBuffer,\n );\n const uniforms = this.context.uniforms.filter(\n (uniform) => uniform.storageClass === STORAGE_CLASS.Uniform,\n );\n\n let bufferBindingIndex = uniforms.length ? 1 : 0;\n this.bindGroupEntries = [];\n if (bufferBindingIndex) {\n let offset = 0;\n // FIXME: 所有 uniform 合并成一个 buffer,固定使用 Float32Array 存储,确实会造成一些内存的浪费\n // we use std140 layout @see https://www.khronos.org/opengl/wiki/Interface_Block_(GLSL)\n const mergedUniformData: number[] = [];\n uniforms.forEach((uniform) => {\n if (isNumber(uniform.data)) {\n this.uniformGPUBufferLayout.push({\n name: uniform.name,\n offset,\n });\n offset += 4;\n mergedUniformData.push(uniform.data);\n } else {\n let originDataLength = uniform.data?.length || 1;\n if (originDataLength === 3) {\n // vec3 -> vec4\n // @see http://ptgmedia.pearsoncmg.com/images/9780321552624/downloads/0321552628_AppL.pdf\n originDataLength = 4;\n uniform.data.push(0);\n }\n // 4 elements per block/line\n const padding = (offset / 4) % 4;\n if (padding > 0) {\n const space = 4 - padding;\n if (originDataLength > 1 && originDataLength <= space) {\n if (originDataLength === 2) {\n if (space === 3) {\n offset += 4;\n mergedUniformData.push(0);\n }\n mergedUniformData.push(...uniform.data);\n this.uniformGPUBufferLayout.push({\n name: uniform.name,\n offset,\n });\n }\n } else {\n for (let i = 0; i < space; i++) {\n offset += 4;\n mergedUniformData.push(0);\n }\n mergedUniformData.push(...uniform.data);\n this.uniformGPUBufferLayout.push({\n name: uniform.name,\n offset,\n });\n }\n }\n\n offset += 4 * originDataLength;\n }\n });\n\n this.uniformBuffer = new WebGPUBuffer(this.engine, {\n // TODO: 处理 Struct 和 boolean\n // @ts-ignore\n data:\n mergedUniformData instanceof Array\n ? // @ts-ignore\n new Float32Array(mergedUniformData)\n : mergedUniformData,\n usage:\n WebGPUConstants.BufferUsage.Uniform |\n WebGPUConstants.BufferUsage.CopyDst,\n });\n\n this.bindGroupEntries.push({\n binding: 0,\n resource: {\n buffer: this.uniformBuffer.get(),\n },\n });\n }\n\n // create GPUBuffers for storeage buffers\n buffers.forEach((buffer) => {\n if (!isNil(buffer.data)) {\n if (\n buffer.type === AST_TOKEN_TYPES.Vector4FloatArray ||\n buffer.type === AST_TOKEN_TYPES.FloatArray\n ) {\n let gpuBuffer;\n if (buffer.name === this.context.output.name) {\n gpuBuffer = new WebGPUBuffer(this.engine, {\n // @ts-ignore\n data: isFinite(Number(buffer.data)) ? [buffer.data] : buffer.data,\n usage:\n WebGPUConstants.BufferUsage.Storage |\n WebGPUConstants.BufferUsage.CopyDst |\n WebGPUConstants.BufferUsage.CopySrc,\n });\n this.outputBuffer = gpuBuffer;\n this.context.output = {\n name: buffer.name,\n // @ts-ignore\n length: isFinite(Number(buffer.data)) ? 1 : buffer.data.length,\n typedArrayConstructor: Float32Array,\n gpuBuffer: gpuBuffer.get(),\n };\n } else {\n if (buffer.isReferer) {\n // @ts-ignore\n if (buffer.data.model && buffer.data.model.outputBuffer) {\n // @ts-ignore\n gpuBuffer = (buffer.data.model as WebGPUComputeModel)\n .outputBuffer;\n } else {\n // referred kernel haven't been executed\n }\n } else {\n gpuBuffer = new WebGPUBuffer(this.engine, {\n // @ts-ignore\n data: isFinite(Number(buffer.data))\n ? [buffer.data]\n : buffer.data,\n usage:\n WebGPUConstants.BufferUsage.Storage |\n WebGPUConstants.BufferUsage.CopyDst |\n WebGPUConstants.BufferUsage.CopySrc,\n });\n }\n }\n\n this.vertexBuffers[buffer.name] = gpuBuffer;\n this.bindGroupEntries.push({\n binding: bufferBindingIndex,\n resource: {\n name: buffer.name,\n refer: gpuBuffer ? undefined : buffer.data,\n buffer: gpuBuffer ? gpuBuffer.get() : undefined,\n },\n });\n bufferBindingIndex++;\n }\n }\n });\n\n // create compute pipeline layout\n this.computePipeline = this.engine.device.createComputePipeline({\n computeStage,\n });\n\n console.log(this.bindGroupEntries);\n\n this.bindGroup = this.engine.device.createBindGroup({\n layout: this.computePipeline.getBindGroupLayout(0),\n entries: this.bindGroupEntries,\n });\n }\n\n public destroy(): void {\n if (this.uniformBuffer) {\n this.uniformBuffer.destroy();\n }\n\n Object.keys(this.vertexBuffers).forEach((bufferName) =>\n this.vertexBuffers[bufferName].destroy(),\n );\n }\n\n public async readData() {\n const { output } = this.context;\n if (output) {\n const { length, typedArrayConstructor, gpuBuffer } = output;\n if (gpuBuffer) {\n // await gpuBuffer.mapAsync(WebGPUConstants.MapMode.Read);\n // const arraybuffer = gpuBuffer.getMappedRange();\n // let arraybuffer;\n\n // if (isSafari) {\n // arraybuffer = await gpuBuffer.mapReadAsync();\n // } else {\n const byteCount = length! * typedArrayConstructor!.BYTES_PER_ELEMENT;\n\n // @see https://developers.google.com/web/updates/2019/08/get-started-with-gpu-compute-on-the-web\n const gpuReadBuffer = this.engine.device.createBuffer({\n size: byteCount,\n usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,\n });\n const encoder = this.engine.device.createCommandEncoder();\n encoder.copyBufferToBuffer(gpuBuffer, 0, gpuReadBuffer, 0, byteCount);\n const queue: GPUQueue = isSafari\n ? // @ts-ignore\n this.engine.device.getQueue()\n : this.engine.device.defaultQueue;\n queue.submit([encoder.finish()]);\n\n await gpuReadBuffer.mapAsync(WebGPUConstants.MapMode.Read);\n const arraybuffer = gpuReadBuffer.getMappedRange();\n const typedArray = new typedArrayConstructor!(arraybuffer.slice(0));\n gpuReadBuffer.unmap();\n\n return typedArray;\n }\n }\n return new Float32Array();\n }\n\n public run() {\n if (this.engine.currentComputePass) {\n this.engine.currentComputePass.setPipeline(this.computePipeline);\n\n // this.bindGroupEntries.forEach((entry) => {\n // if (!entry.resource.buffer) {\n // // get referred kernel's output\n // const gpuBuffer = (entry.resource.refer.model as WebGPUComputeModel)\n // .outputBuffer;\n // this.vertexBuffers[entry.resource.name] = gpuBuffer;\n // entry.resource.buffer = gpuBuffer.get();\n // }\n // });\n\n // const bindGroup = this.engine.device.createBindGroup({\n // layout: this.computePipeline.getBindGroupLayout(0),\n // entries: this.bindGroupEntries,\n // });\n this.engine.currentComputePass.setBindGroup(0, this.bindGroup);\n this.engine.currentComputePass.dispatch(...this.context.dispatch);\n }\n }\n\n public updateBuffer(\n bufferName: string,\n data:\n | number[]\n | Float32Array\n | Uint8Array\n | Uint16Array\n | Uint32Array\n | Int8Array\n | Int16Array\n | Int32Array,\n offset: number = 0,\n ) {\n const buffer = this.vertexBuffers[bufferName];\n if (buffer) {\n buffer.subData({ data, offset });\n }\n }\n\n public updateUniform(\n uniformName: string,\n data:\n | number\n | number[]\n | Float32Array\n | Uint8Array\n | Uint16Array\n | Uint32Array\n | Int8Array\n | Int16Array\n | Int32Array,\n ) {\n const layout = this.uniformGPUBufferLayout.find(\n (l) => l.name === uniformName,\n );\n\n if (layout) {\n this.uniformBuffer.subData({\n data: Number.isFinite(data)\n ? new Float32Array([data as number])\n : new Float32Array(\n data as\n | number[]\n | Float32Array\n | Uint8Array\n | Uint16Array\n | Uint32Array\n | Int8Array\n | Int16Array\n | Int32Array,\n ),\n offset: layout.offset,\n });\n }\n }\n\n public confirmInput(model: IComputeModel, inputName: string): void {\n // copy output GPUBuffer of kernel\n const inputBuffer = this.vertexBuffers[inputName];\n const outputBuffer = (model as WebGPUComputeModel).outputBuffer;\n\n if (inputBuffer && outputBuffer && inputBuffer !== outputBuffer) {\n const encoder = this.engine.device.createCommandEncoder();\n const {\n length,\n typedArrayConstructor,\n } = (model as WebGPUComputeModel).context.output;\n const byteCount = length! * typedArrayConstructor!.BYTES_PER_ELEMENT;\n encoder.copyBufferToBuffer(\n outputBuffer.get(),\n 0,\n inputBuffer.get(),\n 0,\n byteCount,\n );\n const queue: GPUQueue = isSafari\n ? // @ts-ignore\n this.engine.device.getQueue()\n : this.engine.device.defaultQueue;\n queue.submit([encoder.finish()]);\n }\n }\n\n private compileShaderToSpirV(\n source: string,\n type: string,\n shaderVersion: string,\n ): Promise<Uint32Array> {\n return this.compileRawShaderToSpirV(shaderVersion + source, type);\n }\n\n private compileRawShaderToSpirV(\n source: string,\n type: string,\n ): Promise<Uint32Array> {\n return this.engine.glslang.compileGLSL(source, type);\n }\n\n private async compileComputePipelineStageDescriptor(\n computeCode: string,\n ): Promise<Pick<GPUComputePipelineDescriptor, 'computeStage'>> {\n let computeShader: Uint32Array | string = computeCode;\n const shaderVersion = '#version 450\\n';\n if (!this.engine.options.useWGSL) {\n computeShader = await this.compileShaderToSpirV(\n computeCode,\n 'compute',\n shaderVersion,\n );\n }\n\n return {\n computeStage: {\n module: this.engine.device.createShaderModule({\n code: computeShader,\n // @ts-ignore\n isWHLSL: isSafari,\n }),\n entryPoint: 'main',\n },\n };\n }\n}\n"],"file":"WebGPUComputeModel.js"}
\No newline at end of file