| 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::Error 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::Error::ERROR_NONE: |
| 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::Error::ERROR_TRY_AGAIN: |
| 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 case device::mojom::blink::VRVSyncProvider::Error::ERROR_BAD_REQUEST: |
| 661 return; | 662 // The renderer will probably be killed at this point. |
| 663 return; |
| 662 } | 664 } |
| 665 m_pendingVsync = false; |
| 663 if (m_displayBlurred) | 666 if (m_displayBlurred) |
| 664 return; | 667 return; |
| 665 if (!m_scriptedAnimationController) | 668 if (!m_scriptedAnimationController) |
| 666 return; | 669 return; |
| 667 Document* doc = this->document(); | 670 Document* doc = this->document(); |
| 668 if (!doc) | 671 if (!doc) |
| 669 return; | 672 return; |
| 670 | 673 |
| 674 WTF::TimeDelta timeDelta = |
| 675 WTF::TimeDelta::FromMicroseconds(time->microseconds); |
| 671 // Ensure a consistent timebase with document rAF. | 676 // Ensure a consistent timebase with document rAF. |
| 672 if (m_timebase < 0) { | 677 if (m_timebase < 0) { |
| 673 m_timebase = WTF::monotonicallyIncreasingTime() - timeDelta.InSecondsF(); | 678 m_timebase = WTF::monotonicallyIncreasingTime() - timeDelta.InSecondsF(); |
| 674 } | 679 } |
| 675 | 680 |
| 676 AutoReset<bool> animating(&m_inAnimationFrame, true); | 681 AutoReset<bool> animating(&m_inAnimationFrame, true); |
| 677 m_framePose = std::move(pose); | 682 m_framePose = std::move(pose); |
| 678 m_vrFrameId = frameId; | 683 m_vrFrameId = frameId; |
| 679 m_pendingRaf = false; | 684 m_pendingRaf = false; |
| 680 m_scriptedAnimationController->serviceScriptedAnimations( | 685 m_scriptedAnimationController->serviceScriptedAnimations( |
| 681 m_timebase + timeDelta.InSecondsF()); | 686 m_timebase + timeDelta.InSecondsF()); |
| 682 } | 687 } |
| 683 | 688 |
| 684 void VRDisplay::ConnectVSyncProvider() { | 689 void VRDisplay::ConnectVSyncProvider() { |
| 685 if (!m_navigatorVR->isFocused()) | 690 if (!m_navigatorVR->isFocused() || m_vrVSyncProvider.is_bound()) |
| 686 return; | 691 return; |
| 687 m_display->GetVRVSyncProvider(mojo::MakeRequest(&m_vrVSyncProvider)); | 692 m_display->GetVRVSyncProvider(mojo::MakeRequest(&m_vrVSyncProvider)); |
| 688 if (m_pendingRaf && !m_displayBlurred) { | 693 if (m_pendingRaf && !m_displayBlurred) { |
| 694 m_pendingVsync = true; |
| 689 m_vrVSyncProvider->GetVSync(convertToBaseCallback( | 695 m_vrVSyncProvider->GetVSync(convertToBaseCallback( |
| 690 WTF::bind(&VRDisplay::OnVSync, wrapWeakPersistent(this)))); | 696 WTF::bind(&VRDisplay::OnVSync, wrapWeakPersistent(this)))); |
| 691 } | 697 } |
| 692 } | 698 } |
| 693 | 699 |
| 694 void VRDisplay::onFullscreenCheck(TimerBase*) { | 700 void VRDisplay::onFullscreenCheck(TimerBase*) { |
| 695 if (!m_isPresenting) { | 701 if (!m_isPresenting) { |
| 696 m_fullscreenCheckTimer.stop(); | 702 m_fullscreenCheckTimer.stop(); |
| 697 return; | 703 return; |
| 698 } | 704 } |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 773 visitor->trace(m_stageParameters); | 779 visitor->trace(m_stageParameters); |
| 774 visitor->trace(m_eyeParametersLeft); | 780 visitor->trace(m_eyeParametersLeft); |
| 775 visitor->trace(m_eyeParametersRight); | 781 visitor->trace(m_eyeParametersRight); |
| 776 visitor->trace(m_layer); | 782 visitor->trace(m_layer); |
| 777 visitor->trace(m_renderingContext); | 783 visitor->trace(m_renderingContext); |
| 778 visitor->trace(m_scriptedAnimationController); | 784 visitor->trace(m_scriptedAnimationController); |
| 779 visitor->trace(m_pendingPresentResolvers); | 785 visitor->trace(m_pendingPresentResolvers); |
| 780 } | 786 } |
| 781 | 787 |
| 782 } // namespace blink | 788 } // namespace blink |
| OLD | NEW |