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

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

Issue 2617603002: Revert of Mustash: Ensure surfaces submitted to Mus by WM and embedders contain Surfaces with embeded content. (Closed)
Patch Set: Created 3 years, 11 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
« no previous file with comments | « services/ui/ws/frame_generator.h ('k') | services/ui/ws/frame_generator_delegate.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 <utility> 7 #include <utility>
8 8
9 #include "base/containers/adapters.h" 9 #include "base/containers/adapters.h"
10 #include "cc/output/compositor_frame.h" 10 #include "cc/output/compositor_frame.h"
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
123 // TODO(fsamuel, staraz): Implement this. 123 // TODO(fsamuel, staraz): Implement this.
124 } 124 }
125 125
126 cc::CompositorFrame FrameGenerator::GenerateCompositorFrame( 126 cc::CompositorFrame FrameGenerator::GenerateCompositorFrame(
127 const gfx::Rect& output_rect) { 127 const gfx::Rect& output_rect) {
128 const int render_pass_id = 1; 128 const int render_pass_id = 1;
129 std::unique_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create(); 129 std::unique_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create();
130 render_pass->SetNew(render_pass_id, output_rect, output_rect, 130 render_pass->SetNew(render_pass_id, output_rect, output_rect,
131 gfx::Transform()); 131 gfx::Transform());
132 132
133 DrawWindow(render_pass.get(), delegate_->GetActiveRootWindow()); 133 DrawWindowTree(render_pass.get(), root_window_, gfx::Vector2d(), 1.0f);
134 134
135 cc::CompositorFrame frame; 135 cc::CompositorFrame frame;
136 frame.render_pass_list.push_back(std::move(render_pass)); 136 frame.render_pass_list.push_back(std::move(render_pass));
137 if (delegate_->IsInHighContrastMode()) { 137 if (delegate_->IsInHighContrastMode()) {
138 std::unique_ptr<cc::RenderPass> invert_pass = cc::RenderPass::Create(); 138 std::unique_ptr<cc::RenderPass> invert_pass = cc::RenderPass::Create();
139 invert_pass->SetNew(2, output_rect, output_rect, gfx::Transform()); 139 invert_pass->SetNew(2, output_rect, output_rect, gfx::Transform());
140 cc::SharedQuadState* shared_state = 140 cc::SharedQuadState* shared_state =
141 invert_pass->CreateAndAppendSharedQuadState(); 141 invert_pass->CreateAndAppendSharedQuadState();
142 shared_state->SetAll(gfx::Transform(), output_rect.size(), output_rect, 142 shared_state->SetAll(gfx::Transform(), output_rect.size(), output_rect,
143 output_rect, false, 1.f, SkBlendMode::kSrcOver, 0); 143 output_rect, false, 1.f, SkBlendMode::kSrcOver, 0);
144 auto* quad = invert_pass->CreateAndAppendDrawQuad<cc::RenderPassDrawQuad>(); 144 auto* quad = invert_pass->CreateAndAppendDrawQuad<cc::RenderPassDrawQuad>();
145 render_pass->filters.Append(cc::FilterOperation::CreateInvertFilter(1.f)); 145 render_pass->filters.Append(cc::FilterOperation::CreateInvertFilter(1.f));
146 quad->SetNew(shared_state, output_rect, output_rect, render_pass_id, 146 quad->SetNew(shared_state, output_rect, output_rect, render_pass_id,
147 0 /* mask_resource_id */, gfx::Vector2dF() /* mask_uv_scale */, 147 0 /* mask_resource_id */, gfx::Vector2dF() /* mask_uv_scale */,
148 gfx::Size() /* mask_texture_size */, 148 gfx::Size() /* mask_texture_size */,
149 gfx::Vector2dF() /* filters_scale */, 149 gfx::Vector2dF() /* filters_scale */,
150 gfx::PointF() /* filters_origin */); 150 gfx::PointF() /* filters_origin */);
151 frame.render_pass_list.push_back(std::move(invert_pass)); 151 frame.render_pass_list.push_back(std::move(invert_pass));
152 } 152 }
153 frame.metadata.device_scale_factor = device_scale_factor_; 153 frame.metadata.device_scale_factor = device_scale_factor_;
154 154
155 return frame; 155 return frame;
156 } 156 }
157 157
158 void FrameGenerator::DrawWindow(cc::RenderPass* pass, ServerWindow* window) { 158 void FrameGenerator::DrawWindowTree(
159 cc::RenderPass* pass,
160 ServerWindow* window,
161 const gfx::Vector2d& parent_to_root_origin_offset,
162 float opacity) {
159 if (!window->visible()) 163 if (!window->visible())
160 return; 164 return;
161 165
166 const gfx::Rect absolute_bounds =
167 window->bounds() + parent_to_root_origin_offset;
168 const ServerWindow::Windows& children = window->children();
169 const float combined_opacity = opacity * window->opacity();
170 for (ServerWindow* child : base::Reversed(children)) {
171 DrawWindowTree(pass, child, absolute_bounds.OffsetFromOrigin(),
172 combined_opacity);
173 }
174
162 if (!window->compositor_frame_sink_manager() || 175 if (!window->compositor_frame_sink_manager() ||
163 !window->compositor_frame_sink_manager()->ShouldDraw()) 176 !window->compositor_frame_sink_manager()->ShouldDraw())
164 return; 177 return;
165 178
179 cc::SurfaceId underlay_surface_id =
180 window->compositor_frame_sink_manager()->GetLatestSurfaceId(
181 mojom::CompositorFrameSinkType::UNDERLAY);
166 cc::SurfaceId default_surface_id = 182 cc::SurfaceId default_surface_id =
167 window->compositor_frame_sink_manager()->GetLatestSurfaceId( 183 window->compositor_frame_sink_manager()->GetLatestSurfaceId(
168 mojom::CompositorFrameSinkType::DEFAULT); 184 mojom::CompositorFrameSinkType::DEFAULT);
169 185
170 if (!default_surface_id.is_valid()) 186 if (!underlay_surface_id.is_valid() && !default_surface_id.is_valid())
171 return; 187 return;
172 188
173 gfx::Transform quad_to_target_transform; 189 if (default_surface_id.is_valid()) {
174 quad_to_target_transform.Translate(window->bounds().x(), 190 gfx::Transform quad_to_target_transform;
175 window->bounds().y()); 191 quad_to_target_transform.Translate(absolute_bounds.x(),
192 absolute_bounds.y());
176 193
177 cc::SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState(); 194 cc::SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState();
178 195
179 const gfx::Rect bounds_at_origin(window->bounds().size()); 196 const gfx::Rect bounds_at_origin(window->bounds().size());
180 // TODO(fsamuel): These clipping and visible rects are incorrect. They need 197 // TODO(fsamuel): These clipping and visible rects are incorrect. They need
181 // to be populated from CompositorFrame structs. 198 // to be populated from CompositorFrame structs.
182 sqs->SetAll( 199 sqs->SetAll(
183 quad_to_target_transform, bounds_at_origin.size() /* layer_bounds */, 200 quad_to_target_transform, bounds_at_origin.size() /* layer_bounds */,
184 bounds_at_origin /* visible_layer_bounds */, 201 bounds_at_origin /* visible_layer_bounds */,
185 bounds_at_origin /* clip_rect */, false /* is_clipped */, 202 bounds_at_origin /* clip_rect */, false /* is_clipped */,
186 1.0f /* opacity */, SkBlendMode::kSrcOver, 0 /* sorting-context_id */); 203 combined_opacity, SkBlendMode::kSrcOver, 0 /* sorting-context_id */);
187 auto* quad = pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>(); 204 auto* quad = pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>();
188 quad->SetAll(sqs, bounds_at_origin /* rect */, 205 quad->SetAll(sqs, bounds_at_origin /* rect */,
189 gfx::Rect() /* opaque_rect */, 206 gfx::Rect() /* opaque_rect */,
190 bounds_at_origin /* visible_rect */, true /* needs_blending*/, 207 bounds_at_origin /* visible_rect */, true /* needs_blending*/,
191 default_surface_id); 208 default_surface_id);
209 }
210 if (underlay_surface_id.is_valid()) {
211 const gfx::Rect underlay_absolute_bounds =
212 absolute_bounds - window->underlay_offset();
213 gfx::Transform quad_to_target_transform;
214 quad_to_target_transform.Translate(underlay_absolute_bounds.x(),
215 underlay_absolute_bounds.y());
216 cc::SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState();
217 const gfx::Rect bounds_at_origin(
218 window->compositor_frame_sink_manager()->GetLatestFrameSize(
219 mojom::CompositorFrameSinkType::UNDERLAY));
220 sqs->SetAll(
221 quad_to_target_transform, bounds_at_origin.size() /* layer_bounds */,
222 bounds_at_origin /* visible_layer_bounds */,
223 bounds_at_origin /* clip_rect */, false /* is_clipped */,
224 combined_opacity, SkBlendMode::kSrcOver, 0 /* sorting-context_id */);
225
226 auto* quad = pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>();
227 quad->SetAll(sqs, bounds_at_origin /* rect */,
228 gfx::Rect() /* opaque_rect */,
229 bounds_at_origin /* visible_rect */, true /* needs_blending*/,
230 underlay_surface_id);
231 }
192 } 232 }
193 233
194 cc::SurfaceId FrameGenerator::FindParentSurfaceId(ServerWindow* window) { 234 cc::SurfaceId FrameGenerator::FindParentSurfaceId(ServerWindow* window) {
195 if (window == root_window_) 235 if (window == root_window_)
196 return root_window_->delegate()->GetRootSurfaceId(); 236 return root_window_->delegate()->GetRootSurfaceId();
197 237
198 // The root window holds the parent SurfaceId. This SurfaceId will have an 238 // The root window holds the parent SurfaceId. This SurfaceId will have an
199 // invalid LocalFrameId before FrameGenerator has submitted a CompositorFrame. 239 // invalid LocalFrameId before FrameGenerator has submitted a CompositorFrame.
200 // After the first frame is submitted it will always be a valid SurfaceId. 240 // After the first frame is submitted it will always be a valid SurfaceId.
201 return root_window_->compositor_frame_sink_manager()->GetLatestSurfaceId( 241 return root_window_->compositor_frame_sink_manager()->GetLatestSurfaceId(
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
302 cc::SurfaceId underlay_surface_id = 342 cc::SurfaceId underlay_surface_id =
303 window->compositor_frame_sink_manager()->GetLatestSurfaceId( 343 window->compositor_frame_sink_manager()->GetLatestSurfaceId(
304 mojom::CompositorFrameSinkType::UNDERLAY); 344 mojom::CompositorFrameSinkType::UNDERLAY);
305 if (underlay_surface_id.is_valid()) 345 if (underlay_surface_id.is_valid())
306 RemoveFrameSinkReference(underlay_surface_id.frame_sink_id()); 346 RemoveFrameSinkReference(underlay_surface_id.frame_sink_id());
307 } 347 }
308 348
309 } // namespace ws 349 } // namespace ws
310 350
311 } // namespace ui 351 } // namespace ui
OLDNEW
« no previous file with comments | « services/ui/ws/frame_generator.h ('k') | services/ui/ws/frame_generator_delegate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698