@@ -120,6 +120,7 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal, ID
120
120
readonly raw : RawXtermTerminal ;
121
121
private _core : IXtermCore ;
122
122
private static _suggestedRendererType : 'canvas' | 'dom' | undefined = undefined ;
123
+ private static _checkedWebglCompatible = false ;
123
124
private _attached ?: { container : HTMLElement ; options : IXtermAttachToElementOptions } ;
124
125
private _isPhysicalMouseWheel = MouseWheelClassifier . INSTANCE . isPhysicalMouseWheel ( ) ;
125
126
@@ -677,6 +678,25 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal, ID
677
678
if ( ! this . raw . element || this . _webglAddon ) {
678
679
return ;
679
680
}
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
+
680
700
const Addon = await this . _getWebglAddonConstructor ( ) ;
681
701
this . _webglAddon = new Addon ( ) ;
682
702
this . _disposeOfCanvasRenderer ( ) ;
@@ -701,12 +721,16 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal, ID
701
721
if ( ! neverMeasureRenderTime && this . _configHelper . config . gpuAcceleration !== 'off' ) {
702
722
this . _measureRenderTime ( ) ;
703
723
}
704
- XtermTerminal . _suggestedRendererType = 'canvas' ;
705
- this . _disposeOfWebglRenderer ( ) ;
706
- this . _enableCanvasRenderer ( ) ;
724
+ this . _disableWebglForThisSession ( ) ;
707
725
}
708
726
}
709
727
728
+ private _disableWebglForThisSession ( ) {
729
+ XtermTerminal . _suggestedRendererType = 'canvas' ;
730
+ this . _disposeOfWebglRenderer ( ) ;
731
+ this . _enableCanvasRenderer ( ) ;
732
+ }
733
+
710
734
private async _enableCanvasRenderer ( ) : Promise < void > {
711
735
if ( ! this . raw . element || this . _canvasAddon ) {
712
736
return ;
0 commit comments