OLD | NEW |
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 1193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1204 base::Bind(&RenderWidgetHostViewAndroid::SendReclaimCompositorResources, | 1204 base::Bind(&RenderWidgetHostViewAndroid::SendReclaimCompositorResources, |
1205 weak_ptr_factory_.GetWeakPtr(), true /* is_swap_ack */); | 1205 weak_ptr_factory_.GetWeakPtr(), true /* is_swap_ack */); |
1206 | 1206 |
1207 ack_callbacks_.push(ack_callback); | 1207 ack_callbacks_.push(ack_callback); |
1208 | 1208 |
1209 cc::BeginFrameAck ack = frame.metadata.begin_frame_ack; | 1209 cc::BeginFrameAck ack = frame.metadata.begin_frame_ack; |
1210 if (!has_content) { | 1210 if (!has_content) { |
1211 DestroyDelegatedContent(); | 1211 DestroyDelegatedContent(); |
1212 | 1212 |
1213 ack.has_damage = false; | 1213 ack.has_damage = false; |
1214 OnBeginFrameDidNotSwap(ack); | 1214 OnDidNotProduceFrame(ack); |
1215 } else { | 1215 } else { |
1216 delegated_frame_host_->SubmitCompositorFrame(local_surface_id, | 1216 delegated_frame_host_->SubmitCompositorFrame(local_surface_id, |
1217 std::move(frame)); | 1217 std::move(frame)); |
1218 frame_evictor_->SwappedFrame(!host_->is_hidden()); | 1218 frame_evictor_->SwappedFrame(!host_->is_hidden()); |
1219 AcknowledgeBeginFrame(ack); | 1219 AcknowledgeBeginFrame(ack); |
1220 } | 1220 } |
1221 | 1221 |
1222 if (host_->is_hidden()) | 1222 if (host_->is_hidden()) |
1223 RunAckCallbacks(); | 1223 RunAckCallbacks(); |
1224 | 1224 |
(...skipping 10 matching lines...) Expand all Loading... |
1235 if (!delegated_frame_host_) | 1235 if (!delegated_frame_host_) |
1236 return; | 1236 return; |
1237 | 1237 |
1238 if (!delegated_frame_host_->HasDelegatedContent()) | 1238 if (!delegated_frame_host_->HasDelegatedContent()) |
1239 return; | 1239 return; |
1240 | 1240 |
1241 frame_evictor_->DiscardedFrame(); | 1241 frame_evictor_->DiscardedFrame(); |
1242 delegated_frame_host_->DestroyDelegatedContent(); | 1242 delegated_frame_host_->DestroyDelegatedContent(); |
1243 } | 1243 } |
1244 | 1244 |
1245 void RenderWidgetHostViewAndroid::OnBeginFrameDidNotSwap( | 1245 void RenderWidgetHostViewAndroid::OnDidNotProduceFrame( |
1246 const cc::BeginFrameAck& ack) { | 1246 const cc::BeginFrameAck& ack) { |
| 1247 if (!delegated_frame_host_) { |
| 1248 // We are not using the browser compositor and there's no DisplayScheduler |
| 1249 // that needs to be notified about the BeginFrameAck, so we can drop it. |
| 1250 DCHECK(!using_browser_compositor_); |
| 1251 return; |
| 1252 } |
| 1253 |
| 1254 delegated_frame_host_->DidNotProduceFrame(ack); |
1247 AcknowledgeBeginFrame(ack); | 1255 AcknowledgeBeginFrame(ack); |
1248 } | 1256 } |
1249 | 1257 |
1250 void RenderWidgetHostViewAndroid::AcknowledgeBeginFrame( | 1258 void RenderWidgetHostViewAndroid::AcknowledgeBeginFrame( |
1251 const cc::BeginFrameAck& ack) { | 1259 const cc::BeginFrameAck& ack) { |
1252 latest_confirmed_begin_frame_source_id_ = ack.source_id; | 1260 latest_confirmed_begin_frame_source_id_ = ack.source_id; |
1253 latest_confirmed_begin_frame_sequence_number_ = | 1261 latest_confirmed_begin_frame_sequence_number_ = |
1254 ack.latest_confirmed_sequence_number; | 1262 ack.latest_confirmed_sequence_number; |
1255 if (begin_frame_source_) | 1263 if (begin_frame_source_) |
1256 begin_frame_source_->DidFinishFrame(this, ack); | 1264 begin_frame_source_->DidFinishFrame(this, ack); |
(...skipping 807 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2064 DCHECK(content_view_core_); | 2072 DCHECK(content_view_core_); |
2065 DCHECK(using_browser_compositor_); | 2073 DCHECK(using_browser_compositor_); |
2066 RunAckCallbacks(); | 2074 RunAckCallbacks(); |
2067 overscroll_controller_.reset(); | 2075 overscroll_controller_.reset(); |
2068 delegated_frame_host_->DetachFromCompositor(); | 2076 delegated_frame_host_->DetachFromCompositor(); |
2069 } | 2077 } |
2070 | 2078 |
2071 void RenderWidgetHostViewAndroid::OnBeginFrame(const cc::BeginFrameArgs& args) { | 2079 void RenderWidgetHostViewAndroid::OnBeginFrame(const cc::BeginFrameArgs& args) { |
2072 TRACE_EVENT0("cc,benchmark", "RenderWidgetHostViewAndroid::OnBeginFrame"); | 2080 TRACE_EVENT0("cc,benchmark", "RenderWidgetHostViewAndroid::OnBeginFrame"); |
2073 if (!host_) { | 2081 if (!host_) { |
2074 OnBeginFrameDidNotSwap( | 2082 OnDidNotProduceFrame( |
2075 cc::BeginFrameAck(args.source_id, args.sequence_number, | 2083 cc::BeginFrameAck(args.source_id, args.sequence_number, |
2076 cc::BeginFrameArgs::kInvalidFrameNumber, false)); | 2084 cc::BeginFrameArgs::kInvalidFrameNumber, false)); |
2077 return; | 2085 return; |
2078 } | 2086 } |
2079 | 2087 |
2080 // In sync mode, we disregard missed frame args to ensure that | 2088 // In sync mode, we disregard missed frame args to ensure that |
2081 // SynchronousCompositorBrowserFilter::SyncStateAfterVSync will be called | 2089 // SynchronousCompositorBrowserFilter::SyncStateAfterVSync will be called |
2082 // during WindowAndroid::WindowBeginFrameSource::OnVSync() observer iteration. | 2090 // during WindowAndroid::WindowBeginFrameSource::OnVSync() observer iteration. |
2083 if (sync_compositor_ && args.type == cc::BeginFrameArgs::MISSED) { | 2091 if (sync_compositor_ && args.type == cc::BeginFrameArgs::MISSED) { |
2084 uint64_t confirmed = cc::BeginFrameArgs::kInvalidFrameNumber; | 2092 uint64_t confirmed = cc::BeginFrameArgs::kInvalidFrameNumber; |
2085 if (args.source_id == latest_confirmed_begin_frame_source_id_) | 2093 if (args.source_id == latest_confirmed_begin_frame_source_id_) |
2086 confirmed = latest_confirmed_begin_frame_sequence_number_; | 2094 confirmed = latest_confirmed_begin_frame_sequence_number_; |
2087 OnBeginFrameDidNotSwap(cc::BeginFrameAck( | 2095 OnDidNotProduceFrame(cc::BeginFrameAck(args.source_id, args.sequence_number, |
2088 args.source_id, args.sequence_number, confirmed, false)); | 2096 confirmed, false)); |
2089 return; | 2097 return; |
2090 } | 2098 } |
2091 | 2099 |
2092 // Update |last_begin_frame_args_| before handling | 2100 // Update |last_begin_frame_args_| before handling |
2093 // |outstanding_begin_frame_requests_| to prevent the BeginFrameSource from | 2101 // |outstanding_begin_frame_requests_| to prevent the BeginFrameSource from |
2094 // sending the same MISSED args in infinite recursion. This may otherwise | 2102 // sending the same MISSED args in infinite recursion. This may otherwise |
2095 // happen if |host_->OnBeginFrame()| causes a synchronous | 2103 // happen if |host_->OnBeginFrame()| causes a synchronous |
2096 // OnSetNeedsFlushInput() which can lead to | 2104 // OnSetNeedsFlushInput() which can lead to |
2097 // |begin_frame_source_->AddObserver()| and OnBeginFrame(). By setting | 2105 // |begin_frame_source_->AddObserver()| and OnBeginFrame(). By setting |
2098 // |last_begin_frame_args_|, we indicate to the source not to send the same | 2106 // |last_begin_frame_args_|, we indicate to the source not to send the same |
2099 // args during |AddObserver()| again. | 2107 // args during |AddObserver()| again. |
2100 last_begin_frame_args_ = args; | 2108 last_begin_frame_args_ = args; |
2101 | 2109 |
2102 if (outstanding_begin_frame_requests_ & FLUSH_INPUT) { | 2110 if (outstanding_begin_frame_requests_ & FLUSH_INPUT) { |
2103 ClearBeginFrameRequest(FLUSH_INPUT); | 2111 ClearBeginFrameRequest(FLUSH_INPUT); |
2104 host_->OnBeginFrame(); | 2112 host_->OnBeginFrame(); |
2105 } | 2113 } |
2106 | 2114 |
2107 if ((outstanding_begin_frame_requests_ & BEGIN_FRAME) || | 2115 if ((outstanding_begin_frame_requests_ & BEGIN_FRAME) || |
2108 (outstanding_begin_frame_requests_ & PERSISTENT_BEGIN_FRAME)) { | 2116 (outstanding_begin_frame_requests_ & PERSISTENT_BEGIN_FRAME)) { |
2109 ClearBeginFrameRequest(BEGIN_FRAME); | 2117 ClearBeginFrameRequest(BEGIN_FRAME); |
2110 SendBeginFrame(args); | 2118 SendBeginFrame(args); |
2111 } else { | 2119 } else { |
2112 OnBeginFrameDidNotSwap(cc::BeginFrameAck( | 2120 OnDidNotProduceFrame(cc::BeginFrameAck(args.source_id, args.sequence_number, |
2113 args.source_id, args.sequence_number, args.sequence_number, false)); | 2121 args.sequence_number, false)); |
2114 } | 2122 } |
2115 } | 2123 } |
2116 | 2124 |
2117 const cc::BeginFrameArgs& RenderWidgetHostViewAndroid::LastUsedBeginFrameArgs() | 2125 const cc::BeginFrameArgs& RenderWidgetHostViewAndroid::LastUsedBeginFrameArgs() |
2118 const { | 2126 const { |
2119 return last_begin_frame_args_; | 2127 return last_begin_frame_args_; |
2120 } | 2128 } |
2121 | 2129 |
2122 void RenderWidgetHostViewAndroid::OnBeginFrameSourcePausedChanged(bool paused) { | 2130 void RenderWidgetHostViewAndroid::OnBeginFrameSourcePausedChanged(bool paused) { |
2123 // The BeginFrameSources we listen to don't use this. For WebView, we signal | 2131 // The BeginFrameSources we listen to don't use this. For WebView, we signal |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2230 | 2238 |
2231 ui::WindowAndroidCompositor* compositor = window_android->GetCompositor(); | 2239 ui::WindowAndroidCompositor* compositor = window_android->GetCompositor(); |
2232 if (!compositor) | 2240 if (!compositor) |
2233 return; | 2241 return; |
2234 | 2242 |
2235 overscroll_controller_ = base::MakeUnique<OverscrollControllerAndroid>( | 2243 overscroll_controller_ = base::MakeUnique<OverscrollControllerAndroid>( |
2236 overscroll_refresh_handler, compositor, view_.GetDipScale()); | 2244 overscroll_refresh_handler, compositor, view_.GetDipScale()); |
2237 } | 2245 } |
2238 | 2246 |
2239 } // namespace content | 2247 } // namespace content |
OLD | NEW |