// 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.

#include "content/browser/gpu_interface_provider.h"

#include "base/bind.h"
#include "base/containers/unique_ptr_adapters.h"
#include "base/memory/ref_counted.h"
#include "base/task/post_task.h"
#include "components/discardable_memory/public/interfaces/discardable_shared_memory_manager.mojom.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/gpu_client.h"
#include "content/public/browser/gpu_interface_provider_factory.h"
#include "content/public/browser/gpu_service_registry.h"
#include "services/ws/public/mojom/gpu.mojom.h"

namespace content {

// InterfaceBinderImpl handles the actual binding. The binding has to happen on
// the IO thread.
class GpuInterfaceProvider::InterfaceBinderImpl
    : public base::RefCountedThreadSafe<InterfaceBinderImpl> {
 public:
  InterfaceBinderImpl() = default;

  void BindGpuRequestOnGpuTaskRunner(ws::mojom::GpuRequest request) {
    // The GPU task runner is bound to the IO thread.
    DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
    auto gpu_client = content::CreateGpuClient(
        std::move(request),
        base::BindOnce(&InterfaceBinderImpl::OnGpuClientConnectionError, this),
        base::CreateSingleThreadTaskRunnerWithTraits(
            {content::BrowserThread::IO}));
    gpu_clients_.push_back(std::move(gpu_client));
  }

  void BindDiscardableSharedMemoryManagerOnGpuTaskRunner(
      discardable_memory::mojom::DiscardableSharedMemoryManagerRequest
          request) {
    content::BindInterfaceInGpuProcess(std::move(request));
  }

 private:
  friend class base::RefCountedThreadSafe<InterfaceBinderImpl>;
  ~InterfaceBinderImpl() = default;

  void OnGpuClientConnectionError(viz::GpuClient* client) {
    base::EraseIf(
        gpu_clients_,
        base::UniquePtrMatcher<viz::GpuClient, base::OnTaskRunnerDeleter>(
            client));
  }

  std::vector<std::unique_ptr<viz::GpuClient, base::OnTaskRunnerDeleter>>
      gpu_clients_;

  DISALLOW_COPY_AND_ASSIGN(InterfaceBinderImpl);
};

GpuInterfaceProvider::GpuInterfaceProvider()
    : interface_binder_impl_(base::MakeRefCounted<InterfaceBinderImpl>()) {}

GpuInterfaceProvider::~GpuInterfaceProvider() = default;

void GpuInterfaceProvider::RegisterGpuInterfaces(
    service_manager::BinderRegistry* registry) {
  scoped_refptr<base::SingleThreadTaskRunner> gpu_task_runner =
      base::CreateSingleThreadTaskRunnerWithTraits(
          {content::BrowserThread::IO});
  registry->AddInterface(
      base::BindRepeating(&InterfaceBinderImpl::
                              BindDiscardableSharedMemoryManagerOnGpuTaskRunner,
                          interface_binder_impl_),
      gpu_task_runner);
  registry->AddInterface(
      base::BindRepeating(&InterfaceBinderImpl::BindGpuRequestOnGpuTaskRunner,
                          interface_binder_impl_),
      gpu_task_runner);
}

#if defined(USE_OZONE)
void GpuInterfaceProvider::BindOzoneGpuInterface(
    const std::string& interface_name,
    mojo::ScopedMessagePipeHandle handle) {
  // This function is only used in multi-process mash with in-process viz to
  // bind gpu-related ozone interfaces. It should not be invoked here.
  NOTREACHED();
}
#endif

// Factory.
std::unique_ptr<ws::GpuInterfaceProvider> CreateGpuInterfaceProvider() {
  return std::make_unique<GpuInterfaceProvider>();
}

}  // namespace content
