in modules/aggregation-layers/src/utils/gpu-grid-aggregation/gpu-grid-aggregator.js [475:545]
_setupFramebuffers(opts) {
const {
textures,
framebuffers,
maxMinFramebuffers,
minFramebuffers,
maxFramebuffers,
meanTextures,
equations
} = this.state;
const {weights} = opts;
const {numCol, numRow} = opts;
const framebufferSize = {width: numCol, height: numRow};
for (const id in weights) {
const {needMin, needMax, combineMaxMin, operation} = weights[id];
textures[id] =
weights[id].aggregationTexture ||
textures[id] ||
getFloatTexture(this.gl, {id: `${id}-texture`, width: numCol, height: numRow});
textures[id].resize(framebufferSize);
let texture = textures[id];
if (operation === AGGREGATION_OPERATION.MEAN) {
// For MEAN, we first aggregatet into a temp texture
meanTextures[id] =
meanTextures[id] ||
getFloatTexture(this.gl, {id: `${id}-mean-texture`, width: numCol, height: numRow});
meanTextures[id].resize(framebufferSize);
texture = meanTextures[id];
}
if (framebuffers[id]) {
framebuffers[id].attach({[GL.COLOR_ATTACHMENT0]: texture});
} else {
framebuffers[id] = getFramebuffer(this.gl, {
id: `${id}-fb`,
width: numCol,
height: numRow,
texture
});
}
framebuffers[id].resize(framebufferSize);
equations[id] = EQUATION_MAP[operation] || EQUATION_MAP.SUM;
// For min/max framebuffers will use default size 1X1
if (needMin || needMax) {
if (needMin && needMax && combineMaxMin) {
if (!maxMinFramebuffers[id]) {
texture = weights[id].maxMinTexture || this._getMinMaxTexture(`${id}-maxMinTexture`);
maxMinFramebuffers[id] = getFramebuffer(this.gl, {id: `${id}-maxMinFb`, texture});
}
} else {
if (needMin) {
if (!minFramebuffers[id]) {
texture = weights[id].minTexture || this._getMinMaxTexture(`${id}-minTexture`);
minFramebuffers[id] = getFramebuffer(this.gl, {
id: `${id}-minFb`,
texture
});
}
}
if (needMax) {
if (!maxFramebuffers[id]) {
texture = weights[id].maxTexture || this._getMinMaxTexture(`${id}-maxTexture`);
maxFramebuffers[id] = getFramebuffer(this.gl, {
id: `${id}-maxFb`,
texture
});
}
}
}
}
}
}