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

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: SEGV_MAPERR in Callback::Run() 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 std::unique_ptr<cc::ReleaseCallback> callback) {
36 release_callbacks_[id] = std::make_pair(this, std::move(callback)); 35 printf("CompositorFrameSinkHolder::SetResourceReleaseCallback()\n");
36 DCHECK(callback);
37 release_callbacks_[id] = std::move(callback);
37 } 38 }
38 39
39 void CompositorFrameSinkHolder::ActivateFrameCallbacks( 40 void CompositorFrameSinkHolder::ActivateFrameCallbacks(
40 std::list<FrameCallback>* frame_callbacks) { 41 std::list<FrameCallback>* frame_callbacks) {
41 active_frame_callbacks_.splice(active_frame_callbacks_.end(), 42 active_frame_callbacks_.splice(active_frame_callbacks_.end(),
42 *frame_callbacks); 43 *frame_callbacks);
43 UpdateNeedsBeginFrame(); 44 UpdateNeedsBeginFrame();
44 } 45 }
45 46
46 void CompositorFrameSinkHolder::CancelFrameCallbacks() { 47 void CompositorFrameSinkHolder::CancelFrameCallbacks() {
(...skipping 27 matching lines...) Expand all
74 void CompositorFrameSinkHolder::OnBeginFrame(const cc::BeginFrameArgs& args) { 75 void CompositorFrameSinkHolder::OnBeginFrame(const cc::BeginFrameArgs& args) {
75 while (!active_frame_callbacks_.empty()) { 76 while (!active_frame_callbacks_.empty()) {
76 active_frame_callbacks_.front().Run(args.frame_time); 77 active_frame_callbacks_.front().Run(args.frame_time);
77 active_frame_callbacks_.pop_front(); 78 active_frame_callbacks_.pop_front();
78 } 79 }
79 begin_frame_source_->OnBeginFrame(args); 80 begin_frame_source_->OnBeginFrame(args);
80 } 81 }
81 82
82 void CompositorFrameSinkHolder::ReclaimResources( 83 void CompositorFrameSinkHolder::ReclaimResources(
83 const cc::ReturnedResourceArray& resources) { 84 const cc::ReturnedResourceArray& resources) {
85 printf("CompositorFrameSinkHolder::ReclaimResources()\n");
84 for (auto& resource : resources) { 86 for (auto& resource : resources) {
85 auto it = release_callbacks_.find(resource.id); 87 auto it = release_callbacks_.find(resource.id);
86 DCHECK(it != release_callbacks_.end()); 88 DCHECK(it != release_callbacks_.end());
87 std::unique_ptr<cc::SingleReleaseCallback> callback = 89 printf("it != release_callbacks_.end()\n");
88 std::move(it->second.second); 90 DCHECK(it->second);
91 printf("Running\n");
92 it->second->Run(resource.sync_token, resource.lost);
93 printf("it->second->Run().\n");
89 release_callbacks_.erase(it); 94 release_callbacks_.erase(it);
90 callback->Run(resource.sync_token, resource.lost);
91 } 95 }
92 } 96 }
93 97
94 void CompositorFrameSinkHolder::WillDrawSurface() { 98 void CompositorFrameSinkHolder::WillDrawSurface() {
95 if (surface_) 99 if (surface_)
96 surface_->WillDraw(); 100 surface_->WillDraw();
97 101
98 UpdateNeedsBeginFrame(); 102 UpdateNeedsBeginFrame();
99 } 103 }
100 104
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
134 138
135 bool needs_begin_frame = !active_frame_callbacks_.empty(); 139 bool needs_begin_frame = !active_frame_callbacks_.empty();
136 if (needs_begin_frame == needs_begin_frame_) 140 if (needs_begin_frame == needs_begin_frame_)
137 return; 141 return;
138 142
139 needs_begin_frame_ = needs_begin_frame; 143 needs_begin_frame_ = needs_begin_frame;
140 OnNeedsBeginFrames(needs_begin_frame_); 144 OnNeedsBeginFrames(needs_begin_frame_);
141 } 145 }
142 146
143 } // namespace exo 147 } // namespace exo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698