async function gpuProcessTile(tile, rect) {
const textureDimensions = [ tile.naturalWidth ?? tile.width, tile.naturalHeight ?? tile.height ];
const tileTexture = regl.texture({ data: tile });
const buffers = {
color: regl.framebuffer({ depthStencil: false, shape: textureDimensions }),
neighbors: regl.framebuffer({ depthStencil: false, shape: textureDimensions }),
coords: regl.framebuffer({ depthStencil: false, shape: textureDimensions }),
};
[ regl.canvas.width, regl.canvas.height ] = textureDimensions
await pauseIfNeeded();
const detail = {
mp: textureDimensions[0] * textureDimensions[1] / (1024 * 1024),
ts: sampleTileSize
};
async function getPixelIO(extendAtEdges) {
const crop = Object.assign({}, rect.crop);
if (extendAtEdges) {
if (rect.mapEdges.e) crop.width += 1;
if (rect.mapEdges.s) crop.height += 1;
}
const now = performance.now();
const ctx = (new OffscreenCanvas(crop.width, crop.height)).getContext("2d");
const pixelIO = PixelIO.fromImageSource(regl.canvas);
debugger;
perfMeasures.push(performance.measure("gpuProcessTile v2", { start: now, detail }));
pixelIO.crop(crop);
await pauseIfNeeded();
return pixelIO;
}
try {
const result = {
offset: [rect.x, rect.y],
mapEdges: rect.mapEdges
}
replaceColorCommand({
uSampler: tileTexture,
textureDimensions,
target: buffers.color
});
renderToCanvasCommand({
uSampler: tileTexture,
textureDimensions
});
return;
result.colorIO = await getPixelIO(false);
findNeighborsCommand({
uSampler: buffers.color,
textureDimensions,
target: buffers.neighbors
});
result.neighborsIO = await getPixelIO(false);
classifyCoordsCommand({
uSampler: buffers.color,
textureDimensions,
target: buffers.coords
});
result.coordsIO = await getPixelIO(true);
return result;
}
finally {
[tileTexture, ...Object.values(buffers)].forEach(o => o.destroy());
}
}