| 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/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 52 ImageTransportFactoryAndroid::GetInstance()->InsertSyncPoint(); | 52 ImageTransportFactoryAndroid::GetInstance()->InsertSyncPoint(); |
| 53 AcceleratedSurfaceMsg_BufferPresented_Params ack_params; | 53 AcceleratedSurfaceMsg_BufferPresented_Params ack_params; |
| 54 ack_params.mailbox_name = return_mailbox; | 54 ack_params.mailbox_name = return_mailbox; |
| 55 ack_params.sync_point = sync_point; | 55 ack_params.sync_point = sync_point; |
| 56 RenderWidgetHostImpl::AcknowledgeBufferPresent( | 56 RenderWidgetHostImpl::AcknowledgeBufferPresent( |
| 57 route_id, gpu_host_id, ack_params); | 57 route_id, gpu_host_id, ack_params); |
| 58 } | 58 } |
| 59 | 59 |
| 60 void InsertSyncPointAndAckForCompositor( | 60 void InsertSyncPointAndAckForCompositor( |
| 61 int renderer_host_id, | 61 int renderer_host_id, |
| 62 uint32 output_surface_id, |
| 62 int route_id, | 63 int route_id, |
| 63 const gpu::Mailbox& return_mailbox, | 64 const gpu::Mailbox& return_mailbox, |
| 64 const gfx::Size return_size) { | 65 const gfx::Size return_size) { |
| 65 cc::CompositorFrameAck ack; | 66 cc::CompositorFrameAck ack; |
| 66 ack.gl_frame_data.reset(new cc::GLFrameData()); | 67 ack.gl_frame_data.reset(new cc::GLFrameData()); |
| 67 if (!return_mailbox.IsZero()) { | 68 if (!return_mailbox.IsZero()) { |
| 68 ack.gl_frame_data->mailbox = return_mailbox; | 69 ack.gl_frame_data->mailbox = return_mailbox; |
| 69 ack.gl_frame_data->size = return_size; | 70 ack.gl_frame_data->size = return_size; |
| 70 ack.gl_frame_data->sync_point = | 71 ack.gl_frame_data->sync_point = |
| 71 ImageTransportFactoryAndroid::GetInstance()->InsertSyncPoint(); | 72 ImageTransportFactoryAndroid::GetInstance()->InsertSyncPoint(); |
| 72 } | 73 } |
| 73 RenderWidgetHostImpl::SendSwapCompositorFrameAck( | 74 RenderWidgetHostImpl::SendSwapCompositorFrameAck( |
| 74 route_id, renderer_host_id, ack); | 75 route_id, output_surface_id, renderer_host_id, ack); |
| 75 } | 76 } |
| 76 | 77 |
| 77 } // anonymous namespace | 78 } // anonymous namespace |
| 78 | 79 |
| 79 RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( | 80 RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( |
| 80 RenderWidgetHostImpl* widget_host, | 81 RenderWidgetHostImpl* widget_host, |
| 81 ContentViewCoreImpl* content_view_core) | 82 ContentViewCoreImpl* content_view_core) |
| 82 : host_(widget_host), | 83 : host_(widget_host), |
| 83 needs_begin_frame_(false), | 84 needs_begin_frame_(false), |
| 84 are_layers_attached_(true), | 85 are_layers_attached_(true), |
| (...skipping 469 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 554 return new TouchSmoothScrollGestureAndroid( | 555 return new TouchSmoothScrollGestureAndroid( |
| 555 pixels_to_scroll, | 556 pixels_to_scroll, |
| 556 GetRenderWidgetHost(), | 557 GetRenderWidgetHost(), |
| 557 content_view_core_->CreateSmoothScroller( | 558 content_view_core_->CreateSmoothScroller( |
| 558 scroll_down, mouse_event_x, mouse_event_y)); | 559 scroll_down, mouse_event_x, mouse_event_y)); |
| 559 } | 560 } |
| 560 | 561 |
| 561 void RenderWidgetHostViewAndroid::OnAcceleratedCompositingStateChange() { | 562 void RenderWidgetHostViewAndroid::OnAcceleratedCompositingStateChange() { |
| 562 } | 563 } |
| 563 | 564 |
| 564 void RenderWidgetHostViewAndroid::SendDelegatedFrameAck() { | 565 void RenderWidgetHostViewAndroid::SendDelegatedFrameAck( |
| 566 uint32 output_surface_id) { |
| 565 cc::CompositorFrameAck ack; | 567 cc::CompositorFrameAck ack; |
| 566 delegated_renderer_layer_->TakeUnusedResourcesForChildCompositor( | 568 delegated_renderer_layer_->TakeUnusedResourcesForChildCompositor( |
| 567 &ack.resources); | 569 &ack.resources); |
| 568 RenderWidgetHostImpl::SendSwapCompositorFrameAck( | 570 RenderWidgetHostImpl::SendSwapCompositorFrameAck( |
| 569 host_->GetRoutingID(), host_->GetProcess()->GetID(), ack); | 571 host_->GetRoutingID(), output_surface_id, |
| 572 host_->GetProcess()->GetID(), ack); |
| 570 } | 573 } |
| 571 | 574 |
| 572 void RenderWidgetHostViewAndroid::SwapDelegatedFrame( | 575 void RenderWidgetHostViewAndroid::SwapDelegatedFrame( |
| 576 uint32 output_surface_id, |
| 573 scoped_ptr<cc::DelegatedFrameData> frame_data) { | 577 scoped_ptr<cc::DelegatedFrameData> frame_data) { |
| 574 bool has_frame = frame_data.get() && !frame_data->render_pass_list.empty(); | 578 bool has_frame = frame_data.get() && !frame_data->render_pass_list.empty(); |
| 575 | 579 |
| 576 if (has_frame) { | 580 if (has_frame) { |
| 577 delegated_renderer_layer_->SetFrameData(frame_data.Pass()); | 581 delegated_renderer_layer_->SetFrameData(frame_data.Pass()); |
| 578 delegated_renderer_layer_->SetDisplaySize(texture_size_in_layer_); | 582 delegated_renderer_layer_->SetDisplaySize(texture_size_in_layer_); |
| 579 layer_->SetIsDrawable(true); | 583 layer_->SetIsDrawable(true); |
| 580 } | 584 } |
| 581 layer_->SetBounds(content_size_in_layer_); | 585 layer_->SetBounds(content_size_in_layer_); |
| 582 layer_->SetNeedsDisplay(); | 586 layer_->SetNeedsDisplay(); |
| 583 | 587 |
| 584 base::Closure ack_callback = | 588 base::Closure ack_callback = |
| 585 base::Bind(&RenderWidgetHostViewAndroid::SendDelegatedFrameAck, | 589 base::Bind(&RenderWidgetHostViewAndroid::SendDelegatedFrameAck, |
| 586 weak_ptr_factory_.GetWeakPtr()); | 590 weak_ptr_factory_.GetWeakPtr(), |
| 591 output_surface_id); |
| 587 | 592 |
| 588 if (host_->is_hidden()) | 593 if (host_->is_hidden()) |
| 589 ack_callback.Run(); | 594 ack_callback.Run(); |
| 590 else | 595 else |
| 591 ack_callbacks_.push(ack_callback); | 596 ack_callbacks_.push(ack_callback); |
| 592 } | 597 } |
| 593 | 598 |
| 594 void RenderWidgetHostViewAndroid::ComputeContentsSize( | 599 void RenderWidgetHostViewAndroid::ComputeContentsSize( |
| 595 const cc::CompositorFrameMetadata& frame_metadata) { | 600 const cc::CompositorFrameMetadata& frame_metadata) { |
| 596 // Calculate the content size. This should be 0 if the texture_size is 0. | 601 // Calculate the content size. This should be 0 if the texture_size is 0. |
| 597 gfx::Vector2dF offset; | 602 gfx::Vector2dF offset; |
| 598 if (texture_size_in_layer_.GetArea() > 0) | 603 if (texture_size_in_layer_.GetArea() > 0) |
| 599 offset = frame_metadata.location_bar_content_translation; | 604 offset = frame_metadata.location_bar_content_translation; |
| 600 offset.set_y(offset.y() + frame_metadata.overdraw_bottom_height); | 605 offset.set_y(offset.y() + frame_metadata.overdraw_bottom_height); |
| 601 offset.Scale(frame_metadata.device_scale_factor); | 606 offset.Scale(frame_metadata.device_scale_factor); |
| 602 content_size_in_layer_ = | 607 content_size_in_layer_ = |
| 603 gfx::Size(texture_size_in_layer_.width() - offset.x(), | 608 gfx::Size(texture_size_in_layer_.width() - offset.x(), |
| 604 texture_size_in_layer_.height() - offset.y()); | 609 texture_size_in_layer_.height() - offset.y()); |
| 605 // Content size changes should be reflected in associated animation effects. | 610 // Content size changes should be reflected in associated animation effects. |
| 606 UpdateAnimationSize(frame_metadata); | 611 UpdateAnimationSize(frame_metadata); |
| 607 } | 612 } |
| 608 | 613 |
| 609 void RenderWidgetHostViewAndroid::OnSwapCompositorFrame( | 614 void RenderWidgetHostViewAndroid::OnSwapCompositorFrame( |
| 615 uint32 output_surface_id, |
| 610 scoped_ptr<cc::CompositorFrame> frame) { | 616 scoped_ptr<cc::CompositorFrame> frame) { |
| 611 // Always let ContentViewCore know about the new frame first, so it can decide | 617 // Always let ContentViewCore know about the new frame first, so it can decide |
| 612 // to schedule a Draw immediately when it sees the texture layer invalidation. | 618 // to schedule a Draw immediately when it sees the texture layer invalidation. |
| 613 UpdateContentViewCoreFrameMetadata(frame->metadata); | 619 UpdateContentViewCoreFrameMetadata(frame->metadata); |
| 614 | 620 |
| 615 if (frame->delegated_frame_data) { | 621 if (frame->delegated_frame_data) { |
| 616 if (!frame->delegated_frame_data->render_pass_list.empty()) { | 622 if (!frame->delegated_frame_data->render_pass_list.empty()) { |
| 617 texture_size_in_layer_ = frame->delegated_frame_data->render_pass_list | 623 texture_size_in_layer_ = frame->delegated_frame_data->render_pass_list |
| 618 .back()->output_rect.size(); | 624 .back()->output_rect.size(); |
| 619 } | 625 } |
| 620 ComputeContentsSize(frame->metadata); | 626 ComputeContentsSize(frame->metadata); |
| 621 | 627 |
| 622 SwapDelegatedFrame(frame->delegated_frame_data.Pass()); | 628 SwapDelegatedFrame(output_surface_id, frame->delegated_frame_data.Pass()); |
| 623 return; | 629 return; |
| 624 } | 630 } |
| 625 | 631 |
| 626 if (!frame->gl_frame_data || frame->gl_frame_data->mailbox.IsZero()) | 632 if (!frame->gl_frame_data || frame->gl_frame_data->mailbox.IsZero()) |
| 627 return; | 633 return; |
| 628 | 634 |
| 629 base::Closure callback = base::Bind(&InsertSyncPointAndAckForCompositor, | 635 base::Closure callback = base::Bind(&InsertSyncPointAndAckForCompositor, |
| 630 host_->GetProcess()->GetID(), | 636 host_->GetProcess()->GetID(), |
| 637 output_surface_id, |
| 631 host_->GetRoutingID(), | 638 host_->GetRoutingID(), |
| 632 current_mailbox_, | 639 current_mailbox_, |
| 633 texture_size_in_layer_); | 640 texture_size_in_layer_); |
| 634 ImageTransportFactoryAndroid::GetInstance()->WaitSyncPoint( | 641 ImageTransportFactoryAndroid::GetInstance()->WaitSyncPoint( |
| 635 frame->gl_frame_data->sync_point); | 642 frame->gl_frame_data->sync_point); |
| 636 | 643 |
| 637 texture_size_in_layer_ = frame->gl_frame_data->size; | 644 texture_size_in_layer_ = frame->gl_frame_data->size; |
| 638 ComputeContentsSize(frame->metadata); | 645 ComputeContentsSize(frame->metadata); |
| 639 | 646 |
| 640 if (layer_->layer_tree_host()) | 647 if (layer_->layer_tree_host()) |
| (...skipping 483 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1124 // RenderWidgetHostView, public: | 1131 // RenderWidgetHostView, public: |
| 1125 | 1132 |
| 1126 // static | 1133 // static |
| 1127 RenderWidgetHostView* | 1134 RenderWidgetHostView* |
| 1128 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { | 1135 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { |
| 1129 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); | 1136 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); |
| 1130 return new RenderWidgetHostViewAndroid(rwhi, NULL); | 1137 return new RenderWidgetHostViewAndroid(rwhi, NULL); |
| 1131 } | 1138 } |
| 1132 | 1139 |
| 1133 } // namespace content | 1140 } // namespace content |
| OLD | NEW |