// 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_SURFACES_SURFACES_IMPL_H_
#define SERVICES_SURFACES_SURFACES_IMPL_H_

#include "cc/surfaces/display_client.h"
#include "cc/surfaces/surface_factory.h"
#include "cc/surfaces/surface_factory_client.h"
#include "mojo/common/weak_binding_set.h"
#include "mojo/public/cpp/application/application_connection.h"
#include "mojo/public/cpp/bindings/strong_binding.h"
#include "mojo/services/gpu/public/interfaces/command_buffer.mojom.h"
#include "mojo/services/gpu/public/interfaces/viewport_parameter_listener.mojom.h"
#include "mojo/services/surfaces/public/interfaces/surfaces.mojom.h"

namespace cc {
class Display;
}

namespace mojo {
class ApplicationManager;
}

namespace surfaces {

class SurfaceNativeViewportClient;

class SurfacesImpl : public mojo::Surface,
                     public mojo::ViewportParameterListener,
                     public cc::SurfaceFactoryClient,
                     public cc::DisplayClient {
 public:
  class Client {
   public:
    virtual void OnVSyncParametersUpdated(base::TimeTicks timebase,
                                          base::TimeDelta interval) = 0;
    virtual void FrameSubmitted() = 0;
    virtual void SetDisplay(cc::Display* display) = 0;
    virtual void OnDisplayBeingDestroyed(cc::Display* display) = 0;
  };

  SurfacesImpl(cc::SurfaceManager* manager,
               uint32_t id_namespace,
               Client* client,
               mojo::InterfaceRequest<mojo::Surface> request);

  SurfacesImpl(cc::SurfaceManager* manager,
               uint32_t id_namespace,
               Client* client,
               mojo::SurfacePtr* surface);

  ~SurfacesImpl() override;

  // Surface implementation.
  void CreateSurface(mojo::SurfaceIdPtr id) override;
  void SubmitFrame(mojo::SurfaceIdPtr id,
                   mojo::FramePtr frame,
                   const mojo::Closure& callback) override;
  void DestroySurface(mojo::SurfaceIdPtr id) override;
  void CreateGLES2BoundSurface(
      mojo::CommandBufferPtr gles2_client,
      mojo::SurfaceIdPtr id,
      mojo::SizePtr size,
      mojo::InterfaceRequest<mojo::ViewportParameterListener> listener_request)
      override;

  // SurfaceFactoryClient implementation.
  void ReturnResources(const cc::ReturnedResourceArray& resources) override;

  // DisplayClient implementation.
  void DisplayDamaged() override;
  void DidSwapBuffers() override;
  void DidSwapBuffersComplete() override;
  void CommitVSyncParameters(base::TimeTicks timebase,
                             base::TimeDelta interval) override;
  void OutputSurfaceLost() override;
  void SetMemoryPolicy(const cc::ManagedMemoryPolicy& policy) override;

  // ViewportParameterListener
  void OnVSyncParametersUpdated(int64_t timebase, int64_t interval) override;

  cc::SurfaceFactory* factory() { return &factory_; }

 private:
  SurfacesImpl(cc::SurfaceManager* manager,
               uint32_t id_namespace,
               Client* client);

  cc::SurfaceManager* manager_;
  cc::SurfaceFactory factory_;
  uint32_t id_namespace_;
  Client* client_;
  scoped_ptr<cc::Display> display_;
  mojo::ScopedMessagePipeHandle command_buffer_handle_;
  mojo::WeakBindingSet<ViewportParameterListener> parameter_listeners_;
  mojo::StrongBinding<Surface> binding_;

  DISALLOW_COPY_AND_ASSIGN(SurfacesImpl);
};

}  // namespace surfaces

#endif  // SERVICES_SURFACES_SURFACES_IMPL_H_
