| 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 |