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

Side by Side Diff: components/exo/compositor_frame_sink_holder.cc

Issue 2584953002: exo::CompositorFrameSinkHolder's release callbacks hold ref (Closed)
Patch Set: All exo unit tests passed. Created 3 years, 11 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
OLDNEW
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 "base/memory/ptr_util.h"
8 #include "cc/resources/returned_resource.h" 7 #include "cc/resources/returned_resource.h"
9 #include "components/exo/surface.h" 8 #include "components/exo/surface.h"
10 9
11 namespace exo { 10 namespace exo {
12 11
13 //////////////////////////////////////////////////////////////////////////////// 12 ////////////////////////////////////////////////////////////////////////////////
14 // CompositorFrameSinkHolder, public: 13 // CompositorFrameSinkHolder, public:
15 14
16 CompositorFrameSinkHolder::CompositorFrameSinkHolder( 15 CompositorFrameSinkHolder::CompositorFrameSinkHolder(
17 Surface* surface, 16 Surface* surface,
18 std::unique_ptr<CompositorFrameSink> frame_sink, 17 std::unique_ptr<CompositorFrameSink> frame_sink,
19 cc::mojom::MojoCompositorFrameSinkClientRequest request) 18 cc::mojom::MojoCompositorFrameSinkClientRequest request)
20 : surface_(surface), 19 : surface_(surface),
21 frame_sink_(std::move(frame_sink)), 20 frame_sink_(std::move(frame_sink)),
22 begin_frame_source_(base::MakeUnique<cc::ExternalBeginFrameSource>(this)), 21 begin_frame_source_(base::MakeUnique<cc::ExternalBeginFrameSource>(this)),
23 binding_(this, std::move(request)), 22 binding_(this, std::move(request)),
24 weak_factory_(this) { 23 weak_factory_(this) {
25 surface_->AddSurfaceObserver(this); 24 surface_->AddSurfaceObserver(this);
26 } 25 }
27 26
28 bool CompositorFrameSinkHolder::HasReleaseCallbackForResource( 27 bool CompositorFrameSinkHolder::HasReleaseCallbackForResource(
29 cc::ResourceId id) { 28 cc::ResourceId id) {
30 return release_callbacks_.find(id) != release_callbacks_.end(); 29 return release_callbacks_.find(id) != release_callbacks_.end();
31 } 30 }
32 31
33 void CompositorFrameSinkHolder::AddResourceReleaseCallback( 32 void CompositorFrameSinkHolder::SetResourceReleaseCallback(
34 cc::ResourceId id, 33 cc::ResourceId id,
35 std::unique_ptr<cc::SingleReleaseCallback> callback) { 34 const cc::ReleaseCallback& callback) {
36 release_callbacks_[id] = std::make_pair(this, std::move(callback)); 35 DCHECK(callback);
reveman 2017/01/03 23:24:47 nit: DCHECK(!callback.is_null())
Alex Z. 2017/01/03 23:39:15 Done.
36 release_callbacks_[id] = callback;
37 } 37 }
38 38
39 void CompositorFrameSinkHolder::ActivateFrameCallbacks( 39 void CompositorFrameSinkHolder::ActivateFrameCallbacks(
40 std::list<FrameCallback>* frame_callbacks) { 40 std::list<FrameCallback>* frame_callbacks) {
41 active_frame_callbacks_.splice(active_frame_callbacks_.end(), 41 active_frame_callbacks_.splice(active_frame_callbacks_.end(),
42 *frame_callbacks); 42 *frame_callbacks);
43 UpdateNeedsBeginFrame(); 43 UpdateNeedsBeginFrame();
44 } 44 }
45 45
46 void CompositorFrameSinkHolder::CancelFrameCallbacks() { 46 void CompositorFrameSinkHolder::CancelFrameCallbacks() {
(...skipping 30 matching lines...) Expand all
77 active_frame_callbacks_.pop_front(); 77 active_frame_callbacks_.pop_front();
78 } 78 }
79 begin_frame_source_->OnBeginFrame(args); 79 begin_frame_source_->OnBeginFrame(args);
80 } 80 }
81 81
82 void CompositorFrameSinkHolder::ReclaimResources( 82 void CompositorFrameSinkHolder::ReclaimResources(
83 const cc::ReturnedResourceArray& resources) { 83 const cc::ReturnedResourceArray& resources) {
84 for (auto& resource : resources) { 84 for (auto& resource : resources) {
85 auto it = release_callbacks_.find(resource.id); 85 auto it = release_callbacks_.find(resource.id);
86 DCHECK(it != release_callbacks_.end()); 86 DCHECK(it != release_callbacks_.end());
87 std::unique_ptr<cc::SingleReleaseCallback> callback = 87 if (it != release_callbacks_.end()) {
88 std::move(it->second.second); 88 it->second.Run(resource.sync_token, resource.lost);
89 release_callbacks_.erase(it); 89 release_callbacks_.erase(it);
90 callback->Run(resource.sync_token, resource.lost); 90 }
91 } 91 }
92 } 92 }
93 93
94 void CompositorFrameSinkHolder::WillDrawSurface() { 94 void CompositorFrameSinkHolder::WillDrawSurface() {
95 if (surface_) 95 if (surface_)
96 surface_->WillDraw(); 96 surface_->WillDraw();
97 97
98 UpdateNeedsBeginFrame(); 98 UpdateNeedsBeginFrame();
99 } 99 }
100 100
(...skipping 18 matching lines...) Expand all
119 // SurfaceObserver overrides: 119 // SurfaceObserver overrides:
120 120
121 void CompositorFrameSinkHolder::OnSurfaceDestroying(Surface* surface) { 121 void CompositorFrameSinkHolder::OnSurfaceDestroying(Surface* surface) {
122 surface_->RemoveSurfaceObserver(this); 122 surface_->RemoveSurfaceObserver(this);
123 surface_ = nullptr; 123 surface_ = nullptr;
124 } 124 }
125 125
126 //////////////////////////////////////////////////////////////////////////////// 126 ////////////////////////////////////////////////////////////////////////////////
127 // ExoComopositorFrameSink, private: 127 // ExoComopositorFrameSink, private:
128 128
129 CompositorFrameSinkHolder::~CompositorFrameSinkHolder() {} 129 CompositorFrameSinkHolder::~CompositorFrameSinkHolder() {
130 if (surface_)
131 surface_->RemoveSurfaceObserver(this);
132 }
130 133
131 void CompositorFrameSinkHolder::UpdateNeedsBeginFrame() { 134 void CompositorFrameSinkHolder::UpdateNeedsBeginFrame() {
132 if (!begin_frame_source_) 135 if (!begin_frame_source_)
133 return; 136 return;
134 137
135 bool needs_begin_frame = !active_frame_callbacks_.empty(); 138 bool needs_begin_frame = !active_frame_callbacks_.empty();
136 if (needs_begin_frame == needs_begin_frame_) 139 if (needs_begin_frame == needs_begin_frame_)
137 return; 140 return;
138 141
139 needs_begin_frame_ = needs_begin_frame; 142 needs_begin_frame_ = needs_begin_frame;
140 OnNeedsBeginFrames(needs_begin_frame_); 143 OnNeedsBeginFrames(needs_begin_frame_);
141 } 144 }
142 145
143 } // namespace exo 146 } // namespace exo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698