@pixi/core
Version:
Core PixiJS
95 lines (92 loc) • 2.99 kB
JavaScript
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