UNPKG

2.99 kBJavaScriptView Raw
1import { ExtensionType, extensions } from '@pixi/extensions';
2import { GLBuffer } from './GLBuffer.mjs';
3
4class BufferSystem {
5 constructor(renderer) {
6 this.renderer = renderer;
7 this.managedBuffers = {};
8 this.boundBufferBases = {};
9 }
10 destroy() {
11 this.renderer = null;
12 }
13 contextChange() {
14 this.disposeAll(true);
15 this.gl = this.renderer.gl;
16 this.CONTEXT_UID = this.renderer.CONTEXT_UID;
17 }
18 bind(buffer) {
19 const { gl, CONTEXT_UID } = this;
20 const glBuffer = buffer._glBuffers[CONTEXT_UID] || this.createGLBuffer(buffer);
21 gl.bindBuffer(buffer.type, glBuffer.buffer);
22 }
23 unbind(type) {
24 const { gl } = this;
25 gl.bindBuffer(type, null);
26 }
27 bindBufferBase(buffer, index) {
28 const { gl, CONTEXT_UID } = this;
29 if (this.boundBufferBases[index] !== buffer) {
30 const glBuffer = buffer._glBuffers[CONTEXT_UID] || this.createGLBuffer(buffer);
31 this.boundBufferBases[index] = buffer;
32 gl.bindBufferBase(gl.UNIFORM_BUFFER, index, glBuffer.buffer);
33 }
34 }
35 bindBufferRange(buffer, index, offset) {
36 const { gl, CONTEXT_UID } = this;
37 offset = offset || 0;
38 const glBuffer = buffer._glBuffers[CONTEXT_UID] || this.createGLBuffer(buffer);
39 gl.bindBufferRange(gl.UNIFORM_BUFFER, index || 0, glBuffer.buffer, offset * 256, 256);
40 }
41 update(buffer) {
42 const { gl, CONTEXT_UID } = this;
43 const glBuffer = buffer._glBuffers[CONTEXT_UID] || this.createGLBuffer(buffer);
44 if (buffer._updateID === glBuffer.updateID) {
45 return;
46 }
47 glBuffer.updateID = buffer._updateID;
48 gl.bindBuffer(buffer.type, glBuffer.buffer);
49 if (glBuffer.byteLength >= buffer.data.byteLength) {
50 gl.bufferSubData(buffer.type, 0, buffer.data);
51 } else {
52 const drawType = buffer.static ? gl.STATIC_DRAW : gl.DYNAMIC_DRAW;
53 glBuffer.byteLength = buffer.data.byteLength;
54 gl.bufferData(buffer.type, buffer.data, drawType);
55 }
56 }
57 dispose(buffer, contextLost) {
58 if (!this.managedBuffers[buffer.id]) {
59 return;
60 }
61 delete this.managedBuffers[buffer.id];
62 const glBuffer = buffer._glBuffers[this.CONTEXT_UID];
63 const gl = this.gl;
64 buffer.disposeRunner.remove(this);
65 if (!glBuffer) {
66 return;
67 }
68 if (!contextLost) {
69 gl.deleteBuffer(glBuffer.buffer);
70 }
71 delete buffer._glBuffers[this.CONTEXT_UID];
72 }
73 disposeAll(contextLost) {
74 const all = Object.keys(this.managedBuffers);
75 for (let i = 0; i < all.length; i++) {
76 this.dispose(this.managedBuffers[all[i]], contextLost);
77 }
78 }
79 createGLBuffer(buffer) {
80 const { CONTEXT_UID, gl } = this;
81 buffer._glBuffers[CONTEXT_UID] = new GLBuffer(gl.createBuffer());
82 this.managedBuffers[buffer.id] = buffer;
83 buffer.disposeRunner.add(this);
84 return buffer._glBuffers[CONTEXT_UID];
85 }
86}
87BufferSystem.extension = {
88 type: ExtensionType.RendererSystem,
89 name: "buffer"
90};
91extensions.add(BufferSystem);
92
93export { BufferSystem };
94//# sourceMappingURL=BufferSystem.mjs.map