Chromium Code Reviews| 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/frame/UseCounter.h" | 9 #include "core/frame/UseCounter.h" |
| 10 #include "core/inspector/ConsoleMessage.h" | 10 #include "core/inspector/ConsoleMessage.h" |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 39 : m_navigatorVR(navigatorVR), | 39 : m_navigatorVR(navigatorVR), |
| 40 m_displayId(0), | 40 m_displayId(0), |
| 41 m_isConnected(false), | 41 m_isConnected(false), |
| 42 m_isPresenting(false), | 42 m_isPresenting(false), |
| 43 m_canUpdateFramePose(true), | 43 m_canUpdateFramePose(true), |
| 44 m_capabilities(new VRDisplayCapabilities()), | 44 m_capabilities(new VRDisplayCapabilities()), |
| 45 m_eyeParametersLeft(new VREyeParameters()), | 45 m_eyeParametersLeft(new VREyeParameters()), |
| 46 m_eyeParametersRight(new VREyeParameters()), | 46 m_eyeParametersRight(new VREyeParameters()), |
| 47 m_depthNear(0.01), | 47 m_depthNear(0.01), |
| 48 m_depthFar(10000.0), | 48 m_depthFar(10000.0), |
| 49 m_fullscreenCheckTimer(this, &VRDisplay::onFullscreenCheck) {} | 49 m_fullscreenCheckTimer(this, &VRDisplay::onFullscreenCheck), |
| 50 m_binding(this) {} | |
| 50 | 51 |
| 51 VRDisplay::~VRDisplay() {} | 52 VRDisplay::~VRDisplay() {} |
| 52 | 53 |
| 53 VRController* VRDisplay::controller() { | 54 VRController* VRDisplay::controller() { |
| 54 return m_navigatorVR->controller(); | 55 return m_navigatorVR->controller(); |
| 55 } | 56 } |
| 56 | 57 |
| 57 void VRDisplay::update(const device::blink::VRDisplayPtr& display) { | 58 void VRDisplay::update(const device::blink::VRDisplayPtr& display) { |
| 58 m_displayId = display->index; | 59 m_displayId = display->index; |
| 59 m_displayName = display->displayName; | 60 m_displayName = display->displayName; |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 102 if (!m_framePose) | 103 if (!m_framePose) |
| 103 return nullptr; | 104 return nullptr; |
| 104 | 105 |
| 105 VRPose* pose = VRPose::create(); | 106 VRPose* pose = VRPose::create(); |
| 106 pose->setPose(m_framePose); | 107 pose->setPose(m_framePose); |
| 107 return pose; | 108 return pose; |
| 108 } | 109 } |
| 109 | 110 |
| 110 void VRDisplay::updatePose() { | 111 void VRDisplay::updatePose() { |
| 111 if (m_canUpdateFramePose) { | 112 if (m_canUpdateFramePose) { |
| 112 m_framePose = controller()->getPose(m_displayId); | 113 if (!m_service) |
| 114 return; | |
| 115 device::blink::VRPosePtr pose; | |
| 116 m_service->GetPose(&pose); | |
| 117 m_framePose = std::move(pose); | |
| 113 if (m_isPresenting) | 118 if (m_isPresenting) |
| 114 m_canUpdateFramePose = false; | 119 m_canUpdateFramePose = false; |
| 115 } | 120 } |
| 116 } | 121 } |
| 117 | 122 |
| 118 void VRDisplay::resetPose() { | 123 void VRDisplay::resetPose() { |
| 119 controller()->resetPose(m_displayId); | 124 if (!m_service) |
| 125 return; | |
| 126 | |
| 127 m_service->ResetPose(); | |
| 120 } | 128 } |
| 121 | 129 |
| 122 VREyeParameters* VRDisplay::getEyeParameters(const String& whichEye) { | 130 VREyeParameters* VRDisplay::getEyeParameters(const String& whichEye) { |
| 123 switch (stringToVREye(whichEye)) { | 131 switch (stringToVREye(whichEye)) { |
| 124 case VREyeLeft: | 132 case VREyeLeft: |
| 125 return m_eyeParametersLeft; | 133 return m_eyeParametersLeft; |
| 126 case VREyeRight: | 134 case VREyeRight: |
| 127 return m_eyeParametersRight; | 135 return m_eyeParametersRight; |
| 128 default: | 136 default: |
| 129 return nullptr; | 137 return nullptr; |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 232 Fullscreen::requestFullscreen(*m_layer.source(), | 240 Fullscreen::requestFullscreen(*m_layer.source(), |
| 233 Fullscreen::UnprefixedRequest); | 241 Fullscreen::UnprefixedRequest); |
| 234 | 242 |
| 235 // Check to see if the canvas is still the current fullscreen | 243 // Check to see if the canvas is still the current fullscreen |
| 236 // element once per second. | 244 // element once per second. |
| 237 m_fullscreenCheckTimer.startRepeating(1.0, BLINK_FROM_HERE); | 245 m_fullscreenCheckTimer.startRepeating(1.0, BLINK_FROM_HERE); |
| 238 } | 246 } |
| 239 | 247 |
| 240 if (firstPresent) { | 248 if (firstPresent) { |
| 241 bool secureContext = scriptState->getExecutionContext()->isSecureContext(); | 249 bool secureContext = scriptState->getExecutionContext()->isSecureContext(); |
| 242 controller()->requestPresent(resolver, m_displayId, secureContext); | 250 if (!m_service) { |
| 251 DOMException* exception = DOMException::create( | |
| 252 InvalidStateError, "The service is no longer active."); | |
| 253 resolver->reject(exception); | |
| 254 return promise; | |
| 255 } | |
| 256 m_service->RequestPresent( | |
| 257 secureContext, convertToBaseCallback(WTF::bind( | |
| 258 &VRDisplay::onPresentComplete, wrapPersistent(this), | |
| 259 wrapPersistent(resolver)))); | |
| 243 } else { | 260 } else { |
| 244 updateLayerBounds(); | 261 updateLayerBounds(); |
| 245 resolver->resolve(); | 262 resolver->resolve(); |
| 246 } | 263 } |
| 247 | 264 |
| 248 return promise; | 265 return promise; |
| 249 } | 266 } |
| 250 | 267 |
| 268 void VRDisplay::onPresentComplete(ScriptPromiseResolver* resolver, | |
| 269 bool success) { | |
| 270 if (success) { | |
| 271 this->beginPresent(resolver); | |
| 272 } else { | |
| 273 this->forceExitPresent(); | |
| 274 DOMException* exception = DOMException::create( | |
| 275 NotAllowedError, "Presentation request was denied."); | |
| 276 resolver->reject(exception); | |
| 277 } | |
| 278 } | |
| 279 | |
| 251 ScriptPromise VRDisplay::exitPresent(ScriptState* scriptState) { | 280 ScriptPromise VRDisplay::exitPresent(ScriptState* scriptState) { |
| 252 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); | 281 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); |
| 253 ScriptPromise promise = resolver->promise(); | 282 ScriptPromise promise = resolver->promise(); |
| 254 | 283 |
| 255 if (!m_isPresenting) { | 284 if (!m_isPresenting) { |
| 256 // Can't stop presenting if we're not presenting. | 285 // Can't stop presenting if we're not presenting. |
| 257 DOMException* exception = | 286 DOMException* exception = |
| 258 DOMException::create(InvalidStateError, "VRDisplay is not presenting."); | 287 DOMException::create(InvalidStateError, "VRDisplay is not presenting."); |
| 259 resolver->reject(exception); | 288 resolver->reject(exception); |
| 260 return promise; | 289 return promise; |
| 261 } | 290 } |
| 262 | 291 |
| 263 controller()->exitPresent(m_displayId); | 292 if (!m_service) { |
| 293 DOMException* exception = | |
| 294 DOMException::create(InvalidStateError, "VRService is not available."); | |
| 295 resolver->reject(exception); | |
| 296 return promise; | |
| 297 } | |
| 298 m_service->ExitPresent(); | |
| 264 | 299 |
| 265 resolver->resolve(); | 300 resolver->resolve(); |
| 266 | 301 |
| 267 forceExitPresent(); | 302 forceExitPresent(); |
| 268 | 303 |
| 269 return promise; | 304 return promise; |
| 270 } | 305 } |
| 271 | 306 |
| 272 void VRDisplay::beginPresent(ScriptPromiseResolver* resolver) { | 307 void VRDisplay::beginPresent(ScriptPromiseResolver* resolver) { |
| 273 if (m_capabilities->hasExternalDisplay()) { | 308 if (m_capabilities->hasExternalDisplay()) { |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 333 rightBounds->width = m_layer.rightBounds()[2]; | 368 rightBounds->width = m_layer.rightBounds()[2]; |
| 334 rightBounds->height = m_layer.rightBounds()[3]; | 369 rightBounds->height = m_layer.rightBounds()[3]; |
| 335 } else { | 370 } else { |
| 336 // Right eye defaults | 371 // Right eye defaults |
| 337 rightBounds->left = 0.5f; | 372 rightBounds->left = 0.5f; |
| 338 rightBounds->top = 0.0f; | 373 rightBounds->top = 0.0f; |
| 339 rightBounds->width = 0.5f; | 374 rightBounds->width = 0.5f; |
| 340 rightBounds->height = 1.0f; | 375 rightBounds->height = 1.0f; |
| 341 } | 376 } |
| 342 | 377 |
| 343 controller()->updateLayerBounds(m_displayId, std::move(leftBounds), | 378 if (!m_service) |
| 344 std::move(rightBounds)); | 379 return; |
| 380 | |
| 381 m_service->UpdateLayerBounds(std::move(leftBounds), std::move(rightBounds)); | |
| 345 } | 382 } |
| 346 | 383 |
| 347 HeapVector<VRLayer> VRDisplay::getLayers() { | 384 HeapVector<VRLayer> VRDisplay::getLayers() { |
| 348 HeapVector<VRLayer> layers; | 385 HeapVector<VRLayer> layers; |
| 349 | 386 |
| 350 if (m_isPresenting) { | 387 if (m_isPresenting) { |
| 351 layers.append(m_layer); | 388 layers.append(m_layer); |
| 352 } | 389 } |
| 353 | 390 |
| 354 return layers; | 391 return layers; |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 381 gl->ClearColor((idx & 255) / 255.0f, ((idx >> 8) & 255) / 255.0f, | 418 gl->ClearColor((idx & 255) / 255.0f, ((idx >> 8) & 255) / 255.0f, |
| 382 ((idx >> 16) & 255) / 255.0f, 1.0f); | 419 ((idx >> 16) & 255) / 255.0f, 1.0f); |
| 383 gl->Clear(GL_COLOR_BUFFER_BIT); | 420 gl->Clear(GL_COLOR_BUFFER_BIT); |
| 384 | 421 |
| 385 // Set the GL state back to what was set by the WebVR application. | 422 // Set the GL state back to what was set by the WebVR application. |
| 386 m_renderingContext->restoreScissorEnabled(); | 423 m_renderingContext->restoreScissorEnabled(); |
| 387 m_renderingContext->restoreScissorBox(); | 424 m_renderingContext->restoreScissorBox(); |
| 388 m_renderingContext->restoreColorMask(); | 425 m_renderingContext->restoreColorMask(); |
| 389 m_renderingContext->restoreClearColor(); | 426 m_renderingContext->restoreClearColor(); |
| 390 | 427 |
| 391 controller()->submitFrame(m_displayId, m_framePose.Clone()); | 428 if (!m_service) |
| 429 return; | |
| 430 | |
| 431 m_service->SubmitFrame(m_framePose.Clone()); | |
| 392 m_canUpdateFramePose = true; | 432 m_canUpdateFramePose = true; |
| 393 } | 433 } |
| 394 | 434 |
| 435 void VRDisplay::OnDisplayChanged(device::blink::VRDisplayPtr display) { | |
| 436 update(display); | |
| 437 } | |
| 438 | |
| 439 void VRDisplay::OnExitPresent() { | |
| 440 forceExitPresent(); | |
| 441 } | |
| 442 | |
| 443 void VRDisplay::OnDisplayConnected(device::blink::VRDisplayPtr display) { | |
| 444 update(display); | |
| 445 | |
| 446 m_navigatorVR->fireVREvent(VRDisplayEvent::create( | |
| 447 EventTypeNames::vrdisplayconnect, true, false, this, "connect")); | |
| 448 } | |
| 449 | |
| 450 void VRDisplay::OnDisplayDisconnected() { | |
| 451 m_navigatorVR->fireVREvent(VRDisplayEvent::create( | |
| 452 EventTypeNames::vrdisplaydisconnect, true, false, this, "disconnect")); | |
| 453 } | |
| 454 | |
| 395 void VRDisplay::onFullscreenCheck(TimerBase*) { | 455 void VRDisplay::onFullscreenCheck(TimerBase*) { |
| 396 // TODO: This is a temporary measure to track if fullscreen mode has been | 456 // TODO: This is a temporary measure to track if fullscreen mode has been |
| 397 // exited by the UA. If so we need to end VR presentation. Soon we won't | 457 // exited by the UA. If so we need to end VR presentation. Soon we won't |
| 398 // depend on the Fullscreen API to fake VR presentation, so this will | 458 // depend on the Fullscreen API to fake VR presentation, so this will |
| 399 // become unnessecary. Until that point, though, this seems preferable to | 459 // become unnessecary. Until that point, though, this seems preferable to |
| 400 // adding a bunch of notification plumbing to Fullscreen. | 460 // adding a bunch of notification plumbing to Fullscreen. |
| 401 if (!Fullscreen::isCurrentFullScreenElement(*m_layer.source())) { | 461 if (!Fullscreen::isCurrentFullScreenElement(*m_layer.source())) { |
| 402 m_isPresenting = false; | 462 m_isPresenting = false; |
| 403 m_navigatorVR->fireVRDisplayPresentChange(this); | 463 m_navigatorVR->fireVRDisplayPresentChange(this); |
| 404 m_fullscreenCheckTimer.stop(); | 464 m_fullscreenCheckTimer.stop(); |
| 405 controller()->exitPresent(m_displayId); | 465 if (!m_service) |
| 466 return; | |
| 467 m_service->ExitPresent(); | |
| 406 } | 468 } |
| 407 } | 469 } |
| 408 | 470 |
| 471 void VRDisplay::RegisterDisplayService() { | |
| 472 m_service->RegisterDisplayService(m_binding.CreateInterfacePtrAndBind()); | |
|
leonhsl(Using Gerrit)
2016/10/17 09:03:29
As mentioned before, m_binding can only be bound o
shaobo.yan
2016/10/18 01:10:48
Yes. Will update it.
| |
| 473 } | |
| 474 | |
| 475 void VRDisplay::shutdownMessagePipe() { | |
| 476 m_binding.Close(); | |
| 477 } | |
| 478 | |
| 409 DEFINE_TRACE(VRDisplay) { | 479 DEFINE_TRACE(VRDisplay) { |
| 410 visitor->trace(m_navigatorVR); | 480 visitor->trace(m_navigatorVR); |
| 411 visitor->trace(m_capabilities); | 481 visitor->trace(m_capabilities); |
| 412 visitor->trace(m_stageParameters); | 482 visitor->trace(m_stageParameters); |
| 413 visitor->trace(m_eyeParametersLeft); | 483 visitor->trace(m_eyeParametersLeft); |
| 414 visitor->trace(m_eyeParametersRight); | 484 visitor->trace(m_eyeParametersRight); |
| 415 visitor->trace(m_layer); | 485 visitor->trace(m_layer); |
| 416 visitor->trace(m_renderingContext); | 486 visitor->trace(m_renderingContext); |
| 417 } | 487 } |
| 418 | 488 |
| 419 } // namespace blink | 489 } // namespace blink |
| OLD | NEW |