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

Side by Side Diff: ui/android/delegated_frame_host_android.cc

Issue 2728183002: RendererCompositorFrameSink should handle local surface id allocation (Closed)
Patch Set: rebase Created 3 years, 9 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
« no previous file with comments | « ui/android/delegated_frame_host_android.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 "ui/android/delegated_frame_host_android.h" 5 #include "ui/android/delegated_frame_host_android.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/memory/ptr_util.h" 9 #include "base/memory/ptr_util.h"
10 #include "cc/layers/solid_color_layer.h" 10 #include "cc/layers/solid_color_layer.h"
11 #include "cc/layers/surface_layer.h" 11 #include "cc/layers/surface_layer.h"
12 #include "cc/output/compositor_frame.h" 12 #include "cc/output/compositor_frame.h"
13 #include "cc/output/copy_output_result.h" 13 #include "cc/output/copy_output_result.h"
14 #include "cc/surfaces/local_surface_id_allocator.h"
15 #include "cc/surfaces/surface.h" 14 #include "cc/surfaces/surface.h"
16 #include "cc/surfaces/surface_id.h" 15 #include "cc/surfaces/surface_id.h"
17 #include "cc/surfaces/surface_manager.h" 16 #include "cc/surfaces/surface_manager.h"
18 #include "ui/android/view_android.h" 17 #include "ui/android/view_android.h"
19 #include "ui/android/window_android_compositor.h" 18 #include "ui/android/window_android_compositor.h"
20 #include "ui/display/display.h" 19 #include "ui/display/display.h"
21 #include "ui/display/screen.h" 20 #include "ui/display/screen.h"
22 #include "ui/gfx/geometry/dip_util.h" 21 #include "ui/gfx/geometry/dip_util.h"
23 22
24 namespace ui { 23 namespace ui {
25 24
26 namespace { 25 namespace {
27 26
28 scoped_refptr<cc::SurfaceLayer> CreateSurfaceLayer( 27 scoped_refptr<cc::SurfaceLayer> CreateSurfaceLayer(
29 cc::SurfaceManager* surface_manager, 28 cc::SurfaceManager* surface_manager,
30 cc::SurfaceId surface_id, 29 cc::SurfaceInfo surface_info,
31 const gfx::Size surface_size,
32 bool surface_opaque) { 30 bool surface_opaque) {
33 // manager must outlive compositors using it. 31 // manager must outlive compositors using it.
34 auto layer = cc::SurfaceLayer::Create(surface_manager->reference_factory()); 32 auto layer = cc::SurfaceLayer::Create(surface_manager->reference_factory());
35 layer->SetPrimarySurfaceInfo(cc::SurfaceInfo(surface_id, 1.f, surface_size)); 33 layer->SetPrimarySurfaceInfo(surface_info);
36 layer->SetBounds(surface_size); 34 layer->SetBounds(surface_info.size_in_pixels());
37 layer->SetIsDrawable(true); 35 layer->SetIsDrawable(true);
38 layer->SetContentsOpaque(surface_opaque); 36 layer->SetContentsOpaque(surface_opaque);
39 37
40 return layer; 38 return layer;
41 } 39 }
42 40
43 void CopyOutputRequestCallback( 41 void CopyOutputRequestCallback(
44 scoped_refptr<cc::Layer> readback_layer, 42 scoped_refptr<cc::Layer> readback_layer,
45 cc::CopyOutputRequest::CopyOutputRequestCallback result_callback, 43 cc::CopyOutputRequest::CopyOutputRequestCallback result_callback,
46 std::unique_ptr<cc::CopyOutputResult> copy_output_result) { 44 std::unique_ptr<cc::CopyOutputResult> copy_output_result) {
47 readback_layer->RemoveFromParent(); 45 readback_layer->RemoveFromParent();
48 result_callback.Run(std::move(copy_output_result)); 46 result_callback.Run(std::move(copy_output_result));
49 } 47 }
50 48
51 } // namespace 49 } // namespace
52 50
53 DelegatedFrameHostAndroid::DelegatedFrameHostAndroid( 51 DelegatedFrameHostAndroid::DelegatedFrameHostAndroid(
54 ui::ViewAndroid* view, 52 ui::ViewAndroid* view,
55 cc::SurfaceManager* surface_manager, 53 cc::SurfaceManager* surface_manager,
56 Client* client, 54 Client* client,
57 const cc::FrameSinkId& frame_sink_id) 55 const cc::FrameSinkId& frame_sink_id)
58 : frame_sink_id_(frame_sink_id), 56 : frame_sink_id_(frame_sink_id),
59 view_(view), 57 view_(view),
60 surface_manager_(surface_manager), 58 surface_manager_(surface_manager),
61 client_(client), 59 client_(client),
62 begin_frame_source_(this) { 60 begin_frame_source_(this) {
63 DCHECK(view_); 61 DCHECK(view_);
64 DCHECK(client_); 62 DCHECK(client_);
65 63
66 local_surface_id_allocator_.reset(new cc::LocalSurfaceIdAllocator());
67 surface_manager_->RegisterFrameSinkId(frame_sink_id_); 64 surface_manager_->RegisterFrameSinkId(frame_sink_id_);
68 CreateNewCompositorFrameSinkSupport(); 65 CreateNewCompositorFrameSinkSupport();
69 } 66 }
70 67
71 DelegatedFrameHostAndroid::~DelegatedFrameHostAndroid() { 68 DelegatedFrameHostAndroid::~DelegatedFrameHostAndroid() {
72 DestroyDelegatedContent(); 69 DestroyDelegatedContent();
73 DetachFromCompositor(); 70 DetachFromCompositor();
74 support_.reset(); 71 support_.reset();
75 surface_manager_->InvalidateFrameSinkId(frame_sink_id_); 72 surface_manager_->InvalidateFrameSinkId(frame_sink_id_);
76 } 73 }
77 74
78 DelegatedFrameHostAndroid::FrameData::FrameData() = default;
79
80 DelegatedFrameHostAndroid::FrameData::~FrameData() = default;
81
82 void DelegatedFrameHostAndroid::SubmitCompositorFrame( 75 void DelegatedFrameHostAndroid::SubmitCompositorFrame(
76 const cc::LocalSurfaceId& local_surface_id,
83 cc::CompositorFrame frame) { 77 cc::CompositorFrame frame) {
84 cc::RenderPass* root_pass = frame.render_pass_list.back().get(); 78 if (local_surface_id != surface_info_.id().local_surface_id()) {
85 gfx::Size surface_size = root_pass->output_rect.size();
86
87 if (!current_frame_ || surface_size != current_frame_->surface_size ||
88 current_frame_->top_controls_height !=
89 frame.metadata.top_controls_height ||
90 current_frame_->top_controls_shown_ratio !=
91 frame.metadata.top_controls_shown_ratio ||
92 current_frame_->bottom_controls_height !=
93 frame.metadata.bottom_controls_height ||
94 current_frame_->bottom_controls_shown_ratio !=
95 frame.metadata.bottom_controls_shown_ratio ||
96 current_frame_->viewport_selection != frame.metadata.selection ||
97 current_frame_->has_transparent_background !=
98 root_pass->has_transparent_background) {
99 DestroyDelegatedContent(); 79 DestroyDelegatedContent();
100 DCHECK(!content_layer_); 80 DCHECK(!content_layer_);
101 DCHECK(!current_frame_);
102 81
103 current_frame_ = base::MakeUnique<FrameData>(); 82 cc::RenderPass* root_pass = frame.render_pass_list.back().get();
104 current_frame_->local_surface_id = 83 gfx::Size frame_size = root_pass->output_rect.size();
105 local_surface_id_allocator_->GenerateId(); 84 surface_info_ = cc::SurfaceInfo(
106 current_frame_->surface_size = surface_size; 85 cc::SurfaceId(frame_sink_id_, local_surface_id), 1.f, frame_size);
107 current_frame_->top_controls_height = frame.metadata.top_controls_height; 86 has_transparent_background_ = root_pass->has_transparent_background;
108 current_frame_->top_controls_shown_ratio =
109 frame.metadata.top_controls_shown_ratio;
110 current_frame_->bottom_controls_height =
111 frame.metadata.bottom_controls_height;
112 current_frame_->bottom_controls_shown_ratio =
113 frame.metadata.bottom_controls_shown_ratio;
114 current_frame_->has_transparent_background =
115 root_pass->has_transparent_background;
116 current_frame_->viewport_selection = frame.metadata.selection;
117 87
118 content_layer_ = CreateSurfaceLayer( 88 content_layer_ = CreateSurfaceLayer(surface_manager_, surface_info_,
119 surface_manager_, 89 !has_transparent_background_);
120 cc::SurfaceId(frame_sink_id_, current_frame_->local_surface_id),
121 current_frame_->surface_size,
122 !current_frame_->has_transparent_background);
123 view_->GetLayer()->AddChild(content_layer_); 90 view_->GetLayer()->AddChild(content_layer_);
124 } 91 }
125 support_->SubmitCompositorFrame(current_frame_->local_surface_id, 92 support_->SubmitCompositorFrame(local_surface_id, std::move(frame));
126 std::move(frame));
127 } 93 }
128 94
129 cc::FrameSinkId DelegatedFrameHostAndroid::GetFrameSinkId() const { 95 cc::FrameSinkId DelegatedFrameHostAndroid::GetFrameSinkId() const {
130 return frame_sink_id_; 96 return frame_sink_id_;
131 } 97 }
132 98
133 void DelegatedFrameHostAndroid::RequestCopyOfSurface( 99 void DelegatedFrameHostAndroid::RequestCopyOfSurface(
134 WindowAndroidCompositor* compositor, 100 WindowAndroidCompositor* compositor,
135 const gfx::Rect& src_subrect_in_pixel, 101 const gfx::Rect& src_subrect_in_pixel,
136 cc::CopyOutputRequest::CopyOutputRequestCallback result_callback) { 102 cc::CopyOutputRequest::CopyOutputRequestCallback result_callback) {
137 DCHECK(current_frame_); 103 DCHECK(surface_info_.is_valid());
138 DCHECK(!result_callback.is_null()); 104 DCHECK(!result_callback.is_null());
139 105
140 scoped_refptr<cc::Layer> readback_layer = CreateSurfaceLayer( 106 scoped_refptr<cc::Layer> readback_layer = CreateSurfaceLayer(
141 surface_manager_, 107 surface_manager_, surface_info_, !has_transparent_background_);
142 cc::SurfaceId(frame_sink_id_, current_frame_->local_surface_id),
143 current_frame_->surface_size,
144 !current_frame_->has_transparent_background);
145 readback_layer->SetHideLayerAndSubtree(true); 108 readback_layer->SetHideLayerAndSubtree(true);
146 compositor->AttachLayerForReadback(readback_layer); 109 compositor->AttachLayerForReadback(readback_layer);
147 std::unique_ptr<cc::CopyOutputRequest> copy_output_request = 110 std::unique_ptr<cc::CopyOutputRequest> copy_output_request =
148 cc::CopyOutputRequest::CreateRequest(base::Bind( 111 cc::CopyOutputRequest::CreateRequest(base::Bind(
149 &CopyOutputRequestCallback, readback_layer, result_callback)); 112 &CopyOutputRequestCallback, readback_layer, result_callback));
150 113
151 if (!src_subrect_in_pixel.IsEmpty()) 114 if (!src_subrect_in_pixel.IsEmpty())
152 copy_output_request->set_area(src_subrect_in_pixel); 115 copy_output_request->set_area(src_subrect_in_pixel);
153 116
154 support_->RequestCopyOfSurface(std::move(copy_output_request)); 117 support_->RequestCopyOfSurface(std::move(copy_output_request));
155 } 118 }
156 119
157 void DelegatedFrameHostAndroid::DestroyDelegatedContent() { 120 void DelegatedFrameHostAndroid::DestroyDelegatedContent() {
158 if (!current_frame_) 121 if (!surface_info_.is_valid())
159 return; 122 return;
160 123
161 DCHECK(content_layer_); 124 DCHECK(content_layer_);
162 125
163 content_layer_->RemoveFromParent(); 126 content_layer_->RemoveFromParent();
164 content_layer_ = nullptr; 127 content_layer_ = nullptr;
165 support_->EvictFrame(); 128 support_->EvictFrame();
166 current_frame_.reset(); 129 surface_info_ = cc::SurfaceInfo();
167 } 130 }
168 131
169 bool DelegatedFrameHostAndroid::HasDelegatedContent() const { 132 bool DelegatedFrameHostAndroid::HasDelegatedContent() const {
170 return current_frame_.get() != nullptr; 133 return surface_info_.is_valid();
171 } 134 }
172 135
173 void DelegatedFrameHostAndroid::CompositorFrameSinkChanged() { 136 void DelegatedFrameHostAndroid::CompositorFrameSinkChanged() {
174 DestroyDelegatedContent(); 137 DestroyDelegatedContent();
175 CreateNewCompositorFrameSinkSupport(); 138 CreateNewCompositorFrameSinkSupport();
176 if (registered_parent_compositor_) 139 if (registered_parent_compositor_)
177 AttachToCompositor(registered_parent_compositor_); 140 AttachToCompositor(registered_parent_compositor_);
178 } 141 }
179 142
180 void DelegatedFrameHostAndroid::AttachToCompositor( 143 void DelegatedFrameHostAndroid::AttachToCompositor(
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
221 184
222 void DelegatedFrameHostAndroid::CreateNewCompositorFrameSinkSupport() { 185 void DelegatedFrameHostAndroid::CreateNewCompositorFrameSinkSupport() {
223 support_.reset(); 186 support_.reset();
224 support_ = base::MakeUnique<cc::CompositorFrameSinkSupport>( 187 support_ = base::MakeUnique<cc::CompositorFrameSinkSupport>(
225 this, surface_manager_, frame_sink_id_, false /* is_root */, 188 this, surface_manager_, frame_sink_id_, false /* is_root */,
226 false /* handles_frame_sink_id_invalidation */, 189 false /* handles_frame_sink_id_invalidation */,
227 true /* needs_sync_points */); 190 true /* needs_sync_points */);
228 } 191 }
229 192
230 cc::SurfaceId DelegatedFrameHostAndroid::SurfaceId() const { 193 cc::SurfaceId DelegatedFrameHostAndroid::SurfaceId() const {
231 return cc::SurfaceId(frame_sink_id_, current_frame_->local_surface_id); 194 return surface_info_.id();
232 } 195 }
233 196
234 } // namespace ui 197 } // namespace ui
OLDNEW
« no previous file with comments | « ui/android/delegated_frame_host_android.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698