| 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 |