| // 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(); | 
 |  | 
 |   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 |