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 13 matching lines...) Expand all Loading... | |
| 24 | 24 |
| 25 FrameGenerator::FrameGenerator(FrameGeneratorDelegate* delegate, | 25 FrameGenerator::FrameGenerator(FrameGeneratorDelegate* delegate, |
| 26 ServerWindow* root_window) | 26 ServerWindow* root_window) |
| 27 : delegate_(delegate), | 27 : delegate_(delegate), |
| 28 root_window_(root_window), | 28 root_window_(root_window), |
| 29 binding_(this), | 29 binding_(this), |
| 30 weak_factory_(this) { | 30 weak_factory_(this) { |
| 31 DCHECK(delegate_); | 31 DCHECK(delegate_); |
| 32 } | 32 } |
| 33 | 33 |
| 34 void FrameGenerator::SetDeviceScaleFactor(float device_scale_factor) { | |
| 35 device_scale_factor_ = device_scale_factor; | |
|
Fady Samuel
2017/01/24 20:43:28
Let's not do work if we don't need to. Please add
Saman Sami
2017/01/24 21:13:12
Done.
| |
| 36 if (compositor_frame_sink_) | |
| 37 compositor_frame_sink_->SetNeedsBeginFrame(true); | |
| 38 } | |
| 39 | |
| 34 FrameGenerator::~FrameGenerator() { | 40 FrameGenerator::~FrameGenerator() { |
| 35 // Invalidate WeakPtrs now to avoid callbacks back into the | 41 // Invalidate WeakPtrs now to avoid callbacks back into the |
| 36 // FrameGenerator during destruction of |compositor_frame_sink_|. | 42 // FrameGenerator during destruction of |compositor_frame_sink_|. |
| 37 weak_factory_.InvalidateWeakPtrs(); | 43 weak_factory_.InvalidateWeakPtrs(); |
| 38 compositor_frame_sink_.reset(); | 44 compositor_frame_sink_.reset(); |
| 39 } | 45 } |
| 40 | 46 |
| 41 void FrameGenerator::OnAcceleratedWidgetAvailable( | 47 void FrameGenerator::OnAcceleratedWidgetAvailable( |
| 42 gfx::AcceleratedWidget widget) { | 48 gfx::AcceleratedWidget widget) { |
| 43 DCHECK_NE(gfx::kNullAcceleratedWidget, widget); | 49 DCHECK_NE(gfx::kNullAcceleratedWidget, widget); |
| 44 auto associated_group = | 50 auto associated_group = |
| 45 root_window_->delegate()->GetDisplayCompositorAssociatedGroup(); | 51 root_window_->delegate()->GetDisplayCompositorAssociatedGroup(); |
| 46 cc::mojom::MojoCompositorFrameSinkAssociatedRequest sink_request = | 52 cc::mojom::MojoCompositorFrameSinkAssociatedRequest sink_request = |
| 47 mojo::MakeRequest(&compositor_frame_sink_, associated_group); | 53 mojo::MakeRequest(&compositor_frame_sink_, associated_group); |
| 48 cc::mojom::DisplayPrivateAssociatedRequest display_request = | 54 cc::mojom::DisplayPrivateAssociatedRequest display_request = |
| 49 mojo::MakeRequest(&display_private_, associated_group); | 55 mojo::MakeRequest(&display_private_, associated_group); |
| 50 root_window_->CreateDisplayCompositorFrameSink( | 56 root_window_->CreateDisplayCompositorFrameSink( |
| 51 widget, std::move(sink_request), binding_.CreateInterfacePtrAndBind(), | 57 widget, std::move(sink_request), binding_.CreateInterfacePtrAndBind(), |
| 52 std::move(display_request)); | 58 std::move(display_request)); |
| 53 // TODO(fsamuel): This means we're always requesting a new BeginFrame signal | |
| 54 // even when we don't need it. Once surface ID propagation work is done, | |
| 55 // this will not be necessary because FrameGenerator will only need a | |
| 56 // BeginFrame if the window manager changes. | |
| 57 compositor_frame_sink_->SetNeedsBeginFrame(true); | |
| 58 } | 59 } |
| 59 | 60 |
| 60 void FrameGenerator::OnSurfaceCreated(const cc::SurfaceId& surface_id, | 61 void FrameGenerator::OnSurfaceCreated(const cc::SurfaceInfo& surface_info) { |
| 61 ServerWindow* window) { | 62 DCHECK(surface_info.id().is_valid()); |
| 62 DCHECK(surface_id.is_valid()); | |
| 63 | 63 |
| 64 // Only handle embedded surfaces changing here. The display root surface | 64 // Only handle embedded surfaces changing here. The display root surface |
| 65 // changing is handled immediately after the CompositorFrame is submitted. | 65 // changing is handled immediately after the CompositorFrame is submitted. |
| 66 // TODO(samans): Only tell FrameGenerator about WM surface instead of all | 66 // TODO(samans): Only tell FrameGenerator about WM surface instead of all |
|
Fady Samuel
2017/01/24 20:43:27
nit: Remove this TODO because that's what you're d
Saman Sami
2017/01/24 21:13:12
Done.
| |
| 67 // all surfaces. | 67 // all surfaces. |
| 68 if (window == delegate_->GetActiveRootWindow()) | 68 if (surface_info != window_manager_surface_info_) { |
| 69 window_manager_surface_id_ = surface_id; | 69 window_manager_surface_info_ = surface_info; |
| 70 compositor_frame_sink_->SetNeedsBeginFrame(true); | |
| 71 } | |
| 70 } | 72 } |
| 71 | 73 |
| 72 void FrameGenerator::DidReceiveCompositorFrameAck() {} | 74 void FrameGenerator::DidReceiveCompositorFrameAck() {} |
| 73 | 75 |
| 74 void FrameGenerator::OnBeginFrame(const cc::BeginFrameArgs& begin_frame_arags) { | 76 void FrameGenerator::OnBeginFrame(const cc::BeginFrameArgs& begin_frame_arags) { |
| 75 if (!root_window_->visible()) | 77 if (!root_window_->visible()) |
| 76 return; | 78 return; |
| 77 | 79 |
| 78 // TODO(fsamuel): We should add a trace for generating a top level frame. | 80 // TODO(fsamuel): We should add a trace for generating a top level frame. |
| 79 cc::CompositorFrame frame(GenerateCompositorFrame(root_window_->bounds())); | 81 cc::CompositorFrame frame(GenerateCompositorFrame(root_window_->bounds())); |
| 80 | 82 |
| 81 if (compositor_frame_sink_) { | 83 if (compositor_frame_sink_) { |
| 82 gfx::Size frame_size = last_submitted_frame_size_; | 84 gfx::Size frame_size = last_submitted_frame_size_; |
| 83 if (!frame.render_pass_list.empty()) | 85 if (!frame.render_pass_list.empty()) |
| 84 frame_size = frame.render_pass_list[0]->output_rect.size(); | 86 frame_size = frame.render_pass_list[0]->output_rect.size(); |
| 85 | 87 |
| 86 if (!local_frame_id_.is_valid() || | 88 if (!local_frame_id_.is_valid() || |
| 87 frame_size != last_submitted_frame_size_) { | 89 frame_size != last_submitted_frame_size_) { |
| 88 local_frame_id_ = id_allocator_.GenerateId(); | 90 local_frame_id_ = id_allocator_.GenerateId(); |
| 89 display_private_->ResizeDisplay(frame_size); | 91 display_private_->ResizeDisplay(frame_size); |
| 90 } | 92 } |
| 91 | 93 |
| 92 compositor_frame_sink_->SubmitCompositorFrame(local_frame_id_, | 94 compositor_frame_sink_->SubmitCompositorFrame(local_frame_id_, |
| 93 std::move(frame)); | 95 std::move(frame)); |
| 96 compositor_frame_sink_->SetNeedsBeginFrame(false); | |
| 94 last_submitted_frame_size_ = frame_size; | 97 last_submitted_frame_size_ = frame_size; |
| 95 } | 98 } |
| 96 } | 99 } |
| 97 | 100 |
| 98 void FrameGenerator::ReclaimResources( | 101 void FrameGenerator::ReclaimResources( |
| 99 const cc::ReturnedResourceArray& resources) { | 102 const cc::ReturnedResourceArray& resources) { |
| 100 // Nothing to do here because FrameGenerator CompositorFrames don't reference | 103 // Nothing to do here because FrameGenerator CompositorFrames don't reference |
| 101 // any resources. | 104 // any resources. |
| 102 } | 105 } |
| 103 | 106 |
| 104 void FrameGenerator::WillDrawSurface() { | 107 void FrameGenerator::WillDrawSurface() { |
| 105 // TODO(fsamuel, staraz): Implement this. | 108 // TODO(fsamuel, staraz): Implement this. |
| 106 } | 109 } |
| 107 | 110 |
| 108 cc::CompositorFrame FrameGenerator::GenerateCompositorFrame( | 111 cc::CompositorFrame FrameGenerator::GenerateCompositorFrame( |
| 109 const gfx::Rect& output_rect) { | 112 const gfx::Rect& output_rect) { |
| 110 const int render_pass_id = 1; | 113 const int render_pass_id = 1; |
| 111 std::unique_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create(); | 114 std::unique_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create(); |
| 112 render_pass->SetNew(render_pass_id, output_rect, output_rect, | 115 render_pass->SetNew(render_pass_id, output_rect, output_rect, |
| 113 gfx::Transform()); | 116 gfx::Transform()); |
| 114 | 117 |
| 115 DrawWindow(render_pass.get(), delegate_->GetActiveRootWindow()); | 118 DrawWindow(render_pass.get()); |
| 116 | 119 |
| 117 cc::CompositorFrame frame; | 120 cc::CompositorFrame frame; |
| 118 frame.render_pass_list.push_back(std::move(render_pass)); | 121 frame.render_pass_list.push_back(std::move(render_pass)); |
| 119 if (delegate_->IsInHighContrastMode()) { | 122 if (delegate_->IsInHighContrastMode()) { |
| 120 std::unique_ptr<cc::RenderPass> invert_pass = cc::RenderPass::Create(); | 123 std::unique_ptr<cc::RenderPass> invert_pass = cc::RenderPass::Create(); |
| 121 invert_pass->SetNew(2, output_rect, output_rect, gfx::Transform()); | 124 invert_pass->SetNew(2, output_rect, output_rect, gfx::Transform()); |
| 122 cc::SharedQuadState* shared_state = | 125 cc::SharedQuadState* shared_state = |
| 123 invert_pass->CreateAndAppendSharedQuadState(); | 126 invert_pass->CreateAndAppendSharedQuadState(); |
| 124 shared_state->SetAll(gfx::Transform(), output_rect.size(), output_rect, | 127 gfx::Size scaled_bounds = gfx::ScaleToCeiledSize( |
| 128 output_rect.size(), window_manager_surface_info_.device_scale_factor(), | |
| 129 window_manager_surface_info_.device_scale_factor()); | |
| 130 shared_state->SetAll(gfx::Transform(), scaled_bounds, output_rect, | |
| 125 output_rect, false, 1.f, SkBlendMode::kSrcOver, 0); | 131 output_rect, false, 1.f, SkBlendMode::kSrcOver, 0); |
| 126 auto* quad = invert_pass->CreateAndAppendDrawQuad<cc::RenderPassDrawQuad>(); | 132 auto* quad = invert_pass->CreateAndAppendDrawQuad<cc::RenderPassDrawQuad>(); |
| 127 render_pass->filters.Append(cc::FilterOperation::CreateInvertFilter(1.f)); | 133 render_pass->filters.Append(cc::FilterOperation::CreateInvertFilter(1.f)); |
| 128 quad->SetNew(shared_state, output_rect, output_rect, render_pass_id, | 134 quad->SetNew(shared_state, output_rect, output_rect, render_pass_id, |
| 129 0 /* mask_resource_id */, gfx::Vector2dF() /* mask_uv_scale */, | 135 0 /* mask_resource_id */, gfx::Vector2dF() /* mask_uv_scale */, |
| 130 gfx::Size() /* mask_texture_size */, | 136 gfx::Size() /* mask_texture_size */, |
| 131 gfx::Vector2dF() /* filters_scale */, | 137 gfx::Vector2dF() /* filters_scale */, |
| 132 gfx::PointF() /* filters_origin */); | 138 gfx::PointF() /* filters_origin */); |
| 133 frame.render_pass_list.push_back(std::move(invert_pass)); | 139 frame.render_pass_list.push_back(std::move(invert_pass)); |
| 134 } | 140 } |
| 135 frame.metadata.device_scale_factor = device_scale_factor_; | 141 frame.metadata.device_scale_factor = device_scale_factor_; |
| 136 | 142 |
| 137 if (window_manager_surface_id_.is_valid()) | 143 if (window_manager_surface_info_.id().is_valid()) { |
| 138 frame.metadata.referenced_surfaces.push_back(window_manager_surface_id_); | 144 frame.metadata.referenced_surfaces.push_back( |
| 145 window_manager_surface_info_.id()); | |
| 146 } | |
| 139 | 147 |
| 140 return frame; | 148 return frame; |
| 141 } | 149 } |
| 142 | 150 |
| 143 void FrameGenerator::DrawWindow(cc::RenderPass* pass, ServerWindow* window) { | 151 void FrameGenerator::DrawWindow(cc::RenderPass* pass) { |
| 144 if (!window || !window->visible()) | 152 DCHECK(window_manager_surface_info_.id().is_valid()); |
| 145 return; | |
| 146 | 153 |
| 147 if (!window->compositor_frame_sink_manager()) | 154 const gfx::Rect bounds_at_origin( |
| 148 return; | 155 window_manager_surface_info_.size_in_pixels()); |
| 149 | |
| 150 cc::SurfaceId default_surface_id = | |
| 151 window->compositor_frame_sink_manager()->GetLatestSurfaceId(); | |
| 152 | |
| 153 if (!default_surface_id.is_valid()) | |
| 154 return; | |
| 155 | 156 |
| 156 gfx::Transform quad_to_target_transform; | 157 gfx::Transform quad_to_target_transform; |
| 157 quad_to_target_transform.Translate(window->bounds().x(), | 158 quad_to_target_transform.Translate(bounds_at_origin.x(), |
| 158 window->bounds().y()); | 159 bounds_at_origin.y()); |
| 159 | 160 |
| 160 cc::SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState(); | 161 cc::SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState(); |
| 161 | 162 |
| 162 const gfx::Rect bounds_at_origin(window->bounds().size()); | |
| 163 // TODO(fsamuel): These clipping and visible rects are incorrect. They need | 163 // TODO(fsamuel): These clipping and visible rects are incorrect. They need |
| 164 // to be populated from CompositorFrame structs. | 164 // to be populated from CompositorFrame structs. |
| 165 sqs->SetAll( | 165 sqs->SetAll( |
| 166 quad_to_target_transform, bounds_at_origin.size() /* layer_bounds */, | 166 quad_to_target_transform, bounds_at_origin.size() /* layer_bounds */, |
| 167 bounds_at_origin /* visible_layer_bounds */, | 167 bounds_at_origin /* visible_layer_bounds */, |
|
Fady Samuel
2017/01/24 20:43:27
use scaled_bounds here too.
Saman Sami
2017/01/24 21:13:12
Done.
| |
| 168 bounds_at_origin /* clip_rect */, false /* is_clipped */, | 168 bounds_at_origin /* clip_rect */, false /* is_clipped */, |
| 169 1.0f /* opacity */, SkBlendMode::kSrcOver, 0 /* sorting-context_id */); | 169 1.0f /* opacity */, SkBlendMode::kSrcOver, 0 /* sorting-context_id */); |
| 170 auto* quad = pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>(); | 170 auto* quad = pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>(); |
| 171 quad->SetAll(sqs, bounds_at_origin /* rect */, | 171 quad->SetAll(sqs, bounds_at_origin /* rect */, gfx::Rect() /* opaque_rect */, |
| 172 gfx::Rect() /* opaque_rect */, | |
| 173 bounds_at_origin /* visible_rect */, true /* needs_blending*/, | 172 bounds_at_origin /* visible_rect */, true /* needs_blending*/, |
| 174 default_surface_id); | 173 window_manager_surface_info_.id()); |
| 175 } | |
| 176 | |
| 177 void FrameGenerator::OnWindowDestroying(ServerWindow* window) { | |
| 178 Remove(window); | |
| 179 } | 174 } |
| 180 | 175 |
| 181 } // namespace ws | 176 } // namespace ws |
| 182 | 177 |
| 183 } // namespace ui | 178 } // namespace ui |
| OLD | NEW |