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

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

Issue 26753005: Adding compositor callbacks to RenderWidgetHostViewAndroid (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Separate Compositor plumbing from SetContentView Created 7 years, 2 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 "base/basictypes.h" 9 #include "base/basictypes.h"
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 12 matching lines...) Expand all
23 #include "cc/output/copy_output_request.h" 23 #include "cc/output/copy_output_request.h"
24 #include "cc/output/copy_output_result.h" 24 #include "cc/output/copy_output_result.h"
25 #include "cc/resources/single_release_callback.h" 25 #include "cc/resources/single_release_callback.h"
26 #include "cc/trees/layer_tree_host.h" 26 #include "cc/trees/layer_tree_host.h"
27 #include "content/browser/accessibility/browser_accessibility_manager_android.h" 27 #include "content/browser/accessibility/browser_accessibility_manager_android.h"
28 #include "content/browser/android/content_view_core_impl.h" 28 #include "content/browser/android/content_view_core_impl.h"
29 #include "content/browser/android/in_process/synchronous_compositor_impl.h" 29 #include "content/browser/android/in_process/synchronous_compositor_impl.h"
30 #include "content/browser/android/overscroll_glow.h" 30 #include "content/browser/android/overscroll_glow.h"
31 #include "content/browser/gpu/gpu_surface_tracker.h" 31 #include "content/browser/gpu/gpu_surface_tracker.h"
32 #include "content/browser/renderer_host/compositor_impl_android.h" 32 #include "content/browser/renderer_host/compositor_impl_android.h"
33 #include "content/browser/renderer_host/compositor_observer.h"
33 #include "content/browser/renderer_host/dip_util.h" 34 #include "content/browser/renderer_host/dip_util.h"
34 #include "content/browser/renderer_host/generic_touch_gesture_android.h" 35 #include "content/browser/renderer_host/generic_touch_gesture_android.h"
35 #include "content/browser/renderer_host/image_transport_factory_android.h" 36 #include "content/browser/renderer_host/image_transport_factory_android.h"
36 #include "content/browser/renderer_host/render_widget_host_impl.h" 37 #include "content/browser/renderer_host/render_widget_host_impl.h"
37 #include "content/common/gpu/client/gl_helper.h" 38 #include "content/common/gpu/client/gl_helper.h"
38 #include "content/common/gpu/gpu_messages.h" 39 #include "content/common/gpu/gpu_messages.h"
39 #include "content/common/input_messages.h" 40 #include "content/common/input_messages.h"
40 #include "content/common/view_messages.h" 41 #include "content/common/view_messages.h"
41 #include "content/public/common/content_switches.h" 42 #include "content/public/common/content_switches.h"
42 #include "skia/ext/image_operations.h" 43 #include "skia/ext/image_operations.h"
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 : host_(widget_host), 114 : host_(widget_host),
114 needs_begin_frame_(false), 115 needs_begin_frame_(false),
115 are_layers_attached_(true), 116 are_layers_attached_(true),
116 content_view_core_(NULL), 117 content_view_core_(NULL),
117 ime_adapter_android_(this), 118 ime_adapter_android_(this),
118 cached_background_color_(SK_ColorWHITE), 119 cached_background_color_(SK_ColorWHITE),
119 texture_id_in_layer_(0), 120 texture_id_in_layer_(0),
120 current_mailbox_output_surface_id_(kUndefinedOutputSurfaceId), 121 current_mailbox_output_surface_id_(kUndefinedOutputSurfaceId),
121 weak_ptr_factory_(this), 122 weak_ptr_factory_(this),
122 overscroll_effect_enabled_(true), 123 overscroll_effect_enabled_(true),
123 flush_input_requested_(false) { 124 flush_input_requested_(false),
125 compositor_(NULL) {
124 if (!UsingDelegatedRenderer()) { 126 if (!UsingDelegatedRenderer()) {
125 texture_layer_ = cc::TextureLayer::Create(this); 127 texture_layer_ = cc::TextureLayer::Create(NULL);
126 layer_ = texture_layer_; 128 layer_ = texture_layer_;
127 } 129 }
128 130
129 overscroll_effect_enabled_ = !CommandLine::ForCurrentProcess()-> 131 overscroll_effect_enabled_ = !CommandLine::ForCurrentProcess()->
130 HasSwitch(switches::kDisableOverscrollEdgeEffect); 132 HasSwitch(switches::kDisableOverscrollEdgeEffect);
131 // Don't block the main thread with effect resource loading. 133 // Don't block the main thread with effect resource loading.
132 // Actual effect creation is deferred until an overscroll event is received. 134 // Actual effect creation is deferred until an overscroll event is received.
133 if (overscroll_effect_enabled_) { 135 if (overscroll_effect_enabled_) {
134 base::WorkerPool::PostTask(FROM_HERE, 136 base::WorkerPool::PostTask(FROM_HERE,
135 base::Bind(&OverscrollGlow::EnsureResources), 137 base::Bind(&OverscrollGlow::EnsureResources),
136 true); 138 true);
137 } 139 }
138 140
139 host_->SetView(this); 141 host_->SetView(this);
140 SetContentViewCore(content_view_core); 142 SetContentViewCore(content_view_core);
141 ImageTransportFactoryAndroid::AddObserver(this); 143 ImageTransportFactoryAndroid::AddObserver(this);
142 } 144 }
143 145
144 RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() { 146 RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() {
145 ImageTransportFactoryAndroid::RemoveObserver(this); 147 ImageTransportFactoryAndroid::RemoveObserver(this);
146 SetContentViewCore(NULL); 148 SetContentViewCore(NULL);
147 DCHECK(ack_callbacks_.empty()); 149 DCHECK(ack_callbacks_.empty());
148 if (texture_id_in_layer_) { 150 if (texture_id_in_layer_) {
149 ImageTransportFactoryAndroid::GetInstance()->DeleteTexture( 151 ImageTransportFactoryAndroid::GetInstance()->DeleteTexture(
150 texture_id_in_layer_); 152 texture_id_in_layer_);
151 } 153 }
152 154
153 if (texture_layer_.get()) 155 if (texture_layer_.get())
154 texture_layer_->ClearClient(); 156 texture_layer_->ClearClient();
157
158 if (compositor_) {
aelias_OOO_until_Jul13 2013/10/19 03:43:27 nit: no {}. Likewise in many other clauses with o
powei 2013/11/08 21:34:47 Done.
159 compositor_->RemoveObserver(this);
160 }
155 } 161 }
156 162
157 163
158 bool RenderWidgetHostViewAndroid::OnMessageReceived( 164 bool RenderWidgetHostViewAndroid::OnMessageReceived(
159 const IPC::Message& message) { 165 const IPC::Message& message) {
160 bool handled = true; 166 bool handled = true;
161 IPC_BEGIN_MESSAGE_MAP(RenderWidgetHostViewAndroid, message) 167 IPC_BEGIN_MESSAGE_MAP(RenderWidgetHostViewAndroid, message)
162 IPC_MESSAGE_HANDLER(ViewHostMsg_StartContentIntent, OnStartContentIntent) 168 IPC_MESSAGE_HANDLER(ViewHostMsg_StartContentIntent, OnStartContentIntent)
163 IPC_MESSAGE_HANDLER(ViewHostMsg_DidChangeBodyBackgroundColor, 169 IPC_MESSAGE_HANDLER(ViewHostMsg_DidChangeBodyBackgroundColor,
164 OnDidChangeBodyBackgroundColor) 170 OnDidChangeBodyBackgroundColor)
(...skipping 23 matching lines...) Expand all
188 RenderWidgetHost* 194 RenderWidgetHost*
189 RenderWidgetHostViewAndroid::GetRenderWidgetHost() const { 195 RenderWidgetHostViewAndroid::GetRenderWidgetHost() const {
190 return host_; 196 return host_;
191 } 197 }
192 198
193 void RenderWidgetHostViewAndroid::WasShown() { 199 void RenderWidgetHostViewAndroid::WasShown() {
194 if (!host_ || !host_->is_hidden()) 200 if (!host_ || !host_->is_hidden())
195 return; 201 return;
196 202
197 host_->WasShown(); 203 host_->WasShown();
204
205 if (compositor_ && !compositor_->HasObserver(this)) {
aelias_OOO_until_Jul13 2013/10/19 03:43:27 Please make the HasObserver check an early return
powei 2013/11/08 21:34:47 Done.
206 compositor_->AddObserver(this);
207 }
198 } 208 }
199 209
200 void RenderWidgetHostViewAndroid::WasHidden() { 210 void RenderWidgetHostViewAndroid::WasHidden() {
201 RunAckCallbacks(); 211 RunAckCallbacks();
202 212
203 if (!host_ || host_->is_hidden()) 213 if (!host_ || host_->is_hidden())
204 return; 214 return;
205 215
206 // Inform the renderer that we are being hidden so it can reduce its resource 216 // Inform the renderer that we are being hidden so it can reduce its resource
207 // utilization. 217 // utilization.
208 host_->WasHidden(); 218 host_->WasHidden();
219
220 if (compositor_) {
221 compositor_->RemoveObserver(this);
222 }
209 } 223 }
210 224
211 void RenderWidgetHostViewAndroid::WasResized() { 225 void RenderWidgetHostViewAndroid::WasResized() {
212 host_->WasResized(); 226 host_->WasResized();
213 } 227 }
214 228
215 void RenderWidgetHostViewAndroid::SetSize(const gfx::Size& size) { 229 void RenderWidgetHostViewAndroid::SetSize(const gfx::Size& size) {
216 // Ignore the given size as only the Java code has the power to 230 // Ignore the given size as only the Java code has the power to
217 // resize the view on Android. 231 // resize the view on Android.
218 WasResized(); 232 WasResized();
(...skipping 473 matching lines...) Expand 10 before | Expand all | Expand 10 after
692 resource_collection_ = new cc::DelegatedFrameResourceCollection; 706 resource_collection_ = new cc::DelegatedFrameResourceCollection;
693 resource_collection_->SetClient(this); 707 resource_collection_->SetClient(this);
694 } 708 }
695 if (!frame_provider_ || 709 if (!frame_provider_ ||
696 texture_size_in_layer_ != frame_provider_->frame_size()) { 710 texture_size_in_layer_ != frame_provider_->frame_size()) {
697 if (are_layers_attached_) 711 if (are_layers_attached_)
698 RemoveLayers(); 712 RemoveLayers();
699 frame_provider_ = new cc::DelegatedFrameProvider( 713 frame_provider_ = new cc::DelegatedFrameProvider(
700 resource_collection_.get(), frame_data.Pass()); 714 resource_collection_.get(), frame_data.Pass());
701 delegated_renderer_layer_ = 715 delegated_renderer_layer_ =
702 cc::DelegatedRendererLayer::Create(this, frame_provider_); 716 cc::DelegatedRendererLayer::Create(NULL, frame_provider_);
703 layer_ = delegated_renderer_layer_; 717 layer_ = delegated_renderer_layer_;
704 if (are_layers_attached_) 718 if (are_layers_attached_)
705 AttachLayers(); 719 AttachLayers();
706 } else { 720 } else {
707 frame_provider_->SetFrameData(frame_data.Pass()); 721 frame_provider_->SetFrameData(frame_data.Pass());
708 } 722 }
709 } 723 }
710 724
711 if (delegated_renderer_layer_.get()) { 725 if (delegated_renderer_layer_.get()) {
712 delegated_renderer_layer_->SetDisplaySize(texture_size_in_layer_); 726 delegated_renderer_layer_->SetDisplaySize(texture_size_in_layer_);
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
854 ImageTransportFactoryAndroid* factory = 868 ImageTransportFactoryAndroid* factory =
855 ImageTransportFactoryAndroid::GetInstance(); 869 ImageTransportFactoryAndroid::GetInstance();
856 870
857 // TODO(sievers): When running the impl thread in the browser we 871 // TODO(sievers): When running the impl thread in the browser we
858 // need to delay the ACK until after commit and use more than a single 872 // need to delay the ACK until after commit and use more than a single
859 // texture. 873 // texture.
860 DCHECK(!CompositorImpl::IsThreadingEnabled()); 874 DCHECK(!CompositorImpl::IsThreadingEnabled());
861 875
862 if (!texture_id_in_layer_) { 876 if (!texture_id_in_layer_) {
863 texture_id_in_layer_ = factory->CreateTexture(); 877 texture_id_in_layer_ = factory->CreateTexture();
878 texture_layer_->SetTextureId(texture_id_in_layer_);
864 texture_layer_->SetIsDrawable(true); 879 texture_layer_->SetIsDrawable(true);
865 texture_layer_->SetContentsOpaque(true); 880 texture_layer_->SetContentsOpaque(true);
866 } 881 }
867 882
868 ImageTransportFactoryAndroid::GetInstance()->AcquireTexture( 883 ImageTransportFactoryAndroid::GetInstance()->AcquireTexture(
869 texture_id_in_layer_, mailbox.name); 884 texture_id_in_layer_, mailbox.name);
870 885
871 ResetClipping(); 886 ResetClipping();
872 887
873 current_mailbox_ = mailbox; 888 current_mailbox_ = mailbox;
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after
1239 1254
1240 if (are_layers_attached_) 1255 if (are_layers_attached_)
1241 RemoveLayers(); 1256 RemoveLayers();
1242 1257
1243 content_view_core_ = content_view_core; 1258 content_view_core_ = content_view_core;
1244 1259
1245 if (are_layers_attached_) 1260 if (are_layers_attached_)
1246 AttachLayers(); 1261 AttachLayers();
1247 } 1262 }
1248 1263
1264 void RenderWidgetHostViewAndroid::SetCompositor(Compositor* compositor) {
1265 if (compositor_ == compositor)
1266 return;
1267
1268 if (compositor_) {
1269 compositor_->RemoveObserver(this);
David Trainor- moved to gerrit 2013/10/21 15:26:08 Is it safe to call RemoveObserver if it isn't adde
powei 2013/11/08 21:34:47 It is safe. observer_list has an early out for re
1270 }
1271
1272 compositor_ = compositor;
1273
1274 if (are_layers_attached_ && compositor_ && !compositor_->HasObserver(this)) {
David Trainor- moved to gerrit 2013/10/21 15:26:08 Can remove HasObserver if you put it into AddObser
powei 2013/11/08 21:34:47 Done.
1275 compositor_->AddObserver(this);
1276 }
1277 }
1278
1249 void RenderWidgetHostViewAndroid::RunAckCallbacks() { 1279 void RenderWidgetHostViewAndroid::RunAckCallbacks() {
1250 while (!ack_callbacks_.empty()) { 1280 while (!ack_callbacks_.empty()) {
1251 ack_callbacks_.front().Run(); 1281 ack_callbacks_.front().Run();
1252 ack_callbacks_.pop(); 1282 ack_callbacks_.pop();
1253 } 1283 }
1254 } 1284 }
1255 1285
1256 void RenderWidgetHostViewAndroid::HasTouchEventHandlers( 1286 void RenderWidgetHostViewAndroid::HasTouchEventHandlers(
1257 bool need_touch_events) { 1287 bool need_touch_events) {
1258 if (content_view_core_) 1288 if (content_view_core_)
1259 content_view_core_->HasTouchEventHandlers(need_touch_events); 1289 content_view_core_->HasTouchEventHandlers(need_touch_events);
1260 } 1290 }
1261 1291
1262 unsigned RenderWidgetHostViewAndroid::PrepareTexture() { 1292 void RenderWidgetHostViewAndroid::OnCompositingDidCommit(
1293 Compositor* compositor) {
1263 RunAckCallbacks(); 1294 RunAckCallbacks();
1264 return texture_id_in_layer_;
1265 }
1266
1267 void RenderWidgetHostViewAndroid::DidCommitFrameData() {
1268 RunAckCallbacks();
1269 }
1270
1271 WebKit::WebGraphicsContext3D* RenderWidgetHostViewAndroid::Context3d() {
1272 return ImageTransportFactoryAndroid::GetInstance()->GetContext3D();
1273 }
1274
1275 bool RenderWidgetHostViewAndroid::PrepareTextureMailbox(
1276 cc::TextureMailbox* mailbox,
1277 scoped_ptr<cc::SingleReleaseCallback>* release_callback,
1278 bool use_shared_memory) {
1279 return false;
1280 } 1295 }
1281 1296
1282 void RenderWidgetHostViewAndroid::OnLostResources() { 1297 void RenderWidgetHostViewAndroid::OnLostResources() {
1283 if (texture_layer_.get()) 1298 if (texture_layer_.get())
1284 texture_layer_->SetIsDrawable(false); 1299 texture_layer_->SetIsDrawable(false);
1285 if (delegated_renderer_layer_.get()) 1300 if (delegated_renderer_layer_.get())
1286 DestroyDelegatedContent(); 1301 DestroyDelegatedContent();
1287 texture_id_in_layer_ = 0; 1302 texture_id_in_layer_ = 0;
1288 RunAckCallbacks(); 1303 RunAckCallbacks();
1289 } 1304 }
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
1383 // RenderWidgetHostView, public: 1398 // RenderWidgetHostView, public:
1384 1399
1385 // static 1400 // static
1386 RenderWidgetHostView* 1401 RenderWidgetHostView*
1387 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { 1402 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) {
1388 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); 1403 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget);
1389 return new RenderWidgetHostViewAndroid(rwhi, NULL); 1404 return new RenderWidgetHostViewAndroid(rwhi, NULL);
1390 } 1405 }
1391 1406
1392 } // namespace content 1407 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698