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

#include "services/sky/compositor/resource_manager.h"

#ifndef GL_GLEXT_PROTOTYPES
#define GL_GLEXT_PROTOTYPES
#endif

#include "base/logging.h"
#include "base/stl_util.h"
#include "gpu/GLES2/gl2chromium.h"
#include "gpu/GLES2/gl2extchromium.h"
#include "mojo/converters/geometry/geometry_type_converters.h"
#include "mojo/gpu/gl_context.h"
#include "mojo/gpu/gl_texture.h"
#include "mojo/public/c/gles2/gles2.h"
#include "services/sky/compositor/layer.h"

namespace sky {

ResourceManager::ResourceManager(base::WeakPtr<mojo::GLContext> gl_context)
    : gl_context_(gl_context), next_resource_id_(0) {
}

ResourceManager::~ResourceManager() {
  STLDeleteContainerPairSecondPointers(resource_to_texture_map_.begin(),
                                       resource_to_texture_map_.end());
}

scoped_ptr<mojo::GLTexture> ResourceManager::CreateTexture(
    const gfx::Size& size) {
  scoped_ptr<mojo::GLTexture> texture = texture_cache_.GetTexture(size);
  if (texture)
    return texture.Pass();
  gl_context_->MakeCurrent();
  return make_scoped_ptr(new mojo::GLTexture(
      gl_context_, mojo::TypeConverter<mojo::Size, gfx::Size>::Convert(size)));
}

mojo::TransferableResourcePtr ResourceManager::CreateTransferableResource(
    Layer* layer) {
  scoped_ptr<mojo::GLTexture> texture = layer->GetTexture();
  mojo::Size size = texture->size();

  gl_context_->MakeCurrent();
  glBindTexture(GL_TEXTURE_2D, texture->texture_id());
  GLbyte mailbox[GL_MAILBOX_SIZE_CHROMIUM];
  glGenMailboxCHROMIUM(mailbox);
  glProduceTextureCHROMIUM(GL_TEXTURE_2D, mailbox);
  GLuint sync_point = glInsertSyncPointCHROMIUM();
  glFlush();

  mojo::TransferableResourcePtr resource = mojo::TransferableResource::New();
  resource->id = next_resource_id_++;
  resource_to_texture_map_[resource->id] = texture.release();
  resource->format = mojo::RESOURCE_FORMAT_RGBA_8888;
  resource->filter = GL_LINEAR;
  resource->size = size.Clone();
  resource->is_repeated = false;
  resource->is_software = false;

  mojo::MailboxHolderPtr mailbox_holder = mojo::MailboxHolder::New();
  mailbox_holder->mailbox = mojo::Mailbox::New();
  for (int i = 0; i < GL_MAILBOX_SIZE_CHROMIUM; ++i)
    mailbox_holder->mailbox->name.push_back(mailbox[i]);
  mailbox_holder->texture_target = GL_TEXTURE_2D;
  mailbox_holder->sync_point = sync_point;
  resource->mailbox_holder = mailbox_holder.Pass();

  return resource.Pass();
}

void ResourceManager::ReturnResources(
    mojo::Array<mojo::ReturnedResourcePtr> resources) {
  DCHECK(resources.size());

  gl_context_->MakeCurrent();
  for (size_t i = 0u; i < resources.size(); ++i) {
    mojo::ReturnedResourcePtr resource = resources[i].Pass();
    DCHECK_EQ(1, resource->count);
    auto iter = resource_to_texture_map_.find(resource->id);
    if (iter == resource_to_texture_map_.end())
      continue;
    scoped_ptr<mojo::GLTexture> texture(iter->second);
    DCHECK_NE(0u, texture->texture_id());
    resource_to_texture_map_.erase(iter);
    glWaitSyncPointCHROMIUM(resource->sync_point);
    texture_cache_.PutTexture(texture.Pass());
  }
}

}  // namespace examples
