UNPKG

pixi.js

Version:

<p align="center"> <a href="https://pixijs.com" target="_blank" rel="noopener noreferrer"> <img height="150" src="https://files.pixijs.download/branding/pixijs-logo-transparent-dark.svg?v=1" alt="PixiJS logo"> </a> </p> <br/> <p align="center">

1 lines 15.8 kB
{"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 * @category rendering\n * @advanced\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 _boundBufferBases: {[key: number]: GlBuffer} = Object.create(null);\n\n private _renderer: WebGLRenderer;\n\n private _minBaseLocation = 0;\n private _maxBindings: number;\n private _nextBindBaseIndex = this._minBaseLocation;\n private _bindCallId = 0;\n\n /**\n * @param {Renderer} renderer - The renderer this System works for.\n */\n constructor(renderer: WebGLRenderer)\n {\n this._renderer = renderer;\n\n this._renderer.renderableGC.addManagedHash(this, '_gpuBuffers');\n }\n\n /** @ignore */\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._gl = this._renderer.gl;\n\n this._gpuBuffers = Object.create(null);\n this._maxBindings = this._renderer.limits.maxUniformBindings;\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 glBuffer - the buffer to bind\n * @param index - the base index to bind it to.\n */\n public bindBufferBase(glBuffer: GlBuffer, index: number): void\n {\n const { _gl: gl } = this;\n\n if (this._boundBufferBases[index] !== glBuffer)\n {\n this._boundBufferBases[index] = glBuffer;\n glBuffer._lastBindBaseLocation = index;\n\n gl.bindBufferBase(gl.UNIFORM_BUFFER, index, glBuffer.buffer);\n }\n }\n\n public nextBindBase(hasTransformFeedback: boolean)\n {\n this._bindCallId++;\n this._minBaseLocation = 0;\n if (hasTransformFeedback)\n {\n this._boundBufferBases[0] = null;\n this._minBaseLocation = 1;\n if (this._nextBindBaseIndex < 1)\n {\n this._nextBindBaseIndex = 1;\n }\n }\n }\n\n public freeLocationForBufferBase(glBuffer: GlBuffer): number\n {\n let freeIndex = this.getLastBindBaseLocation(glBuffer);\n\n // check if it is already bound..\n if (freeIndex >= this._minBaseLocation)\n {\n glBuffer._lastBindCallId = this._bindCallId;\n\n return freeIndex;\n }\n\n let loop = 0;\n let nextIndex = this._nextBindBaseIndex;\n\n while (loop < 2)\n {\n if (nextIndex >= this._maxBindings)\n {\n nextIndex = this._minBaseLocation;\n loop++;\n }\n\n const curBuf = this._boundBufferBases[nextIndex];\n\n if (curBuf && curBuf._lastBindCallId === this._bindCallId)\n {\n nextIndex++;\n continue;\n }\n break;\n }\n\n freeIndex = nextIndex;\n this._nextBindBaseIndex = nextIndex + 1;\n\n if (loop >= 2)\n {\n // TODO: error\n return -1;\n }\n\n glBuffer._lastBindCallId = this._bindCallId;\n this._boundBufferBases[freeIndex] = null;\n\n return freeIndex;\n }\n\n public getLastBindBaseLocation(glBuffer: GlBuffer): number\n {\n const index = glBuffer._lastBindBaseLocation;\n\n if (this._boundBufferBases[index] === glBuffer)\n {\n return index;\n }\n\n return -1;\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 glBuffer - 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 * @param size - the size to bind at (this is blocks of 256).\n */\n public bindBufferRange(glBuffer: GlBuffer, index?: number, offset?: number, size?: number): void\n {\n const { _gl: gl } = this;\n\n offset ||= 0;\n index ||= 0;\n\n this._boundBufferBases[index] = null;\n\n gl.bindBufferRange(gl.UNIFORM_BUFFER, index || 0, glBuffer.buffer, offset * 256, size || 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 const drawType = (buffer.descriptor.usage & BufferUsage.STATIC) ? gl.STATIC_DRAW : gl.DYNAMIC_DRAW;\n\n if (data)\n {\n if (glBuffer.byteLength >= 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 glBuffer.byteLength = data.byteLength;\n // assuming our buffers are aligned to 4 bits...\n gl.bufferData(glBuffer.type, data, drawType);\n }\n }\n else\n {\n glBuffer.byteLength = buffer.descriptor.size;\n gl.bufferData(glBuffer.type, glBuffer.byteLength, 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 public resetState(): void\n {\n this._boundBufferBases = Object.create(null);\n }\n}\n"],"names":[],"mappings":"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"}