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

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: Plumb compositor provider through instead of compositor Created 7 years, 1 month 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 22 matching lines...) Expand all
33 #include "content/browser/gpu/gpu_surface_tracker.h" 33 #include "content/browser/gpu/gpu_surface_tracker.h"
34 #include "content/browser/renderer_host/compositor_impl_android.h" 34 #include "content/browser/renderer_host/compositor_impl_android.h"
35 #include "content/browser/renderer_host/dip_util.h" 35 #include "content/browser/renderer_host/dip_util.h"
36 #include "content/browser/renderer_host/generic_touch_gesture_android.h" 36 #include "content/browser/renderer_host/generic_touch_gesture_android.h"
37 #include "content/browser/renderer_host/image_transport_factory_android.h" 37 #include "content/browser/renderer_host/image_transport_factory_android.h"
38 #include "content/browser/renderer_host/render_widget_host_impl.h" 38 #include "content/browser/renderer_host/render_widget_host_impl.h"
39 #include "content/common/gpu/client/gl_helper.h" 39 #include "content/common/gpu/client/gl_helper.h"
40 #include "content/common/gpu/gpu_messages.h" 40 #include "content/common/gpu/gpu_messages.h"
41 #include "content/common/input_messages.h" 41 #include "content/common/input_messages.h"
42 #include "content/common/view_messages.h" 42 #include "content/common/view_messages.h"
43 #include "content/public/browser/android/compositor_observer.h"
44 #include "content/public/browser/android/compositor_provider.h"
43 #include "content/public/common/content_switches.h" 45 #include "content/public/common/content_switches.h"
44 #include "gpu/config/gpu_driver_bug_workaround_type.h" 46 #include "gpu/config/gpu_driver_bug_workaround_type.h"
45 #include "skia/ext/image_operations.h" 47 #include "skia/ext/image_operations.h"
46 #include "third_party/khronos/GLES2/gl2.h" 48 #include "third_party/khronos/GLES2/gl2.h"
47 #include "third_party/khronos/GLES2/gl2ext.h" 49 #include "third_party/khronos/GLES2/gl2ext.h"
48 #include "ui/gfx/android/device_display_info.h" 50 #include "ui/gfx/android/device_display_info.h"
49 #include "ui/gfx/android/java_bitmap.h" 51 #include "ui/gfx/android/java_bitmap.h"
50 #include "ui/gfx/display.h" 52 #include "ui/gfx/display.h"
51 #include "ui/gfx/screen.h" 53 #include "ui/gfx/screen.h"
52 #include "ui/gfx/size_conversions.h" 54 #include "ui/gfx/size_conversions.h"
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
94 96
95 bool UsingDelegatedRenderer() { 97 bool UsingDelegatedRenderer() {
96 return CommandLine::ForCurrentProcess()->HasSwitch( 98 return CommandLine::ForCurrentProcess()->HasSwitch(
97 switches::kEnableDelegatedRenderer); 99 switches::kEnableDelegatedRenderer);
98 } 100 }
99 101
100 } // anonymous namespace 102 } // anonymous namespace
101 103
102 RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( 104 RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid(
103 RenderWidgetHostImpl* widget_host, 105 RenderWidgetHostImpl* widget_host,
104 ContentViewCoreImpl* content_view_core) 106 ContentViewCoreImpl* content_view_core,
107 CompositorProvider* compositor_provider)
105 : host_(widget_host), 108 : host_(widget_host),
106 needs_begin_frame_(false), 109 needs_begin_frame_(false),
107 are_layers_attached_(true), 110 are_layers_attached_(true),
108 content_view_core_(NULL), 111 content_view_core_(NULL),
109 ime_adapter_android_(this), 112 ime_adapter_android_(this),
110 cached_background_color_(SK_ColorWHITE), 113 cached_background_color_(SK_ColorWHITE),
111 texture_id_in_layer_(0), 114 texture_id_in_layer_(0),
112 last_output_surface_id_(kUndefinedOutputSurfaceId), 115 last_output_surface_id_(kUndefinedOutputSurfaceId),
113 weak_ptr_factory_(this), 116 weak_ptr_factory_(this),
114 overscroll_effect_enabled_(true), 117 overscroll_effect_enabled_(true),
115 flush_input_requested_(false), 118 flush_input_requested_(false),
116 accelerated_surface_route_id_(0) { 119 accelerated_surface_route_id_(0),
120 compositor_provider_(NULL) {
no sievers 2013/11/08 22:14:04 nit: init to |compositor_provider| here
powei 2013/11/08 22:51:16 Done.
117 if (!UsingDelegatedRenderer()) { 121 if (!UsingDelegatedRenderer()) {
118 texture_layer_ = cc::TextureLayer::Create(this); 122 texture_layer_ = cc::TextureLayer::Create(NULL);
119 layer_ = texture_layer_; 123 layer_ = texture_layer_;
120 } 124 }
121 125
122 overscroll_effect_enabled_ = !CommandLine::ForCurrentProcess()-> 126 overscroll_effect_enabled_ = !CommandLine::ForCurrentProcess()->
123 HasSwitch(switches::kDisableOverscrollEdgeEffect); 127 HasSwitch(switches::kDisableOverscrollEdgeEffect);
124 // Don't block the main thread with effect resource loading. 128 // Don't block the main thread with effect resource loading.
125 // Actual effect creation is deferred until an overscroll event is received. 129 // Actual effect creation is deferred until an overscroll event is received.
126 if (overscroll_effect_enabled_) { 130 if (overscroll_effect_enabled_) {
127 base::WorkerPool::PostTask(FROM_HERE, 131 base::WorkerPool::PostTask(FROM_HERE,
128 base::Bind(&OverscrollGlow::EnsureResources), 132 base::Bind(&OverscrollGlow::EnsureResources),
129 true); 133 true);
130 } 134 }
131 135
132 host_->SetView(this); 136 host_->SetView(this);
133 SetContentViewCore(content_view_core); 137 SetContentViewCore(content_view_core);
138 SetCompositorProvider(compositor_provider);
134 ImageTransportFactoryAndroid::AddObserver(this); 139 ImageTransportFactoryAndroid::AddObserver(this);
135 } 140 }
136 141
137 RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() { 142 RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() {
138 ImageTransportFactoryAndroid::RemoveObserver(this); 143 ImageTransportFactoryAndroid::RemoveObserver(this);
139 SetContentViewCore(NULL); 144 SetContentViewCore(NULL);
140 DCHECK(ack_callbacks_.empty()); 145 DCHECK(ack_callbacks_.empty());
141 if (texture_id_in_layer_) { 146 if (texture_id_in_layer_) {
142 ImageTransportFactoryAndroid::GetInstance()->DeleteTexture( 147 ImageTransportFactoryAndroid::GetInstance()->DeleteTexture(
143 texture_id_in_layer_); 148 texture_id_in_layer_);
144 } 149 }
145 150
146 if (texture_layer_.get()) 151 if (texture_layer_.get())
147 texture_layer_->ClearClient(); 152 texture_layer_->ClearClient();
148 153
149 if (resource_collection_.get()) 154 if (resource_collection_.get())
150 resource_collection_->SetClient(NULL); 155 resource_collection_->SetClient(NULL);
156
157 UnobserveCompositor(GetCompositor());
151 } 158 }
152 159
153 160
154 bool RenderWidgetHostViewAndroid::OnMessageReceived( 161 bool RenderWidgetHostViewAndroid::OnMessageReceived(
155 const IPC::Message& message) { 162 const IPC::Message& message) {
156 bool handled = true; 163 bool handled = true;
157 IPC_BEGIN_MESSAGE_MAP(RenderWidgetHostViewAndroid, message) 164 IPC_BEGIN_MESSAGE_MAP(RenderWidgetHostViewAndroid, message)
158 IPC_MESSAGE_HANDLER(ViewHostMsg_StartContentIntent, OnStartContentIntent) 165 IPC_MESSAGE_HANDLER(ViewHostMsg_StartContentIntent, OnStartContentIntent)
159 IPC_MESSAGE_HANDLER(ViewHostMsg_DidChangeBodyBackgroundColor, 166 IPC_MESSAGE_HANDLER(ViewHostMsg_DidChangeBodyBackgroundColor,
160 OnDidChangeBodyBackgroundColor) 167 OnDidChangeBodyBackgroundColor)
(...skipping 23 matching lines...) Expand all
184 RenderWidgetHost* 191 RenderWidgetHost*
185 RenderWidgetHostViewAndroid::GetRenderWidgetHost() const { 192 RenderWidgetHostViewAndroid::GetRenderWidgetHost() const {
186 return host_; 193 return host_;
187 } 194 }
188 195
189 void RenderWidgetHostViewAndroid::WasShown() { 196 void RenderWidgetHostViewAndroid::WasShown() {
190 if (!host_ || !host_->is_hidden()) 197 if (!host_ || !host_->is_hidden())
191 return; 198 return;
192 199
193 host_->WasShown(); 200 host_->WasShown();
201
202 ObserveCompositor(GetCompositor());
194 } 203 }
195 204
196 void RenderWidgetHostViewAndroid::WasHidden() { 205 void RenderWidgetHostViewAndroid::WasHidden() {
197 RunAckCallbacks(); 206 RunAckCallbacks();
198 207
199 if (!host_ || host_->is_hidden()) 208 if (!host_ || host_->is_hidden())
200 return; 209 return;
201 210
202 // Inform the renderer that we are being hidden so it can reduce its resource 211 // Inform the renderer that we are being hidden so it can reduce its resource
203 // utilization. 212 // utilization.
204 host_->WasHidden(); 213 host_->WasHidden();
214
215 UnobserveCompositor(GetCompositor());
205 } 216 }
206 217
207 void RenderWidgetHostViewAndroid::WasResized() { 218 void RenderWidgetHostViewAndroid::WasResized() {
208 host_->WasResized(); 219 host_->WasResized();
209 } 220 }
210 221
211 void RenderWidgetHostViewAndroid::SetSize(const gfx::Size& size) { 222 void RenderWidgetHostViewAndroid::SetSize(const gfx::Size& size) {
212 // Ignore the given size as only the Java code has the power to 223 // Ignore the given size as only the Java code has the power to
213 // resize the view on Android. 224 // resize the view on Android.
214 WasResized(); 225 WasResized();
(...skipping 478 matching lines...) Expand 10 before | Expand all | Expand 10 after
693 resource_collection_ = new cc::DelegatedFrameResourceCollection; 704 resource_collection_ = new cc::DelegatedFrameResourceCollection;
694 resource_collection_->SetClient(this); 705 resource_collection_->SetClient(this);
695 } 706 }
696 if (!frame_provider_ || 707 if (!frame_provider_ ||
697 texture_size_in_layer_ != frame_provider_->frame_size()) { 708 texture_size_in_layer_ != frame_provider_->frame_size()) {
698 if (are_layers_attached_) 709 if (are_layers_attached_)
699 RemoveLayers(); 710 RemoveLayers();
700 frame_provider_ = new cc::DelegatedFrameProvider( 711 frame_provider_ = new cc::DelegatedFrameProvider(
701 resource_collection_.get(), frame_data.Pass()); 712 resource_collection_.get(), frame_data.Pass());
702 delegated_renderer_layer_ = 713 delegated_renderer_layer_ =
703 cc::DelegatedRendererLayer::Create(this, frame_provider_); 714 cc::DelegatedRendererLayer::Create(NULL, frame_provider_);
704 layer_ = delegated_renderer_layer_; 715 layer_ = delegated_renderer_layer_;
705 if (are_layers_attached_) 716 if (are_layers_attached_)
706 AttachLayers(); 717 AttachLayers();
707 } else { 718 } else {
708 frame_provider_->SetFrameData(frame_data.Pass()); 719 frame_provider_->SetFrameData(frame_data.Pass());
709 } 720 }
710 } 721 }
711 722
712 if (delegated_renderer_layer_.get()) { 723 if (delegated_renderer_layer_.get()) {
713 delegated_renderer_layer_->SetDisplaySize(texture_size_in_layer_); 724 delegated_renderer_layer_->SetDisplaySize(texture_size_in_layer_);
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
831 842
832 void RenderWidgetHostViewAndroid::BuffersSwapped( 843 void RenderWidgetHostViewAndroid::BuffersSwapped(
833 const gpu::Mailbox& mailbox, 844 const gpu::Mailbox& mailbox,
834 uint32_t output_surface_id, 845 uint32_t output_surface_id,
835 const base::Closure& ack_callback) { 846 const base::Closure& ack_callback) {
836 ImageTransportFactoryAndroid* factory = 847 ImageTransportFactoryAndroid* factory =
837 ImageTransportFactoryAndroid::GetInstance(); 848 ImageTransportFactoryAndroid::GetInstance();
838 849
839 if (!texture_id_in_layer_) { 850 if (!texture_id_in_layer_) {
840 texture_id_in_layer_ = factory->CreateTexture(); 851 texture_id_in_layer_ = factory->CreateTexture();
852 texture_layer_->SetTextureId(texture_id_in_layer_);
841 texture_layer_->SetIsDrawable(true); 853 texture_layer_->SetIsDrawable(true);
842 texture_layer_->SetContentsOpaque(true); 854 texture_layer_->SetContentsOpaque(true);
843 } 855 }
844 856
845 ImageTransportFactoryAndroid::GetInstance()->AcquireTexture( 857 ImageTransportFactoryAndroid::GetInstance()->AcquireTexture(
846 texture_id_in_layer_, mailbox.name); 858 texture_id_in_layer_, mailbox.name);
847 859
848 ResetClipping(); 860 ResetClipping();
849 861
850 current_mailbox_ = mailbox; 862 current_mailbox_ = mailbox;
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after
1237 if (content_view_core_) 1249 if (content_view_core_)
1238 obj = content_view_core_->GetJavaObject(); 1250 obj = content_view_core_->GetJavaObject();
1239 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerAndroid()-> 1251 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerAndroid()->
1240 SetContentViewCore(obj); 1252 SetContentViewCore(obj);
1241 } 1253 }
1242 1254
1243 if (are_layers_attached_) 1255 if (are_layers_attached_)
1244 AttachLayers(); 1256 AttachLayers();
1245 } 1257 }
1246 1258
1259 void RenderWidgetHostViewAndroid::SetCompositorProvider(
1260 CompositorProvider* compositor_provider) {
1261 compositor_provider_ = compositor_provider;
1262 if (compositor_provider_) {
1263 compositor_provider_->AddCompositorProviderClient(this);
1264 ObserveCompositor(GetCompositor());
1265 }
1266 }
1267
1268 void RenderWidgetHostViewAndroid::ChangeCompositor(Compositor* new_compositor) {
1269 UnobserveCompositor(GetCompositor());
1270 ObserveCompositor(new_compositor);
1271 }
1272
1273 Compositor* RenderWidgetHostViewAndroid::GetCompositor() {
1274 if (!compositor_provider_)
1275 return NULL;
1276 Compositor* comp = compositor_provider_->GetCompositor();
1277 return comp;
1278 }
1279
1280 void RenderWidgetHostViewAndroid::UnobserveCompositor(
no sievers 2013/11/08 22:14:04 No need for an extra function. And then it avoids
powei 2013/11/08 22:51:16 Done.
1281 Compositor* compositor) {
1282 if (compositor)
1283 compositor->RemoveObserver(this);
1284 }
1285
1286 void RenderWidgetHostViewAndroid::ObserveCompositor(
1287 Compositor* compositor) {
1288 if (compositor)
1289 compositor->AddObserver(this);
1290 }
1291
1247 void RenderWidgetHostViewAndroid::RunAckCallbacks() { 1292 void RenderWidgetHostViewAndroid::RunAckCallbacks() {
1248 while (!ack_callbacks_.empty()) { 1293 while (!ack_callbacks_.empty()) {
1249 ack_callbacks_.front().Run(); 1294 ack_callbacks_.front().Run();
1250 ack_callbacks_.pop(); 1295 ack_callbacks_.pop();
1251 } 1296 }
1252 } 1297 }
1253 1298
1254 void RenderWidgetHostViewAndroid::HasTouchEventHandlers( 1299 void RenderWidgetHostViewAndroid::HasTouchEventHandlers(
1255 bool need_touch_events) { 1300 bool need_touch_events) {
1256 if (content_view_core_) 1301 if (content_view_core_)
1257 content_view_core_->HasTouchEventHandlers(need_touch_events); 1302 content_view_core_->HasTouchEventHandlers(need_touch_events);
1258 } 1303 }
1259 1304
1260 unsigned RenderWidgetHostViewAndroid::PrepareTexture() { 1305 void RenderWidgetHostViewAndroid::OnCompositingDidCommit(
1261 RunAckCallbacks(); 1306 Compositor* compositor) {
1262 return texture_id_in_layer_;
1263 }
1264
1265 void RenderWidgetHostViewAndroid::DidCommitFrameData() {
1266 RunAckCallbacks(); 1307 RunAckCallbacks();
1267 } 1308 }
1268 1309
1269 bool RenderWidgetHostViewAndroid::PrepareTextureMailbox(
1270 cc::TextureMailbox* mailbox,
1271 scoped_ptr<cc::SingleReleaseCallback>* release_callback,
1272 bool use_shared_memory) {
1273 return false;
1274 }
1275
1276 void RenderWidgetHostViewAndroid::OnLostResources() { 1310 void RenderWidgetHostViewAndroid::OnLostResources() {
1277 if (texture_layer_.get()) 1311 if (texture_layer_.get())
1278 texture_layer_->SetIsDrawable(false); 1312 texture_layer_->SetIsDrawable(false);
1279 if (delegated_renderer_layer_.get()) 1313 if (delegated_renderer_layer_.get())
1280 DestroyDelegatedContent(); 1314 DestroyDelegatedContent();
1281 texture_id_in_layer_ = 0; 1315 texture_id_in_layer_ = 0;
1282 RunAckCallbacks(); 1316 RunAckCallbacks();
1283 } 1317 }
1284 1318
1285 // static 1319 // static
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
1373 results->isMonochrome = (results->depthPerComponent == 0); 1407 results->isMonochrome = (results->depthPerComponent == 0);
1374 } 1408 }
1375 1409
1376 //////////////////////////////////////////////////////////////////////////////// 1410 ////////////////////////////////////////////////////////////////////////////////
1377 // RenderWidgetHostView, public: 1411 // RenderWidgetHostView, public:
1378 1412
1379 // static 1413 // static
1380 RenderWidgetHostView* 1414 RenderWidgetHostView*
1381 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { 1415 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) {
1382 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); 1416 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget);
1383 return new RenderWidgetHostViewAndroid(rwhi, NULL); 1417 return new RenderWidgetHostViewAndroid(rwhi, NULL, NULL);
no sievers 2013/11/08 22:14:04 Hmm what's the point if we can't create it with th
powei 2013/11/08 22:51:16 I don't think this is ever called. Maybe a NOTREA
1384 } 1418 }
1385 1419
1386 } // namespace content 1420 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698