Chromium Code Reviews| Index: components/mus/display_manager.cc |
| diff --git a/components/mus/display_manager.cc b/components/mus/display_manager.cc |
| index 195d5a138e3f83ccfd862abccdfe004256e96109..93ac4d83a19ba85f1ef6a84417c5c38c018c5206 100644 |
| --- a/components/mus/display_manager.cc |
| +++ b/components/mus/display_manager.cc |
| @@ -47,6 +47,9 @@ using mojo::Size; |
| namespace mus { |
| namespace { |
| +// DrawViewTree recursively visits ServerViews, creating a SurfaceDrawQuad for |
| +// each that lacks one. For Views that already have CompositorFrames, we can |
| +// skip this step and let cc::SurfaceAggregator do the heavy lifting. |
|
rjkroege
2015/09/17 19:03:56
this code is all on the critical redraw path?
On
Fady Samuel
2015/09/17 20:00:21
GenerateCompositorFrame is the top level call. Do
|
| void DrawViewTree(cc::RenderPass* pass, |
| const ServerView* view, |
| const gfx::Vector2d& parent_to_root_origin_offset, |
| @@ -56,12 +59,14 @@ void DrawViewTree(cc::RenderPass* pass, |
| const gfx::Rect absolute_bounds = |
| view->bounds() + parent_to_root_origin_offset; |
| - std::vector<const ServerView*> children(view->GetChildren()); |
| - const float combined_opacity = opacity * view->opacity(); |
| - for (std::vector<const ServerView*>::reverse_iterator it = children.rbegin(); |
| - it != children.rend(); ++it) { |
| - DrawViewTree(pass, *it, absolute_bounds.OffsetFromOrigin(), |
| - combined_opacity); |
| + |
| + if (!view->parent() || view->surface_id().is_null()) { |
| + std::vector<const ServerView*> children(view->GetChildren()); |
| + const float combined_opacity = opacity * view->opacity(); |
|
rjkroege
2015/09/17 19:08:05
do we have pre-multiplied alpha? if we do (pre-mul
Fady Samuel
2015/09/17 20:00:21
Done.
|
| + for (auto it = children.rbegin(); it != children.rend(); ++it) { |
| + DrawViewTree(pass, *it, absolute_bounds.OffsetFromOrigin(), |
| + combined_opacity); |
| + } |
| } |
| gfx::Transform quad_to_target_transform; |
| @@ -192,19 +197,8 @@ void DefaultDisplayManager::Draw() { |
| if (!delegate_->GetRootView()->visible()) |
| return; |
| - scoped_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create(); |
| - render_pass->damage_rect = dirty_rect_; |
| - render_pass->output_rect = gfx::Rect(metrics_.size_in_pixels.To<gfx::Size>()); |
| - |
| - DrawViewTree(render_pass.get(), delegate_->GetRootView(), gfx::Vector2d(), |
| - 1.0f); |
| - |
| - scoped_ptr<cc::DelegatedFrameData> frame_data(new cc::DelegatedFrameData); |
| - frame_data->device_scale_factor = 1.f; |
| - frame_data->render_pass_list.push_back(render_pass.Pass()); |
| - |
| - scoped_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame); |
| - frame->delegated_frame_data = frame_data.Pass(); |
| + // TODO(fsamuel): We should add a trace for generating a top level frame. |
| + scoped_ptr<cc::CompositorFrame> frame(GenerateCompositorFrame()); |
| frame_pending_ = true; |
| if (top_level_display_client_) { |
| top_level_display_client_->SubmitCompositorFrame( |
| @@ -246,6 +240,33 @@ void DefaultDisplayManager::UpdateMetrics(const gfx::Size& size, |
| delegate_->OnViewportMetricsChanged(old_metrics, metrics_); |
| } |
| +scoped_ptr<cc::CompositorFrame> |
| +DefaultDisplayManager::GenerateCompositorFrame() { |
| + scoped_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create(); |
| + render_pass->damage_rect = dirty_rect_; |
| + render_pass->output_rect = gfx::Rect(metrics_.size_in_pixels.To<gfx::Size>()); |
| + |
| + DrawViewTree(render_pass.get(), |
| + delegate_->GetRootView(), |
| + gfx::Vector2d(), 1.0f); |
| + |
| + scoped_ptr<cc::DelegatedFrameData> frame_data(new cc::DelegatedFrameData); |
| + frame_data->device_scale_factor = 1.f; |
|
rjkroege
2015/09/17 19:08:05
? won't this break native apps that have their CF
Fady Samuel
2015/09/17 20:00:21
Done.
|
| + frame_data->render_pass_list.push_back(render_pass.Pass()); |
| + |
| + scoped_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame); |
| + frame->delegated_frame_data = frame_data.Pass(); |
| + return frame.Pass(); |
| +} |
| + |
| +const cc::CompositorFrame* |
| +DefaultDisplayManager::GetLastCompositorFrame() const { |
| + if (!top_level_display_client_) |
| + return nullptr; |
| + |
| + return top_level_display_client_->GetLastCompositorFrame(); |
| +} |
| + |
| void DefaultDisplayManager::OnBoundsChanged(const gfx::Rect& new_bounds) { |
| UpdateMetrics(new_bounds.size(), metrics_.device_pixel_ratio); |
| } |
| @@ -257,7 +278,21 @@ void DefaultDisplayManager::OnDamageRect(const gfx::Rect& damaged_region) { |
| void DefaultDisplayManager::DispatchEvent(ui::Event* event) { |
| mojo::EventPtr mojo_event(mojo::Event::From(*event)); |
| - delegate_->OnEvent(mojo_event.Pass()); |
| + ViewId id; |
| + if (event->IsLocatedEvent() && !!top_level_display_client_) { |
| + ui::LocatedEvent* located_event = static_cast<ui::LocatedEvent*>(event); |
| + gfx::Point transformed_point; |
| + cc::SurfaceId target_surface = |
| + surfaces_state_->hit_tester()->GetTargetSurfaceAtPoint( |
| + top_level_display_client_->surface_id(), |
| + located_event->location(), |
| + &transformed_point); |
| + id = ViewIdFromTransportId( |
| + cc::SurfaceIdAllocator::NamespaceForId(target_surface)); |
| + mojo_event->pointer_data->location->x = transformed_point.x(); |
| + mojo_event->pointer_data->location->y = transformed_point.y(); |
| + } |
| + delegate_->OnEvent(id, mojo_event.Pass()); |
| switch (event->type()) { |
| case ui::ET_MOUSE_PRESSED: |
| @@ -299,7 +334,7 @@ void DefaultDisplayManager::DispatchEvent(ui::Event* event) { |
| key_press_event->GetLocatedWindowsKeyboardCode(), |
| key_press_event->GetText(), key_press_event->GetUnmodifiedText()))); |
| - delegate_->OnEvent(mojo::Event::From(char_event)); |
| + delegate_->OnEvent(id, mojo::Event::From(char_event)); |
| } |
| #endif |
| } |