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

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

Issue 2810813004: Hide fullscreen rotation jank (Closed)
Patch Set: Build error fixes Created 3 years, 7 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 11 matching lines...) Expand all
22 #include "base/single_thread_task_runner.h" 22 #include "base/single_thread_task_runner.h"
23 #include "base/strings/utf_string_conversions.h" 23 #include "base/strings/utf_string_conversions.h"
24 #include "base/sys_info.h" 24 #include "base/sys_info.h"
25 #include "base/threading/thread_task_runner_handle.h" 25 #include "base/threading/thread_task_runner_handle.h"
26 #include "cc/layers/layer.h" 26 #include "cc/layers/layer.h"
27 #include "cc/layers/surface_layer.h" 27 #include "cc/layers/surface_layer.h"
28 #include "cc/output/compositor_frame.h" 28 #include "cc/output/compositor_frame.h"
29 #include "cc/output/copy_output_request.h" 29 #include "cc/output/copy_output_request.h"
30 #include "cc/output/copy_output_result.h" 30 #include "cc/output/copy_output_result.h"
31 #include "cc/output/latency_info_swap_promise.h" 31 #include "cc/output/latency_info_swap_promise.h"
32 #include "cc/quads/solid_color_draw_quad.h"
32 #include "cc/resources/single_release_callback.h" 33 #include "cc/resources/single_release_callback.h"
33 #include "cc/surfaces/surface.h" 34 #include "cc/surfaces/surface.h"
34 #include "cc/surfaces/surface_hittest.h" 35 #include "cc/surfaces/surface_hittest.h"
35 #include "cc/surfaces/surface_manager.h" 36 #include "cc/surfaces/surface_manager.h"
36 #include "cc/trees/layer_tree_host.h" 37 #include "cc/trees/layer_tree_host.h"
37 #include "components/viz/display_compositor/gl_helper.h" 38 #include "components/viz/display_compositor/gl_helper.h"
38 #include "content/browser/accessibility/browser_accessibility_manager_android.h" 39 #include "content/browser/accessibility/browser_accessibility_manager_android.h"
39 #include "content/browser/android/composited_touch_handle_drawable.h" 40 #include "content/browser/android/composited_touch_handle_drawable.h"
40 #include "content/browser/android/content_view_core_impl.h" 41 #include "content/browser/android/content_view_core_impl.h"
41 #include "content/browser/android/ime_adapter_android.h" 42 #include "content/browser/android/ime_adapter_android.h"
(...skipping 510 matching lines...) Expand 10 before | Expand all | Expand 10 after
552 RenderWidgetHostView* reference_host_view) { 553 RenderWidgetHostView* reference_host_view) {
553 NOTIMPLEMENTED(); 554 NOTIMPLEMENTED();
554 } 555 }
555 556
556 RenderWidgetHost* 557 RenderWidgetHost*
557 RenderWidgetHostViewAndroid::GetRenderWidgetHost() const { 558 RenderWidgetHostViewAndroid::GetRenderWidgetHost() const {
558 return host_; 559 return host_;
559 } 560 }
560 561
561 void RenderWidgetHostViewAndroid::WasResized() { 562 void RenderWidgetHostViewAndroid::WasResized() {
563 // If we're entering a fullscreen transition, show black until the transition
564 // is completed.
565 if (content_view_core_ &&
566 view_.GetPhysicalBackingSize() != prev_physical_backing_size_) {
567 bool is_fullscreen = content_view_core_->GetWebContents()->IsFullscreen();
568 if (is_fullscreen || was_fullscreen_) {
569 fullscreen_transitioning_ = true;
570
571 // Immediately queue a black frame to hide jank while we wait to receive a
572 // "good" frame via SubmitCompositorFrame.
573 cc::CompositorFrame frame;
574 frame.render_pass_list.push_back(CreateBlackRenderPass());
575 frame.metadata.root_background_color = SK_ColorBLACK;
576 delegated_frame_host_->ForceFrame(std::move(frame));
577 UpdateBackgroundColor(SK_ColorBLACK);
578 }
579 was_fullscreen_ = is_fullscreen;
580 prev_physical_backing_size_ = view_.GetPhysicalBackingSize();
Khushal 2017/05/24 05:14:22 I'm a bit confused about saving the previous fulls
steimel 2017/05/24 19:32:58 Hmm I may be able to simplify some of the logic, b
581 }
562 host_->WasResized(); 582 host_->WasResized();
563 } 583 }
564 584
565 void RenderWidgetHostViewAndroid::SetSize(const gfx::Size& size) { 585 void RenderWidgetHostViewAndroid::SetSize(const gfx::Size& size) {
566 // Ignore the given size as only the Java code has the power to 586 // Ignore the given size as only the Java code has the power to
567 // resize the view on Android. 587 // resize the view on Android.
568 default_bounds_ = gfx::Rect(default_bounds_.origin(), size); 588 default_bounds_ = gfx::Rect(default_bounds_.origin(), size);
569 } 589 }
570 590
571 void RenderWidgetHostViewAndroid::SetBounds(const gfx::Rect& rect) { 591 void RenderWidgetHostViewAndroid::SetBounds(const gfx::Rect& rect) {
(...skipping 602 matching lines...) Expand 10 before | Expand all | Expand 10 after
1174 bad_message::RWH_BAD_FRAME_SINK_REQUEST); 1194 bad_message::RWH_BAD_FRAME_SINK_REQUEST);
1175 return; 1195 return;
1176 } 1196 }
1177 delegated_frame_host_->CompositorFrameSinkChanged(); 1197 delegated_frame_host_->CompositorFrameSinkChanged();
1178 renderer_compositor_frame_sink_ = renderer_compositor_frame_sink; 1198 renderer_compositor_frame_sink_ = renderer_compositor_frame_sink;
1179 // Accumulated resources belong to the old RendererCompositorFrameSink and 1199 // Accumulated resources belong to the old RendererCompositorFrameSink and
1180 // should not be returned. 1200 // should not be returned.
1181 surface_returned_resources_.clear(); 1201 surface_returned_resources_.clear();
1182 } 1202 }
1183 1203
1204 std::unique_ptr<cc::RenderPass>
1205 RenderWidgetHostViewAndroid::CreateBlackRenderPass() {
1206 gfx::Rect rect(current_surface_size_);
1207 std::unique_ptr<cc::RenderPass> rp = cc::RenderPass::Create();
1208 rp->SetNew(1, rect, gfx::Rect(), gfx::Transform());
1209 rp->has_transparent_background = false;
1210 cc::SharedQuadState* sqs = rp->CreateAndAppendSharedQuadState();
1211 sqs->SetAll(gfx::Transform(), rect, rect, rect, false, 1.0,
1212 SkBlendMode::kColor, 1);
1213 cc::SolidColorDrawQuad* quad =
1214 rp->CreateAndAppendDrawQuad<cc::SolidColorDrawQuad>();
1215 quad->SetNew(sqs, rect, rect, SK_ColorBLACK, false);
1216 return rp;
1217 }
1218
1219 bool RenderWidgetHostViewAndroid::CheckForFullscreenTransitionJank(
1220 const cc::CompositorFrameMetadata& metadata) {
1221 // Sometimes we'll receive a new frame before WasResized initializes a
1222 // fullscreen transition. In that case, we'll block everything until
1223 // WasResized is called.
1224 if (content_view_core_ &&
1225 content_view_core_->GetWebContents()->IsFullscreen() != was_fullscreen_) {
1226 return true;
1227 }
1228
1229 // We only check for fullscreen jank during a fullscreen transition.
1230 if (fullscreen_transitioning_) {
1231 bool top_controls_transitioning = metadata.top_controls_shown_ratio > 0 &&
1232 metadata.top_controls_shown_ratio < 1;
1233 bool bottom_controls_transitioning =
1234 metadata.bottom_controls_shown_ratio > 0 &&
1235 metadata.bottom_controls_shown_ratio < 1;
1236 bool mismatched_fullscreen_states =
1237 content_view_core_ &&
1238 (content_view_core_->GetWebContents()->IsFullscreen() !=
1239 metadata.is_fullscreen);
1240 bool mismatched_layer_sizes =
1241 view_.GetPhysicalBackingSize() != metadata.device_viewport_size;
Khushal 2017/05/24 05:14:23 Shouldn't we be comparing this with the |current_s
steimel 2017/05/24 19:32:58 Well, view_.GetPhysicalBackingSize is the "correct
Khushal 2017/05/25 03:33:40 Yup, my bad for not stating that clearly. But you
steimel 2017/06/06 03:07:53 Done.
1242
1243 gfx::Size modified_scrollable_viewport_size =
1244 gfx::ToFlooredSize(gfx::ScaleSize(metadata.scrollable_viewport_size,
1245 metadata.page_scale_factor));
1246 bool controls_will_transition =
Khushal 2017/05/24 05:14:23 Could you describe what the behaviour is for top c
steimel 2017/05/24 19:32:58 So this particular check is something that's used
1247 content_view_core_ && (content_view_core_->GetViewSize().width() ==
1248 modified_scrollable_viewport_size.width() &&
1249 content_view_core_->GetViewSize().height() !=
1250 modified_scrollable_viewport_size.height());
1251
1252 if (top_controls_transitioning || bottom_controls_transitioning ||
1253 mismatched_fullscreen_states || mismatched_layer_sizes ||
1254 controls_will_transition) {
1255 return true;
1256 } else {
1257 // Done with current fullscreen transition.
1258 fullscreen_transitioning_ = false;
1259 }
1260 }
1261
1262 return false;
1263 }
1264
1184 void RenderWidgetHostViewAndroid::SubmitCompositorFrame( 1265 void RenderWidgetHostViewAndroid::SubmitCompositorFrame(
1185 const cc::LocalSurfaceId& local_surface_id, 1266 const cc::LocalSurfaceId& local_surface_id,
1186 cc::CompositorFrame frame) { 1267 cc::CompositorFrame frame) {
1187 if (!delegated_frame_host_) { 1268 if (!delegated_frame_host_) {
1188 DCHECK(!using_browser_compositor_); 1269 DCHECK(!using_browser_compositor_);
1189 return; 1270 return;
1190 } 1271 }
1191 1272
1273 if (CheckForFullscreenTransitionJank(frame.metadata)) {
1274 // Block this frame since it will look janky.
1275 frame.render_pass_list.clear();
1276 frame.render_pass_list.push_back(CreateBlackRenderPass());
1277 frame.metadata.root_background_color = SK_ColorBLACK;
1278 UpdateBackgroundColor(SK_ColorBLACK);
1279 }
1280
1192 last_scroll_offset_ = frame.metadata.root_scroll_offset; 1281 last_scroll_offset_ = frame.metadata.root_scroll_offset;
1193 DCHECK(!frame.render_pass_list.empty()); 1282 DCHECK(!frame.render_pass_list.empty());
1194 1283
1195 cc::RenderPass* root_pass = frame.render_pass_list.back().get(); 1284 cc::RenderPass* root_pass = frame.render_pass_list.back().get();
1196 current_surface_size_ = root_pass->output_rect.size(); 1285 current_surface_size_ = root_pass->output_rect.size();
1197 bool is_transparent = root_pass->has_transparent_background; 1286 bool is_transparent = root_pass->has_transparent_background;
1198 1287
1199 cc::CompositorFrameMetadata metadata = frame.metadata.Clone(); 1288 cc::CompositorFrameMetadata metadata = frame.metadata.Clone();
1200 1289
1201 bool has_content = !current_surface_size_.IsEmpty(); 1290 bool has_content = !current_surface_size_.IsEmpty();
(...skipping 1036 matching lines...) Expand 10 before | Expand all | Expand 10 after
2238 2327
2239 ui::WindowAndroidCompositor* compositor = window_android->GetCompositor(); 2328 ui::WindowAndroidCompositor* compositor = window_android->GetCompositor();
2240 if (!compositor) 2329 if (!compositor)
2241 return; 2330 return;
2242 2331
2243 overscroll_controller_ = base::MakeUnique<OverscrollControllerAndroid>( 2332 overscroll_controller_ = base::MakeUnique<OverscrollControllerAndroid>(
2244 overscroll_refresh_handler, compositor, view_.GetDipScale()); 2333 overscroll_refresh_handler, compositor, view_.GetDipScale());
2245 } 2334 }
2246 2335
2247 } // namespace content 2336 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/renderer_host/render_widget_host_view_android.h ('k') | content/renderer/gpu/render_widget_compositor.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698