// Copyright 2014 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 SERVICES_GLES2_COMMAND_BUFFER_IMPL_H_
#define SERVICES_GLES2_COMMAND_BUFFER_IMPL_H_

#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/single_thread_task_runner.h"
#include "mojo/public/cpp/bindings/binding.h"
#include "mojo/services/gpu/interfaces/command_buffer.mojom.h"
#include "mojo/services/gpu/interfaces/viewport_parameter_listener.mojom.h"

namespace gpu {
class SyncPointManager;
}

namespace gles2 {
class CommandBufferDriver;

// This class listens to the CommandBuffer message pipe on a low-latency thread
// so that we can insert sync points without blocking on the GL driver. It
// forwards most method calls to the CommandBufferDriver, which runs on the
// same thread as the native viewport.
class CommandBufferImpl : public mojo::CommandBuffer {
 public:
  class Observer {
   public:
    virtual void OnCommandBufferImplDestroyed() = 0;
  };

  CommandBufferImpl(
      mojo::InterfaceRequest<CommandBuffer> request,
      mojo::ViewportParameterListenerPtr listener,
      scoped_refptr<base::SingleThreadTaskRunner> control_task_runner,
      gpu::SyncPointManager* sync_point_manager,
      scoped_ptr<CommandBufferDriver> driver);
  ~CommandBufferImpl() override;

  void Initialize(
      mojo::InterfaceHandle<mojo::CommandBufferSyncClient> sync_client,
      mojo::InterfaceHandle<mojo::CommandBufferSyncPointClient>
          sync_point_client,
      mojo::InterfaceHandle<mojo::CommandBufferLostContextObserver>
          loss_observer,
      mojo::ScopedSharedBufferHandle shared_state) override;
  void SetGetBuffer(int32_t buffer) override;
  void Flush(int32_t put_offset) override;
  void MakeProgress(int32_t last_get_offset) override;
  void RegisterTransferBuffer(int32_t id,
                              mojo::ScopedSharedBufferHandle transfer_buffer,
                              uint32_t size) override;
  void DestroyTransferBuffer(int32_t id) override;
  void InsertSyncPoint(bool retire) override;
  void RetireSyncPoint(uint32_t sync_point) override;
  void Echo(const mojo::Callback<void()>& callback) override;

  void DidLoseContext();
  void UpdateVSyncParameters(base::TimeTicks timebase,
                             base::TimeDelta interval);

  // Sets an observer for CommandBufferImpl destruction. An observer registered
  // here will be notified of the destruction of this object on the thread used
  // to create it, before the destruction happens.
  void set_observer(Observer* observer) { observer_ = observer; }

 private:
  void BindToRequest(mojo::InterfaceRequest<CommandBuffer> request);
  void OnConnectionError();
  void NotifyAndDestroy();
  void Destroy();

  scoped_refptr<gpu::SyncPointManager> sync_point_manager_;
  scoped_refptr<base::SingleThreadTaskRunner> control_task_runner_;
  scoped_refptr<base::SingleThreadTaskRunner> driver_task_runner_;
  scoped_ptr<CommandBufferDriver> driver_;
  mojo::CommandBufferSyncPointClientPtr sync_point_client_;
  mojo::ViewportParameterListenerPtr viewport_parameter_listener_;
  mojo::Binding<CommandBuffer> binding_;
  Observer* observer_;

  base::WeakPtrFactory<CommandBufferImpl> weak_factory_;
  DISALLOW_COPY_AND_ASSIGN(CommandBufferImpl);
};

}  // namespace gles2

#endif  // SERVICES_GLES2_COMMAND_BUFFER_IMPL_H_
