Skip to content

Commit 6c3f71b

Browse files
authored
fix(UI): Only create VR canvas when necessary (#8580)
1 parent 549385b commit 6c3f71b

File tree

2 files changed

+24
-17
lines changed

2 files changed

+24
-17
lines changed

ui/ui.js

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -584,7 +584,7 @@ shaka.ui.Overlay = class {
584584
* @param {!Element} container
585585
* @param {!Element} video
586586
* @param {!Element} lcevcCanvas
587-
* @param {!Element} vrCanvas
587+
* @param {?Element} vrCanvas
588588
* @private
589589
*/
590590
static async setupUIandAutoLoad_(container, video, lcevcCanvas, vrCanvas) {
@@ -593,7 +593,7 @@ shaka.ui.Overlay = class {
593593
const ui = new shaka.ui.Overlay(player,
594594
shaka.util.Dom.asHTMLElement(container),
595595
shaka.util.Dom.asHTMLMediaElement(video),
596-
shaka.util.Dom.asHTMLCanvasElement(vrCanvas));
596+
vrCanvas ? shaka.util.Dom.asHTMLCanvasElement(vrCanvas) : null);
597597

598598
// Attach Canvas used for LCEVC Decoding
599599
player.attachCanvas(/** @type {HTMLCanvasElement} */(lcevcCanvas));
@@ -639,7 +639,7 @@ shaka.ui.Overlay = class {
639639
* @param {!Element} container
640640
* @param {!NodeList<!Element>} canvases
641641
* @param {!NodeList<!Element>} vrCanvases
642-
* @return {{lcevcCanvas: !Element, vrCanvas: !Element}}
642+
* @return {{lcevcCanvas: !Element, vrCanvas: ?Element}}
643643
* @private
644644
*/
645645
static findOrMakeSpecialCanvases_(container, canvases, vrCanvases) {
@@ -666,11 +666,6 @@ shaka.ui.Overlay = class {
666666
break;
667667
}
668668
}
669-
if (!vrCanvas) {
670-
vrCanvas = document.createElement('canvas');
671-
vrCanvas.classList.add('shaka-vr-canvas-container');
672-
container.appendChild(vrCanvas);
673-
}
674669
return {
675670
lcevcCanvas,
676671
vrCanvas,

ui/vr_manager.js

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ goog.provide('shaka.ui.VRManager');
99

1010
goog.require('shaka.log');
1111
goog.require('shaka.ui.VRWebgl');
12+
goog.require('shaka.util.Dom');
1213
goog.require('shaka.util.EventManager');
1314
goog.require('shaka.util.FakeEvent');
1415
goog.require('shaka.util.FakeEventTarget');
@@ -54,7 +55,7 @@ shaka.ui.VRManager = class extends shaka.util.FakeEventTarget {
5455
this.eventManager_ = new shaka.util.EventManager();
5556

5657
/** @private {?WebGLRenderingContext} */
57-
this.gl_ = this.getGL_();
58+
this.gl_ = this.getGL_(this.canvas_);
5859

5960
/** @private {?shaka.ui.VRWebgl} */
6061
this.vrWebgl_ = null;
@@ -167,7 +168,12 @@ shaka.ui.VRManager = class extends shaka.util.FakeEventTarget {
167168
* @return {boolean}
168169
*/
169170
canPlayVR() {
170-
return !!this.gl_;
171+
if (this.canvas_) {
172+
return !!this.gl_;
173+
}
174+
const canvas =
175+
shaka.util.Dom.asHTMLCanvasElement(document.createElement('canvas'));
176+
return !!this.getGL_(canvas);
171177
}
172178

173179
/**
@@ -306,10 +312,15 @@ shaka.ui.VRManager = class extends shaka.util.FakeEventTarget {
306312
* @private
307313
*/
308314
checkVrStatus_() {
309-
if (!this.canvas_) {
310-
return;
311-
}
312315
if ((this.config_.displayInVrMode || this.vrAsset_)) {
316+
if (!this.canvas_) {
317+
this.canvas_ = shaka.util.Dom.asHTMLCanvasElement(
318+
document.createElement('canvas'));
319+
this.canvas_.classList.add('shaka-vr-canvas-container');
320+
this.video_.parentElement.insertBefore(
321+
this.canvas_, this.video_.nextElementSibling);
322+
this.gl_ = this.getGL_(this.canvas_);
323+
}
313324
const newProjectionMode =
314325
this.vrAsset_ || this.config_.defaultVrProjectionMode;
315326
if (!this.vrWebgl_) {
@@ -328,7 +339,7 @@ shaka.ui.VRManager = class extends shaka.util.FakeEventTarget {
328339
}
329340
}
330341
} else if (!this.config_.displayInVrMode && !this.vrAsset_ &&
331-
this.vrWebgl_) {
342+
this.canvas_ && this.vrWebgl_) {
332343
this.canvas_.style.display = 'none';
333344
this.eventManager_.removeAll();
334345
this.vrWebgl_.release();
@@ -352,11 +363,12 @@ shaka.ui.VRManager = class extends shaka.util.FakeEventTarget {
352363
}
353364

354365
/**
366+
* @param {?HTMLCanvasElement} canvas
355367
* @return {?WebGLRenderingContext}
356368
* @private
357369
*/
358-
getGL_() {
359-
if (!this.canvas_) {
370+
getGL_(canvas) {
371+
if (!canvas) {
360372
return null;
361373
}
362374
// The user interface is not intended for devices that are controlled with
@@ -369,7 +381,7 @@ shaka.ui.VRManager = class extends shaka.util.FakeEventTarget {
369381
'webgl',
370382
];
371383
for (const webgl of webglContexts) {
372-
const gl = this.canvas_.getContext(webgl);
384+
const gl = canvas.getContext(webgl);
373385
if (gl) {
374386
return /** @type {!WebGLRenderingContext} */(gl);
375387
}

0 commit comments

Comments
 (0)