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

Side by Side Diff: content/browser/renderer_host/render_widget_host_view_android.cc

Issue 2021003002: LockCompositingSurface to make sure frame is not evicted. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "content/browser/renderer_host/render_widget_host_view_android.h" 5 #include "content/browser/renderer_host/render_widget_host_view_android.h"
6 6
7 #include <android/bitmap.h> 7 #include <android/bitmap.h>
8 8
9 #include <utility> 9 #include <utility>
10 10
(...skipping 852 matching lines...) Expand 10 before | Expand all | Expand 10 after
863 host_->SetBackgroundOpaque(GetBackgroundOpaque()); 863 host_->SetBackgroundOpaque(GetBackgroundOpaque());
864 UpdateBackgroundColor(color); 864 UpdateBackgroundColor(color);
865 } 865 }
866 866
867 void RenderWidgetHostViewAndroid::CopyFromCompositingSurface( 867 void RenderWidgetHostViewAndroid::CopyFromCompositingSurface(
868 const gfx::Rect& src_subrect, 868 const gfx::Rect& src_subrect,
869 const gfx::Size& dst_size, 869 const gfx::Size& dst_size,
870 const ReadbackRequestCallback& callback, 870 const ReadbackRequestCallback& callback,
871 const SkColorType preferred_color_type) { 871 const SkColorType preferred_color_type) {
872 TRACE_EVENT0("cc", "RenderWidgetHostViewAndroid::CopyFromCompositingSurface"); 872 TRACE_EVENT0("cc", "RenderWidgetHostViewAndroid::CopyFromCompositingSurface");
873 if (!host_ || host_->is_hidden()) { 873 if (!host_ || host_->is_hidden() || !IsSurfaceAvailableForCopy()) {
874 callback.Run(SkBitmap(), READBACK_SURFACE_UNAVAILABLE); 874 callback.Run(SkBitmap(), READBACK_SURFACE_UNAVAILABLE);
875 return; 875 return;
876 } 876 }
877 base::TimeTicks start_time = base::TimeTicks::Now(); 877 if (!content_view_core_ || !(content_view_core_->GetWindowAndroid())) {
878 if (!IsSurfaceAvailableForCopy()) { 878 callback.Run(SkBitmap(), READBACK_FAILED);
879 callback.Run(SkBitmap(), READBACK_SURFACE_UNAVAILABLE);
880 return; 879 return;
881 } 880 }
881
882 base::TimeTicks start_time = base::TimeTicks::Now();
882 const display::Display& display = 883 const display::Display& display =
883 display::Screen::GetScreen()->GetPrimaryDisplay(); 884 display::Screen::GetScreen()->GetPrimaryDisplay();
884 float device_scale_factor = display.device_scale_factor(); 885 float device_scale_factor = display.device_scale_factor();
885 gfx::Size dst_size_in_pixel = 886 gfx::Size dst_size_in_pixel =
886 gfx::ConvertRectToPixel(device_scale_factor, gfx::Rect(dst_size)).size(); 887 gfx::ConvertRectToPixel(device_scale_factor, gfx::Rect(dst_size)).size();
887 gfx::Rect src_subrect_in_pixel = 888 gfx::Rect src_subrect_in_pixel =
888 gfx::ConvertRectToPixel(device_scale_factor, src_subrect); 889 gfx::ConvertRectToPixel(device_scale_factor, src_subrect);
889 890
890 if (!using_browser_compositor_) { 891 if (!using_browser_compositor_) {
891 SynchronousCopyContents(src_subrect_in_pixel, dst_size_in_pixel, callback, 892 SynchronousCopyContents(src_subrect_in_pixel, dst_size_in_pixel, callback,
892 preferred_color_type); 893 preferred_color_type);
893 UMA_HISTOGRAM_TIMES("Compositing.CopyFromSurfaceTimeSynchronous", 894 UMA_HISTOGRAM_TIMES("Compositing.CopyFromSurfaceTimeSynchronous",
894 base::TimeTicks::Now() - start_time); 895 base::TimeTicks::Now() - start_time);
895 return; 896 return;
896 } 897 }
897 898
898 if (!content_view_core_ || !(content_view_core_->GetWindowAndroid())) {
899 callback.Run(SkBitmap(), READBACK_FAILED);
900 return;
901 }
902 ui::WindowAndroidCompositor* compositor = 899 ui::WindowAndroidCompositor* compositor =
903 content_view_core_->GetWindowAndroid()->GetCompositor(); 900 content_view_core_->GetWindowAndroid()->GetCompositor();
904 DCHECK(compositor); 901 DCHECK(compositor);
905 DCHECK(!surface_id_.is_null()); 902 DCHECK(!surface_id_.is_null());
906 std::unique_ptr<cc::CopyOutputRequest> request = 903 std::unique_ptr<cc::CopyOutputRequest> request =
907 cc::CopyOutputRequest::CreateRequest( 904 cc::CopyOutputRequest::CreateRequest(base::Bind(
908 base::Bind(&PrepareTextureCopyOutputResult, dst_size_in_pixel, 905 &PrepareTextureCopyOutputResult, AsWeakPtr(), dst_size_in_pixel,
909 preferred_color_type, start_time, callback)); 906 preferred_color_type, start_time, callback));
910 if (!src_subrect_in_pixel.IsEmpty()) 907 if (!src_subrect_in_pixel.IsEmpty())
911 request->set_area(src_subrect_in_pixel); 908 request->set_area(src_subrect_in_pixel);
909 // 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.
910 LockCompositingSurface();
912 layer_->RequestCopyOfOutput(std::move(request)); 911 layer_->RequestCopyOfOutput(std::move(request));
913 } 912 }
914 913
915 void RenderWidgetHostViewAndroid::CopyFromCompositingSurfaceToVideoFrame( 914 void RenderWidgetHostViewAndroid::CopyFromCompositingSurfaceToVideoFrame(
916 const gfx::Rect& src_subrect, 915 const gfx::Rect& src_subrect,
917 const scoped_refptr<media::VideoFrame>& target, 916 const scoped_refptr<media::VideoFrame>& target,
918 const base::Callback<void(const gfx::Rect&, bool)>& callback) { 917 const base::Callback<void(const gfx::Rect&, bool)>& callback) {
919 NOTIMPLEMENTED(); 918 NOTIMPLEMENTED();
920 callback.Run(gfx::Rect(), false); 919 callback.Run(gfx::Rect(), false);
921 } 920 }
(...skipping 999 matching lines...) Expand 10 before | Expand all | Expand 10 after
1921 DCHECK(ack_callbacks_.empty()); 1920 DCHECK(ack_callbacks_.empty());
1922 } 1921 }
1923 1922
1924 // TODO(wjmaclean): There is significant overlap between 1923 // TODO(wjmaclean): There is significant overlap between
1925 // PrepareTextureCopyOutputResult and CopyFromCompositingSurfaceFinished in 1924 // PrepareTextureCopyOutputResult and CopyFromCompositingSurfaceFinished in
1926 // this file, and the versions in surface_utils.cc. They should 1925 // this file, and the versions in surface_utils.cc. They should
1927 // be merged. See https://crbug.com/582955 1926 // be merged. See https://crbug.com/582955
1928 1927
1929 // static 1928 // static
1930 void RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult( 1929 void RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult(
1930 base::WeakPtr<RenderWidgetHostViewAndroid> rwhva,
1931 const gfx::Size& dst_size_in_pixel, 1931 const gfx::Size& dst_size_in_pixel,
1932 SkColorType color_type, 1932 SkColorType color_type,
1933 const base::TimeTicks& start_time, 1933 const base::TimeTicks& start_time,
1934 const ReadbackRequestCallback& callback, 1934 const ReadbackRequestCallback& callback,
1935 std::unique_ptr<cc::CopyOutputResult> result) { 1935 std::unique_ptr<cc::CopyOutputResult> result) {
1936 base::ScopedClosureRunner scoped_callback_runner( 1936 base::ScopedClosureRunner scoped_callback_runner(
1937 base::Bind(callback, SkBitmap(), READBACK_FAILED)); 1937 base::Bind(callback, SkBitmap(), READBACK_FAILED));
1938 TRACE_EVENT0("cc", 1938 TRACE_EVENT0("cc",
1939 "RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult"); 1939 "RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult");
1940 1940 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.
1941 return;
1942 // Unlock surface after recieving texture as response.
1943 rwhva->UnlockCompositingSurface();
1941 if (!result->HasTexture() || result->IsEmpty() || result->size().IsEmpty()) 1944 if (!result->HasTexture() || result->IsEmpty() || result->size().IsEmpty())
1942 return; 1945 return;
1946 cc::TextureMailbox texture_mailbox;
1947 std::unique_ptr<cc::SingleReleaseCallback> release_callback;
1948 result->TakeTexture(&texture_mailbox, &release_callback);
1949 DCHECK(texture_mailbox.IsTexture());
1950 if (!texture_mailbox.IsTexture())
1951 return;
1952 display_compositor::GLHelper* gl_helper = GetPostReadbackGLHelper();
1953 if (!gl_helper)
1954 return;
1955 if (!gl_helper->IsReadbackConfigSupported(color_type))
1956 color_type = kRGBA_8888_SkColorType;
1943 1957
1944 gfx::Size output_size_in_pixel; 1958 gfx::Size output_size_in_pixel;
1945 if (dst_size_in_pixel.IsEmpty()) 1959 if (dst_size_in_pixel.IsEmpty())
1946 output_size_in_pixel = result->size(); 1960 output_size_in_pixel = result->size();
1947 else 1961 else
1948 output_size_in_pixel = dst_size_in_pixel; 1962 output_size_in_pixel = dst_size_in_pixel;
1949 1963
1950 display_compositor::GLHelper* gl_helper = GetPostReadbackGLHelper();
1951 if (!gl_helper)
1952 return;
1953 if (!gl_helper->IsReadbackConfigSupported(color_type))
1954 color_type = kRGBA_8888_SkColorType;
1955 std::unique_ptr<SkBitmap> bitmap(new SkBitmap); 1964 std::unique_ptr<SkBitmap> bitmap(new SkBitmap);
1956 if (!bitmap->tryAllocPixels(SkImageInfo::Make(output_size_in_pixel.width(), 1965 if (!bitmap->tryAllocPixels(SkImageInfo::Make(output_size_in_pixel.width(),
1957 output_size_in_pixel.height(), 1966 output_size_in_pixel.height(),
1958 color_type, 1967 color_type,
1959 kOpaque_SkAlphaType))) { 1968 kOpaque_SkAlphaType))) {
1960 scoped_callback_runner.Reset( 1969 scoped_callback_runner.Reset(
1961 base::Bind(callback, SkBitmap(), READBACK_BITMAP_ALLOCATION_FAILURE)); 1970 base::Bind(callback, SkBitmap(), READBACK_BITMAP_ALLOCATION_FAILURE));
1962 return; 1971 return;
1963 } 1972 }
1964 1973
1965 std::unique_ptr<SkAutoLockPixels> bitmap_pixels_lock( 1974 std::unique_ptr<SkAutoLockPixels> bitmap_pixels_lock(
1966 new SkAutoLockPixels(*bitmap)); 1975 new SkAutoLockPixels(*bitmap));
1967 uint8_t* pixels = static_cast<uint8_t*>(bitmap->getPixels()); 1976 uint8_t* pixels = static_cast<uint8_t*>(bitmap->getPixels());
1968 1977
1969 cc::TextureMailbox texture_mailbox;
1970 std::unique_ptr<cc::SingleReleaseCallback> release_callback;
1971 result->TakeTexture(&texture_mailbox, &release_callback);
1972 DCHECK(texture_mailbox.IsTexture());
1973 if (!texture_mailbox.IsTexture())
1974 return;
1975
1976 ignore_result(scoped_callback_runner.Release()); 1978 ignore_result(scoped_callback_runner.Release());
1977 1979
1978 gl_helper->CropScaleReadbackAndCleanMailbox( 1980 gl_helper->CropScaleReadbackAndCleanMailbox(
1979 texture_mailbox.mailbox(), texture_mailbox.sync_token(), result->size(), 1981 texture_mailbox.mailbox(), texture_mailbox.sync_token(), result->size(),
1980 gfx::Rect(result->size()), output_size_in_pixel, pixels, color_type, 1982 gfx::Rect(result->size()), output_size_in_pixel, pixels, color_type,
1981 base::Bind(&CopyFromCompositingSurfaceFinished, callback, 1983 base::Bind(&CopyFromCompositingSurfaceFinished, callback,
1982 base::Passed(&release_callback), base::Passed(&bitmap), 1984 base::Passed(&release_callback), base::Passed(&bitmap),
1983 start_time, base::Passed(&bitmap_pixels_lock)), 1985 start_time, base::Passed(&bitmap_pixels_lock)),
1984 display_compositor::GLHelper::SCALER_QUALITY_GOOD); 1986 display_compositor::GLHelper::SCALER_QUALITY_GOOD);
1985 } 1987 }
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
2046 case ui::MotionEvent::ACTION_UP: 2048 case ui::MotionEvent::ACTION_UP:
2047 case ui::MotionEvent::ACTION_POINTER_UP: 2049 case ui::MotionEvent::ACTION_POINTER_UP:
2048 UMA_HISTOGRAM_CUSTOM_COUNTS("Event.Latency.OS.TOUCH_RELEASED", 2050 UMA_HISTOGRAM_CUSTOM_COUNTS("Event.Latency.OS.TOUCH_RELEASED",
2049 delta.InMicroseconds(), 1, 1000000, 50); 2051 delta.InMicroseconds(), 1, 1000000, 50);
2050 default: 2052 default:
2051 return; 2053 return;
2052 } 2054 }
2053 } 2055 }
2054 2056
2055 } // namespace content 2057 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698