File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -126,9 +126,11 @@ vgl.renderWindow = function (canvas) {
126126 * Create the window.
127127 *
128128 * @param {vgl.renderState } renderState
129+ * @param {boolean } forceContextChanged
130+ * If true, force a context change even if the context is the same as the old context.
129131 * @returns {boolean }
130132 */
131- this . _setup = function ( renderState ) {
133+ this . _setup = function ( renderState , forceContextChanged ) {
132134 var oldContext = m_context ;
133135 m_context = null ;
134136
@@ -138,6 +140,9 @@ vgl.renderWindow = function (canvas) {
138140 m_context = m_canvas . getContext ( 'webgl' ) ||
139141 m_canvas . getContext ( 'experimental-webgl' ) ;
140142 var didContextChange = ! ! oldContext && oldContext !== m_context ;
143+ if ( forceContextChanged ) {
144+ didContextChange = true ;
145+ }
141146
142147 // Set width and height of renderers if not set already
143148 var i ;
Original file line number Diff line number Diff line change @@ -34,6 +34,7 @@ var webglRenderer = function (arg) {
3434 m_contextRenderer = null ,
3535 m_viewer = null ,
3636 m_lastZoom ,
37+ m_contextLost = false ,
3738 m_updateCamera = false ,
3839 s_init = this . _init ,
3940 s_exit = this . _exit ;
@@ -92,13 +93,19 @@ var webglRenderer = function (arg) {
9293 m_viewer . init ( ) ;
9394 m_contextRenderer = m_viewer . renderWindow ( ) . activeRenderer ( ) ;
9495 m_contextRenderer . setResetScene ( false ) ;
95- canvas . get ( 0 ) . addEventListener ( 'webglcontextlost' , ( evt ) => evt . preventDefault ( ) , false ) ;
96+ canvas . get ( 0 ) . addEventListener ( 'webglcontextlost' , function ( evt ) {
97+ m_contextLost = true ;
98+ evt . preventDefault ( ) ;
99+ } , false ) ;
96100 canvas . get ( 0 ) . addEventListener ( 'webglcontextrestored' , function ( ) {
97101 if ( ! m_viewer ) {
98102 return ;
99103 }
104+ m_contextLost = false ;
100105 // Reinitialize GL objects, then force a camera sync before redraw.
101- m_viewer . renderWindow ( ) . _setup ( ) ;
106+ // While the context is lost and restored it could be the same context,
107+ // so we need to force a context change for gpu resources to be re-created.
108+ m_viewer . renderWindow ( ) . _setup ( undefined , true ) ;
102109 m_updateCamera = true ;
103110 m_this . _render ( ) ;
104111 } , false ) ;
@@ -162,6 +169,9 @@ var webglRenderer = function (arg) {
162169 */
163170 this . _renderFrame = function ( ) {
164171 if ( m_viewer ) {
172+ if ( m_contextLost ) {
173+ return ;
174+ }
165175 if ( m_updateCamera ) {
166176 m_updateCamera = false ;
167177 m_this . _updateRendererCamera ( ) ;
You can’t perform that action at this time.
0 commit comments