// 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 "ui/gl/gl_image_shared_memory.h" #include "base/logging.h" #include "base/process/process_handle.h" namespace gfx { GLImageSharedMemory::GLImageSharedMemory(const gfx::Size& size, unsigned internalformat) : GLImageMemory(size, internalformat) { } GLImageSharedMemory::~GLImageSharedMemory() { DCHECK(!shared_memory_); } bool GLImageSharedMemory::Initialize(const gfx::GpuMemoryBufferHandle& handle) { if (!HasValidFormat()) return false; if (!base::SharedMemory::IsHandleValid(handle.handle)) return false; base::SharedMemory shared_memory(handle.handle, true); // Duplicate the handle. base::SharedMemoryHandle duped_shared_memory_handle; if (!shared_memory.ShareToProcess(base::GetCurrentProcessHandle(), &duped_shared_memory_handle)) { DVLOG(0) << "Failed to duplicate shared memory handle."; return false; } scoped_ptr<base::SharedMemory> duped_shared_memory( new base::SharedMemory(duped_shared_memory_handle, true)); if (!duped_shared_memory->Map(Bytes())) { DVLOG(0) << "Failed to map shared memory."; return false; } DCHECK(!shared_memory_); shared_memory_ = duped_shared_memory.Pass(); GLImageMemory::Initialize( static_cast<unsigned char*>(shared_memory_->memory())); return true; } void GLImageSharedMemory::Destroy(bool have_context) { GLImageMemory::Destroy(have_context); shared_memory_.reset(); } } // namespace gfx