From faf5f72c1ff25a21a60eaa07f205a3eedd31a286 Mon Sep 17 00:00:00 2001 From: Jason Lin Date: Mon, 5 Sep 2022 13:17:45 +1000 Subject: [PATCH 1/2] Clear glyph render when the webgl model is cleared --- addons/xterm-addon-webgl/src/GlyphRenderer.ts | 26 +++++++++---------- addons/xterm-addon-webgl/src/WebglRenderer.ts | 24 ++++++++++++----- 2 files changed, 30 insertions(+), 20 deletions(-) diff --git a/addons/xterm-addon-webgl/src/GlyphRenderer.ts b/addons/xterm-addon-webgl/src/GlyphRenderer.ts index 85ef25f6..a7f4a700 100644 --- a/addons/xterm-addon-webgl/src/GlyphRenderer.ts +++ b/addons/xterm-addon-webgl/src/GlyphRenderer.ts @@ -238,21 +238,24 @@ export class GlyphRenderer extends Disposable { // a_cellpos only changes on resize } - public clear(force?: boolean): void { + public clear(): void { const terminal = this._terminal; const newCount = terminal.cols * terminal.rows * INDICES_PER_CELL; - // Don't clear if not forced and the array length is correct - if (!force && this._vertices.count === newCount) { - return; - } - // Clear vertices - this._vertices.count = newCount; - this._vertices.attributes = new Float32Array(newCount); - for (let i = 0; i < this._vertices.attributesBuffers.length; i++) { - this._vertices.attributesBuffers[i] = new Float32Array(newCount); + if (this._vertices.count !== newCount) { + this._vertices.attributes = new Float32Array(newCount); + } else { + this._vertices.attributes.fill(0); } + for (let i = 0; i < this._vertices.attributesBuffers.length; i++) { + if (this._vertices.count !== newCount) { + this._vertices.attributesBuffers[i] = new Float32Array(newCount); + } else { + this._vertices.attributesBuffers[i].fill(0); + } + } + this._vertices.count = newCount; let i = 0; for (let y = 0; y < terminal.rows; y++) { for (let x = 0; x < terminal.cols; x++) { @@ -269,9 +272,6 @@ export class GlyphRenderer extends Disposable { this.clear(); } - public setColors(): void { - } - public render(renderModel: IRenderModel): void { if (!this._atlas) { return; diff --git a/addons/xterm-addon-webgl/src/WebglRenderer.ts b/addons/xterm-addon-webgl/src/WebglRenderer.ts index 3ff0c237..b48ec7eb 100644 --- a/addons/xterm-addon-webgl/src/WebglRenderer.ts +++ b/addons/xterm-addon-webgl/src/WebglRenderer.ts @@ -163,12 +163,11 @@ export class WebglRenderer extends Disposable implements IRenderer { } this._rectangleRenderer.setColors(); - this._glyphRenderer.setColors(); this._refreshCharAtlas(); // Force a full refresh - this._model.clear(); + this._clearModel(true); } public onDevicePixelRatioChange(): void { @@ -209,7 +208,7 @@ export class WebglRenderer extends Disposable implements IRenderer { this._refreshCharAtlas(); // Force a full refresh - this._model.clear(); + this._clearModel(false); } public onCharSizeChanged(): void { @@ -293,16 +292,27 @@ export class WebglRenderer extends Disposable implements IRenderer { this._glyphRenderer.setAtlas(this._charAtlas); } + /** + * Clear the model. + * @param clearGlyphRenderer Whether to also clear the glyph renderer. This + * should be true generally to make sure it is in the same state as the model. + */ + private _clearModel(clearGlyphRenderer: boolean): void { + this._model.clear(); + if (clearGlyphRenderer) { + this._glyphRenderer.clear(); + } + } + public clearCharAtlas(): void { this._charAtlas?.clearTexture(); - this._model.clear(); + this._clearModel(true); this._updateModel(0, this._terminal.rows - 1); this._requestRedrawViewport(); } public clear(): void { - this._model.clear(); - this._glyphRenderer.clear(true); + this._clearModel(true); for (const l of this._renderLayers) { l.reset(this._terminal); } @@ -334,7 +344,7 @@ export class WebglRenderer extends Disposable implements IRenderer { // Tell renderer the frame is beginning if (this._glyphRenderer.beginFrame()) { - this._model.clear(); + this._clearModel(true); this._updateSelectionModel(undefined, undefined); } From e5ad3ce9b98954a990895bf0115ff2aede682fdc Mon Sep 17 00:00:00 2001 From: Jason Lin Date: Mon, 5 Sep 2022 17:32:02 +1000 Subject: [PATCH 2/2] Polish --- addons/xterm-addon-webgl/src/WebglRenderer.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/xterm-addon-webgl/src/WebglRenderer.ts b/addons/xterm-addon-webgl/src/WebglRenderer.ts index b48ec7eb..6420e812 100644 --- a/addons/xterm-addon-webgl/src/WebglRenderer.ts +++ b/addons/xterm-addon-webgl/src/WebglRenderer.ts @@ -207,7 +207,8 @@ export class WebglRenderer extends Disposable implements IRenderer { this._refreshCharAtlas(); - // Force a full refresh + // Force a full refresh. Resizing `_glyphRenderer` should clear it already, + // so there is no need to clear it again here. this._clearModel(false); }