UNPKG

@pixi/core

Version:
95 lines (92 loc) 2.99 kB
import { ExtensionType, extensions } from '@pixi/extensions'; import { GLBuffer } from './GLBuffer.mjs'; class BufferSystem { constructor(renderer) { this.renderer = renderer; this.managedBuffers = {}; this.boundBufferBases = {}; } destroy() { this.renderer = null; } contextChange() { this.disposeAll(true); this.gl = this.renderer.gl; this.CONTEXT_UID = this.renderer.CONTEXT_UID; } bind(buffer) { const { gl, CONTEXT_UID } = this; const glBuffer = buffer._glBuffers[CONTEXT_UID] || this.createGLBuffer(buffer); gl.bindBuffer(buffer.type, glBuffer.buffer); } unbind(type) { const { gl } = this; gl.bindBuffer(type, null); } bindBufferBase(buffer, index) { const { gl, CONTEXT_UID } = this; if (this.boundBufferBases[index] !== buffer) { const glBuffer = buffer._glBuffers[CONTEXT_UID] || this.createGLBuffer(buffer); this.boundBufferBases[index] = buffer; gl.bindBufferBase(gl.UNIFORM_BUFFER, index, glBuffer.buffer); } } bindBufferRange(buffer, index, offset) { const { gl, CONTEXT_UID } = this; offset = offset || 0; const glBuffer = buffer._glBuffers[CONTEXT_UID] || this.createGLBuffer(buffer); gl.bindBufferRange(gl.UNIFORM_BUFFER, index || 0, glBuffer.buffer, offset * 256, 256); } update(buffer) { const { gl, CONTEXT_UID } = this; const glBuffer = buffer._glBuffers[CONTEXT_UID] || this.createGLBuffer(buffer); if (buffer._updateID === glBuffer.updateID) { return; } glBuffer.updateID = buffer._updateID; gl.bindBuffer(buffer.type, glBuffer.buffer); if (glBuffer.byteLength >= buffer.data.byteLength) { gl.bufferSubData(buffer.type, 0, buffer.data); } else { const drawType = buffer.static ? gl.STATIC_DRAW : gl.DYNAMIC_DRAW; glBuffer.byteLength = buffer.data.byteLength; gl.bufferData(buffer.type, buffer.data, drawType); } } dispose(buffer, contextLost) { if (!this.managedBuffers[buffer.id]) { return; } delete this.managedBuffers[buffer.id]; const glBuffer = buffer._glBuffers[this.CONTEXT_UID]; const gl = this.gl; buffer.disposeRunner.remove(this); if (!glBuffer) { return; } if (!contextLost) { gl.deleteBuffer(glBuffer.buffer); } delete buffer._glBuffers[this.CONTEXT_UID]; } disposeAll(contextLost) { const all = Object.keys(this.managedBuffers); for (let i = 0; i < all.length; i++) { this.dispose(this.managedBuffers[all[i]], contextLost); } } createGLBuffer(buffer) { const { CONTEXT_UID, gl } = this; buffer._glBuffers[CONTEXT_UID] = new GLBuffer(gl.createBuffer()); this.managedBuffers[buffer.id] = buffer; buffer.disposeRunner.add(this); return buffer._glBuffers[CONTEXT_UID]; } } BufferSystem.extension = { type: ExtensionType.RendererSystem, name: "buffer" }; extensions.add(BufferSystem); export { BufferSystem }; //# sourceMappingURL=BufferSystem.mjs.map