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

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

Issue 2584953002: exo::CompositorFrameSinkHolder's release callbacks hold ref (Closed)
Patch Set: NOT FOR COMMIT: Buffer references sink_holder 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::AddResourceReleaseCallback(
reveman 2017/01/02 19:57:56 nit: SetResourceReleaseCallback
34 cc::ResourceId id, 33 cc::ResourceId id,
35 std::unique_ptr<cc::SingleReleaseCallback> callback) { 34 std::unique_ptr<cc::SingleReleaseCallback> callback) {
36 release_callbacks_[id] = std::make_pair(this, std::move(callback)); 35 release_callbacks_[id] = std::move(callback);
37 } 36 }
38 37
39 void CompositorFrameSinkHolder::ActivateFrameCallbacks( 38 void CompositorFrameSinkHolder::ActivateFrameCallbacks(
40 std::list<FrameCallback>* frame_callbacks) { 39 std::list<FrameCallback>* frame_callbacks) {
41 active_frame_callbacks_.splice(active_frame_callbacks_.end(), 40 active_frame_callbacks_.splice(active_frame_callbacks_.end(),
42 *frame_callbacks); 41 *frame_callbacks);
43 UpdateNeedsBeginFrame(); 42 UpdateNeedsBeginFrame();
44 } 43 }
45 44
46 void CompositorFrameSinkHolder::CancelFrameCallbacks() { 45 void CompositorFrameSinkHolder::CancelFrameCallbacks() {
(...skipping 30 matching lines...) Expand all
77 active_frame_callbacks_.pop_front(); 76 active_frame_callbacks_.pop_front();
78 } 77 }
79 begin_frame_source_->OnBeginFrame(args); 78 begin_frame_source_->OnBeginFrame(args);
80 } 79 }
81 80
82 void CompositorFrameSinkHolder::ReclaimResources( 81 void CompositorFrameSinkHolder::ReclaimResources(
83 const cc::ReturnedResourceArray& resources) { 82 const cc::ReturnedResourceArray& resources) {
84 for (auto& resource : resources) { 83 for (auto& resource : resources) {
85 auto it = release_callbacks_.find(resource.id); 84 auto it = release_callbacks_.find(resource.id);
86 DCHECK(it != release_callbacks_.end()); 85 DCHECK(it != release_callbacks_.end());
87 std::unique_ptr<cc::SingleReleaseCallback> callback = 86 bool will_run = base::ThreadTaskRunnerHandle::Get()->PostTask(
reveman 2017/01/02 19:57:56 If you remove the reset of the sink holder in Buff
88 std::move(it->second.second); 87 FROM_HERE, base::Bind(&cc::SingleReleaseCallback::Run,
88 base::Passed(std::move(it->second)),
89 resource.sync_token, resource.lost));
90 DCHECK(will_run);
89 release_callbacks_.erase(it); 91 release_callbacks_.erase(it);
90 callback->Run(resource.sync_token, resource.lost);
91 } 92 }
92 } 93 }
93 94
94 void CompositorFrameSinkHolder::WillDrawSurface() { 95 void CompositorFrameSinkHolder::WillDrawSurface() {
95 if (surface_) 96 if (surface_)
96 surface_->WillDraw(); 97 surface_->WillDraw();
97 98
98 UpdateNeedsBeginFrame(); 99 UpdateNeedsBeginFrame();
99 } 100 }
100 101
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
134 135
135 bool needs_begin_frame = !active_frame_callbacks_.empty(); 136 bool needs_begin_frame = !active_frame_callbacks_.empty();
136 if (needs_begin_frame == needs_begin_frame_) 137 if (needs_begin_frame == needs_begin_frame_)
137 return; 138 return;
138 139
139 needs_begin_frame_ = needs_begin_frame; 140 needs_begin_frame_ = needs_begin_frame;
140 OnNeedsBeginFrames(needs_begin_frame_); 141 OnNeedsBeginFrames(needs_begin_frame_);
141 } 142 }
142 143
143 } // namespace exo 144 } // namespace exo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698