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

Side by Side Diff: blimp/client/core/compositor/blimp_compositor.cc

Issue 2320923002: Add a full Blimp integration test. (Closed)
Patch Set: Addressed more comments, added thread restriction bypass for tests. Created 4 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
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "blimp/client/core/compositor/blimp_compositor.h" 5 #include "blimp/client/core/compositor/blimp_compositor.h"
6 6
7 #include "base/bind_helpers.h" 7 #include "base/bind_helpers.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/memory/ptr_util.h" 9 #include "base/memory/ptr_util.h"
10 #include "base/numerics/safe_conversions.h" 10 #include "base/numerics/safe_conversions.h"
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 BlimpCompositorDependencies* compositor_dependencies, 61 BlimpCompositorDependencies* compositor_dependencies,
62 BlimpCompositorClient* client) 62 BlimpCompositorClient* client)
63 : render_widget_id_(render_widget_id), 63 : render_widget_id_(render_widget_id),
64 client_(client), 64 client_(client),
65 compositor_dependencies_(compositor_dependencies), 65 compositor_dependencies_(compositor_dependencies),
66 host_should_be_visible_(false), 66 host_should_be_visible_(false),
67 output_surface_(nullptr), 67 output_surface_(nullptr),
68 output_surface_request_pending_(false), 68 output_surface_request_pending_(false),
69 layer_(cc::Layer::Create()), 69 layer_(cc::Layer::Create()),
70 remote_proto_channel_receiver_(nullptr), 70 remote_proto_channel_receiver_(nullptr),
71 outstanding_commits_(0U),
71 weak_ptr_factory_(this) { 72 weak_ptr_factory_(this) {
72 DCHECK(thread_checker_.CalledOnValidThread()); 73 DCHECK(thread_checker_.CalledOnValidThread());
73 74
74 surface_id_allocator_ = base::MakeUnique<cc::SurfaceIdAllocator>( 75 surface_id_allocator_ = base::MakeUnique<cc::SurfaceIdAllocator>(
75 GetEmbedderDeps()->AllocateSurfaceClientId()); 76 GetEmbedderDeps()->AllocateSurfaceClientId());
76 GetEmbedderDeps()->GetSurfaceManager()->RegisterSurfaceClientId( 77 GetEmbedderDeps()->GetSurfaceManager()->RegisterSurfaceClientId(
77 surface_id_allocator_->client_id()); 78 surface_id_allocator_->client_id());
78 } 79 }
79 80
80 BlimpCompositor::~BlimpCompositor() { 81 BlimpCompositor::~BlimpCompositor() {
81 DCHECK(thread_checker_.CalledOnValidThread()); 82 DCHECK(thread_checker_.CalledOnValidThread());
82 83
83 if (host_) 84 if (host_)
84 DestroyLayerTreeHost(); 85 DestroyLayerTreeHost();
85 86
86 GetEmbedderDeps()->GetSurfaceManager()->InvalidateSurfaceClientId( 87 GetEmbedderDeps()->GetSurfaceManager()->InvalidateSurfaceClientId(
87 surface_id_allocator_->client_id()); 88 surface_id_allocator_->client_id());
89
90 CheckPendingCommitCounts(true /* flush */);
88 } 91 }
89 92
90 void BlimpCompositor::SetVisible(bool visible) { 93 void BlimpCompositor::SetVisible(bool visible) {
91 host_should_be_visible_ = visible; 94 host_should_be_visible_ = visible;
92 if (host_) 95 if (host_)
93 host_->SetVisible(host_should_be_visible_); 96 host_->SetVisible(host_should_be_visible_);
97
98 if (!visible)
99 CheckPendingCommitCounts(true /* flush */);
94 } 100 }
95 101
96 bool BlimpCompositor::OnTouchEvent(const ui::MotionEvent& motion_event) { 102 bool BlimpCompositor::OnTouchEvent(const ui::MotionEvent& motion_event) {
97 if (input_manager_) 103 if (input_manager_)
98 return input_manager_->OnTouchEvent(motion_event); 104 return input_manager_->OnTouchEvent(motion_event);
99 return false; 105 return false;
100 } 106 }
101 107
108 void BlimpCompositor::NotifyWhenDonePendingCommits(base::Closure callback) {
109 if (outstanding_commits_ == 0 || !host_ || !host_should_be_visible_) {
110 callback.Run();
111 return;
112 }
113
114 pending_commit_trackers_.push_back(
115 std::make_pair(outstanding_commits_, callback));
116 }
117
102 void BlimpCompositor::RequestNewOutputSurface() { 118 void BlimpCompositor::RequestNewOutputSurface() {
103 DCHECK(!surface_factory_); 119 DCHECK(!surface_factory_);
104 DCHECK(!output_surface_request_pending_); 120 DCHECK(!output_surface_request_pending_);
105 121
106 output_surface_request_pending_ = true; 122 output_surface_request_pending_ = true;
107 GetEmbedderDeps()->GetContextProviders( 123 GetEmbedderDeps()->GetContextProviders(
108 base::Bind(&BlimpCompositor::OnContextProvidersCreated, 124 base::Bind(&BlimpCompositor::OnContextProvidersCreated,
109 weak_ptr_factory_.GetWeakPtr())); 125 weak_ptr_factory_.GetWeakPtr()));
110 } 126 }
111 127
112 void BlimpCompositor::DidInitializeOutputSurface() { 128 void BlimpCompositor::DidInitializeOutputSurface() {
113 output_surface_request_pending_ = false; 129 output_surface_request_pending_ = false;
114 } 130 }
115 131
116 void BlimpCompositor::DidCommitAndDrawFrame() { 132 void BlimpCompositor::DidCommitAndDrawFrame() {
117 BlimpStats::GetInstance()->Add(BlimpStats::COMMIT, 1); 133 BlimpStats::GetInstance()->Add(BlimpStats::COMMIT, 1);
134
135 DCHECK_GT(outstanding_commits_, 0U);
136 outstanding_commits_--;
137
138 CheckPendingCommitCounts(false /* flush */);
118 } 139 }
119 140
120 void BlimpCompositor::SetProtoReceiver(ProtoReceiver* receiver) { 141 void BlimpCompositor::SetProtoReceiver(ProtoReceiver* receiver) {
121 remote_proto_channel_receiver_ = receiver; 142 remote_proto_channel_receiver_ = receiver;
122 } 143 }
123 144
124 void BlimpCompositor::SendCompositorProto( 145 void BlimpCompositor::SendCompositorProto(
125 const cc::proto::CompositorMessage& proto) { 146 const cc::proto::CompositorMessage& proto) {
126 client_->SendCompositorMessage(render_widget_id_, proto); 147 client_->SendCompositorMessage(render_widget_id_, proto);
127 } 148 }
128 149
129 void BlimpCompositor::OnCompositorMessageReceived( 150 void BlimpCompositor::OnCompositorMessageReceived(
130 std::unique_ptr<cc::proto::CompositorMessage> message) { 151 std::unique_ptr<cc::proto::CompositorMessage> message) {
131 DCHECK(message->has_to_impl()); 152 DCHECK(message->has_to_impl());
132 const cc::proto::CompositorMessageToImpl& to_impl_proto = message->to_impl(); 153 const cc::proto::CompositorMessageToImpl& to_impl_proto = message->to_impl();
133 154
134 DCHECK(to_impl_proto.has_message_type()); 155 DCHECK(to_impl_proto.has_message_type());
156
157 if (to_impl_proto.message_type() ==
158 cc::proto::CompositorMessageToImpl::START_COMMIT) {
159 outstanding_commits_++;
160 }
161
135 switch (to_impl_proto.message_type()) { 162 switch (to_impl_proto.message_type()) {
136 case cc::proto::CompositorMessageToImpl::UNKNOWN: 163 case cc::proto::CompositorMessageToImpl::UNKNOWN:
137 NOTIMPLEMENTED() << "Ignoring message of UNKNOWN type"; 164 NOTIMPLEMENTED() << "Ignoring message of UNKNOWN type";
138 break; 165 break;
139 case cc::proto::CompositorMessageToImpl::INITIALIZE_IMPL: 166 case cc::proto::CompositorMessageToImpl::INITIALIZE_IMPL:
140 DCHECK(!host_); 167 DCHECK(!host_);
141 DCHECK(to_impl_proto.has_initialize_impl_message()); 168 DCHECK(to_impl_proto.has_initialize_impl_message());
142 169
143 // Create the remote client LayerTreeHost for the compositor. 170 // Create the remote client LayerTreeHost for the compositor.
144 CreateLayerTreeHost(to_impl_proto.initialize_impl_message()); 171 CreateLayerTreeHost(to_impl_proto.initialize_impl_message());
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
322 input_manager_.reset(); 349 input_manager_.reset();
323 350
324 // Cancel any outstanding OutputSurface requests. That way if we get an async 351 // Cancel any outstanding OutputSurface requests. That way if we get an async
325 // callback related to the old request we know to drop it. 352 // callback related to the old request we know to drop it.
326 output_surface_request_pending_ = false; 353 output_surface_request_pending_ = false;
327 354
328 // Make sure we don't have a receiver at this point. 355 // Make sure we don't have a receiver at this point.
329 DCHECK(!remote_proto_channel_receiver_); 356 DCHECK(!remote_proto_channel_receiver_);
330 } 357 }
331 358
359 void BlimpCompositor::CheckPendingCommitCounts(bool flush) {
360 for (auto it = pending_commit_trackers_.begin();
361 it != pending_commit_trackers_.end();) {
362 if (flush || --it->first == 0) {
363 it->second.Run();
364 it = pending_commit_trackers_.erase(it);
365 } else {
366 ++it;
367 }
368 }
369 }
370
332 } // namespace client 371 } // namespace client
333 } // namespace blimp 372 } // namespace blimp
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698