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

Unified Diff: blimp/client/core/compositor/blimp_compositor.cc

Issue 2320923002: Add a full Blimp integration test. (Closed)
Patch Set: Fix build break with chrome embedder 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 side-by-side diff with in-line comments
Download patch
Index: blimp/client/core/compositor/blimp_compositor.cc
diff --git a/blimp/client/core/compositor/blimp_compositor.cc b/blimp/client/core/compositor/blimp_compositor.cc
index 370047a6e03c73a85aca3bf0b77e3e04a6074f5e..7bafcb53f85aa284c565fb81fb07a5a8f90ac6cb 100644
--- a/blimp/client/core/compositor/blimp_compositor.cc
+++ b/blimp/client/core/compositor/blimp_compositor.cc
@@ -68,6 +68,7 @@ BlimpCompositor::BlimpCompositor(
output_surface_request_pending_(false),
layer_(cc::Layer::Create()),
remote_proto_channel_receiver_(nullptr),
+ outstanding_commits_(0U),
weak_ptr_factory_(this) {
DCHECK(thread_checker_.CalledOnValidThread());
@@ -84,10 +85,15 @@ BlimpCompositor::~BlimpCompositor() {
DestroyLayerTreeHost();
GetEmbedderDeps()->GetSurfaceManager()->InvalidateSurfaceClientId(
surface_id_allocator_->client_id());
+
+ CheckPendingCommitCounts(true /* flush */);
}
void BlimpCompositor::SetVisible(bool visible) {
host_->SetVisible(visible);
+
+ if (!visible)
+ CheckPendingCommitCounts(true /* flush */);
}
bool BlimpCompositor::OnTouchEvent(const ui::MotionEvent& motion_event) {
@@ -96,6 +102,16 @@ bool BlimpCompositor::OnTouchEvent(const ui::MotionEvent& motion_event) {
return false;
}
+void BlimpCompositor::NotifyWhenDonePendingCommits(base::Closure callback) {
+ if (outstanding_commits_ == 0) {
+ base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, callback);
+ return;
+ }
+
+ pending_commit_trackers_.push_back(
+ std::make_pair(outstanding_commits_, callback));
+}
+
void BlimpCompositor::RequestNewOutputSurface() {
DCHECK(!surface_factory_);
DCHECK(!output_surface_request_pending_);
@@ -112,6 +128,11 @@ void BlimpCompositor::DidInitializeOutputSurface() {
void BlimpCompositor::DidCommitAndDrawFrame() {
BlimpStats::GetInstance()->Add(BlimpStats::COMMIT, 1);
+
+ DCHECK_GT(outstanding_commits_, 0U);
+ outstanding_commits_--;
+
+ CheckPendingCommitCounts(false /* flush */);
}
void BlimpCompositor::SetProtoReceiver(ProtoReceiver* receiver) {
@@ -129,6 +150,12 @@ void BlimpCompositor::OnCompositorMessageReceived(
const cc::proto::CompositorMessageToImpl& to_impl_proto = message->to_impl();
DCHECK(to_impl_proto.has_message_type());
+
+ if (to_impl_proto.message_type() ==
+ cc::proto::CompositorMessageToImpl::START_COMMIT) {
+ outstanding_commits_++;
+ }
+
switch (to_impl_proto.message_type()) {
case cc::proto::CompositorMessageToImpl::UNKNOWN:
NOTIMPLEMENTED() << "Ignoring message of UNKNOWN type";
@@ -314,5 +341,17 @@ void BlimpCompositor::DestroyLayerTreeHost() {
DCHECK(!remote_proto_channel_receiver_);
}
+void BlimpCompositor::CheckPendingCommitCounts(bool flush) {
+ for (auto it = pending_commit_trackers_.begin();
+ it != pending_commit_trackers_.end();) {
+ if (flush || --it->first == 0) {
+ it->second.Run();
+ it = pending_commit_trackers_.erase(it);
+ } else {
+ ++it;
+ }
+ }
+}
+
} // namespace client
} // namespace blimp
« no previous file with comments | « blimp/client/core/compositor/blimp_compositor.h ('k') | blimp/client/core/compositor/blimp_compositor_dependencies.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698