molstar
Version:
A comprehensive macromolecular library.
121 lines • 6.04 kB
JavaScript
/**
* Copyright (c) 2020-2021 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Alexander Rose <alexander.rose@weirdbyte.de>
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.createResources = void 0;
var tslib_1 = require("tslib");
var program_1 = require("./program");
var shader_1 = require("./shader");
var framebuffer_1 = require("./framebuffer");
var buffer_1 = require("./buffer");
var reference_cache_1 = require("../../mol-util/reference-cache");
var util_1 = require("../../mol-data/util");
var renderbuffer_1 = require("./renderbuffer");
var texture_1 = require("./texture");
var vertex_array_1 = require("./vertex-array");
function defineValueHash(v) {
return typeof v === 'boolean' ? (v ? 1 : 0) :
typeof v === 'number' ? (v * 10000) : (0, util_1.hashString)(v);
}
function wrapCached(resourceItem) {
var wrapped = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, resourceItem.value), { destroy: function () {
resourceItem.free();
} });
return wrapped;
}
function createResources(gl, state, stats, extensions) {
var sets = {
attribute: new Set(),
elements: new Set(),
framebuffer: new Set(),
program: new Set(),
renderbuffer: new Set(),
shader: new Set(),
texture: new Set(),
vertexArray: new Set(),
};
function wrap(name, resource) {
sets[name].add(resource);
stats.resourceCounts[name] += 1;
return (0, tslib_1.__assign)((0, tslib_1.__assign)({}, resource), { destroy: function () {
resource.destroy();
sets[name].delete(resource);
stats.resourceCounts[name] -= 1;
} });
}
var shaderCache = (0, reference_cache_1.createReferenceCache)(function (props) { return JSON.stringify(props); }, function (props) { return wrap('shader', (0, shader_1.createShader)(gl, props)); }, function (shader) { shader.destroy(); });
function getShader(type, source) {
return wrapCached(shaderCache.get({ type: type, source: source }));
}
var programCache = (0, reference_cache_1.createReferenceCache)(function (props) {
var array = [props.shaderCode.id];
Object.keys(props.defineValues).forEach(function (k) { return array.push((0, util_1.hashString)(k), defineValueHash(props.defineValues[k].ref.value)); });
return (0, util_1.hashFnv32a)(array).toString();
}, function (props) { return wrap('program', (0, program_1.createProgram)(gl, state, extensions, getShader, props)); }, function (program) { program.destroy(); });
return {
attribute: function (array, itemSize, divisor, usageHint) {
return wrap('attribute', (0, buffer_1.createAttributeBuffer)(gl, extensions, array, itemSize, divisor, usageHint));
},
elements: function (array, usageHint) {
return wrap('elements', (0, buffer_1.createElementsBuffer)(gl, array, usageHint));
},
framebuffer: function () {
return wrap('framebuffer', (0, framebuffer_1.createFramebuffer)(gl));
},
program: function (defineValues, shaderCode, schema) {
return wrapCached(programCache.get({ defineValues: defineValues, shaderCode: shaderCode, schema: schema }));
},
renderbuffer: function (format, attachment, width, height) {
return wrap('renderbuffer', (0, renderbuffer_1.createRenderbuffer)(gl, format, attachment, width, height));
},
shader: getShader,
texture: function (kind, format, type, filter) {
return wrap('texture', (0, texture_1.createTexture)(gl, extensions, kind, format, type, filter));
},
vertexArray: function (program, attributeBuffers, elementsBuffer) {
return wrap('vertexArray', (0, vertex_array_1.createVertexArray)(extensions, program, attributeBuffers, elementsBuffer));
},
getByteCounts: function () {
var texture = 0;
sets.texture.forEach(function (r) {
texture += r.getByteCount();
});
var attribute = 0;
sets.attribute.forEach(function (r) {
attribute += r.length * 4;
});
var elements = 0;
sets.elements.forEach(function (r) {
elements += r.length * 4;
});
return { texture: texture, attribute: attribute, elements: elements };
},
reset: function () {
sets.attribute.forEach(function (r) { return r.reset(); });
sets.elements.forEach(function (r) { return r.reset(); });
sets.framebuffer.forEach(function (r) { return r.reset(); });
sets.renderbuffer.forEach(function (r) { return r.reset(); });
sets.shader.forEach(function (r) { return r.reset(); });
sets.program.forEach(function (r) { return r.reset(); });
sets.vertexArray.forEach(function (r) { return r.reset(); });
sets.texture.forEach(function (r) { return r.reset(); });
},
destroy: function () {
sets.attribute.forEach(function (r) { return r.destroy(); });
sets.elements.forEach(function (r) { return r.destroy(); });
sets.framebuffer.forEach(function (r) { return r.destroy(); });
sets.renderbuffer.forEach(function (r) { return r.destroy(); });
sets.shader.forEach(function (r) { return r.destroy(); });
sets.program.forEach(function (r) { return r.destroy(); });
sets.vertexArray.forEach(function (r) { return r.destroy(); });
sets.texture.forEach(function (r) { return r.destroy(); });
shaderCache.clear();
programCache.clear();
}
};
}
exports.createResources = createResources;
//# sourceMappingURL=resources.js.map
;