Chromium Code Reviews| 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 47f8f8db5280b30ee0bea3bddf19f69c99830ccc..024e760e4607112835590ee5794de826e8487f28 100644 |
| --- a/content/browser/renderer_host/render_widget_host_view_android.cc |
| +++ b/content/browser/renderer_host/render_widget_host_view_android.cc |
| @@ -870,15 +870,16 @@ void RenderWidgetHostViewAndroid::CopyFromCompositingSurface( |
| const ReadbackRequestCallback& callback, |
| const SkColorType preferred_color_type) { |
| TRACE_EVENT0("cc", "RenderWidgetHostViewAndroid::CopyFromCompositingSurface"); |
| - if (!host_ || host_->is_hidden()) { |
| + if (!host_ || host_->is_hidden() || !IsSurfaceAvailableForCopy()) { |
| callback.Run(SkBitmap(), READBACK_SURFACE_UNAVAILABLE); |
| return; |
| } |
| - base::TimeTicks start_time = base::TimeTicks::Now(); |
| - if (!IsSurfaceAvailableForCopy()) { |
| - callback.Run(SkBitmap(), READBACK_SURFACE_UNAVAILABLE); |
| + if (!content_view_core_ || !(content_view_core_->GetWindowAndroid())) { |
| + callback.Run(SkBitmap(), READBACK_FAILED); |
| return; |
| } |
| + |
| + base::TimeTicks start_time = base::TimeTicks::Now(); |
| const display::Display& display = |
| display::Screen::GetScreen()->GetPrimaryDisplay(); |
| float device_scale_factor = display.device_scale_factor(); |
| @@ -895,20 +896,18 @@ void RenderWidgetHostViewAndroid::CopyFromCompositingSurface( |
| return; |
| } |
| - if (!content_view_core_ || !(content_view_core_->GetWindowAndroid())) { |
| - callback.Run(SkBitmap(), READBACK_FAILED); |
| - return; |
| - } |
| ui::WindowAndroidCompositor* compositor = |
| content_view_core_->GetWindowAndroid()->GetCompositor(); |
| DCHECK(compositor); |
| DCHECK(!surface_id_.is_null()); |
| std::unique_ptr<cc::CopyOutputRequest> request = |
| - cc::CopyOutputRequest::CreateRequest( |
| - base::Bind(&PrepareTextureCopyOutputResult, dst_size_in_pixel, |
| - preferred_color_type, start_time, callback)); |
| + cc::CopyOutputRequest::CreateRequest(base::Bind( |
| + &PrepareTextureCopyOutputResult, AsWeakPtr(), dst_size_in_pixel, |
| + preferred_color_type, start_time, callback)); |
| if (!src_subrect_in_pixel.IsEmpty()) |
| request->set_area(src_subrect_in_pixel); |
| + // Lock the surface before placing the CopyOutputRequest. |
|
no sievers
2016/06/01 22:32:06
nit: I'd say 'Make sure the layer doesn't get dele
sivag
2016/06/02 14:34:50
Done.
|
| + LockCompositingSurface(); |
| layer_->RequestCopyOfOutput(std::move(request)); |
| } |
| @@ -1928,6 +1927,7 @@ void RenderWidgetHostViewAndroid::OnLostResources() { |
| // static |
| void RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult( |
| + base::WeakPtr<RenderWidgetHostViewAndroid> rwhva, |
| const gfx::Size& dst_size_in_pixel, |
| SkColorType color_type, |
| const base::TimeTicks& start_time, |
| @@ -1937,9 +1937,23 @@ void RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult( |
| base::Bind(callback, SkBitmap(), READBACK_FAILED)); |
| TRACE_EVENT0("cc", |
| "RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult"); |
| - |
| + if (!rwhva) |
|
no sievers
2016/06/01 22:32:06
When RWHVA goes away the layer goes away, which me
sivag
2016/06/02 14:34:50
Done.
|
| + return; |
| + // Unlock surface after recieving texture as response. |
| + rwhva->UnlockCompositingSurface(); |
| if (!result->HasTexture() || result->IsEmpty() || result->size().IsEmpty()) |
| return; |
| + cc::TextureMailbox texture_mailbox; |
| + std::unique_ptr<cc::SingleReleaseCallback> release_callback; |
| + result->TakeTexture(&texture_mailbox, &release_callback); |
| + DCHECK(texture_mailbox.IsTexture()); |
| + if (!texture_mailbox.IsTexture()) |
| + return; |
| + display_compositor::GLHelper* gl_helper = GetPostReadbackGLHelper(); |
| + if (!gl_helper) |
| + return; |
| + if (!gl_helper->IsReadbackConfigSupported(color_type)) |
| + color_type = kRGBA_8888_SkColorType; |
| gfx::Size output_size_in_pixel; |
| if (dst_size_in_pixel.IsEmpty()) |
| @@ -1947,11 +1961,6 @@ void RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult( |
| else |
| output_size_in_pixel = dst_size_in_pixel; |
| - display_compositor::GLHelper* gl_helper = GetPostReadbackGLHelper(); |
| - if (!gl_helper) |
| - return; |
| - if (!gl_helper->IsReadbackConfigSupported(color_type)) |
| - color_type = kRGBA_8888_SkColorType; |
| std::unique_ptr<SkBitmap> bitmap(new SkBitmap); |
| if (!bitmap->tryAllocPixels(SkImageInfo::Make(output_size_in_pixel.width(), |
| output_size_in_pixel.height(), |
| @@ -1966,13 +1975,6 @@ void RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult( |
| new SkAutoLockPixels(*bitmap)); |
| uint8_t* pixels = static_cast<uint8_t*>(bitmap->getPixels()); |
| - cc::TextureMailbox texture_mailbox; |
| - std::unique_ptr<cc::SingleReleaseCallback> release_callback; |
| - result->TakeTexture(&texture_mailbox, &release_callback); |
| - DCHECK(texture_mailbox.IsTexture()); |
| - if (!texture_mailbox.IsTexture()) |
| - return; |
| - |
| ignore_result(scoped_callback_runner.Release()); |
| gl_helper->CropScaleReadbackAndCleanMailbox( |