Skip to content

Commit 6d55df0

Browse files
Olli Etuahophemavax
authored andcommitted
Don't update shaders on every frame in Aquarium
This saves some CPU time - setShaders only needs to be called when some bit of state affecting shading has changed.
1 parent f2ff000 commit 6d55df0

File tree

1 file changed

+25
-16
lines changed

1 file changed

+25
-16
lines changed

aquarium/aquarium.js

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ if (isMultiviewSupportEnabled()) {
2626
g.options.useMultiview = { enabled: true, text: 'Use multiview' };
2727
}
2828

29+
function useMultiviewForStereo() {
30+
return multiview && g.options.useMultiview.enabled;
31+
}
32+
2933
// globals
3034
var gl; // the gl context.
3135
var multiview; // multiview extension.
@@ -70,6 +74,7 @@ var benchRunTime = "runFor";
7074
var numFish = "numFish";
7175
var featureFlags = "featureFlags";
7276
var g_stereoDemoActive = false;
77+
var g_shadersNeedUpdate = false; // Set to true whenever the state has changed so that shaders may need to be changed.
7378

7479
var g_requestId;
7580
var g_syncManager;
@@ -1522,13 +1527,6 @@ function initialize() {
15221527
var lightRayConstInUse = useMultiview ? lightRayConstMultiview : lightRayConst;
15231528
var fishConstInUse = useMultiview ? fishConstMultiview : fishConst;
15241529

1525-
// If we are running > 40hz then turn on a few more options.
1526-
if (setPretty && g_fpsTimer.averageFPS > 40) {
1527-
setPretty = false;
1528-
if (!g.options.normalMaps.enabled) { g.options.normalMaps.toggle(); }
1529-
if (!g.options.reflection.enabled) { g.options.reflection.toggle(); }
1530-
}
1531-
15321530
ambient[0] = g.globals.ambientRed;
15331531
ambient[1] = g.globals.ambientGreen;
15341532
ambient[2] = g.globals.ambientBlue;
@@ -1911,14 +1909,12 @@ function initialize() {
19111909
}
19121910

19131911
function renderStereo(leftProjectionMatrix, rightProjectionMatrix, viewInverseMatrix, pose) {
1914-
var useMultiview = multiview && g.options.useMultiview.enabled;
1915-
if (useMultiview) {
1912+
if (useMultiviewForStereo()) {
19161913
setupMultiviewFbIfNeeded();
19171914
var halfWidth = Math.floor(canvas.width * 0.5);
19181915
gl.bindFramebuffer(gl.FRAMEBUFFER, g_multiviewFb);
19191916
gl.viewport(0, 0, halfWidth, canvas.height);
19201917
gl.disable(gl.SCISSOR_TEST);
1921-
setShaders(true);
19221918
render([leftProjectionMatrix, rightProjectionMatrix], viewInverseMatrix, true, pose);
19231919

19241920
gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null);
@@ -1929,7 +1925,6 @@ function initialize() {
19291925
} else { // not multiview
19301926
gl.viewport(0, 0, canvas.width * 0.5, canvas.height);
19311927
gl.enable(gl.SCISSOR_TEST);
1932-
setShaders(false);
19331928
gl.scissor(0, 0, canvas.width * 0.5, canvas.height);
19341929
render(leftProjectionMatrix, viewInverseMatrix, false, pose);
19351930

@@ -1979,7 +1974,6 @@ function initialize() {
19791974

19801975
gl.disable(gl.SCISSOR_TEST);
19811976
gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);
1982-
setShaders(false);
19831977
render(monoProjection, viewInverseTemp);
19841978
}
19851979

@@ -2034,13 +2028,26 @@ function initialize() {
20342028
g_fpsTimer.update(elapsedTime);
20352029
fpsElem.innerHTML = g_fpsTimer.averageFPS;
20362030

2031+
// If we are running > 40hz then turn on a few more options.
2032+
if (setPretty && g_fpsTimer.averageFPS > 40) {
2033+
setPretty = false;
2034+
if (!g.options.normalMaps.enabled) { g.options.normalMaps.toggle(); }
2035+
if (!g.options.reflection.enabled) { g.options.reflection.toggle(); }
2036+
}
2037+
20372038
if (g_vrDisplay) {
20382039
g_requestId = g_vrDisplay.requestAnimationFrame(onAnimationFrame);
20392040
g_vrDisplay.getFrameData(g_frameData);
20402041
} else {
20412042
g_requestId = tdl.webgl.requestAnimationFrame(onAnimationFrame, canvas);
20422043
}
20432044

2045+
if (g_shadersNeedUpdate) {
2046+
var isInStereoMode = (g_vrDisplay && g_vrDisplay.isPresenting) || g_stereoDemoActive;
2047+
setShaders(isInStereoMode && useMultiviewForStereo());
2048+
g_shadersNeedUpdate = false;
2049+
}
2050+
20442051
if (g_vrDisplay && g_vrDisplay.isPresenting) {
20452052
/* VR UI is enabled in VR Mode. VR UI has two mode, menu mode is the mirror of control panel of
20462053
* aquarium and non-menu mode may presents fps(could be turn off) in front of user. These two
@@ -2054,10 +2061,8 @@ function initialize() {
20542061
// Query gamepad button clicked event.
20552062
g_vrUi.queryGamepadStatus();
20562063

2057-
var useMultiview = multiview && g.options.useMultiview.enabled;
2058-
20592064
// TODO: Support VRUI when doing multiview rendering.
2060-
if (!useMultiview && g_vrUi.isMenuMode) {
2065+
if (!useMultiviewForStereo() && g_vrUi.isMenuMode) {
20612066

20622067
// When VR UI in menu mode, UI need a cursor to help user do select operation. Currently, cursor uses
20632068
// head-neck model which means a point in front of user and user could move the point by rotating their head(with HMD).
@@ -2227,6 +2232,7 @@ function initUIStuff() {
22272232
options[name] = {enabled:!option.enabled};
22282233
setSettings({options:options});
22292234
elem.style.color = option.enabled ? "red" : "gray";
2235+
g_shadersNeedUpdate = true;
22302236
}
22312237

22322238
var optionsContainer = document.getElementById("optionsContainer");
@@ -2425,6 +2431,8 @@ $(function(){
24252431
// to the recommended dimensions for the display.
24262432
resize();
24272433

2434+
g_shadersNeedUpdate = true;
2435+
24282436
if (g_vrDisplay.isPresenting) {
24292437
if (g_vrDisplay.capabilities.hasExternalDisplay) {
24302438
removeButton(vrButton);
@@ -2455,6 +2463,7 @@ $(function(){
24552463

24562464
function toggleStereoDemo() {
24572465
g_stereoDemoActive = !g_stereoDemoActive;
2466+
g_shadersNeedUpdate = true;
24582467
}
24592468

24602469
function resize() {
@@ -2514,7 +2523,7 @@ $(function(){
25142523
}
25152524
}
25162525
// Regardless of if we have WebVR support, we can demonstrate stereo rendering inside the window.
2517-
stereoDemoButton = addButton("Toggle Stereo Demo", "E", getCurrentUrl() + "/vr_assets/button.png", toggleStereoDemo);
2526+
stereoDemoButton = addButton("Toggle Stereo Demo", "", getCurrentUrl() + "/vr_assets/button.png", toggleStereoDemo);
25182527
}
25192528
window.addEventListener('resize', function() {onResize();}, false);
25202529
onResize();

0 commit comments

Comments
 (0)