Skip to content

Commit a301b84

Browse files
committed
fix(webgl): webgl force context reload
1 parent 626c8d4 commit a301b84

2 files changed

Lines changed: 18 additions & 3 deletions

File tree

src/vgl/renderWindow.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff 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;

src/webgl/webglRenderer.js

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff 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();

0 commit comments

Comments
 (0)