Index: ui/aura/mus/window_port_mus.cc |
diff --git a/ui/aura/mus/window_port_mus.cc b/ui/aura/mus/window_port_mus.cc |
index 4c98ed4558a036614237a01cf0d8aa1497009064..c83deffd67d22c4b7c7694c57c5a267a57020203 100644 |
--- a/ui/aura/mus/window_port_mus.cc |
+++ b/ui/aura/mus/window_port_mus.cc |
@@ -5,9 +5,12 @@ |
#include "ui/aura/mus/window_port_mus.h" |
#include "base/memory/ptr_util.h" |
+#include "cc/output/context_provider.h" |
#include "ui/aura/client/aura_constants.h" |
#include "ui/aura/client/transient_window_client.h" |
+#include "ui/aura/env.h" |
#include "ui/aura/mus/client_surface_embedder.h" |
+#include "ui/aura/mus/mus_context_factory.h" |
#include "ui/aura/mus/property_converter.h" |
#include "ui/aura/mus/window_tree_client.h" |
#include "ui/aura/mus/window_tree_client_delegate.h" |
@@ -28,6 +31,25 @@ float ScaleFactorForDisplay(Window* window) { |
->GetDisplayNearestWindow(window) |
.device_scale_factor(); |
} |
+ |
+// TODO(mfomitchev, samans): Remove these stub classes once the SurfaceReference |
+// work is complete. |
+class StubSurfaceReferenceFactory : public cc::SurfaceReferenceFactory { |
+ public: |
+ StubSurfaceReferenceFactory() = default; |
+ |
+ // cc::SurfaceReferenceFactory: |
+ base::Closure CreateReference( |
+ cc::SurfaceReferenceOwner* owner, |
+ const cc::SurfaceId& surface_id) const override { |
+ return base::Closure(); |
+ } |
+ |
+ protected: |
+ ~StubSurfaceReferenceFactory() override = default; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(StubSurfaceReferenceFactory); |
+}; |
} // namespace |
WindowPortMus::WindowMusChangeDataImpl::WindowMusChangeDataImpl() = default; |
@@ -41,7 +63,9 @@ WindowMus* WindowMus::Get(Window* window) { |
WindowPortMus::WindowPortMus(WindowTreeClient* client, |
WindowMusType window_mus_type) |
- : WindowMus(window_mus_type), window_tree_client_(client) {} |
+ : WindowMus(window_mus_type), |
+ window_tree_client_(client), |
+ weak_factory_(this) {} |
WindowPortMus::~WindowPortMus() { |
client_surface_embedder_.reset(); |
@@ -121,9 +145,9 @@ void WindowPortMus::RequestCompositorFrameSinkInternal( |
std::unique_ptr<ui::ClientCompositorFrameSinkBinding> |
compositor_frame_sink_binding; |
std::unique_ptr<ui::ClientCompositorFrameSink> compositor_frame_sink = |
- ui::ClientCompositorFrameSink::Create( |
- frame_sink_id_, std::move(context_provider), |
- gpu_memory_buffer_manager, &compositor_frame_sink_binding); |
+ ui::ClientCompositorFrameSink::Create(std::move(context_provider), |
+ gpu_memory_buffer_manager, |
+ &compositor_frame_sink_binding); |
AttachCompositorFrameSink(std::move(compositor_frame_sink_binding)); |
callback.Run(std::move(compositor_frame_sink)); |
} |
@@ -321,8 +345,18 @@ const cc::LocalSurfaceId& WindowPortMus::GetOrAllocateLocalSurfaceId( |
} |
void WindowPortMus::SetPrimarySurfaceInfo(const cc::SurfaceInfo& surface_info) { |
+ bool embeds_surface = window_mus_type() == WindowMusType::TOP_LEVEL_IN_WM || |
+ window_mus_type() == WindowMusType::EMBED_IN_OWNER; |
primary_surface_info_ = surface_info; |
- UpdateClientSurfaceEmbedder(); |
+ if (embeds_surface) { |
+ UpdateClientSurfaceEmbedder(); |
+ } else { |
+ 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
|
+ ref_factory_ = new StubSurfaceReferenceFactory(); |
+ window_->layer()->SetBounds(gfx::Rect(window_->layer()->bounds().origin(), |
+ surface_info.size_in_pixels())); |
+ window_->layer()->SetShowPrimarySurface(surface_info, ref_factory_); |
+ } |
if (window_->delegate()) |
window_->delegate()->OnWindowSurfaceChanged(surface_info); |
} |
@@ -522,19 +556,36 @@ void WindowPortMus::OnPropertyChanged(const void* key, |
std::unique_ptr<cc::CompositorFrameSink> |
WindowPortMus::CreateCompositorFrameSink() { |
- // TODO(penghuang): Implement it for Mus. |
- return nullptr; |
+ // We only allow creating a compositor frame sink for a local window. |
+ if (window_mus_type() != WindowMusType::LOCAL) |
+ return nullptr; |
+ |
+ DCHECK(!frame_sink_id_.is_valid()); |
+ 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
|
+ |
+ ui::ContextFactory* context_factory = |
+ aura::Env::GetInstance()->context_factory(); |
+ std::unique_ptr<ui::ClientCompositorFrameSinkBinding> frame_sink_binding; |
+ std::unique_ptr<ui::ClientCompositorFrameSink> frame_sink = |
+ ui::ClientCompositorFrameSink::Create( |
+ nullptr /* context_provider */, |
+ context_factory->GetGpuMemoryBufferManager(), &frame_sink_binding); |
+ 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
|
+ base::Bind(&WindowPortMus::OnSurfaceChanged, weak_factory_.GetWeakPtr())); |
+ AttachCompositorFrameSink(std::move(frame_sink_binding)); |
+ return std::move(frame_sink); |
} |
cc::SurfaceId WindowPortMus::GetSurfaceId() const { |
- // TODO(penghuang): Implement it for Mus. |
+ // This method is only used by exo unittests which are not running against |
+ // mus, so don't implement it now. |
return cc::SurfaceId(); |
} |
void WindowPortMus::UpdatePrimarySurfaceInfo() { |
bool embeds_surface = window_mus_type() == WindowMusType::TOP_LEVEL_IN_WM || |
window_mus_type() == WindowMusType::EMBED_IN_OWNER; |
- if (!embeds_surface || !window_tree_client_->enable_surface_synchronization_) |
+ if (embeds_surface && !window_tree_client_->enable_surface_synchronization_) |
return; |
if (!frame_sink_id_.is_valid() || !local_surface_id_.is_valid()) |
@@ -560,4 +611,12 @@ void WindowPortMus::UpdateClientSurfaceEmbedder() { |
client_surface_embedder_->SetFallbackSurfaceInfo(fallback_surface_info_); |
} |
+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
|
+ const gfx::Size& surface_size) { |
+ DCHECK_EQ(window_mus_type(), WindowMusType::LOCAL); |
+ local_surface_id_ = local_surface_id; |
+ last_surface_size_ = surface_size; |
+ UpdatePrimarySurfaceInfo(); |
+} |
+ |
} // namespace aura |