Skip to content

Commit 9d26487

Browse files
authored
Merge pull request microsoft#191795 from microsoft/tyriar/190195
Workaround slow update webgl issue on Windows
2 parents f72ffc4 + d3c2077 commit 9d26487

File tree

2 files changed

+30
-4
lines changed

2 files changed

+30
-4
lines changed

src/vs/workbench/contrib/terminal/browser/xterm/xtermTerminal.ts

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal, ID
120120
readonly raw: RawXtermTerminal;
121121
private _core: IXtermCore;
122122
private static _suggestedRendererType: 'canvas' | 'dom' | undefined = undefined;
123+
private static _checkedWebglCompatible = false;
123124
private _attached?: { container: HTMLElement; options: IXtermAttachToElementOptions };
124125
private _isPhysicalMouseWheel = MouseWheelClassifier.INSTANCE.isPhysicalMouseWheel();
125126

@@ -677,6 +678,25 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal, ID
677678
if (!this.raw.element || this._webglAddon) {
678679
return;
679680
}
681+
682+
// Check if the the WebGL renderer is compatible with xterm.js:
683+
// - https://github.com/microsoft/vscode/issues/190195
684+
// - https://github.com/xtermjs/xterm.js/issues/4665
685+
// - https://bugs.chromium.org/p/chromium/issues/detail?id=1476475
686+
if (!XtermTerminal._checkedWebglCompatible) {
687+
XtermTerminal._checkedWebglCompatible = true;
688+
const checkCanvas = document.createElement('canvas');
689+
const checkGl = checkCanvas.getContext('webgl2');
690+
const debugInfo = checkGl?.getExtension('WEBGL_debug_renderer_info');
691+
if (checkGl && debugInfo) {
692+
const renderer = checkGl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);
693+
if (renderer.startsWith('ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (Subzero)')) {
694+
this._disableWebglForThisSession();
695+
return;
696+
}
697+
}
698+
}
699+
680700
const Addon = await this._getWebglAddonConstructor();
681701
this._webglAddon = new Addon();
682702
this._disposeOfCanvasRenderer();
@@ -701,12 +721,16 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal, ID
701721
if (!neverMeasureRenderTime && this._configHelper.config.gpuAcceleration !== 'off') {
702722
this._measureRenderTime();
703723
}
704-
XtermTerminal._suggestedRendererType = 'canvas';
705-
this._disposeOfWebglRenderer();
706-
this._enableCanvasRenderer();
724+
this._disableWebglForThisSession();
707725
}
708726
}
709727

728+
private _disableWebglForThisSession() {
729+
XtermTerminal._suggestedRendererType = 'canvas';
730+
this._disposeOfWebglRenderer();
731+
this._enableCanvasRenderer();
732+
}
733+
710734
private async _enableCanvasRenderer(): Promise<void> {
711735
if (!this.raw.element || this._canvasAddon) {
712736
return;

src/vs/workbench/contrib/terminal/test/browser/xterm/xtermTerminal.test.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,9 @@ suite('XtermTerminal', () => {
256256
});
257257

258258
suite('renderers', () => {
259-
test('should re-evaluate gpu acceleration auto when the setting is changed', async () => {
259+
// This is skipped until the webgl renderer bug is fixed in Chromium
260+
// https://bugs.chromium.org/p/chromium/issues/detail?id=1476475
261+
test.skip('should re-evaluate gpu acceleration auto when the setting is changed', async () => {
260262
// Check initial state
261263
strictEqual(TestWebglAddon.isEnabled, false);
262264

0 commit comments

Comments
 (0)