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 "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
47 } // namespace | 47 } // namespace |
48 | 48 |
49 RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( | 49 RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( |
50 RenderWidgetHostImpl* widget_host, | 50 RenderWidgetHostImpl* widget_host, |
51 ContentViewCoreImpl* content_view_core) | 51 ContentViewCoreImpl* content_view_core) |
52 : host_(widget_host), | 52 : host_(widget_host), |
53 is_layer_attached_(true), | 53 is_layer_attached_(true), |
54 content_view_core_(NULL), | 54 content_view_core_(NULL), |
55 ime_adapter_android_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), | 55 ime_adapter_android_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), |
56 cached_background_color_(SK_ColorWHITE), | 56 cached_background_color_(SK_ColorWHITE), |
57 texture_id_in_layer_(0) { | 57 texture_id_in_layer_(0), |
| 58 current_buffer_id_(0) { |
58 if (CompositorImpl::UsesDirectGL()) { | 59 if (CompositorImpl::UsesDirectGL()) { |
59 surface_texture_transport_.reset(new SurfaceTextureTransportClient()); | 60 surface_texture_transport_.reset(new SurfaceTextureTransportClient()); |
60 layer_ = surface_texture_transport_->Initialize(); | 61 layer_ = surface_texture_transport_->Initialize(); |
61 } else { | 62 } else { |
62 // TODO: Cannot use CompositorImpl::CompositorSupport() in unit tests. | 63 // TODO: Cannot use CompositorImpl::CompositorSupport() in unit tests. |
63 texture_layer_.reset(WebKit::WebExternalTextureLayer::create()); | 64 texture_layer_.reset(WebKit::WebExternalTextureLayer::create()); |
64 layer_ = texture_layer_->layer(); | 65 layer_ = texture_layer_->layer(); |
65 } | 66 } |
66 | 67 |
67 layer_->setOpaque(true); | 68 layer_->setOpaque(true); |
68 layer_->setDrawsContent(true); | 69 layer_->setDrawsContent(true); |
69 | 70 |
70 host_->SetView(this); | 71 host_->SetView(this); |
71 SetContentViewCore(content_view_core); | 72 SetContentViewCore(content_view_core); |
72 } | 73 } |
73 | 74 |
74 RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() { | 75 RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() { |
75 SetContentViewCore(NULL); | 76 SetContentViewCore(NULL); |
76 if (!shared_surface_.is_null()) { | 77 if (!shared_surface_.is_null()) { |
77 ImageTransportFactoryAndroid::GetInstance()->DestroySharedSurfaceHandle( | 78 ImageTransportFactoryAndroid::GetInstance()->DestroySharedSurfaceHandle( |
78 shared_surface_); | 79 shared_surface_); |
79 } | 80 } |
| 81 if (texture_id_in_layer_) { |
| 82 ImageTransportFactoryAndroid::GetInstance()->DeleteTexture( |
| 83 texture_id_in_layer_); |
| 84 } |
80 } | 85 } |
81 | 86 |
82 void RenderWidgetHostViewAndroid::InitAsChild(gfx::NativeView parent_view) { | 87 void RenderWidgetHostViewAndroid::InitAsChild(gfx::NativeView parent_view) { |
83 NOTIMPLEMENTED(); | 88 NOTIMPLEMENTED(); |
84 } | 89 } |
85 | 90 |
86 void RenderWidgetHostViewAndroid::InitAsPopup( | 91 void RenderWidgetHostViewAndroid::InitAsPopup( |
87 RenderWidgetHostView* parent_host_view, const gfx::Rect& pos) { | 92 RenderWidgetHostView* parent_host_view, const gfx::Rect& pos) { |
88 NOTIMPLEMENTED(); | 93 NOTIMPLEMENTED(); |
89 } | 94 } |
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
380 | 385 |
381 content_view_core_->ShowDisambiguationPopup(target_rect, zoomed_bitmap); | 386 content_view_core_->ShowDisambiguationPopup(target_rect, zoomed_bitmap); |
382 } | 387 } |
383 | 388 |
384 void RenderWidgetHostViewAndroid::OnAcceleratedCompositingStateChange() { | 389 void RenderWidgetHostViewAndroid::OnAcceleratedCompositingStateChange() { |
385 } | 390 } |
386 | 391 |
387 void RenderWidgetHostViewAndroid::AcceleratedSurfaceBuffersSwapped( | 392 void RenderWidgetHostViewAndroid::AcceleratedSurfaceBuffersSwapped( |
388 const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params, | 393 const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params, |
389 int gpu_host_id) { | 394 int gpu_host_id) { |
390 texture_layer_->setTextureId(params.surface_handle); | 395 ImageTransportFactoryAndroid* factory = |
391 DCHECK(texture_layer_->layer() == layer_); | 396 ImageTransportFactoryAndroid::GetInstance(); |
392 layer_->setBounds(params.size); | 397 |
393 texture_id_in_layer_ = params.surface_handle; | 398 // TODO(sievers): When running the impl thread in the browser we |
| 399 // need to delay the ACK until after commit and use more than a single |
| 400 // texture. |
| 401 DCHECK(!CompositorImpl::CompositorSupport()->isThreadingEnabled()); |
| 402 |
| 403 uint64 previous_buffer = current_buffer_id_; |
| 404 if (previous_buffer && texture_id_in_layer_) { |
| 405 DCHECK(id_to_mailbox_.find(previous_buffer) != id_to_mailbox_.end()); |
| 406 ImageTransportFactoryAndroid::GetInstance()->ReleaseTexture( |
| 407 texture_id_in_layer_, |
| 408 reinterpret_cast<const signed char*>( |
| 409 id_to_mailbox_[previous_buffer].c_str())); |
| 410 } |
| 411 |
| 412 current_buffer_id_ = params.surface_handle; |
| 413 if (!texture_id_in_layer_) { |
| 414 texture_id_in_layer_ = factory->CreateTexture(); |
| 415 texture_layer_->setTextureId(texture_id_in_layer_); |
| 416 } |
| 417 |
| 418 DCHECK(id_to_mailbox_.find(current_buffer_id_) != id_to_mailbox_.end()); |
| 419 ImageTransportFactoryAndroid::GetInstance()->AcquireTexture( |
| 420 texture_id_in_layer_, |
| 421 reinterpret_cast<const signed char*>( |
| 422 id_to_mailbox_[current_buffer_id_].c_str())); |
| 423 texture_layer_->layer()->invalidate(); |
| 424 texture_layer_->layer()->setBounds(params.size); |
394 texture_size_in_layer_ = params.size; | 425 texture_size_in_layer_ = params.size; |
395 | 426 |
396 // TODO(sievers): When running the impl thread in the browser we | |
397 // need to delay the ACK until after commit. | |
398 DCHECK(!CompositorImpl::CompositorSupport()->isThreadingEnabled()); | |
399 uint32 sync_point = | 427 uint32 sync_point = |
400 ImageTransportFactoryAndroid::GetInstance()->InsertSyncPoint(); | 428 ImageTransportFactoryAndroid::GetInstance()->InsertSyncPoint(); |
401 RenderWidgetHostImpl::AcknowledgeBufferPresent( | 429 RenderWidgetHostImpl::AcknowledgeBufferPresent( |
402 params.route_id, gpu_host_id, true, sync_point); | 430 params.route_id, gpu_host_id, previous_buffer, sync_point); |
403 } | 431 } |
404 | 432 |
405 void RenderWidgetHostViewAndroid::AcceleratedSurfacePostSubBuffer( | 433 void RenderWidgetHostViewAndroid::AcceleratedSurfacePostSubBuffer( |
406 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params, | 434 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params, |
407 int gpu_host_id) { | 435 int gpu_host_id) { |
408 NOTREACHED(); | 436 NOTREACHED(); |
409 } | 437 } |
410 | 438 |
411 void RenderWidgetHostViewAndroid::AcceleratedSurfaceSuspend() { | 439 void RenderWidgetHostViewAndroid::AcceleratedSurfaceSuspend() { |
412 NOTREACHED(); | 440 NOTREACHED(); |
413 } | 441 } |
414 | 442 |
| 443 void RenderWidgetHostViewAndroid::AcceleratedSurfaceNew( |
| 444 int32 width_in_pixel, int32 height_in_pixel, uint64 surface_id, |
| 445 const std::string& mailbox_name) { |
| 446 DCHECK(surface_id == 1 || surface_id == 2); |
| 447 id_to_mailbox_[surface_id] = mailbox_name; |
| 448 } |
| 449 |
| 450 void RenderWidgetHostViewAndroid::AcceleratedSurfaceRelease(uint64 surface_id) { |
| 451 // This tells us we should free the frontbuffer. |
| 452 if (texture_id_in_layer_) { |
| 453 texture_layer_->setTextureId(0); |
| 454 ImageTransportFactoryAndroid::GetInstance()->DeleteTexture( |
| 455 texture_id_in_layer_); |
| 456 texture_id_in_layer_ = 0; |
| 457 } |
| 458 } |
| 459 |
415 bool RenderWidgetHostViewAndroid::HasAcceleratedSurface( | 460 bool RenderWidgetHostViewAndroid::HasAcceleratedSurface( |
416 const gfx::Size& desired_size) { | 461 const gfx::Size& desired_size) { |
417 NOTREACHED(); | 462 NOTREACHED(); |
418 return false; | 463 return false; |
419 } | 464 } |
420 | 465 |
421 void RenderWidgetHostViewAndroid::StartContentIntent( | 466 void RenderWidgetHostViewAndroid::StartContentIntent( |
422 const GURL& content_url) { | 467 const GURL& content_url) { |
423 if (content_view_core_) | 468 if (content_view_core_) |
424 content_view_core_->StartContentIntent(content_url); | 469 content_view_core_->StartContentIntent(content_url); |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
594 // RenderWidgetHostView, public: | 639 // RenderWidgetHostView, public: |
595 | 640 |
596 // static | 641 // static |
597 RenderWidgetHostView* | 642 RenderWidgetHostView* |
598 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { | 643 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { |
599 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); | 644 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); |
600 return new RenderWidgetHostViewAndroid(rwhi, NULL); | 645 return new RenderWidgetHostViewAndroid(rwhi, NULL); |
601 } | 646 } |
602 | 647 |
603 } // namespace content | 648 } // namespace content |
OLD | NEW |