// Copyright (c) 2012 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 "gpu/ipc/common/gpu_surface_tracker.h"

#include "base/logging.h"
#include "build/build_config.h"

#if defined(OS_ANDROID)
#include <android/native_window_jni.h>
#include "ui/gl/android/scoped_java_surface.h"
#endif  // defined(OS_ANDROID)

namespace gpu {

GpuSurfaceTracker::GpuSurfaceTracker()
    : next_surface_handle_(1) {
  gpu::GpuSurfaceLookup::InitInstance(this);
}

GpuSurfaceTracker::~GpuSurfaceTracker() {
  gpu::GpuSurfaceLookup::InitInstance(NULL);
}

GpuSurfaceTracker* GpuSurfaceTracker::GetInstance() {
  return base::Singleton<GpuSurfaceTracker>::get();
}

int GpuSurfaceTracker::AddSurfaceForNativeWidget(
    gfx::AcceleratedWidget widget) {
  base::AutoLock lock(surface_map_lock_);
  gpu::SurfaceHandle surface_handle = next_surface_handle_++;
  surface_map_[surface_handle] = widget;
  return surface_handle;
}

bool GpuSurfaceTracker::IsValidSurfaceHandle(
    gpu::SurfaceHandle surface_handle) const {
  base::AutoLock lock(surface_map_lock_);
  return surface_map_.find(surface_handle) != surface_map_.end();
}

void GpuSurfaceTracker::RemoveSurface(gpu::SurfaceHandle surface_handle) {
  base::AutoLock lock(surface_map_lock_);
  DCHECK(surface_map_.find(surface_handle) != surface_map_.end());
  surface_map_.erase(surface_handle);
}

gfx::AcceleratedWidget GpuSurfaceTracker::AcquireNativeWidget(
    gpu::SurfaceHandle surface_handle) {
  base::AutoLock lock(surface_map_lock_);
  SurfaceMap::iterator it = surface_map_.find(surface_handle);
  if (it == surface_map_.end())
    return gfx::kNullAcceleratedWidget;

#if defined(OS_ANDROID)
  if (it->second != gfx::kNullAcceleratedWidget)
    ANativeWindow_acquire(it->second);
#endif  // defined(OS_ANDROID)

  return it->second;
}

#if defined(OS_ANDROID)
void GpuSurfaceTracker::RegisterViewSurface(
    int surface_id, jobject j_surface) {
  base::AutoLock lock(surface_view_map_lock_);
  DCHECK(surface_view_map_.find(surface_id) == surface_view_map_.end());

  surface_view_map_[surface_id] =
      gl::ScopedJavaSurface::AcquireExternalSurface(j_surface);
  CHECK(surface_view_map_[surface_id].IsValid());
}

void GpuSurfaceTracker::UnregisterViewSurface(int surface_id)
{
  base::AutoLock lock(surface_view_map_lock_);
  DCHECK(surface_view_map_.find(surface_id) != surface_view_map_.end());
  surface_view_map_.erase(surface_id);
}

gl::ScopedJavaSurface GpuSurfaceTracker::AcquireJavaSurface(int surface_id) {
  base::AutoLock lock(surface_view_map_lock_);
  SurfaceViewMap::const_iterator iter = surface_view_map_.find(surface_id);
  if (iter == surface_view_map_.end())
    return gl::ScopedJavaSurface();

  const gl::ScopedJavaSurface& j_surface = iter->second;
  DCHECK(j_surface.IsValid());
  return gl::ScopedJavaSurface::AcquireExternalSurface(
      j_surface.j_surface().obj());
}
#endif

std::size_t GpuSurfaceTracker::GetSurfaceCount() {
  base::AutoLock lock(surface_map_lock_);
  return surface_map_.size();
}

}  // namespace gpu
