UNPKG

22.2 kBSource Map (JSON)View Raw
1{"version":3,"file":"ReglComputeModel.js","names":["textureId","debug","ReglComputeModel","reGl","context","entity","createEntity","texFBO","computeCommand","textureCache","outputTextureName","swapOutputTextureName","compiledPingpong","dynamicPingpong","uniforms","forEach","uniform","name","type","data","isReferer","storageClass","STORAGE_CLASS","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","AST_TOKEN_TYPES","Vector4FloatArray","Math","ceil","sqrt","paddingTexelCount","fill","constructor"],"sources":["../../src/webgl/ReglComputeModel.ts"],"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 // @ts-ignore\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"],"mappings":"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"}
\No newline at end of file