| 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 "components/exo/compositor_frame_sink_holder.h" | 5 #include "components/exo/compositor_frame_sink_holder.h" |
| 6 | 6 |
| 7 #include "cc/resources/returned_resource.h" | 7 #include "cc/resources/returned_resource.h" |
| 8 #include "components/exo/surface.h" | 8 #include "components/exo/surface.h" |
| 9 | 9 |
| 10 namespace exo { | 10 namespace exo { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 29 return release_callbacks_.find(id) != release_callbacks_.end(); | 29 return release_callbacks_.find(id) != release_callbacks_.end(); |
| 30 } | 30 } |
| 31 | 31 |
| 32 void CompositorFrameSinkHolder::SetResourceReleaseCallback( | 32 void CompositorFrameSinkHolder::SetResourceReleaseCallback( |
| 33 cc::ResourceId id, | 33 cc::ResourceId id, |
| 34 const cc::ReleaseCallback& callback) { | 34 const cc::ReleaseCallback& callback) { |
| 35 DCHECK(!callback.is_null()); | 35 DCHECK(!callback.is_null()); |
| 36 release_callbacks_[id] = callback; | 36 release_callbacks_[id] = callback; |
| 37 } | 37 } |
| 38 | 38 |
| 39 void CompositorFrameSinkHolder::ActivateFrameCallbacks( | |
| 40 std::list<FrameCallback>* frame_callbacks) { | |
| 41 active_frame_callbacks_.splice(active_frame_callbacks_.end(), | |
| 42 *frame_callbacks); | |
| 43 UpdateNeedsBeginFrame(); | |
| 44 } | |
| 45 | |
| 46 void CompositorFrameSinkHolder::CancelFrameCallbacks() { | |
| 47 // Call pending frame callbacks with a null frame time to indicate that they | |
| 48 // have been cancelled. | |
| 49 for (const auto& frame_callback : active_frame_callbacks_) | |
| 50 frame_callback.Run(base::TimeTicks()); | |
| 51 } | |
| 52 | |
| 53 void CompositorFrameSinkHolder::SetNeedsBeginFrame(bool needs_begin_frame) { | 39 void CompositorFrameSinkHolder::SetNeedsBeginFrame(bool needs_begin_frame) { |
| 54 needs_begin_frame_ = needs_begin_frame; | 40 needs_begin_frame_ = needs_begin_frame; |
| 55 OnNeedsBeginFrames(needs_begin_frame); | 41 OnNeedsBeginFrames(needs_begin_frame); |
| 56 } | 42 } |
| 57 | 43 |
| 58 void CompositorFrameSinkHolder::Satisfy(const cc::SurfaceSequence& sequence) { | 44 void CompositorFrameSinkHolder::Satisfy(const cc::SurfaceSequence& sequence) { |
| 59 frame_sink_->Satisfy(sequence); | 45 frame_sink_->Satisfy(sequence); |
| 60 } | 46 } |
| 61 | 47 |
| 62 void CompositorFrameSinkHolder::Require(const cc::SurfaceId& id, | 48 void CompositorFrameSinkHolder::Require(const cc::SurfaceId& id, |
| 63 const cc::SurfaceSequence& sequence) { | 49 const cc::SurfaceSequence& sequence) { |
| 64 frame_sink_->Require(id.local_frame_id(), sequence); | 50 frame_sink_->Require(id.local_frame_id(), sequence); |
| 65 } | 51 } |
| 66 | 52 |
| 67 //////////////////////////////////////////////////////////////////////////////// | 53 //////////////////////////////////////////////////////////////////////////////// |
| 68 // cc::mojom::MojoCompositorFrameSinkClient overrides: | 54 // cc::mojom::MojoCompositorFrameSinkClient overrides: |
| 69 | 55 |
| 70 void CompositorFrameSinkHolder::DidReceiveCompositorFrameAck() { | 56 void CompositorFrameSinkHolder::DidReceiveCompositorFrameAck() { |
| 71 // TODO(staraz): Implement this | 57 // TODO(staraz): Implement this |
| 72 } | 58 } |
| 73 | 59 |
| 74 void CompositorFrameSinkHolder::OnBeginFrame(const cc::BeginFrameArgs& args) { | 60 void CompositorFrameSinkHolder::OnBeginFrame(const cc::BeginFrameArgs& args) { |
| 75 while (!active_frame_callbacks_.empty()) { | 61 if (surface_) |
| 76 active_frame_callbacks_.front().Run(args.frame_time); | 62 surface_->BeginFrame(args.frame_time); |
| 77 active_frame_callbacks_.pop_front(); | 63 |
| 78 } | |
| 79 begin_frame_source_->OnBeginFrame(args); | 64 begin_frame_source_->OnBeginFrame(args); |
| 80 } | 65 } |
| 81 | 66 |
| 82 void CompositorFrameSinkHolder::ReclaimResources( | 67 void CompositorFrameSinkHolder::ReclaimResources( |
| 83 const cc::ReturnedResourceArray& resources) { | 68 const cc::ReturnedResourceArray& resources) { |
| 84 for (auto& resource : resources) { | 69 for (auto& resource : resources) { |
| 85 auto it = release_callbacks_.find(resource.id); | 70 auto it = release_callbacks_.find(resource.id); |
| 86 DCHECK(it != release_callbacks_.end()); | 71 DCHECK(it != release_callbacks_.end()); |
| 87 if (it != release_callbacks_.end()) { | 72 if (it != release_callbacks_.end()) { |
| 88 it->second.Run(resource.sync_token, resource.lost); | 73 it->second.Run(resource.sync_token, resource.lost); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 128 | 113 |
| 129 CompositorFrameSinkHolder::~CompositorFrameSinkHolder() { | 114 CompositorFrameSinkHolder::~CompositorFrameSinkHolder() { |
| 130 if (surface_) | 115 if (surface_) |
| 131 surface_->RemoveSurfaceObserver(this); | 116 surface_->RemoveSurfaceObserver(this); |
| 132 } | 117 } |
| 133 | 118 |
| 134 void CompositorFrameSinkHolder::UpdateNeedsBeginFrame() { | 119 void CompositorFrameSinkHolder::UpdateNeedsBeginFrame() { |
| 135 if (!begin_frame_source_) | 120 if (!begin_frame_source_) |
| 136 return; | 121 return; |
| 137 | 122 |
| 138 bool needs_begin_frame = !active_frame_callbacks_.empty(); | 123 bool needs_begin_frame = surface_ && surface_->NeedsBeginFrame(); |
| 139 if (needs_begin_frame == needs_begin_frame_) | 124 if (needs_begin_frame == needs_begin_frame_) |
| 140 return; | 125 return; |
| 141 | 126 |
| 142 needs_begin_frame_ = needs_begin_frame; | 127 needs_begin_frame_ = needs_begin_frame; |
| 143 OnNeedsBeginFrames(needs_begin_frame_); | 128 OnNeedsBeginFrames(needs_begin_frame_); |
| 144 } | 129 } |
| 145 | 130 |
| 146 } // namespace exo | 131 } // namespace exo |
| OLD | NEW |