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