Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(98)

Side by Side Diff: services/ui/ws/frame_generator.cc

Issue 2140783002: services/ui: Detect when a video is playing (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: . Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "base/containers/adapters.h" 7 #include "base/containers/adapters.h"
8 #include "cc/output/compositor_frame.h" 8 #include "cc/output/compositor_frame.h"
9 #include "cc/quads/render_pass.h" 9 #include "cc/quads/render_pass.h"
10 #include "cc/quads/render_pass_draw_quad.h" 10 #include "cc/quads/render_pass_draw_quad.h"
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 draw_timer_.Start( 66 draw_timer_.Start(
67 FROM_HERE, base::TimeDelta(), 67 FROM_HERE, base::TimeDelta(),
68 base::Bind(&FrameGenerator::Draw, weak_factory_.GetWeakPtr())); 68 base::Bind(&FrameGenerator::Draw, weak_factory_.GetWeakPtr()));
69 } 69 }
70 70
71 void FrameGenerator::Draw() { 71 void FrameGenerator::Draw() {
72 if (!delegate_->GetRootWindow()->visible()) 72 if (!delegate_->GetRootWindow()->visible())
73 return; 73 return;
74 74
75 // TODO(fsamuel): We should add a trace for generating a top level frame. 75 // TODO(fsamuel): We should add a trace for generating a top level frame.
76 bool old_contains_video = may_contain_video_;
76 cc::CompositorFrame frame(GenerateCompositorFrame()); 77 cc::CompositorFrame frame(GenerateCompositorFrame());
78 if (old_contains_video != may_contain_video_) {
79 // TODO(sad): Schedule notifying observers.
80 }
77 frame_pending_ = true; 81 frame_pending_ = true;
78 if (display_compositor_) { 82 if (display_compositor_) {
79 display_compositor_->SubmitCompositorFrame( 83 display_compositor_->SubmitCompositorFrame(
80 std::move(frame), 84 std::move(frame),
81 base::Bind(&FrameGenerator::DidDraw, weak_factory_.GetWeakPtr())); 85 base::Bind(&FrameGenerator::DidDraw, weak_factory_.GetWeakPtr()));
82 } 86 }
87 if (may_contain_video_) {
88 // TODO(sad): Start a timer to reset the bit if no new frame with video
89 // is submitted 'soon'.
90 }
83 dirty_rect_ = gfx::Rect(); 91 dirty_rect_ = gfx::Rect();
84 } 92 }
85 93
86 void FrameGenerator::DidDraw() { 94 void FrameGenerator::DidDraw() {
87 frame_pending_ = false; 95 frame_pending_ = false;
88 delegate_->OnCompositorFrameDrawn(); 96 delegate_->OnCompositorFrameDrawn();
89 if (!dirty_rect_.IsEmpty()) 97 if (!dirty_rect_.IsEmpty())
90 WantToDraw(); 98 WantToDraw();
91 } 99 }
92 100
93 cc::CompositorFrame FrameGenerator::GenerateCompositorFrame() { 101 cc::CompositorFrame FrameGenerator::GenerateCompositorFrame() {
94 const ViewportMetrics& metrics = delegate_->GetViewportMetrics(); 102 const ViewportMetrics& metrics = delegate_->GetViewportMetrics();
95 std::unique_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create(); 103 std::unique_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create();
96 gfx::Rect output_rect(metrics.size_in_pixels); 104 gfx::Rect output_rect(metrics.size_in_pixels);
97 dirty_rect_.Intersect(output_rect); 105 dirty_rect_.Intersect(output_rect);
98 const cc::RenderPassId render_pass_id(1, 1); 106 const cc::RenderPassId render_pass_id(1, 1);
99 render_pass->SetNew(render_pass_id, output_rect, dirty_rect_, 107 render_pass->SetNew(render_pass_id, output_rect, dirty_rect_,
100 gfx::Transform()); 108 gfx::Transform());
101 109
110 may_contain_video_ = false;
102 DrawWindowTree(render_pass.get(), delegate_->GetRootWindow(), gfx::Vector2d(), 111 DrawWindowTree(render_pass.get(), delegate_->GetRootWindow(), gfx::Vector2d(),
103 1.0f); 112 1.0f);
104 113
105 std::unique_ptr<cc::DelegatedFrameData> frame_data( 114 std::unique_ptr<cc::DelegatedFrameData> frame_data(
106 new cc::DelegatedFrameData); 115 new cc::DelegatedFrameData);
107 frame_data->render_pass_list.push_back(std::move(render_pass)); 116 frame_data->render_pass_list.push_back(std::move(render_pass));
108 if (delegate_->IsInHighContrastMode()) { 117 if (delegate_->IsInHighContrastMode()) {
109 std::unique_ptr<cc::RenderPass> invert_pass = cc::RenderPass::Create(); 118 std::unique_ptr<cc::RenderPass> invert_pass = cc::RenderPass::Create();
110 invert_pass->SetNew(cc::RenderPassId(2, 0), output_rect, dirty_rect_, 119 invert_pass->SetNew(cc::RenderPassId(2, 0), output_rect, dirty_rect_,
111 gfx::Transform()); 120 gfx::Transform());
112 cc::SharedQuadState* shared_state = 121 cc::SharedQuadState* shared_state =
113 invert_pass->CreateAndAppendSharedQuadState(); 122 invert_pass->CreateAndAppendSharedQuadState();
114 shared_state->SetAll(gfx::Transform(), output_rect.size(), output_rect, 123 shared_state->SetAll(gfx::Transform(), output_rect.size(), output_rect,
115 output_rect, false, 1.f, SkXfermode::kSrcOver_Mode, 0); 124 output_rect, false, 1.f, SkXfermode::kSrcOver_Mode, 0);
116 auto* quad = invert_pass->CreateAndAppendDrawQuad<cc::RenderPassDrawQuad>(); 125 auto* quad = invert_pass->CreateAndAppendDrawQuad<cc::RenderPassDrawQuad>();
117 cc::FilterOperations filters; 126 cc::FilterOperations filters;
118 filters.Append(cc::FilterOperation::CreateInvertFilter(1.f)); 127 filters.Append(cc::FilterOperation::CreateInvertFilter(1.f));
119 quad->SetNew(shared_state, output_rect, output_rect, render_pass_id, 128 quad->SetNew(shared_state, output_rect, output_rect, render_pass_id,
120 0 /* mask_resource_id */, gfx::Vector2dF() /* mask_uv_scale */, 129 0 /* mask_resource_id */, gfx::Vector2dF() /* mask_uv_scale */,
121 gfx::Size() /* mask_texture_size */, filters, 130 gfx::Size() /* mask_texture_size */, filters,
122 gfx::Vector2dF() /* filters_scale */, 131 gfx::Vector2dF() /* filters_scale */,
123 cc::FilterOperations() /* background_filters */); 132 cc::FilterOperations() /* background_filters */);
124 frame_data->render_pass_list.push_back(std::move(invert_pass)); 133 frame_data->render_pass_list.push_back(std::move(invert_pass));
125 } 134 }
126 135
127 cc::CompositorFrame frame; 136 cc::CompositorFrame frame;
128 frame.delegated_frame_data = std::move(frame_data); 137 frame.delegated_frame_data = std::move(frame_data);
138 frame.metadata.may_contain_video = may_contain_video_;
129 return frame; 139 return frame;
130 } 140 }
131 141
132 void FrameGenerator::DrawWindowTree( 142 void FrameGenerator::DrawWindowTree(
133 cc::RenderPass* pass, 143 cc::RenderPass* pass,
134 ServerWindow* window, 144 ServerWindow* window,
135 const gfx::Vector2d& parent_to_root_origin_offset, 145 const gfx::Vector2d& parent_to_root_origin_offset,
136 float opacity) { 146 float opacity) {
137 if (!window->visible()) 147 if (!window->visible())
138 return; 148 return;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
172 bounds_at_origin.size() /* layer_bounds */, 182 bounds_at_origin.size() /* layer_bounds */,
173 bounds_at_origin /* visible_layer_bounds */, 183 bounds_at_origin /* visible_layer_bounds */,
174 bounds_at_origin /* clip_rect */, false /* is_clipped */, 184 bounds_at_origin /* clip_rect */, false /* is_clipped */,
175 combined_opacity, SkXfermode::kSrcOver_Mode, 185 combined_opacity, SkXfermode::kSrcOver_Mode,
176 0 /* sorting-context_id */); 186 0 /* sorting-context_id */);
177 auto quad = pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>(); 187 auto quad = pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>();
178 quad->SetAll(sqs, bounds_at_origin /* rect */, 188 quad->SetAll(sqs, bounds_at_origin /* rect */,
179 gfx::Rect() /* opaque_rect */, 189 gfx::Rect() /* opaque_rect */,
180 bounds_at_origin /* visible_rect */, true /* needs_blending*/, 190 bounds_at_origin /* visible_rect */, true /* needs_blending*/,
181 default_surface->id()); 191 default_surface->id());
192 if (default_surface->may_contain_video())
193 may_contain_video_ = true;
182 } 194 }
183 if (underlay_surface) { 195 if (underlay_surface) {
184 const gfx::Rect underlay_absolute_bounds = 196 const gfx::Rect underlay_absolute_bounds =
185 absolute_bounds - window->underlay_offset(); 197 absolute_bounds - window->underlay_offset();
186 gfx::Transform quad_to_target_transform; 198 gfx::Transform quad_to_target_transform;
187 quad_to_target_transform.Translate(underlay_absolute_bounds.x(), 199 quad_to_target_transform.Translate(underlay_absolute_bounds.x(),
188 underlay_absolute_bounds.y()); 200 underlay_absolute_bounds.y());
189 cc::SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState(); 201 cc::SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState();
190 const gfx::Rect bounds_at_origin( 202 const gfx::Rect bounds_at_origin(
191 underlay_surface->last_submitted_frame_size()); 203 underlay_surface->last_submitted_frame_size());
192 sqs->SetAll(quad_to_target_transform, 204 sqs->SetAll(quad_to_target_transform,
193 bounds_at_origin.size() /* layer_bounds */, 205 bounds_at_origin.size() /* layer_bounds */,
194 bounds_at_origin /* visible_layer_bounds */, 206 bounds_at_origin /* visible_layer_bounds */,
195 bounds_at_origin /* clip_rect */, false /* is_clipped */, 207 bounds_at_origin /* clip_rect */, false /* is_clipped */,
196 combined_opacity, SkXfermode::kSrcOver_Mode, 208 combined_opacity, SkXfermode::kSrcOver_Mode,
197 0 /* sorting-context_id */); 209 0 /* sorting-context_id */);
198 210
199 auto quad = pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>(); 211 auto quad = pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>();
200 quad->SetAll(sqs, bounds_at_origin /* rect */, 212 quad->SetAll(sqs, bounds_at_origin /* rect */,
201 gfx::Rect() /* opaque_rect */, 213 gfx::Rect() /* opaque_rect */,
202 bounds_at_origin /* visible_rect */, true /* needs_blending*/, 214 bounds_at_origin /* visible_rect */, true /* needs_blending*/,
203 underlay_surface->id()); 215 underlay_surface->id());
216 DCHECK(!underlay_surface->may_contain_video());
204 } 217 }
205 } 218 }
206 219
207 } // namespace ws 220 } // namespace ws
208 221
209 } // namespace ui 222 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698