Index: services/ui/ws/frame_generator.cc |
diff --git a/services/ui/ws/frame_generator.cc b/services/ui/ws/frame_generator.cc |
index b72d0783b10dbaac146aad6fa77f883720cb6ca5..7229a299d751fdbbffde7e42542d11099c94012c 100644 |
--- a/services/ui/ws/frame_generator.cc |
+++ b/services/ui/ws/frame_generator.cc |
@@ -130,7 +130,7 @@ |
render_pass->SetNew(render_pass_id, output_rect, output_rect, |
gfx::Transform()); |
- DrawWindow(render_pass.get(), delegate_->GetActiveRootWindow()); |
+ DrawWindowTree(render_pass.get(), root_window_, gfx::Vector2d(), 1.0f); |
cc::CompositorFrame frame; |
frame.render_pass_list.push_back(std::move(render_pass)); |
@@ -155,40 +155,80 @@ |
return frame; |
} |
-void FrameGenerator::DrawWindow(cc::RenderPass* pass, ServerWindow* window) { |
+void FrameGenerator::DrawWindowTree( |
+ cc::RenderPass* pass, |
+ ServerWindow* window, |
+ const gfx::Vector2d& parent_to_root_origin_offset, |
+ float opacity) { |
if (!window->visible()) |
return; |
+ |
+ const gfx::Rect absolute_bounds = |
+ window->bounds() + parent_to_root_origin_offset; |
+ const ServerWindow::Windows& children = window->children(); |
+ const float combined_opacity = opacity * window->opacity(); |
+ for (ServerWindow* child : base::Reversed(children)) { |
+ DrawWindowTree(pass, child, absolute_bounds.OffsetFromOrigin(), |
+ combined_opacity); |
+ } |
if (!window->compositor_frame_sink_manager() || |
!window->compositor_frame_sink_manager()->ShouldDraw()) |
return; |
+ cc::SurfaceId underlay_surface_id = |
+ window->compositor_frame_sink_manager()->GetLatestSurfaceId( |
+ mojom::CompositorFrameSinkType::UNDERLAY); |
cc::SurfaceId default_surface_id = |
window->compositor_frame_sink_manager()->GetLatestSurfaceId( |
mojom::CompositorFrameSinkType::DEFAULT); |
- if (!default_surface_id.is_valid()) |
- return; |
- |
- gfx::Transform quad_to_target_transform; |
- quad_to_target_transform.Translate(window->bounds().x(), |
- window->bounds().y()); |
- |
- cc::SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState(); |
- |
- const gfx::Rect bounds_at_origin(window->bounds().size()); |
- // TODO(fsamuel): These clipping and visible rects are incorrect. They need |
- // to be populated from CompositorFrame structs. |
- sqs->SetAll( |
- quad_to_target_transform, bounds_at_origin.size() /* layer_bounds */, |
- bounds_at_origin /* visible_layer_bounds */, |
- bounds_at_origin /* clip_rect */, false /* is_clipped */, |
- 1.0f /* opacity */, SkBlendMode::kSrcOver, 0 /* sorting-context_id */); |
- auto* quad = pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>(); |
- quad->SetAll(sqs, bounds_at_origin /* rect */, |
- gfx::Rect() /* opaque_rect */, |
- bounds_at_origin /* visible_rect */, true /* needs_blending*/, |
- default_surface_id); |
+ if (!underlay_surface_id.is_valid() && !default_surface_id.is_valid()) |
+ return; |
+ |
+ if (default_surface_id.is_valid()) { |
+ gfx::Transform quad_to_target_transform; |
+ quad_to_target_transform.Translate(absolute_bounds.x(), |
+ absolute_bounds.y()); |
+ |
+ cc::SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState(); |
+ |
+ const gfx::Rect bounds_at_origin(window->bounds().size()); |
+ // TODO(fsamuel): These clipping and visible rects are incorrect. They need |
+ // to be populated from CompositorFrame structs. |
+ sqs->SetAll( |
+ quad_to_target_transform, bounds_at_origin.size() /* layer_bounds */, |
+ bounds_at_origin /* visible_layer_bounds */, |
+ bounds_at_origin /* clip_rect */, false /* is_clipped */, |
+ combined_opacity, SkBlendMode::kSrcOver, 0 /* sorting-context_id */); |
+ auto* quad = pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>(); |
+ quad->SetAll(sqs, bounds_at_origin /* rect */, |
+ gfx::Rect() /* opaque_rect */, |
+ bounds_at_origin /* visible_rect */, true /* needs_blending*/, |
+ default_surface_id); |
+ } |
+ if (underlay_surface_id.is_valid()) { |
+ const gfx::Rect underlay_absolute_bounds = |
+ absolute_bounds - window->underlay_offset(); |
+ gfx::Transform quad_to_target_transform; |
+ quad_to_target_transform.Translate(underlay_absolute_bounds.x(), |
+ underlay_absolute_bounds.y()); |
+ cc::SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState(); |
+ const gfx::Rect bounds_at_origin( |
+ window->compositor_frame_sink_manager()->GetLatestFrameSize( |
+ mojom::CompositorFrameSinkType::UNDERLAY)); |
+ sqs->SetAll( |
+ quad_to_target_transform, bounds_at_origin.size() /* layer_bounds */, |
+ bounds_at_origin /* visible_layer_bounds */, |
+ bounds_at_origin /* clip_rect */, false /* is_clipped */, |
+ combined_opacity, SkBlendMode::kSrcOver, 0 /* sorting-context_id */); |
+ |
+ auto* quad = pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>(); |
+ quad->SetAll(sqs, bounds_at_origin /* rect */, |
+ gfx::Rect() /* opaque_rect */, |
+ bounds_at_origin /* visible_rect */, true /* needs_blending*/, |
+ underlay_surface_id); |
+ } |
} |
cc::SurfaceId FrameGenerator::FindParentSurfaceId(ServerWindow* window) { |