| 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/css/StylePropertySet.h" | 7 #include "core/css/StylePropertySet.h" |
| 8 #include "core/dom/DOMException.h" | 8 #include "core/dom/DOMException.h" |
| 9 #include "core/dom/DocumentUserGestureToken.h" | 9 #include "core/dom/DocumentUserGestureToken.h" |
| 10 #include "core/dom/FrameRequestCallback.h" | 10 #include "core/dom/FrameRequestCallback.h" |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 154 } | 154 } |
| 155 } | 155 } |
| 156 | 156 |
| 157 int VRDisplay::requestAnimationFrame(FrameRequestCallback* callback) { | 157 int VRDisplay::requestAnimationFrame(FrameRequestCallback* callback) { |
| 158 Document* doc = this->document(); | 158 Document* doc = this->document(); |
| 159 if (!doc) | 159 if (!doc) |
| 160 return 0; | 160 return 0; |
| 161 m_pendingRaf = true; | 161 m_pendingRaf = true; |
| 162 if (!m_vrVSyncProvider.is_bound()) { | 162 if (!m_vrVSyncProvider.is_bound()) { |
| 163 ConnectVSyncProvider(); | 163 ConnectVSyncProvider(); |
| 164 } else if (!m_displayBlurred) { | 164 } else if (!m_displayBlurred && !m_pendingVsync) { |
| 165 m_pendingVsync = true; |
| 165 m_vrVSyncProvider->GetVSync(convertToBaseCallback( | 166 m_vrVSyncProvider->GetVSync(convertToBaseCallback( |
| 166 WTF::bind(&VRDisplay::OnVSync, wrapWeakPersistent(this)))); | 167 WTF::bind(&VRDisplay::OnVSync, wrapWeakPersistent(this)))); |
| 167 } | 168 } |
| 168 callback->m_useLegacyTimeBase = false; | 169 callback->m_useLegacyTimeBase = false; |
| 169 return ensureScriptedAnimationController(doc).registerCallback(callback); | 170 return ensureScriptedAnimationController(doc).registerCallback(callback); |
| 170 } | 171 } |
| 171 | 172 |
| 172 void VRDisplay::cancelAnimationFrame(int id) { | 173 void VRDisplay::cancelAnimationFrame(int id) { |
| 173 if (!m_scriptedAnimationController) | 174 if (!m_scriptedAnimationController) |
| 174 return; | 175 return; |
| (...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 641 } | 642 } |
| 642 | 643 |
| 643 void VRDisplay::OnDeactivate( | 644 void VRDisplay::OnDeactivate( |
| 644 device::mojom::blink::VRDisplayEventReason reason) { | 645 device::mojom::blink::VRDisplayEventReason reason) { |
| 645 m_navigatorVR->enqueueVREvent(VRDisplayEvent::create( | 646 m_navigatorVR->enqueueVREvent(VRDisplayEvent::create( |
| 646 EventTypeNames::vrdisplaydeactivate, true, false, this, reason)); | 647 EventTypeNames::vrdisplaydeactivate, true, false, this, reason)); |
| 647 } | 648 } |
| 648 | 649 |
| 649 void VRDisplay::OnVSync(device::mojom::blink::VRPosePtr pose, | 650 void VRDisplay::OnVSync(device::mojom::blink::VRPosePtr pose, |
| 650 mojo::common::mojom::blink::TimeDeltaPtr time, | 651 mojo::common::mojom::blink::TimeDeltaPtr time, |
| 651 int16_t frameId) { | 652 int16_t frameId, |
| 652 WTF::TimeDelta timeDelta = | 653 device::mojom::blink::VRVSyncProvider::Status error) { |
| 653 WTF::TimeDelta::FromMicroseconds(time->microseconds); | 654 switch (error) { |
| 654 // The VSync provider cannot shut down before replying to pending callbacks, | 655 case device::mojom::blink::VRVSyncProvider::Status::SUCCESS: |
| 655 // so it will send a null pose with no timestamp to be ignored. | 656 break; |
| 656 if (pose.is_null() && timeDelta.is_zero()) { | 657 case device::mojom::blink::VRVSyncProvider::Status::RETRY: |
| 657 // We need to keep the VSync loop going because we haven't responded to the | 658 m_vrVSyncProvider->GetVSync(convertToBaseCallback( |
| 658 // previous rAF yet. | 659 WTF::bind(&VRDisplay::OnVSync, wrapWeakPersistent(this)))); |
| 659 m_vrVSyncProvider->GetVSync(convertToBaseCallback( | 660 return; |
| 660 WTF::bind(&VRDisplay::OnVSync, wrapWeakPersistent(this)))); | |
| 661 return; | |
| 662 } | 661 } |
| 662 m_pendingVsync = false; |
| 663 if (m_displayBlurred) | 663 if (m_displayBlurred) |
| 664 return; | 664 return; |
| 665 if (!m_scriptedAnimationController) | 665 if (!m_scriptedAnimationController) |
| 666 return; | 666 return; |
| 667 Document* doc = this->document(); | 667 Document* doc = this->document(); |
| 668 if (!doc) | 668 if (!doc) |
| 669 return; | 669 return; |
| 670 | 670 |
| 671 WTF::TimeDelta timeDelta = |
| 672 WTF::TimeDelta::FromMicroseconds(time->microseconds); |
| 671 // Ensure a consistent timebase with document rAF. | 673 // Ensure a consistent timebase with document rAF. |
| 672 if (m_timebase < 0) { | 674 if (m_timebase < 0) { |
| 673 m_timebase = WTF::monotonicallyIncreasingTime() - timeDelta.InSecondsF(); | 675 m_timebase = WTF::monotonicallyIncreasingTime() - timeDelta.InSecondsF(); |
| 674 } | 676 } |
| 675 | 677 |
| 676 AutoReset<bool> animating(&m_inAnimationFrame, true); | 678 AutoReset<bool> animating(&m_inAnimationFrame, true); |
| 677 m_framePose = std::move(pose); | 679 m_framePose = std::move(pose); |
| 678 m_vrFrameId = frameId; | 680 m_vrFrameId = frameId; |
| 679 m_pendingRaf = false; | 681 m_pendingRaf = false; |
| 680 m_scriptedAnimationController->serviceScriptedAnimations( | 682 m_scriptedAnimationController->serviceScriptedAnimations( |
| 681 m_timebase + timeDelta.InSecondsF()); | 683 m_timebase + timeDelta.InSecondsF()); |
| 682 } | 684 } |
| 683 | 685 |
| 684 void VRDisplay::ConnectVSyncProvider() { | 686 void VRDisplay::ConnectVSyncProvider() { |
| 685 if (!m_navigatorVR->isFocused()) | 687 if (!m_navigatorVR->isFocused() || m_vrVSyncProvider.is_bound()) |
| 686 return; | 688 return; |
| 687 m_display->GetVRVSyncProvider(mojo::MakeRequest(&m_vrVSyncProvider)); | 689 m_display->GetVRVSyncProvider(mojo::MakeRequest(&m_vrVSyncProvider)); |
| 688 if (m_pendingRaf && !m_displayBlurred) { | 690 if (m_pendingRaf && !m_displayBlurred) { |
| 691 m_pendingVsync = true; |
| 689 m_vrVSyncProvider->GetVSync(convertToBaseCallback( | 692 m_vrVSyncProvider->GetVSync(convertToBaseCallback( |
| 690 WTF::bind(&VRDisplay::OnVSync, wrapWeakPersistent(this)))); | 693 WTF::bind(&VRDisplay::OnVSync, wrapWeakPersistent(this)))); |
| 691 } | 694 } |
| 692 } | 695 } |
| 693 | 696 |
| 694 void VRDisplay::onFullscreenCheck(TimerBase*) { | 697 void VRDisplay::onFullscreenCheck(TimerBase*) { |
| 695 if (!m_isPresenting) { | 698 if (!m_isPresenting) { |
| 696 m_fullscreenCheckTimer.stop(); | 699 m_fullscreenCheckTimer.stop(); |
| 697 return; | 700 return; |
| 698 } | 701 } |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 773 visitor->trace(m_stageParameters); | 776 visitor->trace(m_stageParameters); |
| 774 visitor->trace(m_eyeParametersLeft); | 777 visitor->trace(m_eyeParametersLeft); |
| 775 visitor->trace(m_eyeParametersRight); | 778 visitor->trace(m_eyeParametersRight); |
| 776 visitor->trace(m_layer); | 779 visitor->trace(m_layer); |
| 777 visitor->trace(m_renderingContext); | 780 visitor->trace(m_renderingContext); |
| 778 visitor->trace(m_scriptedAnimationController); | 781 visitor->trace(m_scriptedAnimationController); |
| 779 visitor->trace(m_pendingPresentResolvers); | 782 visitor->trace(m_pendingPresentResolvers); |
| 780 } | 783 } |
| 781 | 784 |
| 782 } // namespace blink | 785 } // namespace blink |
| OLD | NEW |