OLD | NEW |
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/Fullscreen.h" | 8 #include "core/dom/Fullscreen.h" |
9 #include "core/inspector/ConsoleMessage.h" | 9 #include "core/inspector/ConsoleMessage.h" |
10 #include "modules/vr/NavigatorVR.h" | 10 #include "modules/vr/NavigatorVR.h" |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
161 | 161 |
162 m_isPresenting = true; | 162 m_isPresenting = true; |
163 | 163 |
164 resolver->resolve(); | 164 resolver->resolve(); |
165 | 165 |
166 m_navigatorVR->fireVRDisplayPresentChange(this); | 166 m_navigatorVR->fireVRDisplayPresentChange(this); |
167 | 167 |
168 // Check to see if the canvas is still the current fullscreen | 168 // Check to see if the canvas is still the current fullscreen |
169 // element once per second. | 169 // element once per second. |
170 m_fullscreenCheckTimer.startRepeating(1.0, BLINK_FROM_HERE); | 170 m_fullscreenCheckTimer.startRepeating(1.0, BLINK_FROM_HERE); |
| 171 |
| 172 controller()->requestPresent(m_displayId); |
171 } else { | 173 } else { |
172 DOMException* exception = DOMException::create(InvalidStateError, "V
R Presentation not implemented for this VRDisplay"); | 174 DOMException* exception = DOMException::create(InvalidStateError, "V
R Presentation not implemented for this VRDisplay"); |
173 resolver->reject(exception); | 175 resolver->reject(exception); |
174 } | 176 } |
| 177 |
| 178 // Set up the texture bounds for the provided layer |
| 179 device::blink::VRLayerBoundsPtr leftBounds = device::blink::VRLayerBound
s::New(); |
| 180 device::blink::VRLayerBoundsPtr rightBounds = device::blink::VRLayerBoun
ds::New(); |
| 181 |
| 182 if (m_layer.hasLeftBounds()) { |
| 183 leftBounds->left = m_layer.leftBounds()[0]; |
| 184 leftBounds->top = m_layer.leftBounds()[1]; |
| 185 leftBounds->width = m_layer.leftBounds()[2]; |
| 186 leftBounds->height = m_layer.leftBounds()[3]; |
| 187 } else { |
| 188 // Left eye defaults |
| 189 leftBounds->left = 0.0f; |
| 190 leftBounds->top = 0.0f; |
| 191 leftBounds->width = 0.5f; |
| 192 leftBounds->height = 1.0f; |
| 193 } |
| 194 |
| 195 if (m_layer.hasRightBounds()) { |
| 196 rightBounds->left = m_layer.rightBounds()[0]; |
| 197 rightBounds->top = m_layer.rightBounds()[1]; |
| 198 rightBounds->width = m_layer.rightBounds()[2]; |
| 199 rightBounds->height = m_layer.rightBounds()[3]; |
| 200 } else { |
| 201 // Right eye defaults |
| 202 rightBounds->left = 0.5f; |
| 203 rightBounds->top = 0.0f; |
| 204 rightBounds->width = 0.5f; |
| 205 rightBounds->height = 1.0f; |
| 206 } |
| 207 |
| 208 controller()->updateLayerBounds(m_displayId, std::move(leftBounds), std:
:move(rightBounds)); |
175 } else { | 209 } else { |
176 DOMException* exception = DOMException::create(InvalidStateError, "Inval
id layer source"); | 210 DOMException* exception = DOMException::create(InvalidStateError, "Inval
id layer source"); |
177 resolver->reject(exception); | 211 resolver->reject(exception); |
178 } | 212 } |
179 | 213 |
180 return promise; | 214 return promise; |
181 } | 215 } |
182 | 216 |
183 ScriptPromise VRDisplay::exitPresent(ScriptState* scriptState) | 217 ScriptPromise VRDisplay::exitPresent(ScriptState* scriptState) |
184 { | 218 { |
185 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 219 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
186 ScriptPromise promise = resolver->promise(); | 220 ScriptPromise promise = resolver->promise(); |
187 | 221 |
188 if (!m_isPresenting) { | 222 if (!m_isPresenting) { |
189 // Can't stop presenting if we're not presenting. | 223 // Can't stop presenting if we're not presenting. |
190 DOMException* exception = DOMException::create(InvalidStateError, "VRDis
play is not presenting"); | 224 DOMException* exception = DOMException::create(InvalidStateError, "VRDis
play is not presenting"); |
191 resolver->reject(exception); | 225 resolver->reject(exception); |
192 return promise; | 226 return promise; |
193 } | 227 } |
194 | 228 |
195 if (!m_capabilities->hasExternalDisplay()) { | 229 if (!m_capabilities->hasExternalDisplay()) { |
196 Fullscreen::fullyExitFullscreen(m_layer.source()->document()); | 230 Fullscreen::fullyExitFullscreen(m_layer.source()->document()); |
197 m_fullscreenCheckTimer.stop(); | 231 m_fullscreenCheckTimer.stop(); |
| 232 controller()->exitPresent(m_displayId); |
198 } else { | 233 } else { |
199 // Can't get into this presentation mode, so nothing to do here. | 234 // Can't get into this presentation mode, so nothing to do here. |
200 } | 235 } |
201 | 236 |
202 m_isPresenting = false; | 237 m_isPresenting = false; |
203 | 238 |
204 // TODO: Resolve when exit is confirmed | 239 // TODO: Resolve when exit is confirmed |
205 resolver->resolve(); | 240 resolver->resolve(); |
206 | 241 |
207 m_navigatorVR->fireVRDisplayPresentChange(this); | 242 m_navigatorVR->fireVRDisplayPresentChange(this); |
208 | 243 |
209 return promise; | 244 return promise; |
210 } | 245 } |
211 | 246 |
212 HeapVector<VRLayer> VRDisplay::getLayers() | 247 HeapVector<VRLayer> VRDisplay::getLayers() |
213 { | 248 { |
214 HeapVector<VRLayer> layers; | 249 HeapVector<VRLayer> layers; |
215 | 250 |
216 if (m_isPresenting) { | 251 if (m_isPresenting) { |
217 layers.append(m_layer); | 252 layers.append(m_layer); |
218 } | 253 } |
219 | 254 |
220 return layers; | 255 return layers; |
221 } | 256 } |
222 | 257 |
223 void VRDisplay::submitFrame(VRPose* pose) | 258 void VRDisplay::submitFrame(VRPose* pose) |
224 { | 259 { |
| 260 controller()->submitFrame(m_displayId); |
225 } | 261 } |
226 | 262 |
227 void VRDisplay::didProcessTask() | 263 void VRDisplay::didProcessTask() |
228 { | 264 { |
229 // Pose should be stable until control is returned to the user agent. | 265 // Pose should be stable until control is returned to the user agent. |
230 if (!m_canUpdateFramePose) { | 266 if (!m_canUpdateFramePose) { |
231 Platform::current()->currentThread()->removeTaskObserver(this); | 267 Platform::current()->currentThread()->removeTaskObserver(this); |
232 m_canUpdateFramePose = true; | 268 m_canUpdateFramePose = true; |
233 } | 269 } |
234 } | 270 } |
235 | 271 |
236 void VRDisplay::onFullscreenCheck(TimerBase*) | 272 void VRDisplay::onFullscreenCheck(TimerBase*) |
237 { | 273 { |
238 // TODO: This is a temporary measure to track if fullscreen mode has been | 274 // TODO: This is a temporary measure to track if fullscreen mode has been |
239 // exited by the UA. If so we need to end VR presentation. Soon we won't | 275 // exited by the UA. If so we need to end VR presentation. Soon we won't |
240 // depend on the Fullscreen API to fake VR presentation, so this will | 276 // depend on the Fullscreen API to fake VR presentation, so this will |
241 // become unnessecary. Until that point, though, this seems preferable to | 277 // become unnessecary. Until that point, though, this seems preferable to |
242 // adding a bunch of notification plumbing to Fullscreen. | 278 // adding a bunch of notification plumbing to Fullscreen. |
243 if (!Fullscreen::isCurrentFullScreenElement(*m_layer.source())) { | 279 if (!Fullscreen::isCurrentFullScreenElement(*m_layer.source())) { |
244 m_isPresenting = false; | 280 m_isPresenting = false; |
245 m_navigatorVR->fireVRDisplayPresentChange(this); | 281 m_navigatorVR->fireVRDisplayPresentChange(this); |
246 m_fullscreenCheckTimer.stop(); | 282 m_fullscreenCheckTimer.stop(); |
| 283 controller()->exitPresent(m_displayId); |
247 } | 284 } |
248 } | 285 } |
249 | 286 |
250 DEFINE_TRACE(VRDisplay) | 287 DEFINE_TRACE(VRDisplay) |
251 { | 288 { |
252 visitor->trace(m_navigatorVR); | 289 visitor->trace(m_navigatorVR); |
253 visitor->trace(m_capabilities); | 290 visitor->trace(m_capabilities); |
254 visitor->trace(m_stageParameters); | 291 visitor->trace(m_stageParameters); |
255 visitor->trace(m_eyeParametersLeft); | 292 visitor->trace(m_eyeParametersLeft); |
256 visitor->trace(m_eyeParametersRight); | 293 visitor->trace(m_eyeParametersRight); |
257 visitor->trace(m_framePose); | 294 visitor->trace(m_framePose); |
258 visitor->trace(m_layer); | 295 visitor->trace(m_layer); |
259 } | 296 } |
260 | 297 |
261 } // namespace blink | 298 } // namespace blink |
OLD | NEW |