@@ -43,6 +43,7 @@ import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService
43
43
import { debounce } from 'vs/base/common/decorators' ;
44
44
import { MouseWheelClassifier } from 'vs/base/browser/ui/scrollbar/scrollableElement' ;
45
45
import { IMouseWheelEvent , StandardWheelEvent } from 'vs/base/browser/mouseEvent' ;
46
+ import { isWindows } from 'vs/base/common/platform' ;
46
47
47
48
const enum RenderConstants {
48
49
/**
@@ -120,6 +121,7 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal, ID
120
121
readonly raw : RawXtermTerminal ;
121
122
private _core : IXtermCore ;
122
123
private static _suggestedRendererType : 'canvas' | 'dom' | undefined = undefined ;
124
+ private static _checkedWebglCompatible = false ;
123
125
private _attached ?: { container : HTMLElement ; options : IXtermAttachToElementOptions } ;
124
126
private _isPhysicalMouseWheel = MouseWheelClassifier . INSTANCE . isPhysicalMouseWheel ( ) ;
125
127
@@ -677,6 +679,25 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal, ID
677
679
if ( ! this . raw . element || this . _webglAddon ) {
678
680
return ;
679
681
}
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
+
680
701
const Addon = await this . _getWebglAddonConstructor ( ) ;
681
702
this . _webglAddon = new Addon ( ) ;
682
703
this . _disposeOfCanvasRenderer ( ) ;
@@ -701,12 +722,16 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal, ID
701
722
if ( ! neverMeasureRenderTime && this . _configHelper . config . gpuAcceleration !== 'off' ) {
702
723
this . _measureRenderTime ( ) ;
703
724
}
704
- XtermTerminal . _suggestedRendererType = 'canvas' ;
705
- this . _disposeOfWebglRenderer ( ) ;
706
- this . _enableCanvasRenderer ( ) ;
725
+ this . _disableWebglForThisSession ( ) ;
707
726
}
708
727
}
709
728
729
+ private _disableWebglForThisSession ( ) {
730
+ XtermTerminal . _suggestedRendererType = 'canvas' ;
731
+ this . _disposeOfWebglRenderer ( ) ;
732
+ this . _enableCanvasRenderer ( ) ;
733
+ }
734
+
710
735
private async _enableCanvasRenderer ( ) : Promise < void > {
711
736
if ( ! this . raw . element || this . _canvasAddon ) {
712
737
return ;
0 commit comments