Skip to content

Commit 6b9018f

Browse files
committed
Workaround slow update webgl issue on Windows
Fixes microsoft#190195
1 parent 4538c81 commit 6b9018f

File tree

1 file changed

+28
-3
lines changed

1 file changed

+28
-3
lines changed

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

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService
4343
import { debounce } from 'vs/base/common/decorators';
4444
import { MouseWheelClassifier } from 'vs/base/browser/ui/scrollbar/scrollableElement';
4545
import { IMouseWheelEvent, StandardWheelEvent } from 'vs/base/browser/mouseEvent';
46+
import { isWindows } from 'vs/base/common/platform';
4647

4748
const enum RenderConstants {
4849
/**
@@ -120,6 +121,7 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal, ID
120121
readonly raw: RawXtermTerminal;
121122
private _core: IXtermCore;
122123
private static _suggestedRendererType: 'canvas' | 'dom' | undefined = undefined;
124+
private static _checkedWebglCompatible = false;
123125
private _attached?: { container: HTMLElement; options: IXtermAttachToElementOptions };
124126
private _isPhysicalMouseWheel = MouseWheelClassifier.INSTANCE.isPhysicalMouseWheel();
125127

@@ -677,6 +679,25 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal, ID
677679
if (!this.raw.element || this._webglAddon) {
678680
return;
679681
}
682+
683+
// Check if the the WebGL renderer is compatible with xterm.js:
684+
// - https://github.com/microsoft/vscode/issues/190195
685+
// - https://github.com/xtermjs/xterm.js/issues/4665
686+
// - https://bugs.chromium.org/p/chromium/issues/detail?id=1476475
687+
if (!XtermTerminal._checkedWebglCompatible && isWindows) {
688+
XtermTerminal._checkedWebglCompatible = true;
689+
const checkCanvas = document.createElement('canvas');
690+
const checkGl = checkCanvas.getContext('webgl2');
691+
const debugInfo = checkGl?.getExtension('WEBGL_debug_renderer_info');
692+
if (checkGl && debugInfo) {
693+
const renderer = checkGl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);
694+
if (renderer.startsWith('ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (Subzero)')) {
695+
this._disableWebglForThisSession();
696+
return;
697+
}
698+
}
699+
}
700+
680701
const Addon = await this._getWebglAddonConstructor();
681702
this._webglAddon = new Addon();
682703
this._disposeOfCanvasRenderer();
@@ -701,12 +722,16 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal, ID
701722
if (!neverMeasureRenderTime && this._configHelper.config.gpuAcceleration !== 'off') {
702723
this._measureRenderTime();
703724
}
704-
XtermTerminal._suggestedRendererType = 'canvas';
705-
this._disposeOfWebglRenderer();
706-
this._enableCanvasRenderer();
725+
this._disableWebglForThisSession();
707726
}
708727
}
709728

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

0 commit comments

Comments
 (0)