1 | import { ExtensionType, extensions } from '@pixi/extensions';
|
2 | import { GLBuffer } from './GLBuffer.mjs';
|
3 |
|
4 | class 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 | }
|
87 | BufferSystem.extension = {
|
88 | type: ExtensionType.RendererSystem,
|
89 | name: "buffer"
|
90 | };
|
91 | extensions.add(BufferSystem);
|
92 |
|
93 | export { BufferSystem };
|
94 |
|