Chromium Code Reviews| 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 DCHECK(surface_info.id().is_valid()); |
| 58 DCHECK(surface_id.is_valid()); | |
| 59 | 53 |
| 60 // Only handle embedded surfaces changing here. The display root surface | 54 // Only handle embedded surfaces changing here. The display root surface |
| 61 // changing is handled immediately after the CompositorFrame is submitted. | 55 // changing is handled immediately after the CompositorFrame is submitted. |
| 62 // TODO(samans): Only tell FrameGenerator about WM surface instead of all | 56 // TODO(samans): Only tell FrameGenerator about WM surface instead of all |
| 63 // all surfaces. | 57 // all surfaces. |
| 64 if (window == delegate_->GetActiveRootWindow()) | 58 if (surface_info != window_manager_surface_info_) { |
| 65 window_manager_surface_id_ = surface_id; | 59 compositor_frame_sink_->SetNeedsBeginFrame(true); |
| 60 window_manager_surface_info_ = surface_info; | |
| 61 } | |
| 66 } | 62 } |
| 67 | 63 |
| 68 void FrameGenerator::DidReceiveCompositorFrameAck() {} | 64 void FrameGenerator::DidReceiveCompositorFrameAck() {} |
| 69 | 65 |
| 70 void FrameGenerator::OnBeginFrame(const cc::BeginFrameArgs& begin_frame_arags) { | 66 void FrameGenerator::OnBeginFrame(const cc::BeginFrameArgs& begin_frame_arags) { |
| 71 if (!root_window_->visible()) | 67 if (!root_window_->visible()) |
| 72 return; | 68 return; |
| 73 | 69 |
| 74 // TODO(fsamuel): We should add a trace for generating a top level frame. | 70 // TODO(fsamuel): We should add a trace for generating a top level frame. |
| 75 cc::CompositorFrame frame(GenerateCompositorFrame(root_window_->bounds())); | 71 cc::CompositorFrame frame(GenerateCompositorFrame(root_window_->bounds())); |
| 76 | 72 |
| 77 if (compositor_frame_sink_) { | 73 if (compositor_frame_sink_) { |
| 78 gfx::Size frame_size = last_submitted_frame_size_; | 74 gfx::Size frame_size = last_submitted_frame_size_; |
| 79 if (!frame.render_pass_list.empty()) | 75 if (!frame.render_pass_list.empty()) |
| 80 frame_size = frame.render_pass_list[0]->output_rect.size(); | 76 frame_size = frame.render_pass_list[0]->output_rect.size(); |
| 81 | 77 |
| 82 if (!local_frame_id_.is_valid() || frame_size != last_submitted_frame_size_) | 78 if (!local_frame_id_.is_valid() || frame_size != last_submitted_frame_size_) |
| 83 local_frame_id_ = id_allocator_.GenerateId(); | 79 local_frame_id_ = id_allocator_.GenerateId(); |
| 84 | 80 |
| 85 compositor_frame_sink_->SubmitCompositorFrame(local_frame_id_, | 81 compositor_frame_sink_->SubmitCompositorFrame(local_frame_id_, |
| 86 std::move(frame)); | 82 std::move(frame)); |
| 83 compositor_frame_sink_->SetNeedsBeginFrame(false); | |
| 87 last_submitted_frame_size_ = frame_size; | 84 last_submitted_frame_size_ = frame_size; |
| 88 } | 85 } |
| 89 } | 86 } |
| 90 | 87 |
| 91 void FrameGenerator::ReclaimResources( | 88 void FrameGenerator::ReclaimResources( |
| 92 const cc::ReturnedResourceArray& resources) { | 89 const cc::ReturnedResourceArray& resources) { |
| 93 // Nothing to do here because FrameGenerator CompositorFrames don't reference | 90 // Nothing to do here because FrameGenerator CompositorFrames don't reference |
| 94 // any resources. | 91 // any resources. |
| 95 } | 92 } |
| 96 | 93 |
| 97 void FrameGenerator::WillDrawSurface() { | 94 void FrameGenerator::WillDrawSurface() { |
| 98 // TODO(fsamuel, staraz): Implement this. | 95 // TODO(fsamuel, staraz): Implement this. |
| 99 } | 96 } |
| 100 | 97 |
| 101 cc::CompositorFrame FrameGenerator::GenerateCompositorFrame( | 98 cc::CompositorFrame FrameGenerator::GenerateCompositorFrame( |
| 102 const gfx::Rect& output_rect) { | 99 const gfx::Rect& output_rect) { |
| 103 const int render_pass_id = 1; | 100 const int render_pass_id = 1; |
| 104 std::unique_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create(); | 101 std::unique_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create(); |
| 105 render_pass->SetNew(render_pass_id, output_rect, output_rect, | 102 render_pass->SetNew(render_pass_id, output_rect, output_rect, |
| 106 gfx::Transform()); | 103 gfx::Transform()); |
| 107 | 104 |
| 108 DrawWindow(render_pass.get(), delegate_->GetActiveRootWindow()); | 105 DrawWindow(render_pass.get(), delegate_->GetActiveRootWindow()); |
|
Fady Samuel
2017/01/24 02:52:31
We don't need GetActiveRootWindow here anymore. In
Saman Sami
2017/01/24 20:29:58
Done.
| |
| 109 | 106 |
| 110 cc::CompositorFrame frame; | 107 cc::CompositorFrame frame; |
| 111 frame.render_pass_list.push_back(std::move(render_pass)); | 108 frame.render_pass_list.push_back(std::move(render_pass)); |
| 112 if (delegate_->IsInHighContrastMode()) { | 109 if (delegate_->IsInHighContrastMode()) { |
| 113 std::unique_ptr<cc::RenderPass> invert_pass = cc::RenderPass::Create(); | 110 std::unique_ptr<cc::RenderPass> invert_pass = cc::RenderPass::Create(); |
| 114 invert_pass->SetNew(2, output_rect, output_rect, gfx::Transform()); | 111 invert_pass->SetNew(2, output_rect, output_rect, gfx::Transform()); |
| 115 cc::SharedQuadState* shared_state = | 112 cc::SharedQuadState* shared_state = |
| 116 invert_pass->CreateAndAppendSharedQuadState(); | 113 invert_pass->CreateAndAppendSharedQuadState(); |
| 117 shared_state->SetAll(gfx::Transform(), output_rect.size(), output_rect, | 114 shared_state->SetAll(gfx::Transform(), output_rect.size(), output_rect, |
|
Fady Samuel
2017/01/23 23:26:54
You should scale the bounds like so: https://cs.ch
Saman Sami
2017/01/24 20:29:58
Done.
| |
| 118 output_rect, false, 1.f, SkBlendMode::kSrcOver, 0); | 115 output_rect, false, 1.f, SkBlendMode::kSrcOver, 0); |
| 119 auto* quad = invert_pass->CreateAndAppendDrawQuad<cc::RenderPassDrawQuad>(); | 116 auto* quad = invert_pass->CreateAndAppendDrawQuad<cc::RenderPassDrawQuad>(); |
| 120 render_pass->filters.Append(cc::FilterOperation::CreateInvertFilter(1.f)); | 117 render_pass->filters.Append(cc::FilterOperation::CreateInvertFilter(1.f)); |
| 121 quad->SetNew(shared_state, output_rect, output_rect, render_pass_id, | 118 quad->SetNew(shared_state, output_rect, output_rect, render_pass_id, |
| 122 0 /* mask_resource_id */, gfx::Vector2dF() /* mask_uv_scale */, | 119 0 /* mask_resource_id */, gfx::Vector2dF() /* mask_uv_scale */, |
| 123 gfx::Size() /* mask_texture_size */, | 120 gfx::Size() /* mask_texture_size */, |
| 124 gfx::Vector2dF() /* filters_scale */, | 121 gfx::Vector2dF() /* filters_scale */, |
| 125 gfx::PointF() /* filters_origin */); | 122 gfx::PointF() /* filters_origin */); |
| 126 frame.render_pass_list.push_back(std::move(invert_pass)); | 123 frame.render_pass_list.push_back(std::move(invert_pass)); |
| 127 } | 124 } |
| 128 frame.metadata.device_scale_factor = device_scale_factor_; | 125 frame.metadata.device_scale_factor = device_scale_factor_; |
| 129 | 126 |
| 130 if (window_manager_surface_id_.is_valid()) | 127 if (window_manager_surface_info_.id().is_valid()) { |
| 131 frame.metadata.referenced_surfaces.push_back(window_manager_surface_id_); | 128 frame.metadata.referenced_surfaces.push_back( |
| 129 window_manager_surface_info_.id()); | |
| 130 } | |
| 132 | 131 |
| 133 return frame; | 132 return frame; |
| 134 } | 133 } |
| 135 | 134 |
| 136 void FrameGenerator::DrawWindow(cc::RenderPass* pass, ServerWindow* window) { | 135 void FrameGenerator::DrawWindow(cc::RenderPass* pass, ServerWindow* window) { |
| 137 if (!window || !window->visible()) | 136 if (!window || !window->visible()) |
|
Fady Samuel
2017/01/24 02:52:31
Remove as well.
Saman Sami
2017/01/24 20:29:58
Done.
| |
| 138 return; | 137 return; |
| 139 | 138 |
| 140 if (!window->compositor_frame_sink_manager()) | 139 if (!window->compositor_frame_sink_manager()) |
|
Fady Samuel
2017/01/24 02:52:31
This seems unnecessary.
Saman Sami
2017/01/24 20:29:58
Done.
| |
| 141 return; | 140 return; |
| 142 | 141 |
| 143 cc::SurfaceId default_surface_id = | 142 cc::SurfaceId default_surface_id = |
| 144 window->compositor_frame_sink_manager()->GetLatestSurfaceId(); | 143 window->compositor_frame_sink_manager()->GetLatestSurfaceId(); |
|
Fady Samuel
2017/01/23 23:26:54
Just use window_manager_surface_id_
Saman Sami
2017/01/24 20:29:58
Done.
| |
| 145 | 144 |
| 146 if (!default_surface_id.is_valid()) | 145 if (!default_surface_id.is_valid()) |
|
Fady Samuel
2017/01/24 02:52:31
This should be a DCHECK instead.
Saman Sami
2017/01/24 20:29:58
Done.
| |
| 147 return; | 146 return; |
| 148 | 147 |
| 149 gfx::Transform quad_to_target_transform; | 148 gfx::Transform quad_to_target_transform; |
| 150 quad_to_target_transform.Translate(window->bounds().x(), | 149 quad_to_target_transform.Translate(window->bounds().x(), |
| 151 window->bounds().y()); | 150 window->bounds().y()); |
| 152 | 151 |
| 153 cc::SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState(); | 152 cc::SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState(); |
| 154 | 153 |
| 155 const gfx::Rect bounds_at_origin(window->bounds().size()); | 154 const gfx::Rect bounds_at_origin(window->bounds().size()); |
|
Fady Samuel
2017/01/23 23:26:54
Just use surface_info_.size_in_pixels()
Saman Sami
2017/01/24 20:29:58
Done.
| |
| 156 // TODO(fsamuel): These clipping and visible rects are incorrect. They need | 155 // TODO(fsamuel): These clipping and visible rects are incorrect. They need |
| 157 // to be populated from CompositorFrame structs. | 156 // to be populated from CompositorFrame structs. |
| 158 sqs->SetAll( | 157 sqs->SetAll( |
| 159 quad_to_target_transform, bounds_at_origin.size() /* layer_bounds */, | 158 quad_to_target_transform, bounds_at_origin.size() /* layer_bounds */, |
| 160 bounds_at_origin /* visible_layer_bounds */, | 159 bounds_at_origin /* visible_layer_bounds */, |
| 161 bounds_at_origin /* clip_rect */, false /* is_clipped */, | 160 bounds_at_origin /* clip_rect */, false /* is_clipped */, |
| 162 1.0f /* opacity */, SkBlendMode::kSrcOver, 0 /* sorting-context_id */); | 161 1.0f /* opacity */, SkBlendMode::kSrcOver, 0 /* sorting-context_id */); |
| 163 auto* quad = pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>(); | 162 auto* quad = pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>(); |
| 164 quad->SetAll(sqs, bounds_at_origin /* rect */, | 163 quad->SetAll(sqs, bounds_at_origin /* rect */, |
| 165 gfx::Rect() /* opaque_rect */, | 164 gfx::Rect() /* opaque_rect */, |
| 166 bounds_at_origin /* visible_rect */, true /* needs_blending*/, | 165 bounds_at_origin /* visible_rect */, true /* needs_blending*/, |
| 167 default_surface_id); | 166 default_surface_id); |
| 168 } | 167 } |
| 169 | 168 |
| 170 void FrameGenerator::OnWindowDestroying(ServerWindow* window) { | 169 void FrameGenerator::OnWindowDestroying(ServerWindow* window) { |
|
Fady Samuel
2017/01/24 02:52:31
Delete this.
Saman Sami
2017/01/24 20:29:58
Done.
| |
| 171 Remove(window); | 170 Remove(window); |
| 172 } | 171 } |
| 173 | 172 |
| 174 } // namespace ws | 173 } // namespace ws |
| 175 | 174 |
| 176 } // namespace ui | 175 } // namespace ui |
| OLD | NEW |