108 lines
5.1 KiB
JavaScript
108 lines
5.1 KiB
JavaScript
shadow$provide.module$node_modules$pixi_DOT_js$lib$rendering$renderers$gl$buffer$GlBufferSystem = function(global, require, module, exports) {
|
|
global = require("module$node_modules$pixi_DOT_js$lib$extensions$Extensions");
|
|
var GCManagedHash = require("module$node_modules$pixi_DOT_js$lib$utils$data$GCManagedHash"), _const = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$shared$buffer$const"), _const$1 = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$gl$buffer$const"), GlBuffer = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$gl$buffer$GlBuffer");
|
|
"use strict";
|
|
class GlBufferSystem {
|
|
constructor(renderer) {
|
|
this._boundBufferBases = Object.create(null);
|
|
this._bindCallId = this._nextBindBaseIndex = this._minBaseLocation = 0;
|
|
this._renderer = renderer;
|
|
this._managedBuffers = new GCManagedHash.GCManagedHash({renderer, type:"resource", onUnload:this.onBufferUnload.bind(this), name:"glBuffer"});
|
|
}
|
|
destroy() {
|
|
this._managedBuffers.destroy();
|
|
this._gl = this._renderer = null;
|
|
this._boundBufferBases = {};
|
|
}
|
|
contextChange() {
|
|
this._gl = this._renderer.gl;
|
|
this.destroyAll(!0);
|
|
this._maxBindings = this._renderer.limits.maxUniformBindings;
|
|
}
|
|
getGlBuffer(buffer) {
|
|
buffer._gcLastUsed = this._renderer.gc.now;
|
|
return buffer._gpuData[this._renderer.uid] || this.createGLBuffer(buffer);
|
|
}
|
|
bind(buffer) {
|
|
const {_gl:gl} = this;
|
|
buffer = this.getGlBuffer(buffer);
|
|
gl.bindBuffer(buffer.type, buffer.buffer);
|
|
}
|
|
bindBufferBase(glBuffer, index) {
|
|
const {_gl:gl} = this;
|
|
this._boundBufferBases[index] !== glBuffer && (this._boundBufferBases[index] = glBuffer, glBuffer._lastBindBaseLocation = index, gl.bindBufferBase(gl.UNIFORM_BUFFER, index, glBuffer.buffer));
|
|
}
|
|
nextBindBase(hasTransformFeedback) {
|
|
this._bindCallId++;
|
|
this._minBaseLocation = 0;
|
|
hasTransformFeedback && (this._boundBufferBases[0] = null, this._minBaseLocation = 1, 1 > this._nextBindBaseIndex && (this._nextBindBaseIndex = 1));
|
|
}
|
|
freeLocationForBufferBase(glBuffer) {
|
|
var freeIndex = this.getLastBindBaseLocation(glBuffer);
|
|
if (freeIndex >= this._minBaseLocation) {
|
|
return glBuffer._lastBindCallId = this._bindCallId, freeIndex;
|
|
}
|
|
let loop = 0, nextIndex = this._nextBindBaseIndex;
|
|
for (; 2 > loop;) {
|
|
if (nextIndex >= this._maxBindings && (nextIndex = this._minBaseLocation, loop++), (freeIndex = this._boundBufferBases[nextIndex]) && freeIndex._lastBindCallId === this._bindCallId) {
|
|
nextIndex++;
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
freeIndex = nextIndex;
|
|
this._nextBindBaseIndex = nextIndex + 1;
|
|
if (2 <= loop) {
|
|
return -1;
|
|
}
|
|
glBuffer._lastBindCallId = this._bindCallId;
|
|
this._boundBufferBases[freeIndex] = null;
|
|
return freeIndex;
|
|
}
|
|
getLastBindBaseLocation(glBuffer) {
|
|
const index = glBuffer._lastBindBaseLocation;
|
|
return this._boundBufferBases[index] === glBuffer ? index : -1;
|
|
}
|
|
bindBufferRange(glBuffer, index, offset, size) {
|
|
const {_gl:gl} = this;
|
|
offset || (offset = 0);
|
|
index || (index = 0);
|
|
this._boundBufferBases[index] = null;
|
|
gl.bindBufferRange(gl.UNIFORM_BUFFER, index || 0, glBuffer.buffer, 256 * offset, size || 256);
|
|
}
|
|
updateBuffer(buffer) {
|
|
const {_gl:gl} = this, glBuffer = this.getGlBuffer(buffer);
|
|
if (buffer._updateID === glBuffer.updateID) {
|
|
return glBuffer;
|
|
}
|
|
glBuffer.updateID = buffer._updateID;
|
|
gl.bindBuffer(glBuffer.type, glBuffer.buffer);
|
|
const data = buffer.data, drawType = buffer.descriptor.usage & _const.BufferUsage.STATIC ? gl.STATIC_DRAW : gl.DYNAMIC_DRAW;
|
|
data ? glBuffer.byteLength >= data.byteLength ? gl.bufferSubData(glBuffer.type, 0, data, 0, buffer._updateSize / data.BYTES_PER_ELEMENT) : (glBuffer.byteLength = data.byteLength, gl.bufferData(glBuffer.type, data, drawType)) : (glBuffer.byteLength = buffer.descriptor.size, gl.bufferData(glBuffer.type, glBuffer.byteLength, drawType));
|
|
return glBuffer;
|
|
}
|
|
destroyAll(contextLost = !1) {
|
|
this._managedBuffers.removeAll(contextLost);
|
|
}
|
|
onBufferUnload(buffer, contextLost = !1) {
|
|
(buffer = buffer._gpuData[this._renderer.uid]) && (contextLost || this._gl.deleteBuffer(buffer.buffer));
|
|
}
|
|
createGLBuffer(buffer) {
|
|
var {_gl:gl} = this;
|
|
let type = _const$1.BUFFER_TYPE.ARRAY_BUFFER;
|
|
buffer.descriptor.usage & _const.BufferUsage.INDEX ? type = _const$1.BUFFER_TYPE.ELEMENT_ARRAY_BUFFER : buffer.descriptor.usage & _const.BufferUsage.UNIFORM && (type = _const$1.BUFFER_TYPE.UNIFORM_BUFFER);
|
|
gl = new GlBuffer.GlBuffer(gl.createBuffer(), type);
|
|
buffer._gpuData[this._renderer.uid] = gl;
|
|
this._managedBuffers.add(buffer);
|
|
return gl;
|
|
}
|
|
resetState() {
|
|
this._boundBufferBases = Object.create(null);
|
|
}
|
|
}
|
|
GlBufferSystem.extension = {type:[global.ExtensionType.WebGLSystem], name:"buffer"};
|
|
exports.GlBufferSystem = GlBufferSystem;
|
|
};
|
|
|
|
//# sourceMappingURL=module$node_modules$pixi_DOT_js$lib$rendering$renderers$gl$buffer$GlBufferSystem.js.map
|