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

Side by Side Diff: ui/aura/mus/window_port_mus.cc

Issue 2875753002: Implement aura::WindowPortMus::CreateCompositorFrameSink() (Closed)
Patch Set: Rebase Created 3 years, 7 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 "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 {
Fady Samuel 2017/05/18 16:48:51 Remove this.
Peng 2017/05/18 19:37:59 Done.
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 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
262 ServerChangeData data; 286 ServerChangeData data;
263 data.property_name = property_name; 287 data.property_name = property_name;
264 ScopedServerChange change(this, ServerChangeType::PROPERTY, data); 288 ScopedServerChange change(this, ServerChangeType::PROPERTY, data);
265 GetPropertyConverter()->SetPropertyFromTransportValue(window_, property_name, 289 GetPropertyConverter()->SetPropertyFromTransportValue(window_, property_name,
266 property_data); 290 property_data);
267 } 291 }
268 292
269 void WindowPortMus::SetFrameSinkIdFromServer( 293 void WindowPortMus::SetFrameSinkIdFromServer(
270 const cc::FrameSinkId& frame_sink_id) { 294 const cc::FrameSinkId& frame_sink_id) {
271 DCHECK(window_mus_type() == WindowMusType::TOP_LEVEL_IN_WM || 295 DCHECK(window_mus_type() == WindowMusType::TOP_LEVEL_IN_WM ||
272 window_mus_type() == WindowMusType::EMBED_IN_OWNER); 296 window_mus_type() == WindowMusType::EMBED_IN_OWNER ||
297 window_mus_type() == WindowMusType::LOCAL);
273 frame_sink_id_ = frame_sink_id; 298 frame_sink_id_ = frame_sink_id;
274 UpdatePrimarySurfaceInfo(); 299 UpdatePrimarySurfaceInfo();
275 } 300 }
276 301
277 const cc::LocalSurfaceId& WindowPortMus::GetOrAllocateLocalSurfaceId( 302 const cc::LocalSurfaceId& WindowPortMus::GetOrAllocateLocalSurfaceId(
278 const gfx::Size& surface_size) { 303 const gfx::Size& surface_size) {
279 if (last_surface_size_ == surface_size && local_surface_id_.is_valid()) 304 if (last_surface_size_ == surface_size && local_surface_id_.is_valid())
280 return local_surface_id_; 305 return local_surface_id_;
281 306
282 local_surface_id_ = local_surface_id_allocator_.GenerateId(); 307 local_surface_id_ = local_surface_id_allocator_.GenerateId();
283 last_surface_size_ = surface_size; 308 last_surface_size_ = surface_size;
284 309
285 // If surface synchronization is enabled and the FrameSinkId is available, 310 // If surface synchronization is enabled and the FrameSinkId is available,
286 // then immediately embed the SurfaceId. The newly generated frame by the 311 // then immediately embed the SurfaceId. The newly generated frame by the
287 // embedder will block in the display compositor until the child submits a 312 // embedder will block in the display compositor until the child submits a
288 // corresponding CompositorFrame or a deadline hits. 313 // corresponding CompositorFrame or a deadline hits.
289 if (window_tree_client_->enable_surface_synchronization_ && 314 if (window_tree_client_->enable_surface_synchronization_ &&
290 frame_sink_id_.is_valid()) { 315 frame_sink_id_.is_valid()) {
291 UpdatePrimarySurfaceInfo(); 316 UpdatePrimarySurfaceInfo();
292 } 317 }
293 318
294 return local_surface_id_; 319 return local_surface_id_;
295 } 320 }
296 321
297 void WindowPortMus::SetPrimarySurfaceInfo(const cc::SurfaceInfo& surface_info) { 322 void WindowPortMus::SetPrimarySurfaceInfo(const cc::SurfaceInfo& surface_info) {
323 bool embeds_surface = window_mus_type() == WindowMusType::TOP_LEVEL_IN_WM ||
324 window_mus_type() == WindowMusType::EMBED_IN_OWNER;
298 primary_surface_info_ = surface_info; 325 primary_surface_info_ = surface_info;
299 UpdateClientSurfaceEmbedder(); 326 if (embeds_surface) {
327 UpdateClientSurfaceEmbedder();
Fady Samuel 2017/05/18 16:48:51 Undo this change. Always use ClientSurfaceEmbedder
Peng 2017/05/18 19:37:59 Done.
328 } else {
329 if (!ref_factory_)
330 ref_factory_ = new StubSurfaceReferenceFactory();
331 window_->layer()->SetBounds(gfx::Rect(window_->layer()->bounds().origin(),
332 surface_info.size_in_pixels()));
333 window_->layer()->SetShowPrimarySurface(surface_info, ref_factory_);
334 }
300 if (window_->delegate()) 335 if (window_->delegate())
301 window_->delegate()->OnWindowSurfaceChanged(surface_info); 336 window_->delegate()->OnWindowSurfaceChanged(surface_info);
302 } 337 }
303 338
304 void WindowPortMus::SetFallbackSurfaceInfo( 339 void WindowPortMus::SetFallbackSurfaceInfo(
305 const cc::SurfaceInfo& surface_info) { 340 const cc::SurfaceInfo& surface_info) {
306 fallback_surface_info_ = surface_info; 341 fallback_surface_info_ = surface_info;
307 UpdateClientSurfaceEmbedder(); 342 UpdateClientSurfaceEmbedder();
308 } 343 }
309 344
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
489 // TODO(sky): investigate to see if we need to compare data. In particular do 524 // TODO(sky): investigate to see if we need to compare data. In particular do
490 // we ever have a case where changing a property cascades into changing the 525 // we ever have a case where changing a property cascades into changing the
491 // same property? 526 // same property?
492 if (!RemoveChangeByTypeAndData(ServerChangeType::PROPERTY, change_data)) 527 if (!RemoveChangeByTypeAndData(ServerChangeType::PROPERTY, change_data))
493 window_tree_client_->OnWindowMusPropertyChanged(this, key, old_value, 528 window_tree_client_->OnWindowMusPropertyChanged(this, key, old_value,
494 std::move(data)); 529 std::move(data));
495 } 530 }
496 531
497 std::unique_ptr<cc::CompositorFrameSink> 532 std::unique_ptr<cc::CompositorFrameSink>
498 WindowPortMus::CreateCompositorFrameSink() { 533 WindowPortMus::CreateCompositorFrameSink() {
499 // TODO(penghuang): Implement it for Mus. 534 // We only allow creating a compositor frame sink for a local window.
500 return nullptr; 535 if (window_mus_type() != WindowMusType::LOCAL)
536 return nullptr;
537
538 DCHECK(!frame_sink_id_.is_valid());
539 window_tree_client_->GetFrameSinkId(server_id());
540
541 ui::ContextFactory* context_factory =
542 aura::Env::GetInstance()->context_factory();
543 std::unique_ptr<ui::ClientCompositorFrameSinkBinding> frame_sink_binding;
544 // The compositor frame sink is for a local window, so we don't need surface
545 // synchronization.
546 const bool enable_surface_synchronization = false;
547 std::unique_ptr<ui::ClientCompositorFrameSink> frame_sink =
548 ui::ClientCompositorFrameSink::Create(
549 nullptr /* context_provider */,
550 context_factory->GetGpuMemoryBufferManager(), &frame_sink_binding,
551 enable_surface_synchronization);
552 frame_sink->SetSurfaceChangedCallback(
553 base::Bind(&WindowPortMus::OnSurfaceChanged, weak_factory_.GetWeakPtr()));
Fady Samuel 2017/05/18 16:48:51 This is fundamentally not compatible with surface
Peng 2017/05/18 19:37:59 Done.
554 AttachCompositorFrameSink(std::move(frame_sink_binding));
555 return std::move(frame_sink);
501 } 556 }
502 557
503 cc::SurfaceId WindowPortMus::GetSurfaceId() const { 558 cc::SurfaceId WindowPortMus::GetSurfaceId() const {
504 // TODO(penghuang): Implement it for Mus. 559 // This method is only used by exo unittests which are not running against
560 // mus, so don't implement it now.
505 return cc::SurfaceId(); 561 return cc::SurfaceId();
506 } 562 }
507 563
508 void WindowPortMus::UpdatePrimarySurfaceInfo() { 564 void WindowPortMus::UpdatePrimarySurfaceInfo() {
509 bool embeds_surface = window_mus_type() == WindowMusType::TOP_LEVEL_IN_WM || 565 bool embeds_surface = window_mus_type() == WindowMusType::TOP_LEVEL_IN_WM ||
510 window_mus_type() == WindowMusType::EMBED_IN_OWNER; 566 window_mus_type() == WindowMusType::EMBED_IN_OWNER;
511 if (!embeds_surface || !window_tree_client_->enable_surface_synchronization_) 567 if (embeds_surface && !window_tree_client_->enable_surface_synchronization_)
Fady Samuel 2017/05/18 16:48:51 Undo this?
Peng 2017/05/18 19:37:59 Done.
512 return; 568 return;
513 569
514 if (!frame_sink_id_.is_valid() || !local_surface_id_.is_valid()) 570 if (!frame_sink_id_.is_valid() || !local_surface_id_.is_valid())
515 return; 571 return;
516 572
517 SetPrimarySurfaceInfo( 573 SetPrimarySurfaceInfo(
518 cc::SurfaceInfo(cc::SurfaceId(frame_sink_id_, local_surface_id_), 574 cc::SurfaceInfo(cc::SurfaceId(frame_sink_id_, local_surface_id_),
519 ScaleFactorForDisplay(window_), last_surface_size_)); 575 ScaleFactorForDisplay(window_), last_surface_size_));
520 } 576 }
521 577
522 void WindowPortMus::UpdateClientSurfaceEmbedder() { 578 void WindowPortMus::UpdateClientSurfaceEmbedder() {
523 bool embeds_surface = window_mus_type() == WindowMusType::TOP_LEVEL_IN_WM || 579 bool embeds_surface = window_mus_type() == WindowMusType::TOP_LEVEL_IN_WM ||
524 window_mus_type() == WindowMusType::EMBED_IN_OWNER; 580 window_mus_type() == WindowMusType::EMBED_IN_OWNER;
525 if (!embeds_surface) 581 if (!embeds_surface)
526 return; 582 return;
527 583
528 if (!client_surface_embedder_) { 584 if (!client_surface_embedder_) {
529 client_surface_embedder_ = base::MakeUnique<ClientSurfaceEmbedder>( 585 client_surface_embedder_ = base::MakeUnique<ClientSurfaceEmbedder>(
530 window_, window_tree_client_->normal_client_area_insets_); 586 window_, window_tree_client_->normal_client_area_insets_);
531 } 587 }
532 588
533 client_surface_embedder_->SetPrimarySurfaceInfo(primary_surface_info_); 589 client_surface_embedder_->SetPrimarySurfaceInfo(primary_surface_info_);
534 client_surface_embedder_->SetFallbackSurfaceInfo(fallback_surface_info_); 590 client_surface_embedder_->SetFallbackSurfaceInfo(fallback_surface_info_);
535 } 591 }
536 592
593 void WindowPortMus::OnSurfaceChanged(const cc::LocalSurfaceId& local_surface_id,
Fady Samuel 2017/05/18 16:48:51 Remove this.
Peng 2017/05/18 19:37:59 Done.
594 const gfx::Size& surface_size) {
595 DCHECK_EQ(window_mus_type(), WindowMusType::LOCAL);
596 local_surface_id_ = local_surface_id;
597 last_surface_size_ = surface_size;
598 UpdatePrimarySurfaceInfo();
599 }
600
537 } // namespace aura 601 } // namespace aura
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698