@luma.gl/engine
Version:
3D Engine Components for luma.gl
54 lines • 1.93 kB
JavaScript
// luma.gl
// SPDX-License-Identifier: MIT
// Copyright (c) vis.gl contributors
import { Shader } from '@luma.gl/core';
/** Manages a cached pool of Shaders for reuse. */
export class ShaderFactory {
static defaultProps = { ...Shader.defaultProps };
/** Returns the default ShaderFactory for the given {@link Device}, creating one if necessary. */
static getDefaultShaderFactory(device) {
device._lumaData.defaultShaderFactory ||= new ShaderFactory(device);
return device._lumaData.defaultShaderFactory;
}
device;
destroyPolicy;
_cache = {};
/** @internal */
constructor(device) {
this.device = device;
this.destroyPolicy = device.props._factoryDestroyPolicy;
}
/** Requests a {@link Shader} from the cache, creating a new Shader only if necessary. */
createShader(props) {
const key = this._hashShader(props);
let cacheEntry = this._cache[key];
if (!cacheEntry) {
const shader = this.device.createShader({
...props,
id: props.id ? `${props.id}-cached` : undefined
});
this._cache[key] = cacheEntry = { shader, useCount: 0 };
}
cacheEntry.useCount++;
return cacheEntry.shader;
}
/** Releases a previously-requested {@link Shader}, destroying it if no users remain. */
release(shader) {
const key = this._hashShader(shader);
const cacheEntry = this._cache[key];
if (cacheEntry) {
cacheEntry.useCount--;
if (cacheEntry.useCount === 0) {
if (this.destroyPolicy === 'unused') {
delete this._cache[key];
cacheEntry.shader.destroy();
}
}
}
}
// PRIVATE
_hashShader(value) {
return `${value.stage}:${value.source}`;
}
}
//# sourceMappingURL=shader-factory.js.map