From 7496bd6bf05fa292cbbd7f3de12892409a9b3daa Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Tue, 30 Apr 2024 17:21:28 -0600 Subject: [PATCH 1/2] Delete palette texture before creating a new context --- src/ol/renderer/webgl/TileLayer.js | 23 ++++++++ src/ol/webgl/PaletteTexture.js | 10 ++++ .../cases/cog-palette-add-remove/expected.png | Bin 0 -> 5418 bytes .../cases/cog-palette-add-remove/main.js | 49 ++++++++++++++++++ 4 files changed, 82 insertions(+) create mode 100644 test/rendering/cases/cog-palette-add-remove/expected.png create mode 100644 test/rendering/cases/cog-palette-add-remove/main.js diff --git a/src/ol/renderer/webgl/TileLayer.js b/src/ol/renderer/webgl/TileLayer.js index c0f2c3422f5..4d2fccc33fc 100644 --- a/src/ol/renderer/webgl/TileLayer.js +++ b/src/ol/renderer/webgl/TileLayer.js @@ -129,10 +129,17 @@ class WebGLTileLayerRenderer extends WebGLBaseTileLayerRenderer { */ reset(options) { super.reset(options); + if (this.helper) { + const gl = this.helper.getGL(); + for (const paletteTexture of this.paletteTextures_) { + paletteTexture.delete(gl); + } + } this.vertexShader_ = options.vertexShader; this.fragmentShader_ = options.fragmentShader; this.paletteTextures_ = options.paletteTextures || []; + if (this.helper) { this.program_ = this.helper.getProgram( this.fragmentShader_, @@ -149,6 +156,17 @@ class WebGLTileLayerRenderer extends WebGLBaseTileLayerRenderer { this.helper.flushBufferData(this.indices_); } + removeHelper() { + if (this.helper) { + const gl = this.helper.getGL(); + for (const paletteTexture of this.paletteTextures_) { + paletteTexture.delete(gl); + } + } + + super.removeHelper(); + } + createTileRepresentation(options) { return new TileTexture(options); } @@ -358,6 +376,11 @@ class WebGLTileLayerRenderer extends WebGLBaseTileLayerRenderer { const helper = this.helper; if (helper) { const gl = helper.getGL(); + for (const paletteTexture of this.paletteTextures_) { + paletteTexture.delete(gl); + } + this.paletteTextures_.length = 0; + gl.deleteProgram(this.program_); delete this.program_; helper.deleteBuffer(this.indices_); diff --git a/src/ol/webgl/PaletteTexture.js b/src/ol/webgl/PaletteTexture.js index d38c86f6678..ccf5fbe96ca 100644 --- a/src/ol/webgl/PaletteTexture.js +++ b/src/ol/webgl/PaletteTexture.js @@ -45,6 +45,16 @@ class PaletteTexture { } return this.texture_; } + + /** + * @param {WebGLRenderingContext} gl Rendering context. + */ + delete(gl) { + if (this.texture_) { + gl.deleteTexture(this.texture_); + } + this.texture_ = null; + } } export default PaletteTexture; diff --git a/test/rendering/cases/cog-palette-add-remove/expected.png b/test/rendering/cases/cog-palette-add-remove/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..aac90ad3b714d48118d38f4c24e382e177f78eb6 GIT binary patch literal 5418 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 literal 0 HcmV?d00001 diff --git a/test/rendering/cases/cog-palette-add-remove/main.js b/test/rendering/cases/cog-palette-add-remove/main.js new file mode 100644 index 00000000000..5893f1e2f59 --- /dev/null +++ b/test/rendering/cases/cog-palette-add-remove/main.js @@ -0,0 +1,49 @@ +import GeoTIFF from '../../../../src/ol/source/GeoTIFF.js'; +import Map from '../../../../src/ol/Map.js'; +import TileLayer from '../../../../src/ol/layer/WebGLTile.js'; + +const source = new GeoTIFF({ + sources: [ + { + url: '/data/raster/sentinel-b04.tif', + min: 0, + max: 10000, + }, + { + url: '/data/raster/sentinel-b08.tif', + min: 0, + max: 10000, + }, + ], + transition: 100, +}); + +const nir = ['band', 2]; +const red = ['band', 1]; +const ndvi = ['/', ['-', nir, red], ['+', nir, red]]; + +const layer = new TileLayer({ + source: source, + style: { + color: [ + 'palette', + ['interpolate', ['linear'], ndvi, -0.2, 0, 0.65, 4], + ['#440154', '#3b528b', '#21918c', '#5ec962', '#fde725'], + ], + }, +}); + +const map = new Map({ + layers: [layer], + target: 'map', + view: source.getView(), +}); + +// regression test for https://github.com/openlayers/openlayers/issues/15786 +setTimeout(() => { + map.removeLayer(layer); + map.addLayer(layer); + render({ + message: 'palette still works after adding and removing layer', + }); +}, 500); From 431914b46e9d63cf0e5bba6e0e89c45b596a76f6 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Wed, 1 May 2024 06:17:50 -0600 Subject: [PATCH 2/2] Use rendercomplete event Co-authored-by: Andreas Hocevar --- test/rendering/cases/cog-palette-add-remove/main.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/rendering/cases/cog-palette-add-remove/main.js b/test/rendering/cases/cog-palette-add-remove/main.js index 5893f1e2f59..bed2fffccff 100644 --- a/test/rendering/cases/cog-palette-add-remove/main.js +++ b/test/rendering/cases/cog-palette-add-remove/main.js @@ -40,10 +40,10 @@ const map = new Map({ }); // regression test for https://github.com/openlayers/openlayers/issues/15786 -setTimeout(() => { +map.once('rendercomplete', () => { map.removeLayer(layer); map.addLayer(layer); render({ message: 'palette still works after adding and removing layer', }); -}, 500); +});