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 "ui/aura/mus/window_port_mus.h" | 5 #include "ui/aura/mus/window_port_mus.h" |
| 6 | 6 |
| 7 #include "base/memory/ptr_util.h" | 7 #include "base/memory/ptr_util.h" |
| 8 #include "cc/output/context_provider.h" | |
| 8 #include "ui/aura/client/aura_constants.h" | 9 #include "ui/aura/client/aura_constants.h" |
| 9 #include "ui/aura/client/transient_window_client.h" | 10 #include "ui/aura/client/transient_window_client.h" |
| 11 #include "ui/aura/env.h" | |
| 10 #include "ui/aura/mus/client_surface_embedder.h" | 12 #include "ui/aura/mus/client_surface_embedder.h" |
| 13 #include "ui/aura/mus/mus_context_factory.h" | |
| 11 #include "ui/aura/mus/property_converter.h" | 14 #include "ui/aura/mus/property_converter.h" |
| 12 #include "ui/aura/mus/window_tree_client.h" | 15 #include "ui/aura/mus/window_tree_client.h" |
| 13 #include "ui/aura/mus/window_tree_client_delegate.h" | 16 #include "ui/aura/mus/window_tree_client_delegate.h" |
| 14 #include "ui/aura/window.h" | 17 #include "ui/aura/window.h" |
| 15 #include "ui/aura/window_delegate.h" | 18 #include "ui/aura/window_delegate.h" |
| 16 #include "ui/aura/window_observer.h" | 19 #include "ui/aura/window_observer.h" |
| 17 #include "ui/base/class_property.h" | 20 #include "ui/base/class_property.h" |
| 18 #include "ui/display/display.h" | 21 #include "ui/display/display.h" |
| 19 #include "ui/display/screen.h" | 22 #include "ui/display/screen.h" |
| 20 | 23 |
| 21 namespace aura { | 24 namespace aura { |
| 22 | 25 |
| 23 namespace { | 26 namespace { |
| 24 // Helper function to get the device_scale_factor() of the display::Display | 27 // Helper function to get the device_scale_factor() of the display::Display |
| 25 // nearest to |window|. | 28 // nearest to |window|. |
| 26 float ScaleFactorForDisplay(Window* window) { | 29 float ScaleFactorForDisplay(Window* window) { |
| 27 return display::Screen::GetScreen() | 30 return display::Screen::GetScreen() |
| 28 ->GetDisplayNearestWindow(window) | 31 ->GetDisplayNearestWindow(window) |
| 29 .device_scale_factor(); | 32 .device_scale_factor(); |
| 30 } | 33 } |
| 34 | |
| 35 // TODO(mfomitchev, samans): Remove these stub classes once the SurfaceReference | |
| 36 // work is complete. | |
| 37 class StubSurfaceReferenceFactory : public cc::SurfaceReferenceFactory { | |
| 38 public: | |
| 39 StubSurfaceReferenceFactory() = default; | |
| 40 | |
| 41 // cc::SurfaceReferenceFactory: | |
| 42 base::Closure CreateReference( | |
| 43 cc::SurfaceReferenceOwner* owner, | |
| 44 const cc::SurfaceId& surface_id) const override { | |
| 45 return base::Closure(); | |
| 46 } | |
| 47 | |
| 48 protected: | |
| 49 ~StubSurfaceReferenceFactory() override = default; | |
| 50 | |
| 51 DISALLOW_COPY_AND_ASSIGN(StubSurfaceReferenceFactory); | |
| 52 }; | |
| 31 } // namespace | 53 } // namespace |
| 32 | 54 |
| 33 WindowPortMus::WindowMusChangeDataImpl::WindowMusChangeDataImpl() = default; | 55 WindowPortMus::WindowMusChangeDataImpl::WindowMusChangeDataImpl() = default; |
| 34 | 56 |
| 35 WindowPortMus::WindowMusChangeDataImpl::~WindowMusChangeDataImpl() = default; | 57 WindowPortMus::WindowMusChangeDataImpl::~WindowMusChangeDataImpl() = default; |
| 36 | 58 |
| 37 // static | 59 // static |
| 38 WindowMus* WindowMus::Get(Window* window) { | 60 WindowMus* WindowMus::Get(Window* window) { |
| 39 return WindowPortMus::Get(window); | 61 return WindowPortMus::Get(window); |
| 40 } | 62 } |
| 41 | 63 |
| 42 WindowPortMus::WindowPortMus(WindowTreeClient* client, | 64 WindowPortMus::WindowPortMus(WindowTreeClient* client, |
| 43 WindowMusType window_mus_type) | 65 WindowMusType window_mus_type) |
| 44 : WindowMus(window_mus_type), window_tree_client_(client) {} | 66 : WindowMus(window_mus_type), |
| 67 window_tree_client_(client), | |
| 68 weak_factory_(this) {} | |
| 45 | 69 |
| 46 WindowPortMus::~WindowPortMus() { | 70 WindowPortMus::~WindowPortMus() { |
| 47 client_surface_embedder_.reset(); | 71 client_surface_embedder_.reset(); |
| 48 | 72 |
| 49 // DESTROY is only scheduled from DestroyFromServer(), meaning if DESTROY is | 73 // DESTROY is only scheduled from DestroyFromServer(), meaning if DESTROY is |
| 50 // present then the server originated the change. | 74 // present then the server originated the change. |
| 51 const WindowTreeClient::Origin origin = | 75 const WindowTreeClient::Origin origin = |
| 52 RemoveChangeByTypeAndData(ServerChangeType::DESTROY, ServerChangeData()) | 76 RemoveChangeByTypeAndData(ServerChangeType::DESTROY, ServerChangeData()) |
| 53 ? WindowTreeClient::Origin::SERVER | 77 ? WindowTreeClient::Origin::SERVER |
| 54 : WindowTreeClient::Origin::CLIENT; | 78 : WindowTreeClient::Origin::CLIENT; |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 114 } | 138 } |
| 115 | 139 |
| 116 void WindowPortMus::RequestCompositorFrameSinkInternal( | 140 void WindowPortMus::RequestCompositorFrameSinkInternal( |
| 117 scoped_refptr<cc::ContextProvider> context_provider, | 141 scoped_refptr<cc::ContextProvider> context_provider, |
| 118 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, | 142 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, |
| 119 const CompositorFrameSinkCallback& callback) { | 143 const CompositorFrameSinkCallback& callback) { |
| 120 DCHECK(frame_sink_id_.is_valid()); | 144 DCHECK(frame_sink_id_.is_valid()); |
| 121 std::unique_ptr<ui::ClientCompositorFrameSinkBinding> | 145 std::unique_ptr<ui::ClientCompositorFrameSinkBinding> |
| 122 compositor_frame_sink_binding; | 146 compositor_frame_sink_binding; |
| 123 std::unique_ptr<ui::ClientCompositorFrameSink> compositor_frame_sink = | 147 std::unique_ptr<ui::ClientCompositorFrameSink> compositor_frame_sink = |
| 124 ui::ClientCompositorFrameSink::Create( | 148 ui::ClientCompositorFrameSink::Create(std::move(context_provider), |
| 125 frame_sink_id_, std::move(context_provider), | 149 gpu_memory_buffer_manager, |
| 126 gpu_memory_buffer_manager, &compositor_frame_sink_binding); | 150 &compositor_frame_sink_binding); |
| 127 AttachCompositorFrameSink(std::move(compositor_frame_sink_binding)); | 151 AttachCompositorFrameSink(std::move(compositor_frame_sink_binding)); |
| 128 callback.Run(std::move(compositor_frame_sink)); | 152 callback.Run(std::move(compositor_frame_sink)); |
| 129 } | 153 } |
| 130 | 154 |
| 131 void WindowPortMus::AttachCompositorFrameSink( | 155 void WindowPortMus::AttachCompositorFrameSink( |
| 132 std::unique_ptr<ui::ClientCompositorFrameSinkBinding> | 156 std::unique_ptr<ui::ClientCompositorFrameSinkBinding> |
| 133 compositor_frame_sink_binding) { | 157 compositor_frame_sink_binding) { |
| 134 window_tree_client_->AttachCompositorFrameSink( | 158 window_tree_client_->AttachCompositorFrameSink( |
| 135 server_id(), compositor_frame_sink_binding->TakeFrameSinkRequest(), | 159 server_id(), compositor_frame_sink_binding->TakeFrameSinkRequest(), |
| 136 mojo::MakeProxy(compositor_frame_sink_binding->TakeFrameSinkClient())); | 160 mojo::MakeProxy(compositor_frame_sink_binding->TakeFrameSinkClient())); |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 314 // corresponding CompositorFrame or a deadline hits. | 338 // corresponding CompositorFrame or a deadline hits. |
| 315 if (window_tree_client_->enable_surface_synchronization_ && | 339 if (window_tree_client_->enable_surface_synchronization_ && |
| 316 frame_sink_id_.is_valid()) { | 340 frame_sink_id_.is_valid()) { |
| 317 UpdatePrimarySurfaceInfo(); | 341 UpdatePrimarySurfaceInfo(); |
| 318 } | 342 } |
| 319 | 343 |
| 320 return local_surface_id_; | 344 return local_surface_id_; |
| 321 } | 345 } |
| 322 | 346 |
| 323 void WindowPortMus::SetPrimarySurfaceInfo(const cc::SurfaceInfo& surface_info) { | 347 void WindowPortMus::SetPrimarySurfaceInfo(const cc::SurfaceInfo& surface_info) { |
| 348 bool embeds_surface = window_mus_type() == WindowMusType::TOP_LEVEL_IN_WM || | |
| 349 window_mus_type() == WindowMusType::EMBED_IN_OWNER; | |
| 324 primary_surface_info_ = surface_info; | 350 primary_surface_info_ = surface_info; |
| 325 UpdateClientSurfaceEmbedder(); | 351 if (embeds_surface) { |
| 352 UpdateClientSurfaceEmbedder(); | |
| 353 } else { | |
| 354 if (!ref_factory_) | |
|
Fady Samuel
2017/05/16 10:26:41
what calls this?
Peng
2017/05/16 10:55:24
window_->layer()->SetShowPrimarySurface(surface_in
| |
| 355 ref_factory_ = new StubSurfaceReferenceFactory(); | |
| 356 window_->layer()->SetBounds(gfx::Rect(window_->layer()->bounds().origin(), | |
| 357 surface_info.size_in_pixels())); | |
| 358 window_->layer()->SetShowPrimarySurface(surface_info, ref_factory_); | |
| 359 } | |
| 326 if (window_->delegate()) | 360 if (window_->delegate()) |
| 327 window_->delegate()->OnWindowSurfaceChanged(surface_info); | 361 window_->delegate()->OnWindowSurfaceChanged(surface_info); |
| 328 } | 362 } |
| 329 | 363 |
| 330 void WindowPortMus::SetFallbackSurfaceInfo( | 364 void WindowPortMus::SetFallbackSurfaceInfo( |
| 331 const cc::SurfaceInfo& surface_info) { | 365 const cc::SurfaceInfo& surface_info) { |
| 332 fallback_surface_info_ = surface_info; | 366 fallback_surface_info_ = surface_info; |
| 333 UpdateClientSurfaceEmbedder(); | 367 UpdateClientSurfaceEmbedder(); |
| 334 } | 368 } |
| 335 | 369 |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 515 // TODO(sky): investigate to see if we need to compare data. In particular do | 549 // TODO(sky): investigate to see if we need to compare data. In particular do |
| 516 // we ever have a case where changing a property cascades into changing the | 550 // we ever have a case where changing a property cascades into changing the |
| 517 // same property? | 551 // same property? |
| 518 if (!RemoveChangeByTypeAndData(ServerChangeType::PROPERTY, change_data)) | 552 if (!RemoveChangeByTypeAndData(ServerChangeType::PROPERTY, change_data)) |
| 519 window_tree_client_->OnWindowMusPropertyChanged(this, key, old_value, | 553 window_tree_client_->OnWindowMusPropertyChanged(this, key, old_value, |
| 520 std::move(data)); | 554 std::move(data)); |
| 521 } | 555 } |
| 522 | 556 |
| 523 std::unique_ptr<cc::CompositorFrameSink> | 557 std::unique_ptr<cc::CompositorFrameSink> |
| 524 WindowPortMus::CreateCompositorFrameSink() { | 558 WindowPortMus::CreateCompositorFrameSink() { |
| 525 // TODO(penghuang): Implement it for Mus. | 559 // We only allow creating a compositor frame sink for a local window. |
| 526 return nullptr; | 560 if (window_mus_type() != WindowMusType::LOCAL) |
| 561 return nullptr; | |
| 562 | |
| 563 DCHECK(!frame_sink_id_.is_valid()); | |
| 564 window_tree_client_->GetFrameSinkId(server_id()); | |
|
Fady Samuel
2017/05/16 10:28:03
Why do we need this?
Peng
2017/05/16 10:55:23
Right now, WS doesn't send frame sink id to client
| |
| 565 | |
| 566 ui::ContextFactory* context_factory = | |
| 567 aura::Env::GetInstance()->context_factory(); | |
| 568 std::unique_ptr<ui::ClientCompositorFrameSinkBinding> frame_sink_binding; | |
| 569 std::unique_ptr<ui::ClientCompositorFrameSink> frame_sink = | |
| 570 ui::ClientCompositorFrameSink::Create( | |
| 571 nullptr /* context_provider */, | |
| 572 context_factory->GetGpuMemoryBufferManager(), &frame_sink_binding); | |
| 573 frame_sink->SetSurfaceChangedCallback( | |
|
Fady Samuel
2017/05/16 10:28:03
What is the purpose of this callback?
Peng
2017/05/16 10:55:23
The ClientCompositorFrameSink will generate new lo
| |
| 574 base::Bind(&WindowPortMus::OnSurfaceChanged, weak_factory_.GetWeakPtr())); | |
| 575 AttachCompositorFrameSink(std::move(frame_sink_binding)); | |
| 576 return std::move(frame_sink); | |
| 527 } | 577 } |
| 528 | 578 |
| 529 cc::SurfaceId WindowPortMus::GetSurfaceId() const { | 579 cc::SurfaceId WindowPortMus::GetSurfaceId() const { |
| 530 // TODO(penghuang): Implement it for Mus. | 580 // This method is only used by exo unittests which are not running against |
| 581 // mus, so don't implement it now. | |
| 531 return cc::SurfaceId(); | 582 return cc::SurfaceId(); |
| 532 } | 583 } |
| 533 | 584 |
| 534 void WindowPortMus::UpdatePrimarySurfaceInfo() { | 585 void WindowPortMus::UpdatePrimarySurfaceInfo() { |
| 535 bool embeds_surface = window_mus_type() == WindowMusType::TOP_LEVEL_IN_WM || | 586 bool embeds_surface = window_mus_type() == WindowMusType::TOP_LEVEL_IN_WM || |
| 536 window_mus_type() == WindowMusType::EMBED_IN_OWNER; | 587 window_mus_type() == WindowMusType::EMBED_IN_OWNER; |
| 537 if (!embeds_surface || !window_tree_client_->enable_surface_synchronization_) | 588 if (embeds_surface && !window_tree_client_->enable_surface_synchronization_) |
| 538 return; | 589 return; |
| 539 | 590 |
| 540 if (!frame_sink_id_.is_valid() || !local_surface_id_.is_valid()) | 591 if (!frame_sink_id_.is_valid() || !local_surface_id_.is_valid()) |
| 541 return; | 592 return; |
| 542 | 593 |
| 543 SetPrimarySurfaceInfo( | 594 SetPrimarySurfaceInfo( |
| 544 cc::SurfaceInfo(cc::SurfaceId(frame_sink_id_, local_surface_id_), | 595 cc::SurfaceInfo(cc::SurfaceId(frame_sink_id_, local_surface_id_), |
| 545 ScaleFactorForDisplay(window_), last_surface_size_)); | 596 ScaleFactorForDisplay(window_), last_surface_size_)); |
| 546 } | 597 } |
| 547 | 598 |
| 548 void WindowPortMus::UpdateClientSurfaceEmbedder() { | 599 void WindowPortMus::UpdateClientSurfaceEmbedder() { |
| 549 bool embeds_surface = window_mus_type() == WindowMusType::TOP_LEVEL_IN_WM || | 600 bool embeds_surface = window_mus_type() == WindowMusType::TOP_LEVEL_IN_WM || |
| 550 window_mus_type() == WindowMusType::EMBED_IN_OWNER; | 601 window_mus_type() == WindowMusType::EMBED_IN_OWNER; |
| 551 if (!embeds_surface) | 602 if (!embeds_surface) |
| 552 return; | 603 return; |
| 553 | 604 |
| 554 if (!client_surface_embedder_) { | 605 if (!client_surface_embedder_) { |
| 555 client_surface_embedder_ = base::MakeUnique<ClientSurfaceEmbedder>( | 606 client_surface_embedder_ = base::MakeUnique<ClientSurfaceEmbedder>( |
| 556 window_, window_tree_client_->normal_client_area_insets_); | 607 window_, window_tree_client_->normal_client_area_insets_); |
| 557 } | 608 } |
| 558 | 609 |
| 559 client_surface_embedder_->SetPrimarySurfaceInfo(primary_surface_info_); | 610 client_surface_embedder_->SetPrimarySurfaceInfo(primary_surface_info_); |
| 560 client_surface_embedder_->SetFallbackSurfaceInfo(fallback_surface_info_); | 611 client_surface_embedder_->SetFallbackSurfaceInfo(fallback_surface_info_); |
| 561 } | 612 } |
| 562 | 613 |
| 614 void WindowPortMus::OnSurfaceChanged(const cc::LocalSurfaceId& local_surface_id, | |
|
Fady Samuel
2017/05/16 10:26:42
I'm confused about when this happens then...
Peng
2017/05/16 10:55:23
See line 103 at https://codereview.chromium.org/28
| |
| 615 const gfx::Size& surface_size) { | |
| 616 DCHECK_EQ(window_mus_type(), WindowMusType::LOCAL); | |
| 617 local_surface_id_ = local_surface_id; | |
| 618 last_surface_size_ = surface_size; | |
| 619 UpdatePrimarySurfaceInfo(); | |
| 620 } | |
| 621 | |
| 563 } // namespace aura | 622 } // namespace aura |
| OLD | NEW |