UNPKG

22 kBSource Map (JSON)View Raw
1{"version":3,"sources":["../../src/webgl/ReglComputeModel.ts"],"names":["AST_TOKEN_TYPES","createEntity","STORAGE_CLASS","textureId","debug","ReglComputeModel","reGl","context","entity","texFBO","computeCommand","textureCache","outputTextureName","swapOutputTextureName","compiledPingpong","dynamicPingpong","uniforms","forEach","uniform","name","type","data","isReferer","storageClass","StorageBuffer","calcDataTexture","width","textureWidth","isOutput","needPingpong","undefined","compiledBundle","output","textureSize","console","log","id","texture","Uniform","Array","isArray","length","Error","getOuputDataTexture","texelCount","u_OutputTextureSize","u_OutputTexelCount","drawParams","attributes","a_Position","a_TexCoord","frag","shader","vert","quadVert","primitive","count","maxIteration","swap","framebuffer","color","use","pixels","read","originalDataLength","elementsPerTexel","typedArrayConstructor","Float32Array","formattedPixels","i","push","slice","model","inputName","inputModel","bufferName","offset","buffer","find","paddingData","createSwapOutputDataTexture","outputTextureUniformName","tmp","cloneDataTexture","height","Vector4FloatArray","Math","ceil","sqrt","paddingTexelCount","fill","constructor"],"mappings":"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","sourcesContent":["import {\n AST_TOKEN_TYPES,\n createEntity,\n DataType,\n GLSLContext,\n IComputeModel,\n STORAGE_CLASS,\n} from '@antv/g-webgpu-core';\nimport { isTypedArray } from 'lodash';\nimport regl from 'regl';\nimport quadVert from './shaders/quad.vert.glsl';\n\ninterface DataTextureDescriptor {\n id: number;\n data:\n | number\n | number[]\n | Float32Array\n | Uint8Array\n | Uint16Array\n | Uint32Array\n | Int8Array\n | Int16Array\n | Int32Array\n | undefined;\n textureWidth: number;\n texture: regl.Texture2D;\n texelCount: number;\n originalDataLength: number;\n elementsPerTexel: number;\n typedArrayConstructor?: Function;\n isOutput: boolean;\n}\n\nlet textureId = 0;\nconst debug = false;\n\n/**\n * adaptor for regl.DrawCommand\n */\nexport default class ReglComputeModel implements IComputeModel {\n private entity = createEntity();\n private texFBO: regl.Framebuffer2D;\n private computeCommand: regl.DrawCommand;\n private textureCache: {\n [textureName: string]: DataTextureDescriptor;\n } = {};\n private outputTextureName: string;\n private swapOutputTextureName: string;\n private compiledPingpong: boolean;\n private dynamicPingpong: boolean;\n\n constructor(private reGl: regl.Regl, private context: GLSLContext) {\n const uniforms: Record<string, any> = {};\n this.context.uniforms.forEach((uniform) => {\n const { name, type, data, isReferer, storageClass } = uniform;\n // store data with a 2D texture\n if (storageClass === STORAGE_CLASS.StorageBuffer) {\n if (!isReferer) {\n this.textureCache[name] = this.calcDataTexture(name, type, data!);\n const { textureWidth: width, isOutput } = this.textureCache[name];\n uniforms[`${name}Size`] = [width, width];\n\n if (isOutput) {\n this.outputTextureName = name;\n if (this.context.needPingpong) {\n this.outputTextureName = `${name}Output`;\n this.textureCache[this.outputTextureName] = this.calcDataTexture(\n name,\n type,\n data!,\n );\n }\n }\n } else {\n this.textureCache[name] = {\n data: undefined,\n };\n // refer to another kernel's output,\n // the referred kernel may not have been initialized, so we use dynamic way here\n uniforms[`${name}Size`] = () =>\n // @ts-ignore\n data.compiledBundle.context.output.textureSize;\n }\n\n uniforms[name] = () => {\n if (debug) {\n console.log(\n `[${this.entity}]: ${name} ${this.textureCache[name].id}`,\n );\n }\n return this.textureCache[name].texture;\n };\n } else if (storageClass === STORAGE_CLASS.Uniform) {\n if (\n data &&\n (Array.isArray(data) || isTypedArray(data)) &&\n (data as ArrayLike<number>).length > 16\n ) {\n // up to mat4 which includes 16 elements\n throw new Error(`invalid data type ${type}`);\n }\n // get uniform dynamically\n uniforms[name] = () => uniform.data;\n }\n });\n\n const { textureWidth, texelCount } = this.getOuputDataTexture();\n\n // 传入 output 纹理尺寸和数据长度,便于多余的 texel 提前退出\n uniforms.u_OutputTextureSize = [textureWidth, textureWidth];\n uniforms.u_OutputTexelCount = texelCount;\n\n // 保存在 Kernel 的上下文中,供其他 Kernel 引用\n this.context.output.textureSize = [textureWidth!, textureWidth!];\n\n const drawParams: regl.DrawConfig = {\n attributes: {\n a_Position: [\n [-1, 1, 0],\n [-1, -1, 0],\n [1, 1, 0],\n [1, -1, 0],\n ],\n a_TexCoord: [\n [0, 1],\n [0, 0],\n [1, 1],\n [1, 0],\n ],\n },\n frag: `#ifdef GL_FRAGMENT_PRECISION_HIGH\n precision highp float;\n#else\n precision mediump float;\n#endif\n${this.context.shader}`,\n uniforms,\n vert: quadVert,\n // TODO: use a fullscreen triangle instead.\n primitive: 'triangle strip',\n count: 4,\n };\n\n this.computeCommand = this.reGl(drawParams);\n }\n\n public run() {\n if (this.context.maxIteration > 1 && this.context.needPingpong) {\n this.compiledPingpong = true;\n }\n // need pingpong when (@in@out and execute(10)) or use `setBinding('out', self)`\n // this.needPingpong =\n // !!(this.context.maxIteration > 1 && this.context.needPingpong);\n\n // if (this.relativeOutputTextureNames.length) {\n // const { id, texture } = this.getOuputDataTexture();\n // this.relativeOutputTextureNames.forEach((name) => {\n // this.textureCache[name].id = id;\n // this.textureCache[name].texture = texture;\n // });\n // this.swap();\n // }\n\n if (this.compiledPingpong || this.dynamicPingpong) {\n this.swap();\n }\n\n this.texFBO = this.reGl.framebuffer({\n color: this.getOuputDataTexture().texture,\n });\n this.texFBO.use(() => {\n this.computeCommand();\n });\n if (debug) {\n console.log(`[${this.entity}]: output ${this.getOuputDataTexture().id}`);\n }\n }\n\n public async readData() {\n let pixels: Uint8Array | Float32Array;\n this.reGl({\n framebuffer: this.texFBO,\n })(() => {\n pixels = this.reGl.read();\n });\n\n // @ts-ignore\n if (pixels) {\n const {\n originalDataLength,\n elementsPerTexel,\n typedArrayConstructor = Float32Array,\n } = this.getOuputDataTexture();\n\n let formattedPixels = [];\n if (elementsPerTexel !== 4) {\n for (let i = 0; i < pixels.length; i += 4) {\n if (elementsPerTexel === 1) {\n formattedPixels.push(pixels[i]);\n } else if (elementsPerTexel === 2) {\n formattedPixels.push(pixels[i], pixels[i + 1]);\n } else {\n formattedPixels.push(pixels[i], pixels[i + 1], pixels[i + 2]);\n }\n }\n } else {\n // @ts-ignore\n formattedPixels = pixels;\n }\n\n // 截取多余的部分\n // @ts-ignore\n return new typedArrayConstructor(\n formattedPixels.slice(0, originalDataLength),\n );\n }\n\n return new Float32Array();\n }\n\n public confirmInput(model: IComputeModel, inputName: string) {\n let inputModel: ReglComputeModel;\n // refer to self, same as pingpong\n if (this.entity === (model as ReglComputeModel).entity) {\n this.dynamicPingpong = true;\n inputModel = this;\n } else {\n inputModel = model as ReglComputeModel;\n }\n\n this.textureCache[inputName].id = inputModel.getOuputDataTexture().id;\n this.textureCache[\n inputName\n ].texture = inputModel.getOuputDataTexture().texture;\n\n if (debug) {\n console.log(\n `[${this.entity}]: confirm input ${inputName} from model ${\n inputModel.entity\n }, ${(inputModel as ReglComputeModel).getOuputDataTexture().id}`,\n );\n }\n }\n\n public updateUniform() {\n // already get uniform's data dynamically when created, do nothing here\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 // regenerate data texture\n const buffer = this.context.uniforms.find(\n ({ name }) => name === bufferName,\n );\n if (buffer) {\n const { texture, data: paddingData } = this.calcDataTexture(\n bufferName,\n buffer.type,\n data,\n );\n\n // TODO: destroy outdated texture\n this.textureCache[bufferName].data = paddingData;\n this.textureCache[bufferName].texture = texture;\n }\n }\n\n public destroy() {\n // regl will destroy all resources\n }\n\n private swap() {\n if (!this.swapOutputTextureName) {\n this.createSwapOutputDataTexture();\n }\n\n if (this.compiledPingpong) {\n const outputTextureUniformName = this.context.output.name;\n this.textureCache[\n outputTextureUniformName\n ].id = this.getOuputDataTexture().id;\n this.textureCache[\n outputTextureUniformName\n ].texture = this.getOuputDataTexture().texture;\n }\n\n const tmp = this.outputTextureName;\n this.outputTextureName = this.swapOutputTextureName;\n this.swapOutputTextureName = tmp;\n\n if (debug) {\n console.log(\n `[${this.entity}]: after swap, output ${this.getOuputDataTexture().id}`,\n );\n }\n }\n\n private getOuputDataTexture() {\n return this.textureCache[this.outputTextureName];\n }\n\n private createSwapOutputDataTexture() {\n const texture = this.cloneDataTexture(this.getOuputDataTexture());\n this.swapOutputTextureName = `${this.entity}-swap`;\n this.textureCache[this.swapOutputTextureName] = texture;\n }\n\n private cloneDataTexture(texture: DataTextureDescriptor) {\n const { data, textureWidth } = texture;\n return {\n ...texture,\n id: textureId++,\n // @ts-ignore\n texture: this.reGl.texture({\n width: textureWidth,\n height: textureWidth,\n data,\n type: 'float',\n }),\n };\n }\n\n private calcDataTexture(\n name: string,\n type: DataType,\n data:\n | number\n | number[]\n | Float32Array\n | Uint8Array\n | Uint16Array\n | Uint32Array\n | Int8Array\n | Int16Array\n | Int32Array,\n ) {\n let elementsPerTexel = 1;\n if (type === AST_TOKEN_TYPES.Vector4FloatArray) {\n elementsPerTexel = 4;\n }\n\n // 用 0 补全不足 vec4 的部分\n const paddingData: number[] = [];\n for (let i = 0; i < (data as number[]).length; i += elementsPerTexel) {\n if (elementsPerTexel === 1) {\n paddingData.push((data as number[])[i], 0, 0, 0);\n } else if (elementsPerTexel === 2) {\n paddingData.push(\n (data as number[])[i],\n (data as number[])[i + 1],\n 0,\n 0,\n );\n } else if (elementsPerTexel === 3) {\n paddingData.push(\n (data as number[])[i],\n (data as number[])[i + 1],\n (data as number[])[i + 2],\n 0,\n );\n } else if (elementsPerTexel === 4) {\n paddingData.push(\n (data as number[])[i],\n (data as number[])[i + 1],\n (data as number[])[i + 2],\n (data as number[])[i + 3],\n );\n }\n }\n\n // 使用纹理存储,例如 Array(8) 使用 3 * 3 纹理,末尾空白使用 0 填充\n const originalDataLength = (data as ArrayLike<number>).length;\n const texelCount = Math.ceil(originalDataLength / elementsPerTexel);\n const width = Math.ceil(Math.sqrt(texelCount));\n const paddingTexelCount = width * width;\n if (texelCount < paddingTexelCount) {\n paddingData.push(\n ...new Array((paddingTexelCount - texelCount) * 4).fill(0),\n );\n }\n\n const texture = this.reGl.texture({\n width,\n height: width,\n data: paddingData,\n type: 'float',\n });\n\n return {\n id: textureId++,\n data: paddingData,\n originalDataLength,\n typedArrayConstructor: isTypedArray(data) ? data!.constructor : undefined,\n textureWidth: width,\n texture,\n texelCount,\n elementsPerTexel,\n isOutput: name === this.context.output.name,\n };\n }\n}\n"],"file":"ReglComputeModel.js"}
\No newline at end of file