OLD | NEW |
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 Loading... |
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 |
OLD | NEW |