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

Side by Side Diff: content/browser/renderer_host/render_widget_host_view_android.cc

Issue 19331002: Associate an id with the output surface to handle lost contexts (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix android, tests Created 7 years, 5 months 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 | Annotate | Revision Log
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/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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698