| Index: services/ui/surfaces/display_compositor.cc
|
| diff --git a/services/ui/surfaces/display_compositor.cc b/services/ui/surfaces/display_compositor.cc
|
| index 53c85aa4ecd5b57235c476df6bf8adaa36f28721..79abc2a89934c6391009f21c19fa75c009677e47 100644
|
| --- a/services/ui/surfaces/display_compositor.cc
|
| +++ b/services/ui/surfaces/display_compositor.cc
|
| @@ -4,16 +4,50 @@
|
|
|
| #include "services/ui/surfaces/display_compositor.h"
|
|
|
| +#include "cc/output/in_process_context_provider.h"
|
| #include "cc/surfaces/surface.h"
|
| +#include "gpu/command_buffer/client/shared_memory_limits.h"
|
| +#include "gpu/ipc/gpu_in_process_thread_service.h"
|
| +#include "mojo/public/cpp/bindings/strong_binding.h"
|
| +#include "services/ui/surfaces/gpu_compositor_frame_sink.h"
|
|
|
| namespace ui {
|
|
|
| DisplayCompositor::DisplayCompositor(
|
| + scoped_refptr<gpu::InProcessCommandBuffer::Service> gpu_service,
|
| + std::unique_ptr<MusGpuMemoryBufferManager> gpu_memory_buffer_manager,
|
| + gpu::ImageFactory* image_factory,
|
| cc::mojom::DisplayCompositorClientPtr client)
|
| - : client_(std::move(client)) {
|
| + : gpu_service_(std::move(gpu_service)),
|
| + gpu_memory_buffer_manager_(std::move(gpu_memory_buffer_manager)),
|
| + image_factory_(image_factory),
|
| + client_(std::move(client)) {
|
| manager_.AddObserver(this);
|
| }
|
|
|
| +void DisplayCompositor::CreateCompositorFrameSink(
|
| + const cc::FrameSinkId& frame_sink_id,
|
| + gpu::SurfaceHandle surface_handle,
|
| + cc::mojom::MojoCompositorFrameSinkRequest request,
|
| + cc::mojom::MojoCompositorFrameSinkPrivateRequest private_request,
|
| + cc::mojom::MojoCompositorFrameSinkClientPtr client) {
|
| + // We cannot create more than one CompositorFrameSink with a given
|
| + // |frame_sink_id|.
|
| + DCHECK_EQ(0u, compositor_frame_sinks_.count(frame_sink_id));
|
| + scoped_refptr<cc::InProcessContextProvider> context_provider;
|
| + if (surface_handle != gpu::kNullSurfaceHandle) {
|
| + context_provider = new cc::InProcessContextProvider(
|
| + gpu_service_, surface_handle, gpu_memory_buffer_manager_.get(),
|
| + image_factory_, gpu::SharedMemoryLimits(),
|
| + nullptr /* shared_context */);
|
| + }
|
| + compositor_frame_sinks_[frame_sink_id] =
|
| + base::MakeUnique<GpuCompositorFrameSink>(
|
| + this, frame_sink_id, surface_handle, gpu_memory_buffer_manager_.get(),
|
| + std::move(context_provider), std::move(request),
|
| + std::move(private_request), std::move(client));
|
| +}
|
| +
|
| void DisplayCompositor::AddRootSurfaceReference(const cc::SurfaceId& child_id) {
|
| AddSurfaceReference(manager_.GetRootSurfaceId(), child_id);
|
| }
|
| @@ -93,6 +127,23 @@ DisplayCompositor::~DisplayCompositor() {
|
| manager_.RemoveObserver(this);
|
| }
|
|
|
| +void DisplayCompositor::OnCompositorFrameSinkClientConnectionLost(
|
| + const cc::FrameSinkId& frame_sink_id,
|
| + bool destroy_compositor_frame_sink) {
|
| + if (destroy_compositor_frame_sink)
|
| + compositor_frame_sinks_.erase(frame_sink_id);
|
| + // TODO(fsamuel): Tell the display compositor host that the client connection
|
| + // has been lost so that it can drop its private connection and allow a new
|
| + // client instance to create a new CompositorFrameSink.
|
| +}
|
| +
|
| +void DisplayCompositor::OnCompositorFrameSinkPrivateConnectionLost(
|
| + const cc::FrameSinkId& frame_sink_id,
|
| + bool destroy_compositor_frame_sink) {
|
| + if (destroy_compositor_frame_sink)
|
| + compositor_frame_sinks_.erase(frame_sink_id);
|
| +}
|
| +
|
| void DisplayCompositor::OnSurfaceCreated(const cc::SurfaceId& surface_id,
|
| const gfx::Size& frame_size,
|
| float device_scale_factor) {
|
|
|