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/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/FrameRequestCallback.h" | 9 #include "core/dom/FrameRequestCallback.h" |
| 10 #include "core/dom/ScriptedAnimationController.h" | 10 #include "core/dom/ScriptedAnimationController.h" |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 122 switch (StringToVREye(which_eye)) { | 122 switch (StringToVREye(which_eye)) { |
| 123 case kVREyeLeft: | 123 case kVREyeLeft: |
| 124 return eye_parameters_left_; | 124 return eye_parameters_left_; |
| 125 case kVREyeRight: | 125 case kVREyeRight: |
| 126 return eye_parameters_right_; | 126 return eye_parameters_right_; |
| 127 default: | 127 default: |
| 128 return nullptr; | 128 return nullptr; |
| 129 } | 129 } |
| 130 } | 130 } |
| 131 | 131 |
| 132 int VRDisplay::requestAnimationFrame(FrameRequestCallback* callback) { | 132 void VRDisplay::RequestVSync() { |
| 133 DVLOG(2) << __FUNCTION__; | 133 if (pending_vsync_ || !pending_vrdisplay_raf_) |
| 134 Document* doc = this->GetDocument(); | 134 return; |
| 135 if (!doc) | 135 |
| 136 return 0; | |
| 137 pending_vrdisplay_raf_ = true; | |
| 138 if (!vr_v_sync_provider_.is_bound()) { | 136 if (!vr_v_sync_provider_.is_bound()) { |
| 139 ConnectVSyncProvider(); | 137 ConnectVSyncProvider(); |
| 140 } else if (!display_blurred_ && !pending_vsync_) { | 138 } else if (!display_blurred_ && !pending_vsync_) { |
| 141 pending_vsync_ = true; | 139 pending_vsync_ = true; |
| 142 vr_v_sync_provider_->GetVSync(ConvertToBaseCallback( | 140 vr_v_sync_provider_->GetVSync(ConvertToBaseCallback( |
| 143 WTF::Bind(&VRDisplay::OnVSync, WrapWeakPersistent(this)))); | 141 WTF::Bind(&VRDisplay::OnVSync, WrapWeakPersistent(this)))); |
| 144 } | 142 } |
| 143 } | |
| 144 | |
| 145 int VRDisplay::requestAnimationFrame(FrameRequestCallback* callback) { | |
| 146 DVLOG(2) << __FUNCTION__; | |
| 147 Document* doc = this->GetDocument(); | |
| 148 if (!doc) | |
| 149 return 0; | |
| 150 pending_vrdisplay_raf_ = true; | |
| 151 if (did_submit_this_frame_) { | |
| 152 RequestVSync(); | |
| 153 } | |
|
bajones
2017/05/18 15:59:18
I'm not sure what this call site provides? Seems l
mthiesse
2017/05/18 16:09:01
This code is all really subtle and kind of scary.
klausw
2017/05/18 22:22:29
I've added a detailed explanation in RequestVSync,
| |
| 145 callback->use_legacy_time_base_ = false; | 154 callback->use_legacy_time_base_ = false; |
| 146 return EnsureScriptedAnimationController(doc).RegisterCallback(callback); | 155 return EnsureScriptedAnimationController(doc).RegisterCallback(callback); |
| 147 } | 156 } |
| 148 | 157 |
| 149 void VRDisplay::cancelAnimationFrame(int id) { | 158 void VRDisplay::cancelAnimationFrame(int id) { |
| 150 DVLOG(2) << __FUNCTION__; | 159 DVLOG(2) << __FUNCTION__; |
| 151 if (!scripted_animation_controller_) | 160 if (!scripted_animation_controller_) |
| 152 return; | 161 return; |
| 153 scripted_animation_controller_->CancelCallback(id); | 162 scripted_animation_controller_->CancelCallback(id); |
| 154 } | 163 } |
| (...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 599 } | 608 } |
| 600 } | 609 } |
| 601 } | 610 } |
| 602 | 611 |
| 603 pending_previous_frame_render_ = true; | 612 pending_previous_frame_render_ = true; |
| 604 pending_submit_frame_ = true; | 613 pending_submit_frame_ = true; |
| 605 display_->SubmitFrame( | 614 display_->SubmitFrame( |
| 606 vr_frame_id_, | 615 vr_frame_id_, |
| 607 gpu::MailboxHolder(static_image->GetMailbox(), | 616 gpu::MailboxHolder(static_image->GetMailbox(), |
| 608 static_image->GetSyncToken(), GL_TEXTURE_2D)); | 617 static_image->GetSyncToken(), GL_TEXTURE_2D)); |
| 618 did_submit_this_frame_ = true; | |
| 619 RequestVSync(); | |
| 609 | 620 |
| 610 // If preserveDrawingBuffer is false, must clear now. Normally this | 621 // If preserveDrawingBuffer is false, must clear now. Normally this |
| 611 // happens as part of compositing, but that's not active while | 622 // happens as part of compositing, but that's not active while |
| 612 // presenting, so run the responsible code directly. | 623 // presenting, so run the responsible code directly. |
| 613 rendering_context_->MarkCompositedAndClearBackbufferIfNeeded(); | 624 rendering_context_->MarkCompositedAndClearBackbufferIfNeeded(); |
| 614 | 625 |
| 615 // If we're not deferring the wait for transferring the mailbox, | 626 // If we're not deferring the wait for transferring the mailbox, |
| 616 // we need to wait for it now to prevent the image going out of | 627 // we need to wait for it now to prevent the image going out of |
| 617 // scope before its mailbox is retrieved. | 628 // scope before its mailbox is retrieved. |
| 618 if (!wait_for_previous_transfer_to_finish) { | 629 if (!wait_for_previous_transfer_to_finish) { |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 749 } | 760 } |
| 750 | 761 |
| 751 TRACE_EVENT1("gpu", "VRDisplay::OnVSync", "frame", vr_frame_id_); | 762 TRACE_EVENT1("gpu", "VRDisplay::OnVSync", "frame", vr_frame_id_); |
| 752 | 763 |
| 753 if (pending_vrdisplay_raf_ && scripted_animation_controller_) { | 764 if (pending_vrdisplay_raf_ && scripted_animation_controller_) { |
| 754 // Run the callback, making sure that in_animation_frame_ is only | 765 // Run the callback, making sure that in_animation_frame_ is only |
| 755 // true for the vrDisplay rAF and not for a legacy window rAF | 766 // true for the vrDisplay rAF and not for a legacy window rAF |
| 756 // that may be called later. | 767 // that may be called later. |
| 757 AutoReset<bool> animating(&in_animation_frame_, true); | 768 AutoReset<bool> animating(&in_animation_frame_, true); |
| 758 pending_vrdisplay_raf_ = false; | 769 pending_vrdisplay_raf_ = false; |
| 770 did_submit_this_frame_ = false; | |
| 759 scripted_animation_controller_->ServiceScriptedAnimations(timestamp); | 771 scripted_animation_controller_->ServiceScriptedAnimations(timestamp); |
| 772 if (!did_submit_this_frame_) { | |
| 773 DVLOG(2) << __FUNCTION__ << ": vrDisplay.rAF did not submit a frame"; | |
| 774 RequestVSync(); | |
| 775 } | |
| 760 } | 776 } |
| 761 | 777 |
|
mthiesse
2017/05/18 16:09:01
Add a DCHECK here that if pending_vrdisplay_raf_ i
klausw
2017/05/18 22:22:29
Done.
| |
| 762 // For GVR, we shut down normal vsync processing during VR presentation. | 778 // For GVR, we shut down normal vsync processing during VR presentation. |
| 763 // Trigger any callbacks on window.rAF manually so that they run after | 779 // Trigger any callbacks on window.rAF manually so that they run after |
| 764 // completing the vrDisplay.rAF processing. | 780 // completing the vrDisplay.rAF processing. |
| 765 if (is_presenting_ && !capabilities_->hasExternalDisplay()) { | 781 if (is_presenting_ && !capabilities_->hasExternalDisplay()) { |
| 766 Platform::Current()->CurrentThread()->GetWebTaskRunner()->PostTask( | 782 Platform::Current()->CurrentThread()->GetWebTaskRunner()->PostTask( |
| 767 BLINK_FROM_HERE, WTF::Bind(&VRDisplay::ProcessScheduledWindowAnimations, | 783 BLINK_FROM_HERE, WTF::Bind(&VRDisplay::ProcessScheduledWindowAnimations, |
| 768 WrapWeakPersistent(this), timestamp)); | 784 WrapWeakPersistent(this), timestamp)); |
| 769 } | 785 } |
| 770 } | 786 } |
| 771 | 787 |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 881 visitor->Trace(stage_parameters_); | 897 visitor->Trace(stage_parameters_); |
| 882 visitor->Trace(eye_parameters_left_); | 898 visitor->Trace(eye_parameters_left_); |
| 883 visitor->Trace(eye_parameters_right_); | 899 visitor->Trace(eye_parameters_right_); |
| 884 visitor->Trace(layer_); | 900 visitor->Trace(layer_); |
| 885 visitor->Trace(rendering_context_); | 901 visitor->Trace(rendering_context_); |
| 886 visitor->Trace(scripted_animation_controller_); | 902 visitor->Trace(scripted_animation_controller_); |
| 887 visitor->Trace(pending_present_resolvers_); | 903 visitor->Trace(pending_present_resolvers_); |
| 888 } | 904 } |
| 889 | 905 |
| 890 } // namespace blink | 906 } // namespace blink |
| OLD | NEW |