| 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 "services/ui/ws/frame_generator.h" | 5 #include "services/ui/ws/frame_generator.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/containers/adapters.h" | 10 #include "base/containers/adapters.h" |
| (...skipping 28 matching lines...) Expand all Loading... |
| 39 } | 39 } |
| 40 | 40 |
| 41 void FrameGenerator::OnAcceleratedWidgetAvailable( | 41 void FrameGenerator::OnAcceleratedWidgetAvailable( |
| 42 gfx::AcceleratedWidget widget) { | 42 gfx::AcceleratedWidget widget) { |
| 43 DCHECK_NE(gfx::kNullAcceleratedWidget, widget); | 43 DCHECK_NE(gfx::kNullAcceleratedWidget, widget); |
| 44 cc::mojom::MojoCompositorFrameSinkRequest request(&compositor_frame_sink_); | 44 cc::mojom::MojoCompositorFrameSinkRequest request(&compositor_frame_sink_); |
| 45 cc::mojom::DisplayPrivateRequest display_private_request(&display_private_); | 45 cc::mojom::DisplayPrivateRequest display_private_request(&display_private_); |
| 46 root_window_->CreateDisplayCompositorFrameSink( | 46 root_window_->CreateDisplayCompositorFrameSink( |
| 47 widget, std::move(request), binding_.CreateInterfacePtrAndBind(), | 47 widget, std::move(request), binding_.CreateInterfacePtrAndBind(), |
| 48 std::move(display_private_request)); | 48 std::move(display_private_request)); |
| 49 // TODO(fsamuel): This means we're always requesting a new BeginFrame signal | |
| 50 // even when we don't need it. Once surface ID propagation work is done, | |
| 51 // this will not be necessary because FrameGenerator will only need a | |
| 52 // BeginFrame if the window manager changes. | |
| 53 compositor_frame_sink_->SetNeedsBeginFrame(true); | |
| 54 } | 49 } |
| 55 | 50 |
| 56 void FrameGenerator::OnSurfaceCreated(const cc::SurfaceId& surface_id, | 51 void FrameGenerator::OnSurfaceCreated(const cc::SurfaceInfo& surface_info, |
| 57 ServerWindow* window) { | 52 ServerWindow* window) { |
| 58 DCHECK(surface_id.is_valid()); | 53 DCHECK(surface_info.id().is_valid()); |
| 59 | 54 |
| 60 // Only handle embedded surfaces changing here. The display root surface | 55 // Only handle embedded surfaces changing here. The display root surface |
| 61 // changing is handled immediately after the CompositorFrame is submitted. | 56 // changing is handled immediately after the CompositorFrame is submitted. |
| 62 // TODO(samans): Only tell FrameGenerator about WM surface instead of all | 57 // TODO(samans): Only tell FrameGenerator about WM surface instead of all |
| 63 // all surfaces. | 58 // all surfaces. |
| 64 if (window == delegate_->GetActiveRootWindow()) | 59 if (window == delegate_->GetActiveRootWindow()) { |
| 65 window_manager_surface_id_ = surface_id; | 60 if (surface_info != window_manager_surface_info_) |
| 61 compositor_frame_sink_->SetNeedsBeginFrame(true); |
| 62 window_manager_surface_info_ = surface_info; |
| 63 } |
| 66 } | 64 } |
| 67 | 65 |
| 68 void FrameGenerator::DidReceiveCompositorFrameAck() {} | 66 void FrameGenerator::DidReceiveCompositorFrameAck() {} |
| 69 | 67 |
| 70 void FrameGenerator::OnBeginFrame(const cc::BeginFrameArgs& begin_frame_arags) { | 68 void FrameGenerator::OnBeginFrame(const cc::BeginFrameArgs& begin_frame_arags) { |
| 71 if (!root_window_->visible()) | 69 if (!root_window_->visible()) |
| 72 return; | 70 return; |
| 73 | 71 |
| 74 // TODO(fsamuel): We should add a trace for generating a top level frame. | 72 // TODO(fsamuel): We should add a trace for generating a top level frame. |
| 75 cc::CompositorFrame frame(GenerateCompositorFrame(root_window_->bounds())); | 73 cc::CompositorFrame frame(GenerateCompositorFrame(root_window_->bounds())); |
| 76 | 74 |
| 77 if (compositor_frame_sink_) { | 75 if (compositor_frame_sink_) { |
| 78 gfx::Size frame_size = last_submitted_frame_size_; | 76 gfx::Size frame_size = last_submitted_frame_size_; |
| 79 if (!frame.render_pass_list.empty()) | 77 if (!frame.render_pass_list.empty()) |
| 80 frame_size = frame.render_pass_list[0]->output_rect.size(); | 78 frame_size = frame.render_pass_list[0]->output_rect.size(); |
| 81 | 79 |
| 82 if (!local_frame_id_.is_valid() || frame_size != last_submitted_frame_size_) | 80 if (!local_frame_id_.is_valid() || frame_size != last_submitted_frame_size_) |
| 83 local_frame_id_ = id_allocator_.GenerateId(); | 81 local_frame_id_ = id_allocator_.GenerateId(); |
| 84 | 82 |
| 85 compositor_frame_sink_->SubmitCompositorFrame(local_frame_id_, | 83 compositor_frame_sink_->SubmitCompositorFrame(local_frame_id_, |
| 86 std::move(frame)); | 84 std::move(frame)); |
| 85 compositor_frame_sink_->SetNeedsBeginFrame(false); |
| 87 last_submitted_frame_size_ = frame_size; | 86 last_submitted_frame_size_ = frame_size; |
| 88 } | 87 } |
| 89 } | 88 } |
| 90 | 89 |
| 91 void FrameGenerator::ReclaimResources( | 90 void FrameGenerator::ReclaimResources( |
| 92 const cc::ReturnedResourceArray& resources) { | 91 const cc::ReturnedResourceArray& resources) { |
| 93 // Nothing to do here because FrameGenerator CompositorFrames don't reference | 92 // Nothing to do here because FrameGenerator CompositorFrames don't reference |
| 94 // any resources. | 93 // any resources. |
| 95 } | 94 } |
| 96 | 95 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 120 render_pass->filters.Append(cc::FilterOperation::CreateInvertFilter(1.f)); | 119 render_pass->filters.Append(cc::FilterOperation::CreateInvertFilter(1.f)); |
| 121 quad->SetNew(shared_state, output_rect, output_rect, render_pass_id, | 120 quad->SetNew(shared_state, output_rect, output_rect, render_pass_id, |
| 122 0 /* mask_resource_id */, gfx::Vector2dF() /* mask_uv_scale */, | 121 0 /* mask_resource_id */, gfx::Vector2dF() /* mask_uv_scale */, |
| 123 gfx::Size() /* mask_texture_size */, | 122 gfx::Size() /* mask_texture_size */, |
| 124 gfx::Vector2dF() /* filters_scale */, | 123 gfx::Vector2dF() /* filters_scale */, |
| 125 gfx::PointF() /* filters_origin */); | 124 gfx::PointF() /* filters_origin */); |
| 126 frame.render_pass_list.push_back(std::move(invert_pass)); | 125 frame.render_pass_list.push_back(std::move(invert_pass)); |
| 127 } | 126 } |
| 128 frame.metadata.device_scale_factor = device_scale_factor_; | 127 frame.metadata.device_scale_factor = device_scale_factor_; |
| 129 | 128 |
| 130 if (window_manager_surface_id_.is_valid()) | 129 if (window_manager_surface_info_.id().is_valid()) { |
| 131 frame.metadata.referenced_surfaces.push_back(window_manager_surface_id_); | 130 frame.metadata.referenced_surfaces.push_back( |
| 131 window_manager_surface_info_.id()); |
| 132 } |
| 132 | 133 |
| 133 return frame; | 134 return frame; |
| 134 } | 135 } |
| 135 | 136 |
| 136 void FrameGenerator::DrawWindow(cc::RenderPass* pass, ServerWindow* window) { | 137 void FrameGenerator::DrawWindow(cc::RenderPass* pass, ServerWindow* window) { |
| 137 if (!window || !window->visible()) | 138 if (!window || !window->visible()) |
| 138 return; | 139 return; |
| 139 | 140 |
| 140 if (!window->compositor_frame_sink_manager()) | 141 if (!window->compositor_frame_sink_manager()) |
| 141 return; | 142 return; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 167 default_surface_id); | 168 default_surface_id); |
| 168 } | 169 } |
| 169 | 170 |
| 170 void FrameGenerator::OnWindowDestroying(ServerWindow* window) { | 171 void FrameGenerator::OnWindowDestroying(ServerWindow* window) { |
| 171 Remove(window); | 172 Remove(window); |
| 172 } | 173 } |
| 173 | 174 |
| 174 } // namespace ws | 175 } // namespace ws |
| 175 | 176 |
| 176 } // namespace ui | 177 } // namespace ui |
| OLD | NEW |