68 lines
3.8 KiB
JavaScript
68 lines
3.8 KiB
JavaScript
shadow$provide.module$node_modules$pixi_DOT_js$lib$rendering$renderers$gl$shader$GlShaderSystem = function(global, require, module, exports) {
|
|
global = require("module$node_modules$pixi_DOT_js$lib$extensions$Extensions");
|
|
var GenerateShaderSyncCode = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$gl$shader$GenerateShaderSyncCode"), generateProgram = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$gl$shader$program$generateProgram");
|
|
"use strict";
|
|
const defaultSyncData = {textureCount:0, blockIndex:0};
|
|
class GlShaderSystem {
|
|
constructor(renderer) {
|
|
this._activeProgram = null;
|
|
this._programDataHash = Object.create(null);
|
|
this._shaderSyncFunctions = Object.create(null);
|
|
this._renderer = renderer;
|
|
}
|
|
contextChange(gl) {
|
|
this._gl = gl;
|
|
this._programDataHash = Object.create(null);
|
|
this._shaderSyncFunctions = Object.create(null);
|
|
this._activeProgram = null;
|
|
}
|
|
bind(shader, skipSync) {
|
|
this._setProgram(shader.glProgram);
|
|
skipSync || (defaultSyncData.textureCount = 0, defaultSyncData.blockIndex = 0, (skipSync = this._shaderSyncFunctions[shader.glProgram._key]) || (skipSync = this._shaderSyncFunctions[shader.glProgram._key] = this._generateShaderSync(shader, this)), this._renderer.buffer.nextBindBase(!!shader.glProgram.transformFeedbackVaryings), skipSync(this._renderer, shader, defaultSyncData));
|
|
}
|
|
updateUniformGroup(uniformGroup) {
|
|
this._renderer.uniformGroup.updateUniformGroup(uniformGroup, this._activeProgram, defaultSyncData);
|
|
}
|
|
bindUniformBlock(uniformGroup, name, index = 0) {
|
|
const bufferSystem = this._renderer.buffer, programData = this._getProgramData(this._activeProgram), isBufferResource = uniformGroup._bufferResource;
|
|
isBufferResource || this._renderer.ubo.updateUniformGroup(uniformGroup);
|
|
const buffer = uniformGroup.buffer, glBuffer = bufferSystem.updateBuffer(buffer), boundLocation = bufferSystem.freeLocationForBufferBase(glBuffer);
|
|
if (isBufferResource) {
|
|
const {offset, size} = uniformGroup;
|
|
0 === offset && size === buffer.data.byteLength ? bufferSystem.bindBufferBase(glBuffer, boundLocation) : bufferSystem.bindBufferRange(glBuffer, boundLocation, offset);
|
|
} else {
|
|
bufferSystem.getLastBindBaseLocation(glBuffer) !== boundLocation && bufferSystem.bindBufferBase(glBuffer, boundLocation);
|
|
}
|
|
uniformGroup = this._activeProgram._uniformBlockData[name].index;
|
|
programData.uniformBlockBindings[index] !== boundLocation && (programData.uniformBlockBindings[index] = boundLocation, this._renderer.gl.uniformBlockBinding(programData.program, uniformGroup, boundLocation));
|
|
}
|
|
_setProgram(program) {
|
|
this._activeProgram !== program && (this._activeProgram = program, program = this._getProgramData(program), this._gl.useProgram(program.program));
|
|
}
|
|
_getProgramData(program) {
|
|
return this._programDataHash[program._key] || this._createProgramData(program);
|
|
}
|
|
_createProgramData(program) {
|
|
const key = program._key;
|
|
this._programDataHash[key] = generateProgram.generateProgram(this._gl, program);
|
|
return this._programDataHash[key];
|
|
}
|
|
destroy() {
|
|
for (const key of Object.keys(this._programDataHash)) {
|
|
this._programDataHash[key].destroy();
|
|
}
|
|
this._gl = this._renderer = this._activeProgram = this._shaderSyncFunctions = this._programDataHash = null;
|
|
}
|
|
_generateShaderSync(shader, shaderSystem) {
|
|
return GenerateShaderSyncCode.generateShaderSyncCode(shader, shaderSystem);
|
|
}
|
|
resetState() {
|
|
this._activeProgram = null;
|
|
}
|
|
}
|
|
GlShaderSystem.extension = {type:[global.ExtensionType.WebGLSystem], name:"shader"};
|
|
exports.GlShaderSystem = GlShaderSystem;
|
|
};
|
|
|
|
//# sourceMappingURL=module$node_modules$pixi_DOT_js$lib$rendering$renderers$gl$shader$GlShaderSystem.js.map
|