Home | History | Annotate | Download | only in gl
      1 // Copyright 2014 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 "ui/gl/gl_image_shared_memory.h"
      6 
      7 #include "base/logging.h"
      8 #include "base/process/process_handle.h"
      9 
     10 namespace gfx {
     11 
     12 GLImageSharedMemory::GLImageSharedMemory(const gfx::Size& size,
     13                                          unsigned internalformat)
     14     : GLImageMemory(size, internalformat) {
     15 }
     16 
     17 GLImageSharedMemory::~GLImageSharedMemory() {
     18   DCHECK(!shared_memory_);
     19 }
     20 
     21 bool GLImageSharedMemory::Initialize(const gfx::GpuMemoryBufferHandle& handle) {
     22   if (!HasValidFormat())
     23     return false;
     24 
     25   if (!base::SharedMemory::IsHandleValid(handle.handle))
     26     return false;
     27 
     28   base::SharedMemory shared_memory(handle.handle, true);
     29 
     30   // Duplicate the handle.
     31   base::SharedMemoryHandle duped_shared_memory_handle;
     32   if (!shared_memory.ShareToProcess(base::GetCurrentProcessHandle(),
     33                                     &duped_shared_memory_handle)) {
     34     DVLOG(0) << "Failed to duplicate shared memory handle.";
     35     return false;
     36   }
     37 
     38   scoped_ptr<base::SharedMemory> duped_shared_memory(
     39       new base::SharedMemory(duped_shared_memory_handle, true));
     40 
     41   if (!duped_shared_memory->Map(Bytes())) {
     42     DVLOG(0) << "Failed to map shared memory.";
     43     return false;
     44   }
     45 
     46   DCHECK(!shared_memory_);
     47   shared_memory_ = duped_shared_memory.Pass();
     48   GLImageMemory::Initialize(
     49       static_cast<unsigned char*>(shared_memory_->memory()));
     50   return true;
     51 }
     52 
     53 void GLImageSharedMemory::Destroy(bool have_context) {
     54   GLImageMemory::Destroy(have_context);
     55   shared_memory_.reset();
     56 }
     57 
     58 }  // namespace gfx
     59