Home | History | Annotate | Download | only in service
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "gpu/command_buffer/service/image_manager.h"
      6 
      7 #include "ui/gl/gl_image.h"
      8 
      9 namespace gpu {
     10 namespace gles2 {
     11 
     12 ImageManager::ImageManager() : release_after_use_(false) {
     13 }
     14 
     15 ImageManager::~ImageManager() {
     16 }
     17 
     18 void ImageManager::RegisterGpuMemoryBuffer(int32 id,
     19                                            gfx::GpuMemoryBufferHandle buffer,
     20                                            size_t width,
     21                                            size_t height,
     22                                            unsigned internalformat) {
     23   if (id <= 0) {
     24     DVLOG(0) << "Cannot register GPU memory buffer with non-positive ID.";
     25     return;
     26   }
     27 
     28   if (LookupImage(id)) {
     29     DVLOG(0) << "GPU memory buffer ID already in use.";
     30     return;
     31   }
     32 
     33   scoped_refptr<gfx::GLImage> gl_image =
     34       gfx::GLImage::CreateGLImageForGpuMemoryBuffer(buffer,
     35                                                     gfx::Size(width, height),
     36                                                     internalformat);
     37   if (!gl_image)
     38     return;
     39 
     40   if (release_after_use_)
     41     gl_image->SetReleaseAfterUse();
     42 
     43   AddImage(gl_image.get(), id);
     44 }
     45 
     46 void ImageManager::UnregisterGpuMemoryBuffer(int32 id) {
     47   RemoveImage(id);
     48 }
     49 
     50 void ImageManager::AddImage(gfx::GLImage* image, int32 service_id) {
     51   gl_images_[service_id] = image;
     52 }
     53 
     54 void ImageManager::RemoveImage(int32 service_id) {
     55   gl_images_.erase(service_id);
     56 }
     57 
     58 gfx::GLImage* ImageManager::LookupImage(int32 service_id) {
     59   GLImageMap::const_iterator iter = gl_images_.find(service_id);
     60   if (iter != gl_images_.end())
     61     return iter->second.get();
     62 
     63   return NULL;
     64 }
     65 
     66 void ImageManager::SetReleaseAfterUse() {
     67   release_after_use_ = true;
     68 }
     69 
     70 }  // namespace gles2
     71 }  // namespace gpu
     72