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

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: addressed comments 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 28 matching lines...) Expand all
39 #include "content/browser/renderer_host/render_widget_host_impl.h" 39 #include "content/browser/renderer_host/render_widget_host_impl.h"
40 #include "content/common/gpu/client/gl_helper.h" 40 #include "content/common/gpu/client/gl_helper.h"
41 #include "content/common/gpu/gpu_messages.h" 41 #include "content/common/gpu/gpu_messages.h"
42 #include "content/common/input_messages.h" 42 #include "content/common/input_messages.h"
43 #include "content/common/view_messages.h" 43 #include "content/common/view_messages.h"
44 #include "content/public/common/content_switches.h" 44 #include "content/public/common/content_switches.h"
45 #include "gpu/config/gpu_driver_bug_workaround_type.h" 45 #include "gpu/config/gpu_driver_bug_workaround_type.h"
46 #include "skia/ext/image_operations.h" 46 #include "skia/ext/image_operations.h"
47 #include "third_party/khronos/GLES2/gl2.h" 47 #include "third_party/khronos/GLES2/gl2.h"
48 #include "third_party/khronos/GLES2/gl2ext.h" 48 #include "third_party/khronos/GLES2/gl2ext.h"
49 #include "ui/base/android/window_android.h"
49 #include "ui/gfx/android/device_display_info.h" 50 #include "ui/gfx/android/device_display_info.h"
50 #include "ui/gfx/android/java_bitmap.h" 51 #include "ui/gfx/android/java_bitmap.h"
51 #include "ui/gfx/display.h" 52 #include "ui/gfx/display.h"
52 #include "ui/gfx/screen.h" 53 #include "ui/gfx/screen.h"
53 #include "ui/gfx/size_conversions.h" 54 #include "ui/gfx/size_conversions.h"
54 55
55 namespace content { 56 namespace content {
56 57
57 namespace { 58 namespace {
58 59
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 content_view_core_(NULL), 110 content_view_core_(NULL),
110 ime_adapter_android_(this), 111 ime_adapter_android_(this),
111 cached_background_color_(SK_ColorWHITE), 112 cached_background_color_(SK_ColorWHITE),
112 texture_id_in_layer_(0), 113 texture_id_in_layer_(0),
113 last_output_surface_id_(kUndefinedOutputSurfaceId), 114 last_output_surface_id_(kUndefinedOutputSurfaceId),
114 weak_ptr_factory_(this), 115 weak_ptr_factory_(this),
115 overscroll_effect_enabled_(true), 116 overscroll_effect_enabled_(true),
116 flush_input_requested_(false), 117 flush_input_requested_(false),
117 accelerated_surface_route_id_(0) { 118 accelerated_surface_route_id_(0) {
118 if (!UsingDelegatedRenderer()) { 119 if (!UsingDelegatedRenderer()) {
119 texture_layer_ = cc::TextureLayer::Create(this); 120 texture_layer_ = cc::TextureLayer::Create(NULL);
120 layer_ = texture_layer_; 121 layer_ = texture_layer_;
121 } 122 }
122 123
123 overscroll_effect_enabled_ = !CommandLine::ForCurrentProcess()-> 124 overscroll_effect_enabled_ = !CommandLine::ForCurrentProcess()->
124 HasSwitch(switches::kDisableOverscrollEdgeEffect); 125 HasSwitch(switches::kDisableOverscrollEdgeEffect);
125 // Don't block the main thread with effect resource loading. 126 // Don't block the main thread with effect resource loading.
126 // Actual effect creation is deferred until an overscroll event is received. 127 // Actual effect creation is deferred until an overscroll event is received.
127 if (overscroll_effect_enabled_) { 128 if (overscroll_effect_enabled_) {
128 base::WorkerPool::PostTask(FROM_HERE, 129 base::WorkerPool::PostTask(FROM_HERE,
129 base::Bind(&OverscrollGlow::EnsureResources), 130 base::Bind(&OverscrollGlow::EnsureResources),
130 true); 131 true);
131 } 132 }
132 133
133 host_->SetView(this); 134 host_->SetView(this);
134 SetContentViewCore(content_view_core); 135 SetContentViewCore(content_view_core);
135 ImageTransportFactoryAndroid::AddObserver(this); 136 ImageTransportFactoryAndroid::AddObserver(this);
137
138 using_synchronous_compositor_ =
139 SynchronousCompositorImpl::FromID(host_->GetProcess()->GetID(),
140 host_->GetRoutingID()) != NULL;
136 } 141 }
137 142
138 RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() { 143 RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() {
139 ImageTransportFactoryAndroid::RemoveObserver(this); 144 ImageTransportFactoryAndroid::RemoveObserver(this);
140 SetContentViewCore(NULL); 145 SetContentViewCore(NULL);
141 DCHECK(ack_callbacks_.empty()); 146 DCHECK(ack_callbacks_.empty());
142 if (texture_id_in_layer_) { 147 if (texture_id_in_layer_) {
143 ImageTransportFactoryAndroid::GetInstance()->DeleteTexture( 148 ImageTransportFactoryAndroid::GetInstance()->DeleteTexture(
144 texture_id_in_layer_); 149 texture_id_in_layer_);
145 } 150 }
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
185 RenderWidgetHost* 190 RenderWidgetHost*
186 RenderWidgetHostViewAndroid::GetRenderWidgetHost() const { 191 RenderWidgetHostViewAndroid::GetRenderWidgetHost() const {
187 return host_; 192 return host_;
188 } 193 }
189 194
190 void RenderWidgetHostViewAndroid::WasShown() { 195 void RenderWidgetHostViewAndroid::WasShown() {
191 if (!host_ || !host_->is_hidden()) 196 if (!host_ || !host_->is_hidden())
192 return; 197 return;
193 198
194 host_->WasShown(); 199 host_->WasShown();
200
201 if (content_view_core_ && !using_synchronous_compositor_)
202 content_view_core_->GetWindowAndroid()->AddObserver(this);
Ted C 2013/11/16 01:04:08 -2 indent. In the event content_view_core_ wasn't
powei 2013/11/18 19:29:59 Done for indent. I don't think we're necessarily
195 } 203 }
196 204
197 void RenderWidgetHostViewAndroid::WasHidden() { 205 void RenderWidgetHostViewAndroid::WasHidden() {
198 RunAckCallbacks(); 206 RunAckCallbacks();
199 207
200 if (!host_ || host_->is_hidden()) 208 if (!host_ || host_->is_hidden())
201 return; 209 return;
202 210
203 // 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
204 // utilization. 212 // utilization.
205 host_->WasHidden(); 213 host_->WasHidden();
214
215 if (content_view_core_ && !using_synchronous_compositor_)
216 content_view_core_->GetWindowAndroid()->RemoveObserver(this);
Ted C 2013/11/16 01:04:08 -2 indent
powei 2013/11/18 19:29:59 Done.
206 } 217 }
207 218
208 void RenderWidgetHostViewAndroid::WasResized() { 219 void RenderWidgetHostViewAndroid::WasResized() {
209 host_->WasResized(); 220 host_->WasResized();
210 } 221 }
211 222
212 void RenderWidgetHostViewAndroid::SetSize(const gfx::Size& size) { 223 void RenderWidgetHostViewAndroid::SetSize(const gfx::Size& size) {
213 // Ignore the given size as only the Java code has the power to 224 // Ignore the given size as only the Java code has the power to
214 // resize the view on Android. 225 // resize the view on Android.
215 default_size_ = size; 226 default_size_ = size;
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after
499 NOTIMPLEMENTED(); 510 NOTIMPLEMENTED();
500 } 511 }
501 512
502 void RenderWidgetHostViewAndroid::RenderProcessGone( 513 void RenderWidgetHostViewAndroid::RenderProcessGone(
503 base::TerminationStatus status, int error_code) { 514 base::TerminationStatus status, int error_code) {
504 Destroy(); 515 Destroy();
505 } 516 }
506 517
507 void RenderWidgetHostViewAndroid::Destroy() { 518 void RenderWidgetHostViewAndroid::Destroy() {
508 RemoveLayers(); 519 RemoveLayers();
509 content_view_core_ = NULL; 520 SetContentViewCore(NULL);
510 521
511 // The RenderWidgetHost's destruction led here, so don't call it. 522 // The RenderWidgetHost's destruction led here, so don't call it.
512 host_ = NULL; 523 host_ = NULL;
513 524
514 delete this; 525 delete this;
515 } 526 }
516 527
517 void RenderWidgetHostViewAndroid::SetTooltipText( 528 void RenderWidgetHostViewAndroid::SetTooltipText(
518 const string16& tooltip_text) { 529 const string16& tooltip_text) {
519 // Tooltips don't makes sense on Android. 530 // Tooltips don't makes sense on Android.
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
701 resource_collection_ = new cc::DelegatedFrameResourceCollection; 712 resource_collection_ = new cc::DelegatedFrameResourceCollection;
702 resource_collection_->SetClient(this); 713 resource_collection_->SetClient(this);
703 } 714 }
704 if (!frame_provider_ || 715 if (!frame_provider_ ||
705 texture_size_in_layer_ != frame_provider_->frame_size()) { 716 texture_size_in_layer_ != frame_provider_->frame_size()) {
706 if (are_layers_attached_) 717 if (are_layers_attached_)
707 RemoveLayers(); 718 RemoveLayers();
708 frame_provider_ = new cc::DelegatedFrameProvider( 719 frame_provider_ = new cc::DelegatedFrameProvider(
709 resource_collection_.get(), frame_data.Pass()); 720 resource_collection_.get(), frame_data.Pass());
710 delegated_renderer_layer_ = 721 delegated_renderer_layer_ =
711 cc::DelegatedRendererLayer::Create(this, frame_provider_); 722 cc::DelegatedRendererLayer::Create(NULL, frame_provider_);
712 layer_ = delegated_renderer_layer_; 723 layer_ = delegated_renderer_layer_;
713 if (are_layers_attached_) 724 if (are_layers_attached_)
714 AttachLayers(); 725 AttachLayers();
715 } else { 726 } else {
716 frame_provider_->SetFrameData(frame_data.Pass()); 727 frame_provider_->SetFrameData(frame_data.Pass());
717 } 728 }
718 } 729 }
719 730
720 if (delegated_renderer_layer_.get()) { 731 if (delegated_renderer_layer_.get()) {
721 delegated_renderer_layer_->SetDisplaySize(texture_size_in_layer_); 732 delegated_renderer_layer_->SetDisplaySize(texture_size_in_layer_);
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
839 850
840 void RenderWidgetHostViewAndroid::BuffersSwapped( 851 void RenderWidgetHostViewAndroid::BuffersSwapped(
841 const gpu::Mailbox& mailbox, 852 const gpu::Mailbox& mailbox,
842 uint32_t output_surface_id, 853 uint32_t output_surface_id,
843 const base::Closure& ack_callback) { 854 const base::Closure& ack_callback) {
844 ImageTransportFactoryAndroid* factory = 855 ImageTransportFactoryAndroid* factory =
845 ImageTransportFactoryAndroid::GetInstance(); 856 ImageTransportFactoryAndroid::GetInstance();
846 857
847 if (!texture_id_in_layer_) { 858 if (!texture_id_in_layer_) {
848 texture_id_in_layer_ = factory->CreateTexture(); 859 texture_id_in_layer_ = factory->CreateTexture();
860 texture_layer_->SetTextureId(texture_id_in_layer_);
849 texture_layer_->SetIsDrawable(true); 861 texture_layer_->SetIsDrawable(true);
850 texture_layer_->SetContentsOpaque(true); 862 texture_layer_->SetContentsOpaque(true);
851 } 863 }
852 864
853 ImageTransportFactoryAndroid::GetInstance()->AcquireTexture( 865 ImageTransportFactoryAndroid::GetInstance()->AcquireTexture(
854 texture_id_in_layer_, mailbox.name); 866 texture_id_in_layer_, mailbox.name);
855 867
856 ResetClipping(); 868 ResetClipping();
857 869
858 current_mailbox_ = mailbox; 870 current_mailbox_ = mailbox;
(...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after
1237 ScheduleAnimationIfNecessary(); 1249 ScheduleAnimationIfNecessary();
1238 } 1250 }
1239 1251
1240 void RenderWidgetHostViewAndroid::SetContentViewCore( 1252 void RenderWidgetHostViewAndroid::SetContentViewCore(
1241 ContentViewCoreImpl* content_view_core) { 1253 ContentViewCoreImpl* content_view_core) {
1242 RunAckCallbacks(); 1254 RunAckCallbacks();
1243 1255
1244 if (are_layers_attached_) 1256 if (are_layers_attached_)
1245 RemoveLayers(); 1257 RemoveLayers();
1246 1258
1259 if (content_view_core == NULL) {
Ted C 2013/11/16 01:04:08 Shouldn't need the == NULL
powei 2013/11/18 19:29:59 Done. Followed suggestion below.
1260 if (content_view_core_ && !using_synchronous_compositor_)
boliu 2013/11/16 00:42:56 Why does value of new content_view_core matter her
Ted C 2013/11/16 01:04:08 Yeah, maybe it should be content_view_core != cont
powei 2013/11/18 19:29:59 Done.
1261 content_view_core_->GetWindowAndroid()->RemoveObserver(this);
1262 }
1263
1247 content_view_core_ = content_view_core; 1264 content_view_core_ = content_view_core;
1248 1265
1249 if (GetBrowserAccessibilityManager()) { 1266 if (GetBrowserAccessibilityManager()) {
1250 base::android::ScopedJavaLocalRef<jobject> obj; 1267 base::android::ScopedJavaLocalRef<jobject> obj;
1251 if (content_view_core_) 1268 if (content_view_core_)
1252 obj = content_view_core_->GetJavaObject(); 1269 obj = content_view_core_->GetJavaObject();
1253 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerAndroid()-> 1270 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerAndroid()->
1254 SetContentViewCore(obj); 1271 SetContentViewCore(obj);
1255 } 1272 }
1256 1273
1257 if (are_layers_attached_) 1274 if (are_layers_attached_) {
1258 AttachLayers(); 1275 AttachLayers();
1276 if (content_view_core_ && !using_synchronous_compositor_)
1277 content_view_core_->GetWindowAndroid()->AddObserver(this);
1278 }
1259 } 1279 }
1260 1280
1261 void RenderWidgetHostViewAndroid::RunAckCallbacks() { 1281 void RenderWidgetHostViewAndroid::RunAckCallbacks() {
1262 while (!ack_callbacks_.empty()) { 1282 while (!ack_callbacks_.empty()) {
1263 ack_callbacks_.front().Run(); 1283 ack_callbacks_.front().Run();
1264 ack_callbacks_.pop(); 1284 ack_callbacks_.pop();
1265 } 1285 }
1266 } 1286 }
1267 1287
1268 void RenderWidgetHostViewAndroid::HasTouchEventHandlers( 1288 void RenderWidgetHostViewAndroid::HasTouchEventHandlers(
1269 bool need_touch_events) { 1289 bool need_touch_events) {
1270 if (content_view_core_) 1290 if (content_view_core_)
1271 content_view_core_->HasTouchEventHandlers(need_touch_events); 1291 content_view_core_->HasTouchEventHandlers(need_touch_events);
1272 } 1292 }
1273 1293
1274 unsigned RenderWidgetHostViewAndroid::PrepareTexture() { 1294 void RenderWidgetHostViewAndroid::OnCompositingDidCommit() {
1275 RunAckCallbacks();
1276 return texture_id_in_layer_;
1277 }
1278
1279 void RenderWidgetHostViewAndroid::DidCommitFrameData() {
1280 RunAckCallbacks(); 1295 RunAckCallbacks();
1281 } 1296 }
1282 1297
1283 bool RenderWidgetHostViewAndroid::PrepareTextureMailbox( 1298 void RenderWidgetHostViewAndroid::OnDetachCompositor() {
1284 cc::TextureMailbox* mailbox, 1299 DCHECK(content_view_core_);
1285 scoped_ptr<cc::SingleReleaseCallback>* release_callback, 1300 DCHECK(!using_synchronous_compositor_);
1286 bool use_shared_memory) { 1301 RunAckCallbacks();
1287 return false;
1288 } 1302 }
1289 1303
1290 void RenderWidgetHostViewAndroid::OnLostResources() { 1304 void RenderWidgetHostViewAndroid::OnLostResources() {
1291 if (texture_layer_.get()) 1305 if (texture_layer_.get())
1292 texture_layer_->SetIsDrawable(false); 1306 texture_layer_->SetIsDrawable(false);
1293 if (delegated_renderer_layer_.get()) 1307 if (delegated_renderer_layer_.get())
1294 DestroyDelegatedContent(); 1308 DestroyDelegatedContent();
1295 texture_id_in_layer_ = 0; 1309 texture_id_in_layer_ = 0;
1296 RunAckCallbacks(); 1310 RunAckCallbacks();
1297 } 1311 }
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
1391 // RenderWidgetHostView, public: 1405 // RenderWidgetHostView, public:
1392 1406
1393 // static 1407 // static
1394 RenderWidgetHostView* 1408 RenderWidgetHostView*
1395 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { 1409 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) {
1396 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); 1410 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget);
1397 return new RenderWidgetHostViewAndroid(rwhi, NULL); 1411 return new RenderWidgetHostViewAndroid(rwhi, NULL);
1398 } 1412 }
1399 1413
1400 } // namespace content 1414 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698