// Copyright 2013 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 CONTENT_COMMON_GPU_CLIENT_GPU_MEMORY_BUFFER_IMPL_H_
#define CONTENT_COMMON_GPU_CLIENT_GPU_MEMORY_BUFFER_IMPL_H_

#include "base/callback.h"
#include "base/memory/scoped_ptr.h"
#include "content/common/content_export.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/gpu_memory_buffer.h"

namespace content {

// Provides common implementation of a GPU memory buffer.
class CONTENT_EXPORT GpuMemoryBufferImpl : public gfx::GpuMemoryBuffer {
 public:
  typedef base::Callback<void(uint32 sync_point)> DestructionCallback;

  ~GpuMemoryBufferImpl() override;

  // Creates an instance from the given |handle|. |size| and |internalformat|
  // should match what was used to allocate the |handle|. |callback| is
  // called when instance is deleted, which is not necessarily on the same
  // thread as this function was called on and instance was created on.
  static scoped_ptr<GpuMemoryBufferImpl> CreateFromHandle(
      const gfx::GpuMemoryBufferHandle& handle,
      const gfx::Size& size,
      Format format,
      const DestructionCallback& callback);

  // Type-checking upcast routine. Returns an NULL on failure.
  static GpuMemoryBufferImpl* FromClientBuffer(ClientBuffer buffer);

  // Returns the number of planes based on the format of the buffer.
  static size_t NumberOfPlanesForGpuMemoryBufferFormat(Format format);

  // Returns the subsampling factor applied to the given zero-indexed |plane| of
  // the |format| both horizontally and vertically.
  static size_t SubsamplingFactor(Format format, int plane);

  // Returns the number of bytes used to store a row of the given zero-indexed
  // |plane| of |format|.
  // Note: This is an approximation and the exact size used by an implementation
  // might be different.
  static bool RowSizeInBytes(size_t width,
                             Format format,
                             int plane,
                             size_t* size_in_bytes);

  // Returns the number of bytes used to store all the planes of a given
  // |format|.
  // Note: This is an approximation and the exact size used by an implementation
  // might be different.
  static bool BufferSizeInBytes(const gfx::Size& size,
                                Format format,
                                size_t* size_in_bytes);

  // Overridden from gfx::GpuMemoryBuffer:
  bool IsMapped() const override;
  Format GetFormat() const override;
  ClientBuffer AsClientBuffer() override;

  void set_destruction_sync_point(uint32 sync_point) {
    destruction_sync_point_ = sync_point;
  }

 protected:
  GpuMemoryBufferImpl(gfx::GpuMemoryBufferId id,
                      const gfx::Size& size,
                      Format format,
                      const DestructionCallback& callback);

  const gfx::GpuMemoryBufferId id_;
  const gfx::Size size_;
  const Format format_;
  const DestructionCallback callback_;
  bool mapped_;
  uint32 destruction_sync_point_;

 private:
  DISALLOW_COPY_AND_ASSIGN(GpuMemoryBufferImpl);
};

}  // namespace content

#endif  // CONTENT_COMMON_GPU_CLIENT_GPU_MEMORY_BUFFER_IMPL_H_
