blob: 8f2d2fd570ea04ffeb4b02a5f5955c0d60251987 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_VIZ_SERVICE_MAIN_VIZ_COMPOSITOR_THREAD_RUNNER_H_
#define COMPONENTS_VIZ_SERVICE_MAIN_VIZ_COMPOSITOR_THREAD_RUNNER_H_
#include <memory>
#include "base/macros.h"
#include "base/memory/scoped_refptr.h"
#include "build/build_config.h"
#include "services/network/public/mojom/tcp_socket.mojom.h"
#include "services/viz/privileged/interfaces/viz_main.mojom.h"
#if defined(OS_ANDROID)
#include "base/android/java_handler_thread.h"
#endif
namespace base {
class SingleThreadTaskRunner;
class Thread;
} // namespace base
namespace gpu {
class CommandBufferTaskExecutor;
} // namespace gpu
namespace ui_devtools {
class UiDevToolsServer;
} // namespace ui_devtools
namespace viz {
class OutputSurfaceProvider;
class FrameSinkManagerImpl;
class GpuServiceImpl;
class ServerSharedBitmapManager;
#if defined(OS_ANDROID)
using VizCompositorThreadType = base::android::JavaHandlerThread;
#else
using VizCompositorThreadType = base::Thread;
#endif
// Starts and runs the VizCompositorThread. The thread will be started when this
// object is constructed. Objects on the thread will be initialized after
// calling CreateFrameSinkManager(). Destructor will teardown objects on thread
// and then stop the thread.
class VizCompositorThreadRunner {
public:
VizCompositorThreadRunner();
// Performs teardown on thread and then stops thread.
~VizCompositorThreadRunner();
// Returns the TaskRunner for VizCompositorThread.
base::SingleThreadTaskRunner* task_runner() { return task_runner_.get(); }
// Creates FrameSinkManager from |params|. The version with |gpu_service| and
// |task_executor| supports both GPU and software compositing, while the
// version without supports only software compositing. Should be called from
// the thread that owns |this| to initialize state on VizCompositorThread.
void CreateFrameSinkManager(mojom::FrameSinkManagerParamsPtr params);
void CreateFrameSinkManager(mojom::FrameSinkManagerParamsPtr params,
gpu::CommandBufferTaskExecutor* task_executor,
GpuServiceImpl* gpu_service);
#if defined(USE_VIZ_DEVTOOLS)
void CreateVizDevTools(mojom::VizDevToolsParamsPtr params);
#endif
// Performs cleanup on VizCompositorThread needed before forcing thread to
// shut down. Ensures VizCompositorThread teardown during the destructor
// doesn't block on PostTasks back to the GPU thread. After cleanup has
// finished |cleanup_finished_callback| will be run. Should be called from the
// thread that owns |this|.
//
// This is intended to be used when the GPU thread wants to force restart. The
// cleanup is normally handled by the browser process before GPU process
// shutdown, except if the GPU thread is forcing restart.
void CleanupForShutdown(base::OnceClosure cleanup_finished_callback);
private:
void CreateFrameSinkManagerOnCompositorThread(
mojom::FrameSinkManagerParamsPtr params,
gpu::CommandBufferTaskExecutor* task_executor,
GpuServiceImpl* gpu_service);
#if defined(USE_VIZ_DEVTOOLS)
void CreateVizDevToolsOnCompositorThread(mojom::VizDevToolsParamsPtr params);
void InitVizDevToolsOnCompositorThread(mojom::VizDevToolsParamsPtr params);
#endif
void CleanupForShutdownOnCompositorThread();
void TearDownOnCompositorThread();
// Start variables to be accessed only on |task_runner_|.
std::unique_ptr<ServerSharedBitmapManager> server_shared_bitmap_manager_;
std::unique_ptr<OutputSurfaceProvider> output_surface_provider_;
std::unique_ptr<FrameSinkManagerImpl> frame_sink_manager_;
#if defined(USE_VIZ_DEVTOOLS)
std::unique_ptr<ui_devtools::UiDevToolsServer> devtools_server_;
// If the FrameSinkManager is not ready yet, then we stash the pending
// VizDevToolsParams.
mojom::VizDevToolsParamsPtr pending_viz_dev_tools_params_;
#endif
// End variables to be accessed only on |task_runner_|.
std::unique_ptr<VizCompositorThreadType> thread_;
scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
DISALLOW_COPY_AND_ASSIGN(VizCompositorThreadRunner);
};
} // namespace viz
#endif // COMPONENTS_VIZ_SERVICE_MAIN_VIZ_COMPOSITOR_THREAD_RUNNER_H_