UNPKG

23.9 kBSource Map (JSON)View Raw
1{"version":3,"sources":["../../src/webgpu/WebGPUModel.ts"],"names":["gl","isSafari","WebGPUConstants","isNil","extractUniforms","getColorStateDescriptors","getCullMode","getDepthStencilStateDescriptor","primitiveMap","WebGPUBuffer","concatenate","resultConstructor","totalLength","arrays","arr","length","result","offset","set","WebGPUModel","engine","options","pipelineLayout","renderPipeline","uniformsBindGroupLayout","uniformBindGroup","uniformBuffer","uniforms","uniformGPUBufferLayout","attributeCache","indexBuffer","indexCount","vs","fs","attributes","primitive","count","elements","depth","blend","stencil","cull","instances","compilePipelineStageDescriptor","vertexStage","fragmentStage","buildUniformBindGroup","get","vertexState","vertexBuffers","Object","keys","map","attributeName","i","attribute","arrayStride","stepMode","ats","descriptor","sampleCount","mainPassSampleCount","primitiveTopology","TRIANGLES","rasterizationState","getDefaultRasterizationStateDescriptor","cullMode","depthStencilState","colorStates","swapChainFormat","layout","device","createRenderPipeline","renderPass","getCurrentRenderPass","bindGroupBindings","forEach","uniformName","type","Array","isArray","BYTES_PER_ELEMENT","find","name","subData","data","textureOrFramebuffer","color","texture","sampler","push","binding","resource","createView","buffer","createBindGroup","entries","setPipeline","setBindGroup","setIndexBuffer","IndexFormat","Uint32","setVertexBuffer","drawIndexed","draw","Error","vertexCode","fragmentCode","defines","shaderVersion","vertexShader","fragmentShader","useWGSL","compileShaderToSpirV","createPipelineStageDescriptor","source","compileRawShaderToSpirV","glslang","compileGLSL","module","createShaderModule","code","isWHLSL","entryPoint","frontFace","FrontFace","CCW","CullMode","None","depthBias","depthBiasSlopeScale","depthBiasClamp","mergedUniformData","Float32Array","hasUniform","visibility","ShaderStage","Fragment","Vertex","BindingType","UniformBuffer","filter","Sampler","SampledTexture","createBindGroupLayout","createPipelineLayout","bindGroupLayouts","usage","BufferUsage","Uniform","CopyDst"],"mappings":"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","sourcesContent":["import {\n gl,\n IModel,\n IModelDrawOptions,\n IModelInitializationOptions,\n isSafari,\n IUniform,\n} from '@antv/g-webgpu-core';\nimport * as WebGPUConstants from '@webgpu/types/dist/constants';\nimport isNil from 'lodash/isNil';\nimport { WebGPUEngine } from '.';\nimport { extractUniforms } from '../utils/uniform';\nimport {\n getColorStateDescriptors,\n getCullMode,\n getDepthStencilStateDescriptor,\n primitiveMap,\n} from './constants';\nimport WebGPUAttribute from './WebGPUAttribute';\nimport WebGPUBuffer from './WebGPUBuffer';\nimport WebGPUElements from './WebGPUElements';\nimport WebGPUFramebuffer from './WebGPUFramebuffer';\nimport WebGPUTexture2D from './WebGPUTexture2D';\n\n// @ts-ignore\nfunction concatenate(resultConstructor, ...arrays) {\n let totalLength = 0;\n for (const arr of arrays) {\n totalLength += arr.length;\n }\n const result = new resultConstructor(totalLength);\n let offset = 0;\n for (const arr of arrays) {\n result.set(arr, offset);\n offset += arr.length;\n }\n return result;\n}\n\nexport default class WebGPUModel implements IModel {\n private pipelineLayout: GPUPipelineLayout;\n private renderPipeline: GPURenderPipeline;\n private uniformsBindGroupLayout: GPUBindGroupLayout;\n private uniformBindGroup: GPUBindGroup;\n private uniformBuffer: WebGPUBuffer;\n\n private uniforms: {\n [key: string]: IUniform;\n } = {};\n\n /**\n * 用于后续渲染时动态更新\n */\n private uniformGPUBufferLayout: Array<{\n name: string;\n offset: number;\n }> = [];\n\n /**\n * vertex\n */\n private attributeCache: {\n [attributeName: string]: WebGPUAttribute;\n } = {};\n\n /**\n * indices's buffer\n */\n private indexBuffer: WebGPUBuffer;\n private indexCount: number;\n\n constructor(\n private engine: WebGPUEngine,\n private options: IModelInitializationOptions,\n ) {}\n\n public async init() {\n const {\n vs,\n fs,\n attributes,\n uniforms,\n primitive,\n count,\n elements,\n depth,\n blend,\n stencil,\n cull,\n instances,\n } = this.options;\n\n // build shaders first\n const {\n vertexStage,\n fragmentStage,\n } = await this.compilePipelineStageDescriptor(vs, fs, null);\n\n if (uniforms) {\n // create uniform bind groups & layout\n this.buildUniformBindGroup(uniforms);\n }\n\n if (elements) {\n this.indexBuffer = (elements as WebGPUElements).get() as WebGPUBuffer;\n this.indexCount = (elements as WebGPUElements).indexCount;\n }\n\n // TODO: instanced array\n\n const vertexState = {\n vertexBuffers: Object.keys(attributes).map((attributeName, i) => {\n const attribute = attributes[attributeName] as WebGPUAttribute;\n const { arrayStride, stepMode, attributes: ats } = attribute.get();\n this.attributeCache[attributeName] = attribute;\n return {\n arrayStride,\n stepMode,\n attributes: ats,\n };\n }),\n };\n\n const descriptor = {\n sampleCount: this.engine.mainPassSampleCount,\n primitiveTopology: primitiveMap[primitive || gl.TRIANGLES],\n rasterizationState: {\n ...this.getDefaultRasterizationStateDescriptor(),\n // TODO: support frontface\n cullMode: getCullMode({ cull }),\n },\n depthStencilState: getDepthStencilStateDescriptor({\n depth,\n stencil,\n }),\n colorStates: getColorStateDescriptors(\n { blend },\n this.engine.options.swapChainFormat!,\n ),\n layout: this.pipelineLayout,\n vertexStage,\n fragmentStage,\n vertexState,\n };\n\n // create pipeline\n this.renderPipeline = this.engine.device.createRenderPipeline(descriptor);\n }\n\n public addUniforms(uniforms: { [key: string]: IUniform }): void {\n this.uniforms = {\n ...this.uniforms,\n ...extractUniforms(uniforms),\n };\n }\n\n public draw(options: IModelDrawOptions): void {\n const renderPass = this.engine.getCurrentRenderPass();\n\n const uniforms: {\n [key: string]: IUniform;\n } = {\n ...this.uniforms,\n ...extractUniforms(options.uniforms || {}),\n };\n\n const bindGroupBindings: GPUBindGroupEntry[] = [];\n\n // TODO: uniform 发生修改\n Object.keys(uniforms).forEach((uniformName: string) => {\n const type = typeof uniforms[uniformName];\n if (\n type === 'boolean' ||\n type === 'number' ||\n Array.isArray(uniforms[uniformName]) ||\n // @ts-ignore\n uniforms[uniformName].BYTES_PER_ELEMENT\n ) {\n const offset = this.uniformGPUBufferLayout.find(\n ({ name }) => name === uniformName,\n )?.offset;\n if (!isNil(offset)) {\n this.uniformBuffer.subData({\n data: uniforms[uniformName],\n offset,\n });\n }\n } else {\n let offset = this.uniformGPUBufferLayout.find(\n ({ name }) => name === uniformName,\n )?.offset;\n if (!isNil(offset)) {\n const textureOrFramebuffer = (uniforms[uniformName] as\n | WebGPUTexture2D\n | WebGPUFramebuffer).get();\n const { texture, sampler } =\n textureOrFramebuffer.color || textureOrFramebuffer;\n if (sampler) {\n bindGroupBindings.push({\n binding: offset,\n resource: sampler,\n });\n offset++;\n }\n bindGroupBindings.push({\n binding: offset,\n resource: texture.createView(),\n });\n }\n }\n });\n\n if (this.uniformBuffer) {\n bindGroupBindings[0] = {\n binding: 0,\n resource: {\n buffer: this.uniformBuffer.get(), // 返回 GPUBuffer 原生对象\n },\n };\n }\n\n this.uniformBindGroup = this.engine.device.createBindGroup({\n layout: this.uniformsBindGroupLayout,\n entries: bindGroupBindings,\n });\n\n if (this.renderPipeline) {\n renderPass.setPipeline(this.renderPipeline);\n }\n\n renderPass.setBindGroup(0, this.uniformBindGroup);\n\n if (this.indexBuffer) {\n renderPass.setIndexBuffer(\n this.indexBuffer.get(),\n WebGPUConstants.IndexFormat.Uint32,\n 0,\n );\n }\n\n Object.keys(this.attributeCache).forEach((attributeName: string, i) => {\n renderPass.setVertexBuffer(\n 0 + i,\n this.attributeCache[attributeName].get().buffer,\n 0,\n );\n });\n\n // renderPass.draw(verticesCount, instancesCount, verticesStart, 0);\n if (this.indexBuffer) {\n renderPass.drawIndexed(\n this.indexCount,\n this.options.instances || 1,\n 0,\n 0,\n 0,\n );\n } else {\n renderPass.draw(\n this.options.count || 0,\n this.options.instances || 0,\n 0,\n 0,\n );\n }\n }\n\n public destroy(): void {\n throw new Error('Method not implemented.');\n }\n\n private async compilePipelineStageDescriptor(\n vertexCode: string,\n fragmentCode: string,\n defines: string | null,\n ): Promise<\n Pick<GPURenderPipelineDescriptor, 'vertexStage' | 'fragmentStage'>\n > {\n const shaderVersion = '#version 450\\n';\n\n let vertexShader: Uint32Array | string = vertexCode;\n let fragmentShader: Uint32Array | string = fragmentCode;\n if (!this.engine.options.useWGSL) {\n vertexShader = await this.compileShaderToSpirV(\n vertexCode,\n 'vertex',\n shaderVersion,\n );\n fragmentShader = await this.compileShaderToSpirV(\n fragmentCode,\n 'fragment',\n shaderVersion,\n );\n }\n\n return this.createPipelineStageDescriptor(vertexShader, fragmentShader);\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 createPipelineStageDescriptor(\n vertexShader: Uint32Array | string,\n fragmentShader: Uint32Array | string,\n ): Pick<GPURenderPipelineDescriptor, 'vertexStage' | 'fragmentStage'> {\n return {\n vertexStage: {\n module: this.engine.device.createShaderModule({\n code: vertexShader,\n // @ts-ignore\n isWHLSL: isSafari,\n }),\n entryPoint: 'main',\n },\n fragmentStage: {\n module: this.engine.device.createShaderModule({\n code: fragmentShader,\n // @ts-ignore\n isWHLSL: isSafari,\n }),\n entryPoint: 'main',\n },\n };\n }\n\n /**\n * @see https://gpuweb.github.io/gpuweb/#rasterization-state\n */\n private getDefaultRasterizationStateDescriptor(): GPURasterizationStateDescriptor {\n return {\n frontFace: WebGPUConstants.FrontFace.CCW,\n cullMode: WebGPUConstants.CullMode.None,\n depthBias: 0,\n depthBiasSlopeScale: 0,\n depthBiasClamp: 0,\n };\n }\n\n private buildUniformBindGroup(uniforms: { [key: string]: IUniform }) {\n let offset = 0;\n // FIXME: 所有 uniform 合并成一个 buffer,固定使用 Float32Array 存储,确实会造成一些内存的浪费\n const mergedUniformData = concatenate(\n Float32Array,\n ...Object.keys(uniforms).map((uniformName) => {\n if (uniforms[uniformName]) {\n this.uniformGPUBufferLayout.push({\n name: uniformName,\n offset,\n });\n // @ts-ignore\n offset += (uniforms[uniformName].length || 1) * 4;\n return uniforms[uniformName];\n } else {\n // texture & framebuffer\n return [];\n }\n }),\n );\n\n const entries: GPUBindGroupLayoutEntry[] = [];\n let hasUniform = false;\n if (mergedUniformData.length) {\n hasUniform = true;\n // TODO: 所有 uniform 绑定到 slot 0,通过解析 Shader 代码判定可见性\n entries.push({\n // TODO: 暂时都绑定到 slot 0\n binding: 0,\n visibility:\n WebGPUConstants.ShaderStage.Fragment |\n WebGPUConstants.ShaderStage.Vertex, // TODO: 暂时 VS 和 FS 都可见\n type: WebGPUConstants.BindingType.UniformBuffer,\n });\n }\n\n // 声明 texture & sampler\n Object.keys(uniforms)\n .filter((uniformName) => uniforms[uniformName] === null)\n .forEach((uniformName, i) => {\n this.uniformGPUBufferLayout.push({\n name: uniformName,\n offset: i * 2 + (hasUniform ? 1 : 0),\n });\n entries.push(\n {\n // Sampler\n binding: i * 2 + (hasUniform ? 1 : 0),\n visibility: WebGPUConstants.ShaderStage.Fragment,\n type: WebGPUConstants.BindingType.Sampler,\n },\n {\n // Texture view\n binding: i * 2 + (hasUniform ? 1 : 0) + 1,\n visibility: WebGPUConstants.ShaderStage.Fragment,\n type: WebGPUConstants.BindingType.SampledTexture,\n },\n );\n });\n\n this.uniformsBindGroupLayout = this.engine.device.createBindGroupLayout({\n // 最新 API 0.0.22 版本使用 entries。Chrome Canary 84.0.4110.0 已实现。\n // 使用 bindings 会报 Warning: GPUBindGroupLayoutDescriptor.bindings is deprecated: renamed to entries\n // @see https://github.com/antvis/GWebGPUEngine/issues/5\n entries,\n });\n\n this.pipelineLayout = this.engine.device.createPipelineLayout({\n bindGroupLayouts: [this.uniformsBindGroupLayout],\n });\n\n if (hasUniform) {\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 }\n}\n"],"file":"WebGPUModel.js"}
\No newline at end of file