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

Unified Diff: content/browser/renderer_host/render_widget_host_view_android.cc

Issue 174323003: Expose locks for CopyFromCompositingSurface/CopyFromBackingStore API (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: addressed comments Created 6 years, 10 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/browser/renderer_host/render_widget_host_view_android.cc
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc
index dba444dff70b19c755109494fa7471bcc80f3263..12da8878043ea8e31dc051a1fc4f5d6b20a6e664 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.cc
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -147,7 +147,8 @@ RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid(
using_delegated_renderer_(CommandLine::ForCurrentProcess()->HasSwitch(
switches::kEnableDelegatedRenderer) &&
!CommandLine::ForCurrentProcess()->HasSwitch(
- switches::kDisableDelegatedRenderer)) {
+ switches::kDisableDelegatedRenderer)),
+ locks_on_frame_count_(0) {
if (!using_delegated_renderer_) {
texture_layer_ = cc::TextureLayer::Create(NULL);
layer_ = texture_layer_;
@@ -285,6 +286,9 @@ bool RenderWidgetHostViewAndroid::HasValidFrame() const {
if (texture_size_in_layer_.IsEmpty())
return false;
+ if (!frame_evictor_->HasFrame())
+ return false;
+
if (using_delegated_renderer_) {
if (!delegated_renderer_layer_.get())
return false;
@@ -375,16 +379,31 @@ bool RenderWidgetHostViewAndroid::IsShowing() {
return is_showing_ && content_view_core_;
}
-void RenderWidgetHostViewAndroid::LockResources() {
+void RenderWidgetHostViewAndroid::LockSurfaceForCopy() {
DCHECK(HasValidFrame());
DCHECK(host_);
- DCHECK(!host_->is_hidden());
+ DCHECK(frame_evictor_->HasFrame());
frame_evictor_->LockFrame();
+ locks_on_frame_count_++;
}
-void RenderWidgetHostViewAndroid::UnlockResources() {
+void RenderWidgetHostViewAndroid::UnlockSurfaceForCopy() {
+ if (!frame_evictor_->HasFrame() || locks_on_frame_count_ == 0)
+ return;
+
DCHECK(HasValidFrame());
frame_evictor_->UnlockFrame();
+ locks_on_frame_count_--;
+}
+
+void RenderWidgetHostViewAndroid::ReleaseLocksOnSurface() {
+ if (!frame_evictor_->HasFrame()) {
+ DCHECK_EQ(locks_on_frame_count_, 0u);
+ return;
+ }
+ while (locks_on_frame_count_ > 0) {
+ UnlockSurfaceForCopy();
+ }
}
gfx::Rect RenderWidgetHostViewAndroid::GetViewBounds() const {
@@ -808,6 +827,18 @@ void RenderWidgetHostViewAndroid::OnSwapCompositorFrame(
DCHECK(frame->delegated_frame_data);
DCHECK(!frame->delegated_frame_data->render_pass_list.empty());
+ if (locks_on_frame_count_ > 0) {
+ DCHECK(HasValidFrame());
+ base::Closure ack_callback =
+ base::Bind(&RenderWidgetHostViewAndroid::SendDelegatedFrameAck,
+ weak_ptr_factory_.GetWeakPtr(),
+ output_surface_id);
+ if (host_->is_hidden())
+ ack_callback.Run();
+ else
+ ack_callbacks_.push(ack_callback);
+ return;
piman 2014/03/05 20:14:36 So, if my understanding is correct, while there is
powei 2014/03/06 07:41:40 Yes
+ }
cc::RenderPass* root_pass =
frame->delegated_frame_data->render_pass_list.back();
texture_size_in_layer_ = root_pass->output_rect.size();
@@ -1260,6 +1291,9 @@ void RenderWidgetHostViewAndroid::SetContentViewCore(
if (content_view_core_ && !using_synchronous_compositor_)
content_view_core_->GetWindowAndroid()->RemoveObserver(this);
+ if (content_view_core != content_view_core_)
+ ReleaseLocksOnSurface();
+
content_view_core_ = content_view_core;
if (GetBrowserAccessibilityManager()) {
@@ -1293,6 +1327,7 @@ void RenderWidgetHostViewAndroid::OnDetachCompositor() {
}
void RenderWidgetHostViewAndroid::OnLostResources() {
+ ReleaseLocksOnSurface();
if (texture_layer_.get())
texture_layer_->SetIsDrawable(false);
if (delegated_renderer_layer_.get())

Powered by Google App Engine
This is Rietveld 408576698