Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(755)

Side by Side Diff: cc/scheduler/scheduler_state_machine.cc

Issue 423773002: Unified BeginFrame scheduling (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: WIP in mac and android Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2011 The Chromium Authors. All rights reserved. 1 // Copyright 2011 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 "cc/scheduler/scheduler_state_machine.h" 5 #include "cc/scheduler/scheduler_state_machine.h"
6 6
7 #include "base/debug/trace_event.h" 7 #include "base/debug/trace_event.h"
8 #include "base/debug/trace_event_argument.h" 8 #include "base/debug/trace_event_argument.h"
9 #include "base/format_macros.h" 9 #include "base/format_macros.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 29 matching lines...) Expand all
40 visible_(false), 40 visible_(false),
41 can_start_(false), 41 can_start_(false),
42 can_draw_(false), 42 can_draw_(false),
43 has_pending_tree_(false), 43 has_pending_tree_(false),
44 pending_tree_is_ready_for_activation_(false), 44 pending_tree_is_ready_for_activation_(false),
45 active_tree_needs_first_draw_(false), 45 active_tree_needs_first_draw_(false),
46 did_create_and_initialize_first_output_surface_(false), 46 did_create_and_initialize_first_output_surface_(false),
47 smoothness_takes_priority_(false), 47 smoothness_takes_priority_(false),
48 skip_next_begin_main_frame_to_reduce_latency_(false), 48 skip_next_begin_main_frame_to_reduce_latency_(false),
49 skip_begin_main_frame_to_reduce_latency_(false), 49 skip_begin_main_frame_to_reduce_latency_(false),
50 continuous_painting_(false) { 50 continuous_painting_(false),
51 children_need_begin_frames_(false) {
51 } 52 }
52 53
53 const char* SchedulerStateMachine::OutputSurfaceStateToString( 54 const char* SchedulerStateMachine::OutputSurfaceStateToString(
54 OutputSurfaceState state) { 55 OutputSurfaceState state) {
55 switch (state) { 56 switch (state) {
56 case OUTPUT_SURFACE_ACTIVE: 57 case OUTPUT_SURFACE_ACTIVE:
57 return "OUTPUT_SURFACE_ACTIVE"; 58 return "OUTPUT_SURFACE_ACTIVE";
58 case OUTPUT_SURFACE_LOST: 59 case OUTPUT_SURFACE_LOST:
59 return "OUTPUT_SURFACE_LOST"; 60 return "OUTPUT_SURFACE_LOST";
60 case OUTPUT_SURFACE_CREATING: 61 case OUTPUT_SURFACE_CREATING:
(...skipping 637 matching lines...) Expand 10 before | Expand all | Expand 10 after
698 skip_next_begin_main_frame_to_reduce_latency_ = true; 699 skip_next_begin_main_frame_to_reduce_latency_ = true;
699 } 700 }
700 701
701 bool SchedulerStateMachine::BeginFrameNeeded() const { 702 bool SchedulerStateMachine::BeginFrameNeeded() const {
702 // Proactive BeginFrames are bad for the synchronous compositor because we 703 // Proactive BeginFrames are bad for the synchronous compositor because we
703 // have to draw when we get the BeginFrame and could end up drawing many 704 // have to draw when we get the BeginFrame and could end up drawing many
704 // duplicate frames if our new frame isn't ready in time. 705 // duplicate frames if our new frame isn't ready in time.
705 // To poll for state with the synchronous compositor without having to draw, 706 // To poll for state with the synchronous compositor without having to draw,
706 // we rely on ShouldPollForAnticipatedDrawTriggers instead. 707 // we rely on ShouldPollForAnticipatedDrawTriggers instead.
707 if (!SupportsProactiveBeginFrame()) 708 if (!SupportsProactiveBeginFrame())
708 return BeginFrameNeededToAnimateOrDraw(); 709 return (BeginFrameNeededToAnimateOrDraw() || BeginFrameNeededToChildren());
brianderson 2014/08/28 02:48:07 This should not include BeginFrameNeededToChildren
simonhong 2014/09/03 21:02:23 Done.
709 710
710 return BeginFrameNeededToAnimateOrDraw() || ProactiveBeginFrameWanted(); 711 return (BeginFrameNeededToAnimateOrDraw() ||
712 BeginFrameNeededToChildren() ||
brianderson 2014/08/28 02:48:07 BeginFrameNeededToChildren belongs in ProactiveBeg
simonhong 2014/09/03 21:02:23 How Browser knows whether Renderer is slow or not
brianderson 2014/09/04 18:45:45 Nevermind about my comment here. What you have is
713 ProactiveBeginFrameWanted());
711 } 714 }
712 715
713 bool SchedulerStateMachine::ShouldPollForAnticipatedDrawTriggers() const { 716 bool SchedulerStateMachine::ShouldPollForAnticipatedDrawTriggers() const {
714 // ShouldPollForAnticipatedDrawTriggers is what we use in place of 717 // ShouldPollForAnticipatedDrawTriggers is what we use in place of
715 // ProactiveBeginFrameWanted when we are using the synchronous 718 // ProactiveBeginFrameWanted when we are using the synchronous
716 // compositor. 719 // compositor.
717 if (!SupportsProactiveBeginFrame()) { 720 if (!SupportsProactiveBeginFrame()) {
718 return !BeginFrameNeededToAnimateOrDraw() && ProactiveBeginFrameWanted(); 721 return !BeginFrameNeededToAnimateOrDraw() && ProactiveBeginFrameWanted();
719 } 722 }
720 723
721 // Non synchronous compositors should rely on 724 // Non synchronous compositors should rely on
722 // ProactiveBeginFrameWanted to poll for state instead. 725 // ProactiveBeginFrameWanted to poll for state instead.
723 return false; 726 return false;
724 } 727 }
725 728
726 // Note: If SupportsProactiveBeginFrame is false, the scheduler should poll 729 // Note: If SupportsProactiveBeginFrame is false, the scheduler should poll
727 // for changes in it's draw state so it can request a BeginFrame when it's 730 // for changes in it's draw state so it can request a BeginFrame when it's
728 // actually ready. 731 // actually ready.
729 bool SchedulerStateMachine::SupportsProactiveBeginFrame() const { 732 bool SchedulerStateMachine::SupportsProactiveBeginFrame() const {
730 // It is undesirable to proactively request BeginFrames if we are 733 // It is undesirable to proactively request BeginFrames if we are
731 // using a synchronous compositor because we *must* draw for every 734 // using a synchronous compositor because we *must* draw for every
732 // BeginFrame, which could cause duplicate draws. 735 // BeginFrame, which could cause duplicate draws.
733 return !settings_.using_synchronous_renderer_compositor; 736 return !settings_.using_synchronous_renderer_compositor;
734 } 737 }
735 738
739 void SchedulerStateMachine::SetChildrenNeedBeginFrames(
740 bool children_need_begin_frames) {
741 DCHECK(settings_.begin_frame_publisher && !settings_.begin_frame_receiver);
742 children_need_begin_frames_ = children_need_begin_frames;
743 }
744
736 // These are the cases where we definitely (or almost definitely) have a 745 // These are the cases where we definitely (or almost definitely) have a
737 // new frame to animate and/or draw and can draw. 746 // new frame to animate and/or draw and can draw.
738 bool SchedulerStateMachine::BeginFrameNeededToAnimateOrDraw() const { 747 bool SchedulerStateMachine::BeginFrameNeededToAnimateOrDraw() const {
739 // The output surface is the provider of BeginImplFrames, so we are not going 748 // The output surface is the provider of BeginImplFrames, so we are not going
740 // to get them even if we ask for them. 749 // to get them even if we ask for them.
741 if (!HasInitializedOutputSurface()) 750 if (!HasInitializedOutputSurface())
742 return false; 751 return false;
743 752
744 // If we can't draw, don't tick until we are notified that we can draw again. 753 // If we can't draw, don't tick until we are notified that we can draw again.
745 if (!can_draw_) 754 if (!can_draw_)
(...skipping 13 matching lines...) Expand all
759 // additional visible tiles. 768 // additional visible tiles.
760 if (swap_used_incomplete_tile_) 769 if (swap_used_incomplete_tile_)
761 return true; 770 return true;
762 771
763 if (needs_animate_) 772 if (needs_animate_)
764 return true; 773 return true;
765 774
766 return needs_redraw_; 775 return needs_redraw_;
767 } 776 }
768 777
778 bool SchedulerStateMachine::BeginFrameNeededToChildren() const {
779 if (!HasInitializedOutputSurface())
780 return false;
781
782 // If we can't draw, don't tick until we are notified that we can draw again.
783 if (!can_draw_)
784 return false;
785
786 return children_need_begin_frames_;
787 }
788
769 // These are cases where we are very likely to draw soon, but might not 789 // These are cases where we are very likely to draw soon, but might not
770 // actually have a new frame to draw when we receive the next BeginImplFrame. 790 // actually have a new frame to draw when we receive the next BeginImplFrame.
771 // Proactively requesting the BeginImplFrame helps hide the round trip latency 791 // Proactively requesting the BeginImplFrame helps hide the round trip latency
772 // of the SetNeedsBeginFrame request that has to go to the Browser. 792 // of the SetNeedsBeginFrame request that has to go to the Browser.
773 bool SchedulerStateMachine::ProactiveBeginFrameWanted() const { 793 bool SchedulerStateMachine::ProactiveBeginFrameWanted() const {
774 // The output surface is the provider of BeginImplFrames, 794 // The output surface is the provider of BeginImplFrames,
775 // so we are not going to get them even if we ask for them. 795 // so we are not going to get them even if we ask for them.
776 if (!HasInitializedOutputSurface()) 796 if (!HasInitializedOutputSurface())
777 return false; 797 return false;
778 798
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after
1073 case OUTPUT_SURFACE_ACTIVE: 1093 case OUTPUT_SURFACE_ACTIVE:
1074 case OUTPUT_SURFACE_WAITING_FOR_FIRST_COMMIT: 1094 case OUTPUT_SURFACE_WAITING_FOR_FIRST_COMMIT:
1075 case OUTPUT_SURFACE_WAITING_FOR_FIRST_ACTIVATION: 1095 case OUTPUT_SURFACE_WAITING_FOR_FIRST_ACTIVATION:
1076 return true; 1096 return true;
1077 } 1097 }
1078 NOTREACHED(); 1098 NOTREACHED();
1079 return false; 1099 return false;
1080 } 1100 }
1081 1101
1082 } // namespace cc 1102 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698