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

Unified Diff: content/renderer/browser_plugin/browser_plugin_compositing_helper.cc

Issue 24278007: Fix <webview> with software compositor (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 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: content/renderer/browser_plugin/browser_plugin_compositing_helper.cc
diff --git a/content/renderer/browser_plugin/browser_plugin_compositing_helper.cc b/content/renderer/browser_plugin/browser_plugin_compositing_helper.cc
index c7e1ae88432ec02735720527f98aa4cb5bfcab7b..c7a4758365e34bdb17dd0b5bb3148395d7f5255f 100644
--- a/content/renderer/browser_plugin/browser_plugin_compositing_helper.cc
+++ b/content/renderer/browser_plugin/browser_plugin_compositing_helper.cc
@@ -41,6 +41,7 @@ BrowserPluginCompositingHelper::BrowserPluginCompositingHelper(
last_host_id_(0),
last_mailbox_valid_(false),
ack_pending_(true),
+ software_ack_pending_(false),
container_(container),
browser_plugin_manager_(manager) {
}
@@ -49,6 +50,24 @@ BrowserPluginCompositingHelper::~BrowserPluginCompositingHelper() {
}
void BrowserPluginCompositingHelper::DidCommitCompositorFrame() {
+ if (software_ack_pending_) {
+ cc::CompositorFrameAck ack;
+ if (!unacked_software_frames_.empty()) {
+ ack.last_software_frame_id = unacked_software_frames_.back();
+ unacked_software_frames_.pop_back();
+ }
+
+ browser_plugin_manager_->Send(
+ new BrowserPluginHostMsg_CompositorFrameACK(
+ host_routing_id_,
+ instance_id_,
+ last_route_id_,
+ last_output_surface_id_,
+ last_host_id_,
+ ack));
+
+ software_ack_pending_ = false;
+ }
if (!delegated_layer_.get() || !ack_pending_)
return;
@@ -112,6 +131,9 @@ void BrowserPluginCompositingHelper::MailboxReleased(
last_route_id_ != mailbox.route_id)
return;
+ if (mailbox.type == SOFTWARE_COMPOSITOR_FRAME)
+ unacked_software_frames_.push_back(mailbox.software_frame_id);
+
// We need to send an ACK to for every buffer sent to us.
// However, if a buffer is freed up from
// the compositor in cases like switching back to SW mode without a new
@@ -152,20 +174,8 @@ void BrowserPluginCompositingHelper::MailboxReleased(
ack));
break;
}
- case SOFTWARE_COMPOSITOR_FRAME: {
- cc::CompositorFrameAck ack;
- ack.last_software_frame_id = mailbox.software_frame_id;
-
- browser_plugin_manager_->Send(
- new BrowserPluginHostMsg_CompositorFrameACK(
- host_routing_id_,
- instance_id_,
- mailbox.route_id,
- mailbox.output_surface_id,
- mailbox.host_id,
- ack));
+ case SOFTWARE_COMPOSITOR_FRAME:
break;
- }
}
}
@@ -310,14 +320,19 @@ void BrowserPluginCompositingHelper::OnCompositorFrameSwapped(
LOG(ERROR) << "Failed to map shared memory of size "
<< size_in_bytes;
// Send ACK right away.
- ack_pending_ = true;
+ software_ack_pending_ = true;
MailboxReleased(swap_info, 0, false);
+ DidCommitCompositorFrame();
return;
}
swap_info.shared_memory = shared_memory.release();
OnBuffersSwappedPrivate(swap_info, 0,
frame->metadata.device_scale_factor);
+ software_ack_pending_ = true;
+ last_route_id_ = route_id;
+ last_output_surface_id_ = output_surface_id;
+ last_host_id_ = host_id;
return;
}

Powered by Google App Engine
This is Rietveld 408576698