Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / ui / gl / gl_image_shared_memory.cc
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/numerics/safe_math.h"
9 #include "base/process/process_handle.h"
10
11 namespace gfx {
12 namespace {
13
14 // Returns true if the size is valid and false otherwise.
15 bool SizeInBytes(const gfx::Size& size,
16                  gfx::GpuMemoryBuffer::Format format,
17                  size_t* size_in_bytes) {
18   if (size.IsEmpty())
19     return false;
20   base::CheckedNumeric<size_t> s = GLImageMemory::BytesPerPixel(format);
21   s *= size.width();
22   s *= size.height();
23   if (!s.IsValid())
24     return false;
25   *size_in_bytes = s.ValueOrDie();
26   return true;
27 }
28
29 }  // namespace
30
31 GLImageSharedMemory::GLImageSharedMemory(const gfx::Size& size,
32                                          unsigned internalformat)
33     : GLImageMemory(size, internalformat) {
34 }
35
36 GLImageSharedMemory::~GLImageSharedMemory() {
37   DCHECK(!shared_memory_);
38 }
39
40 bool GLImageSharedMemory::Initialize(const gfx::GpuMemoryBufferHandle& handle,
41                                      gfx::GpuMemoryBuffer::Format format) {
42   size_t size_in_bytes;
43   if (!SizeInBytes(GetSize(), format, &size_in_bytes))
44     return false;
45
46   if (!base::SharedMemory::IsHandleValid(handle.handle))
47     return false;
48
49   base::SharedMemory shared_memory(handle.handle, true);
50
51   // Duplicate the handle.
52   base::SharedMemoryHandle duped_shared_memory_handle;
53   if (!shared_memory.ShareToProcess(base::GetCurrentProcessHandle(),
54                                     &duped_shared_memory_handle)) {
55     DVLOG(0) << "Failed to duplicate shared memory handle.";
56     return false;
57   }
58
59   scoped_ptr<base::SharedMemory> duped_shared_memory(
60       new base::SharedMemory(duped_shared_memory_handle, true));
61   if (!duped_shared_memory->Map(size_in_bytes)) {
62     DVLOG(0) << "Failed to map shared memory.";
63     return false;
64   }
65
66   if (!GLImageMemory::Initialize(
67           static_cast<unsigned char*>(duped_shared_memory->memory()), format)) {
68     return false;
69   }
70
71   DCHECK(!shared_memory_);
72   shared_memory_ = duped_shared_memory.Pass();
73   return true;
74 }
75
76 void GLImageSharedMemory::Destroy(bool have_context) {
77   GLImageMemory::Destroy(have_context);
78   shared_memory_.reset();
79 }
80
81 }  // namespace gfx