blob: 81bd73fdd8e2d519a841ddb92dbd181329a62981 [file] [log] [blame]
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SERVICES_VIZ_PUBLIC_CPP_GPU_GPU_H_
#define SERVICES_VIZ_PUBLIC_CPP_GPU_GPU_H_
#include <stdint.h>
#include <memory>
#include <string>
#include <vector>
#include "base/memory/scoped_refptr.h"
#include "base/task/single_thread_task_runner.h"
#include "components/viz/common/gpu/context_provider.h"
#include "gpu/ipc/client/gpu_channel_host.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "services/viz/public/mojom/gpu.mojom.h"
namespace viz {
class Gpu : public gpu::GpuChannelEstablishFactory {
public:
// The Gpu has to be initialized in the main thread before establishing
// the gpu channel.
static std::unique_ptr<Gpu> Create(
mojo::PendingRemote<mojom::Gpu> remote,
scoped_refptr<base::SingleThreadTaskRunner> io_task_runner);
Gpu(const Gpu&) = delete;
Gpu& operator=(const Gpu&) = delete;
~Gpu() override;
#if BUILDFLAG(IS_CHROMEOS)
void CreateJpegDecodeAccelerator(
mojo::PendingReceiver<chromeos_camera::mojom::MjpegDecodeAccelerator>
jda_receiver);
#endif // BUILDFLAG(IS_CHROMEOS)
void CreateVideoEncodeAcceleratorProvider(
mojo::PendingReceiver<media::mojom::VideoEncodeAcceleratorProvider>
vea_provider_receiver);
// gpu::GpuChannelEstablishFactory:
void EstablishGpuChannel(
gpu::GpuChannelEstablishedCallback callback) override;
scoped_refptr<gpu::GpuChannelHost> EstablishGpuChannelSync() override;
bool gpu_remote_disconnected() { return gpu_remote_disconnected_; }
void LoseChannel();
scoped_refptr<gpu::GpuChannelHost> GetGpuChannel();
private:
friend class GpuTest;
class GpuPtrIO;
class EstablishRequest;
Gpu(mojo::PendingRemote<mojom::Gpu> gpu_remote,
scoped_refptr<base::SingleThreadTaskRunner> task_runner);
// Sends a request to establish a gpu channel. If a request is currently
// pending this will do nothing.
void SendEstablishGpuChannelRequest(base::WaitableEvent* waitable_event);
// Handles results of request to establish a gpu channel in
// |pending_request_|.
void OnEstablishedGpuChannel();
scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
std::unique_ptr<GpuPtrIO, base::OnTaskRunnerDeleter> gpu_;
scoped_refptr<EstablishRequest> pending_request_;
scoped_refptr<gpu::GpuChannelHost> gpu_channel_;
bool gpu_remote_disconnected_ = false;
std::vector<gpu::GpuChannelEstablishedCallback> establish_callbacks_;
};
} // namespace viz
#endif // SERVICES_VIZ_PUBLIC_CPP_GPU_GPU_H_