Files
nothoughts/node_modules/pixi.js/lib/rendering/renderers/gl/buffer/GlBufferSystem.mjs.map
2025-08-04 18:57:35 +02:00

1 line
11 KiB
Plaintext

{"version":3,"file":"GlBufferSystem.mjs","sources":["../../../../../src/rendering/renderers/gl/buffer/GlBufferSystem.ts"],"sourcesContent":["import { ExtensionType } from '../../../../extensions/Extensions';\nimport { BufferUsage } from '../../shared/buffer/const';\nimport { BUFFER_TYPE } from './const';\nimport { GlBuffer } from './GlBuffer';\n\nimport type { Buffer } from '../../shared/buffer/Buffer';\nimport type { System } from '../../shared/system/System';\nimport type { GlRenderingContext } from '../context/GlRenderingContext';\nimport type { WebGLRenderer } from '../WebGLRenderer';\n\n/**\n * System plugin to the renderer to manage buffers.\n *\n * WebGL uses Buffers as a way to store objects to the GPU.\n * This system makes working with them a lot easier.\n *\n * Buffers are used in three main places in WebGL\n * - geometry information\n * - Uniform information (via uniform buffer objects - a WebGL 2 only feature)\n * - Transform feedback information. (WebGL 2 only feature)\n *\n * This system will handle the binding of buffers to the GPU as well as uploading\n * them. With this system, you never need to work directly with GPU buffers, but instead work with\n * the Buffer class.\n * @class\n * @memberof rendering\n */\nexport class GlBufferSystem implements System\n{\n /** @ignore */\n public static extension = {\n type: [\n ExtensionType.WebGLSystem,\n ],\n name: 'buffer',\n } as const;\n\n private _gl: GlRenderingContext;\n private _gpuBuffers: {[key: number]: GlBuffer} = Object.create(null);\n\n /** Cache keeping track of the base bound buffer bases */\n private readonly _boundBufferBases: {[key: number]: Buffer} = Object.create(null);\n\n private _renderer: WebGLRenderer;\n\n /**\n * @param {Renderer} renderer - The renderer this System works for.\n */\n constructor(renderer: WebGLRenderer)\n {\n this._renderer = renderer;\n }\n\n /**\n * @ignore\n */\n public destroy(): void\n {\n this._renderer = null;\n this._gl = null;\n this._gpuBuffers = null;\n (this._boundBufferBases as null) = null;\n }\n\n /** Sets up the renderer context and necessary buffers. */\n protected contextChange(): void\n {\n this._gpuBuffers = Object.create(null);\n this._gl = this._renderer.gl;\n }\n\n public getGlBuffer(buffer: Buffer): GlBuffer\n {\n return this._gpuBuffers[buffer.uid] || this.createGLBuffer(buffer);\n }\n\n /**\n * This binds specified buffer. On first run, it will create the webGL buffers for the context too\n * @param buffer - the buffer to bind to the renderer\n */\n public bind(buffer: Buffer): void\n {\n const { _gl: gl } = this;\n\n const glBuffer = this.getGlBuffer(buffer);\n\n gl.bindBuffer(glBuffer.type, glBuffer.buffer);\n }\n\n /**\n * Binds an uniform buffer to at the given index.\n *\n * A cache is used so a buffer will not be bound again if already bound.\n * @param buffer - the buffer to bind\n * @param index - the base index to bind it to.\n */\n public bindBufferBase(buffer: Buffer, index: number): void\n {\n const { _gl: gl } = this;\n\n if (this._boundBufferBases[index] !== buffer)\n {\n const glBuffer = this.getGlBuffer(buffer);\n\n this._boundBufferBases[index] = buffer;\n\n gl.bindBufferBase(gl.UNIFORM_BUFFER, index, glBuffer.buffer);\n }\n }\n\n /**\n * Binds a buffer whilst also binding its range.\n * This will make the buffer start from the offset supplied rather than 0 when it is read.\n * @param buffer - the buffer to bind\n * @param index - the base index to bind at, defaults to 0\n * @param offset - the offset to bind at (this is blocks of 256). 0 = 0, 1 = 256, 2 = 512 etc\n */\n public bindBufferRange(buffer: Buffer, index?: number, offset?: number): void\n {\n const { _gl: gl } = this;\n\n offset = offset || 0;\n\n const glBuffer = this.getGlBuffer(buffer);\n\n gl.bindBufferRange(gl.UNIFORM_BUFFER, index || 0, glBuffer.buffer, offset * 256, 256);\n }\n\n /**\n * Will ensure the data in the buffer is uploaded to the GPU.\n * @param {Buffer} buffer - the buffer to update\n */\n public updateBuffer(buffer: Buffer): GlBuffer\n {\n const { _gl: gl } = this;\n\n const glBuffer = this.getGlBuffer(buffer);\n\n if (buffer._updateID === glBuffer.updateID)\n {\n return glBuffer;\n }\n\n glBuffer.updateID = buffer._updateID;\n\n gl.bindBuffer(glBuffer.type, glBuffer.buffer);\n\n const data = buffer.data;\n\n if (glBuffer.byteLength >= buffer.data.byteLength)\n {\n // assuming our buffers are aligned to 4 bits...\n // offset is always zero for now!\n gl.bufferSubData(glBuffer.type, 0, data, 0, buffer._updateSize / data.BYTES_PER_ELEMENT);\n }\n else\n {\n const drawType = (buffer.descriptor.usage & BufferUsage.STATIC) ? gl.STATIC_DRAW : gl.DYNAMIC_DRAW;\n\n glBuffer.byteLength = data.byteLength;\n\n // assuming our buffers are aligned to 4 bits...\n gl.bufferData(glBuffer.type, data, drawType);\n }\n\n return glBuffer;\n }\n\n /** dispose all WebGL resources of all managed buffers */\n public destroyAll(): void\n {\n const gl = this._gl;\n\n for (const id in this._gpuBuffers)\n {\n gl.deleteBuffer(this._gpuBuffers[id].buffer);\n }\n\n this._gpuBuffers = Object.create(null);\n }\n\n /**\n * Disposes buffer\n * @param {Buffer} buffer - buffer with data\n * @param {boolean} [contextLost=false] - If context was lost, we suppress deleteVertexArray\n */\n protected onBufferDestroy(buffer: Buffer, contextLost?: boolean): void\n {\n const glBuffer = this._gpuBuffers[buffer.uid];\n\n const gl = this._gl;\n\n if (!contextLost)\n {\n gl.deleteBuffer(glBuffer.buffer);\n }\n\n this._gpuBuffers[buffer.uid] = null;\n }\n\n /**\n * creates and attaches a GLBuffer object tied to the current context.\n * @param buffer\n * @protected\n */\n protected createGLBuffer(buffer: Buffer): GlBuffer\n {\n const { _gl: gl } = this;\n\n let type = BUFFER_TYPE.ARRAY_BUFFER;\n\n if ((buffer.descriptor.usage & BufferUsage.INDEX))\n {\n type = BUFFER_TYPE.ELEMENT_ARRAY_BUFFER;\n }\n else if ((buffer.descriptor.usage & BufferUsage.UNIFORM))\n {\n type = BUFFER_TYPE.UNIFORM_BUFFER;\n }\n\n const glBuffer = new GlBuffer(gl.createBuffer(), type);\n\n this._gpuBuffers[buffer.uid] = glBuffer;\n\n buffer.on('destroy', this.onBufferDestroy, this);\n\n return glBuffer;\n }\n}\n"],"names":[],"mappings":"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"}