Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(717)

Side by Side Diff: third_party/WebKit/Source/modules/vr/VRDisplay.cpp

Issue 2471433002: Implement WebVR presentation pausing for VR Shell Menu Mode (Closed)
Patch Set: Address comments Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "modules/vr/VRDisplay.h" 5 #include "modules/vr/VRDisplay.h"
6 6
7 #include "core/dom/DOMException.h" 7 #include "core/dom/DOMException.h"
8 #include "core/dom/FrameRequestCallback.h" 8 #include "core/dom/FrameRequestCallback.h"
9 #include "core/dom/Fullscreen.h" 9 #include "core/dom/Fullscreen.h"
10 #include "core/dom/ScriptedAnimationController.h" 10 #include "core/dom/ScriptedAnimationController.h"
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 m_displayId(0), 62 m_displayId(0),
63 m_isConnected(false), 63 m_isConnected(false),
64 m_isPresenting(false), 64 m_isPresenting(false),
65 m_canUpdateFramePose(true), 65 m_canUpdateFramePose(true),
66 m_capabilities(new VRDisplayCapabilities()), 66 m_capabilities(new VRDisplayCapabilities()),
67 m_eyeParametersLeft(new VREyeParameters()), 67 m_eyeParametersLeft(new VREyeParameters()),
68 m_eyeParametersRight(new VREyeParameters()), 68 m_eyeParametersRight(new VREyeParameters()),
69 m_depthNear(0.01), 69 m_depthNear(0.01),
70 m_depthFar(10000.0), 70 m_depthFar(10000.0),
71 m_fullscreenCheckTimer(this, &VRDisplay::onFullscreenCheck), 71 m_fullscreenCheckTimer(this, &VRDisplay::onFullscreenCheck),
72 m_contextGL(nullptr),
72 m_animationCallbackRequested(false), 73 m_animationCallbackRequested(false),
73 m_inAnimationFrame(false) {} 74 m_inAnimationFrame(false) {}
74 75
75 VRDisplay::~VRDisplay() {} 76 VRDisplay::~VRDisplay() {}
76 77
77 VRController* VRDisplay::controller() { 78 VRController* VRDisplay::controller() {
78 return m_navigatorVR->controller(); 79 return m_navigatorVR->controller();
79 } 80 }
80 81
81 void VRDisplay::update(const device::blink::VRDisplayPtr& display) { 82 void VRDisplay::update(const device::blink::VRDisplayPtr& display) {
(...skipping 21 matching lines...) Expand all
103 } 104 }
104 105
105 void VRDisplay::disconnected() { 106 void VRDisplay::disconnected() {
106 if (m_isConnected) 107 if (m_isConnected)
107 m_isConnected = !m_isConnected; 108 m_isConnected = !m_isConnected;
108 } 109 }
109 110
110 bool VRDisplay::getFrameData(VRFrameData* frameData) { 111 bool VRDisplay::getFrameData(VRFrameData* frameData) {
111 updatePose(); 112 updatePose();
112 113
114 if (!m_framePose)
115 return false;
116
113 if (!frameData) 117 if (!frameData)
114 return false; 118 return false;
115 119
116 if (m_depthNear == m_depthFar) 120 if (m_depthNear == m_depthFar)
117 return false; 121 return false;
118 122
119 return frameData->update(m_framePose, m_eyeParametersLeft, 123 return frameData->update(m_framePose, m_eyeParametersLeft,
120 m_eyeParametersRight, m_depthNear, m_depthFar); 124 m_eyeParametersRight, m_depthNear, m_depthFar);
121 } 125 }
122 126
123 VRPose* VRDisplay::getPose() { 127 VRPose* VRDisplay::getPose() {
124 updatePose(); 128 updatePose();
125 129
126 if (!m_framePose) 130 if (!m_framePose)
127 return nullptr; 131 return nullptr;
128 132
129 VRPose* pose = VRPose::create(); 133 VRPose* pose = VRPose::create();
130 pose->setPose(m_framePose); 134 pose->setPose(m_framePose);
131 return pose; 135 return pose;
132 } 136 }
133 137
134 void VRDisplay::updatePose() { 138 void VRDisplay::updatePose() {
139 if (m_displayBlurred) {
140 m_framePose = nullptr;
dcheng 2016/11/08 23:05:45 Out of curiosity, why don't we just clear this in
mthiesse 2016/11/10 22:14:10 I clear it in updatePose simply for code clarity.
141 return;
142 }
135 if (m_canUpdateFramePose) { 143 if (m_canUpdateFramePose) {
136 m_framePose = controller()->getPose(m_displayId); 144 m_framePose = controller()->getPose(m_displayId);
137 if (m_isPresenting) 145 if (m_isPresenting)
138 m_canUpdateFramePose = false; 146 m_canUpdateFramePose = false;
139 } 147 }
140 } 148 }
141 149
142 void VRDisplay::resetPose() { 150 void VRDisplay::resetPose() {
143 controller()->resetPose(m_displayId); 151 controller()->resetPose(m_displayId);
144 } 152 }
(...skipping 22 matching lines...) Expand all
167 callback->m_useLegacyTimeBase = false; 175 callback->m_useLegacyTimeBase = false;
168 return ensureScriptedAnimationController(doc).registerCallback(callback); 176 return ensureScriptedAnimationController(doc).registerCallback(callback);
169 } 177 }
170 178
171 void VRDisplay::cancelAnimationFrame(int id) { 179 void VRDisplay::cancelAnimationFrame(int id) {
172 if (!m_scriptedAnimationController) 180 if (!m_scriptedAnimationController)
173 return; 181 return;
174 m_scriptedAnimationController->cancelCallback(id); 182 m_scriptedAnimationController->cancelCallback(id);
175 } 183 }
176 184
185 void VRDisplay::onDisplayBlur() {
186 m_displayBlurred = true;
187 m_navigatorVR->fireVrDisplayOnBlur(this);
188 }
189
190 void VRDisplay::onDisplayFocus() {
191 m_displayBlurred = false;
192 // Restart our internal doc requestAnimationFrame callback, if it fired while
193 // the display was blurred.
194 // TODO(bajones): Don't use doc->requestAnimationFrame() at all. Animation
195 // frames should be tied to the presenting VR display (e.g. should be serviced
196 // by GVR library callbacks on Android), and not the doc frame rate.
197 if (!m_animationCallbackRequested) {
198 Document* doc = m_navigatorVR->document();
199 if (!doc)
200 return;
201 doc->requestAnimationFrame(new VRDisplayFrameRequestCallback(this));
202 }
203 m_navigatorVR->fireVrDisplayOnFocus(this);
204 }
205
177 void VRDisplay::serviceScriptedAnimations(double monotonicAnimationStartTime) { 206 void VRDisplay::serviceScriptedAnimations(double monotonicAnimationStartTime) {
178 if (!m_scriptedAnimationController) 207 if (!m_scriptedAnimationController)
179 return; 208 return;
180 AutoReset<bool> animating(&m_inAnimationFrame, true); 209 AutoReset<bool> animating(&m_inAnimationFrame, true);
181 m_animationCallbackRequested = false; 210 m_animationCallbackRequested = false;
211 if (m_displayBlurred)
212 return;
182 m_scriptedAnimationController->serviceScriptedAnimations( 213 m_scriptedAnimationController->serviceScriptedAnimations(
183 monotonicAnimationStartTime); 214 monotonicAnimationStartTime);
184 } 215 }
185 216
186 void ReportPresentationResult(PresentationResult result) { 217 void ReportPresentationResult(PresentationResult result) {
187 // Note that this is called twice for each call to requestPresent - 218 // Note that this is called twice for each call to requestPresent -
188 // one to declare that requestPresent was called, and one for the 219 // one to declare that requestPresent was called, and one for the
189 // result. 220 // result.
190 DEFINE_STATIC_LOCAL( 221 DEFINE_STATIC_LOCAL(
191 EnumerationHistogram, vrPresentationResultHistogram, 222 EnumerationHistogram, vrPresentationResultHistogram,
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after
499 visitor->trace(m_capabilities); 530 visitor->trace(m_capabilities);
500 visitor->trace(m_stageParameters); 531 visitor->trace(m_stageParameters);
501 visitor->trace(m_eyeParametersLeft); 532 visitor->trace(m_eyeParametersLeft);
502 visitor->trace(m_eyeParametersRight); 533 visitor->trace(m_eyeParametersRight);
503 visitor->trace(m_layer); 534 visitor->trace(m_layer);
504 visitor->trace(m_renderingContext); 535 visitor->trace(m_renderingContext);
505 visitor->trace(m_scriptedAnimationController); 536 visitor->trace(m_scriptedAnimationController);
506 } 537 }
507 538
508 } // namespace blink 539 } // namespace blink
OLDNEW
« device/vr/vr_device_manager.cc ('K') | « third_party/WebKit/Source/modules/vr/VRDisplay.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698