Chromium Code Reviews| 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 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 70 } // anonymous namespace | 70 } // anonymous namespace |
| 71 | 71 |
| 72 RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( | 72 RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( |
| 73 RenderWidgetHostImpl* widget_host, | 73 RenderWidgetHostImpl* widget_host, |
| 74 ContentViewCoreImpl* content_view_core) | 74 ContentViewCoreImpl* content_view_core) |
| 75 : host_(widget_host), | 75 : host_(widget_host), |
| 76 is_layer_attached_(true), | 76 is_layer_attached_(true), |
| 77 content_view_core_(NULL), | 77 content_view_core_(NULL), |
| 78 ime_adapter_android_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), | 78 ime_adapter_android_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), |
| 79 cached_background_color_(SK_ColorWHITE), | 79 cached_background_color_(SK_ColorWHITE), |
| 80 texture_id_in_layer_(0) { | 80 texture_id_in_layer_(0), |
| 81 consumed_current_texture_(true) { | |
| 81 if (CompositorImpl::UsesDirectGL()) { | 82 if (CompositorImpl::UsesDirectGL()) { |
| 82 surface_texture_transport_.reset(new SurfaceTextureTransportClient()); | 83 surface_texture_transport_.reset(new SurfaceTextureTransportClient()); |
| 83 layer_ = surface_texture_transport_->Initialize(); | 84 layer_ = surface_texture_transport_->Initialize(); |
| 85 layer_->SetIsDrawable(true); | |
| 84 } else { | 86 } else { |
| 85 texture_layer_ = cc::TextureLayer::Create(NULL); | 87 texture_layer_ = cc::TextureLayer::Create(this); |
| 86 layer_ = texture_layer_; | 88 layer_ = texture_layer_; |
| 87 } | 89 } |
| 88 | 90 |
| 89 layer_->SetContentsOpaque(true); | 91 layer_->SetContentsOpaque(true); |
| 90 layer_->SetIsDrawable(true); | |
| 91 | 92 |
| 92 host_->SetView(this); | 93 host_->SetView(this); |
| 93 SetContentViewCore(content_view_core); | 94 SetContentViewCore(content_view_core); |
| 94 } | 95 } |
| 95 | 96 |
| 96 RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() { | 97 RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() { |
| 97 SetContentViewCore(NULL); | 98 SetContentViewCore(NULL); |
| 99 DCHECK(ack_callbacks_.empty()); | |
| 98 if (texture_id_in_layer_ || !last_mailbox_.IsZero()) { | 100 if (texture_id_in_layer_ || !last_mailbox_.IsZero()) { |
| 99 ImageTransportFactoryAndroid* factory = | 101 ImageTransportFactoryAndroid* factory = |
| 100 ImageTransportFactoryAndroid::GetInstance(); | 102 ImageTransportFactoryAndroid::GetInstance(); |
| 101 // TODO: crbug.com/230137 - make workaround obsolete with refcounting. | 103 // TODO: crbug.com/230137 - make workaround obsolete with refcounting. |
| 102 // Don't let the last frame we sent leak in the mailbox. | 104 // Don't let the last frame we sent leak in the mailbox. |
| 103 if (!last_mailbox_.IsZero()) { | 105 if (!last_mailbox_.IsZero()) { |
| 104 if (!texture_id_in_layer_) | 106 if (!texture_id_in_layer_) |
| 105 texture_id_in_layer_ = factory->CreateTexture(); | 107 texture_id_in_layer_ = factory->CreateTexture(); |
| 106 factory->AcquireTexture(texture_id_in_layer_, last_mailbox_.name); | 108 factory->AcquireTexture(texture_id_in_layer_, last_mailbox_.name); |
| 107 factory->GetContext3D()->getError(); // Clear error if mailbox was empty. | 109 factory->GetContext3D()->getError(); // Clear error if mailbox was empty. |
| 108 } | 110 } |
| 109 factory->DeleteTexture(texture_id_in_layer_); | 111 factory->DeleteTexture(texture_id_in_layer_); |
| 110 } | 112 } |
| 113 | |
| 114 if (texture_layer_) | |
| 115 texture_layer_->ClearClient(); | |
| 111 } | 116 } |
| 112 | 117 |
| 113 | 118 |
| 114 bool RenderWidgetHostViewAndroid::OnMessageReceived( | 119 bool RenderWidgetHostViewAndroid::OnMessageReceived( |
| 115 const IPC::Message& message) { | 120 const IPC::Message& message) { |
| 116 bool handled = true; | 121 bool handled = true; |
| 117 IPC_BEGIN_MESSAGE_MAP(RenderWidgetHostViewAndroid, message) | 122 IPC_BEGIN_MESSAGE_MAP(RenderWidgetHostViewAndroid, message) |
| 118 IPC_MESSAGE_HANDLER(ViewHostMsg_ImeBatchStateChanged_ACK, | 123 IPC_MESSAGE_HANDLER(ViewHostMsg_ImeBatchStateChanged_ACK, |
| 119 OnProcessImeBatchStateAck) | 124 OnProcessImeBatchStateAck) |
| 120 IPC_MESSAGE_HANDLER(ViewHostMsg_StartContentIntent, OnStartContentIntent) | 125 IPC_MESSAGE_HANDLER(ViewHostMsg_StartContentIntent, OnStartContentIntent) |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 145 } | 150 } |
| 146 | 151 |
| 147 void RenderWidgetHostViewAndroid::WasShown() { | 152 void RenderWidgetHostViewAndroid::WasShown() { |
| 148 if (!host_->is_hidden()) | 153 if (!host_->is_hidden()) |
| 149 return; | 154 return; |
| 150 | 155 |
| 151 host_->WasShown(); | 156 host_->WasShown(); |
| 152 } | 157 } |
| 153 | 158 |
| 154 void RenderWidgetHostViewAndroid::WasHidden() { | 159 void RenderWidgetHostViewAndroid::WasHidden() { |
| 160 RunAckCallbacks(); | |
| 161 | |
| 155 if (host_->is_hidden()) | 162 if (host_->is_hidden()) |
| 156 return; | 163 return; |
| 157 | 164 |
| 158 // Inform the renderer that we are being hidden so it can reduce its resource | 165 // Inform the renderer that we are being hidden so it can reduce its resource |
| 159 // utilization. | 166 // utilization. |
| 160 host_->WasHidden(); | 167 host_->WasHidden(); |
| 161 } | 168 } |
| 162 | 169 |
| 163 void RenderWidgetHostViewAndroid::WasResized() { | 170 void RenderWidgetHostViewAndroid::WasResized() { |
| 164 if (surface_texture_transport_.get() && content_view_core_) | 171 if (surface_texture_transport_.get() && content_view_core_) |
| (...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 588 // need to delay the ACK until after commit and use more than a single | 595 // need to delay the ACK until after commit and use more than a single |
| 589 // texture. | 596 // texture. |
| 590 DCHECK(!CompositorImpl::IsThreadingEnabled()); | 597 DCHECK(!CompositorImpl::IsThreadingEnabled()); |
| 591 | 598 |
| 592 if (texture_id_in_layer_) { | 599 if (texture_id_in_layer_) { |
| 593 DCHECK(!current_mailbox_.IsZero()); | 600 DCHECK(!current_mailbox_.IsZero()); |
| 594 ImageTransportFactoryAndroid::GetInstance()->ReleaseTexture( | 601 ImageTransportFactoryAndroid::GetInstance()->ReleaseTexture( |
| 595 texture_id_in_layer_, current_mailbox_.name); | 602 texture_id_in_layer_, current_mailbox_.name); |
| 596 } else { | 603 } else { |
| 597 texture_id_in_layer_ = factory->CreateTexture(); | 604 texture_id_in_layer_ = factory->CreateTexture(); |
| 598 texture_layer_->SetTextureId(texture_id_in_layer_); | 605 texture_layer_->SetIsDrawable(true); |
| 599 } | 606 } |
| 600 | 607 |
| 601 ImageTransportFactoryAndroid::GetInstance()->AcquireTexture( | 608 ImageTransportFactoryAndroid::GetInstance()->AcquireTexture( |
| 602 texture_id_in_layer_, mailbox.name); | 609 texture_id_in_layer_, mailbox.name); |
| 603 | 610 |
| 604 texture_layer_->SetNeedsDisplay(); | 611 texture_layer_->SetNeedsDisplay(); |
| 605 texture_layer_->SetBounds(gfx::Size(content_size.width(), | 612 texture_layer_->SetBounds(gfx::Size(content_size.width(), |
| 606 content_size.height())); | 613 content_size.height())); |
| 607 | 614 |
| 608 // Calculate the uv_max based on the content size relative to the texture | 615 // Calculate the uv_max based on the content size relative to the texture |
| 609 // size. | 616 // size. |
| 610 gfx::PointF uv_max; | 617 gfx::PointF uv_max; |
| 611 if (texture_size.GetArea() > 0) { | 618 if (texture_size.GetArea() > 0) { |
| 612 uv_max.SetPoint(content_size.width() / texture_size.width(), | 619 uv_max.SetPoint(content_size.width() / texture_size.width(), |
| 613 content_size.height() / texture_size.height()); | 620 content_size.height() / texture_size.height()); |
| 614 } | 621 } |
| 615 texture_layer_->SetUV(gfx::PointF(0, 0), uv_max); | 622 texture_layer_->SetUV(gfx::PointF(0, 0), uv_max); |
| 616 texture_size_in_layer_ = texture_size; | 623 texture_size_in_layer_ = texture_size; |
| 617 current_mailbox_ = mailbox; | 624 current_mailbox_ = mailbox; |
| 618 ack_callback.Run(); | 625 |
| 626 if (consumed_current_texture_ || host_->is_hidden()) | |
| 627 ack_callback.Run(); | |
|
piman
2013/04/19 18:09:12
Note: this can add a frame of latency when GPU-bou
brianderson
2013/04/19 18:49:19
I'm not sure if this is still true, but I tried to
| |
| 628 else | |
| 629 ack_callbacks_.push(ack_callback); | |
| 630 | |
| 631 consumed_current_texture_ = false; | |
| 619 } | 632 } |
| 620 | 633 |
| 621 void RenderWidgetHostViewAndroid::AcceleratedSurfacePostSubBuffer( | 634 void RenderWidgetHostViewAndroid::AcceleratedSurfacePostSubBuffer( |
| 622 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params, | 635 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params, |
| 623 int gpu_host_id) { | 636 int gpu_host_id) { |
| 624 NOTREACHED(); | 637 NOTREACHED(); |
| 625 } | 638 } |
| 626 | 639 |
| 627 void RenderWidgetHostViewAndroid::AcceleratedSurfaceSuspend() { | 640 void RenderWidgetHostViewAndroid::AcceleratedSurfaceSuspend() { |
| 628 NOTREACHED(); | 641 NOTREACHED(); |
| 629 } | 642 } |
| 630 | 643 |
| 631 void RenderWidgetHostViewAndroid::AcceleratedSurfaceRelease() { | 644 void RenderWidgetHostViewAndroid::AcceleratedSurfaceRelease() { |
| 632 // This tells us we should free the frontbuffer. | 645 // This tells us we should free the frontbuffer. |
| 633 if (texture_id_in_layer_) { | 646 if (texture_id_in_layer_) { |
| 634 texture_layer_->SetTextureId(0); | 647 texture_layer_->SetTextureId(0); |
| 648 texture_layer_->SetIsDrawable(false); | |
| 635 ImageTransportFactoryAndroid::GetInstance()->DeleteTexture( | 649 ImageTransportFactoryAndroid::GetInstance()->DeleteTexture( |
| 636 texture_id_in_layer_); | 650 texture_id_in_layer_); |
| 637 texture_id_in_layer_ = 0; | 651 texture_id_in_layer_ = 0; |
| 638 current_mailbox_ = gpu::Mailbox(); | 652 current_mailbox_ = gpu::Mailbox(); |
| 639 } | 653 } |
| 640 } | 654 } |
| 641 | 655 |
| 642 bool RenderWidgetHostViewAndroid::HasAcceleratedSurface( | 656 bool RenderWidgetHostViewAndroid::HasAcceleratedSurface( |
| 643 const gfx::Size& desired_size) { | 657 const gfx::Size& desired_size) { |
| 644 NOTREACHED(); | 658 NOTREACHED(); |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 750 if (host_) | 764 if (host_) |
| 751 host_->MoveCaret(point); | 765 host_->MoveCaret(point); |
| 752 } | 766 } |
| 753 | 767 |
| 754 SkColor RenderWidgetHostViewAndroid::GetCachedBackgroundColor() const { | 768 SkColor RenderWidgetHostViewAndroid::GetCachedBackgroundColor() const { |
| 755 return cached_background_color_; | 769 return cached_background_color_; |
| 756 } | 770 } |
| 757 | 771 |
| 758 void RenderWidgetHostViewAndroid::SetContentViewCore( | 772 void RenderWidgetHostViewAndroid::SetContentViewCore( |
| 759 ContentViewCoreImpl* content_view_core) { | 773 ContentViewCoreImpl* content_view_core) { |
| 774 RunAckCallbacks(); | |
| 775 | |
| 760 if (content_view_core_ && is_layer_attached_) | 776 if (content_view_core_ && is_layer_attached_) |
| 761 content_view_core_->RemoveLayer(layer_); | 777 content_view_core_->RemoveLayer(layer_); |
| 762 | 778 |
| 763 content_view_core_ = content_view_core; | 779 content_view_core_ = content_view_core; |
| 764 if (content_view_core_ && is_layer_attached_) | 780 if (content_view_core_ && is_layer_attached_) |
| 765 content_view_core_->AttachLayer(layer_); | 781 content_view_core_->AttachLayer(layer_); |
| 766 } | 782 } |
| 767 | 783 |
| 784 void RenderWidgetHostViewAndroid::RunAckCallbacks() { | |
| 785 while (!ack_callbacks_.empty()) { | |
| 786 ack_callbacks_.front().Run(); | |
| 787 ack_callbacks_.pop(); | |
| 788 } | |
| 789 } | |
| 790 | |
| 768 void RenderWidgetHostViewAndroid::HasTouchEventHandlers( | 791 void RenderWidgetHostViewAndroid::HasTouchEventHandlers( |
| 769 bool need_touch_events) { | 792 bool need_touch_events) { |
| 770 if (content_view_core_) | 793 if (content_view_core_) |
| 771 content_view_core_->HasTouchEventHandlers(need_touch_events); | 794 content_view_core_->HasTouchEventHandlers(need_touch_events); |
| 772 } | 795 } |
| 773 | 796 |
| 797 unsigned RenderWidgetHostViewAndroid::PrepareTexture( | |
|
no sievers
2013/04/19 17:57:17
Well, it's update resources, not really post commi
| |
| 798 cc::ResourceUpdateQueue* queue) { | |
| 799 RunAckCallbacks(); | |
| 800 consumed_current_texture_ = true; | |
| 801 return texture_id_in_layer_; | |
| 802 } | |
| 803 | |
| 804 WebKit::WebGraphicsContext3D* RenderWidgetHostViewAndroid::Context3d() { | |
| 805 return ImageTransportFactoryAndroid::GetInstance()->GetContext3D(); | |
| 806 } | |
| 807 | |
| 774 // static | 808 // static |
| 775 void RenderWidgetHostViewPort::GetDefaultScreenInfo( | 809 void RenderWidgetHostViewPort::GetDefaultScreenInfo( |
| 776 WebKit::WebScreenInfo* results) { | 810 WebKit::WebScreenInfo* results) { |
| 777 const gfx::Display& display = | 811 const gfx::Display& display = |
| 778 gfx::Screen::GetNativeScreen()->GetPrimaryDisplay(); | 812 gfx::Screen::GetNativeScreen()->GetPrimaryDisplay(); |
| 779 results->rect = display.bounds(); | 813 results->rect = display.bounds(); |
| 780 // TODO(husky): Remove any system controls from availableRect. | 814 // TODO(husky): Remove any system controls from availableRect. |
| 781 results->availableRect = display.work_area(); | 815 results->availableRect = display.work_area(); |
| 782 results->deviceScaleFactor = display.device_scale_factor(); | 816 results->deviceScaleFactor = display.device_scale_factor(); |
| 783 gfx::DeviceDisplayInfo info; | 817 gfx::DeviceDisplayInfo info; |
| 784 results->depth = info.GetBitsPerPixel(); | 818 results->depth = info.GetBitsPerPixel(); |
| 785 results->depthPerComponent = info.GetBitsPerComponent(); | 819 results->depthPerComponent = info.GetBitsPerComponent(); |
| 786 results->isMonochrome = (results->depthPerComponent == 0); | 820 results->isMonochrome = (results->depthPerComponent == 0); |
| 787 } | 821 } |
| 788 | 822 |
| 789 //////////////////////////////////////////////////////////////////////////////// | 823 //////////////////////////////////////////////////////////////////////////////// |
| 790 // RenderWidgetHostView, public: | 824 // RenderWidgetHostView, public: |
| 791 | 825 |
| 792 // static | 826 // static |
| 793 RenderWidgetHostView* | 827 RenderWidgetHostView* |
| 794 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { | 828 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { |
| 795 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); | 829 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); |
| 796 return new RenderWidgetHostViewAndroid(rwhi, NULL); | 830 return new RenderWidgetHostViewAndroid(rwhi, NULL); |
| 797 } | 831 } |
| 798 | 832 |
| 799 } // namespace content | 833 } // namespace content |
| OLD | NEW |