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.
5 #include "content/common/gpu/client/gpu_memory_buffer_impl_shared_memory.h"
8 #include "base/numerics/safe_math.h"
9 #include "ui/gl/gl_bindings.h"
19 GpuMemoryBufferImplSharedMemory::GpuMemoryBufferImplSharedMemory(
20 const gfx::Size& size,
21 unsigned internalformat,
22 const DestructionCallback& callback,
23 scoped_ptr<base::SharedMemory> shared_memory)
24 : GpuMemoryBufferImpl(size, internalformat, callback),
25 shared_memory_(shared_memory.Pass()) {
28 GpuMemoryBufferImplSharedMemory::~GpuMemoryBufferImplSharedMemory() {
32 void GpuMemoryBufferImplSharedMemory::Create(const gfx::Size& size,
33 unsigned internalformat,
35 const CreationCallback& callback) {
36 DCHECK(GpuMemoryBufferImplSharedMemory::IsConfigurationSupported(
37 size, internalformat, usage));
39 scoped_ptr<base::SharedMemory> shared_memory(new base::SharedMemory());
40 if (!shared_memory->CreateAnonymous(size.GetArea() *
41 BytesPerPixel(internalformat))) {
42 callback.Run(scoped_ptr<GpuMemoryBufferImpl>());
47 make_scoped_ptr<GpuMemoryBufferImpl>(new GpuMemoryBufferImplSharedMemory(
48 size, internalformat, base::Bind(&Noop), shared_memory.Pass())));
52 void GpuMemoryBufferImplSharedMemory::AllocateForChildProcess(
53 const gfx::Size& size,
54 unsigned internalformat,
55 base::ProcessHandle child_process,
56 const AllocationCallback& callback) {
57 DCHECK(IsLayoutSupported(size, internalformat));
58 base::SharedMemory shared_memory;
59 if (!shared_memory.CreateAnonymous(size.GetArea() *
60 BytesPerPixel(internalformat))) {
61 callback.Run(gfx::GpuMemoryBufferHandle());
64 gfx::GpuMemoryBufferHandle handle;
65 handle.type = gfx::SHARED_MEMORY_BUFFER;
66 shared_memory.GiveToProcess(child_process, &handle.handle);
71 scoped_ptr<GpuMemoryBufferImpl>
72 GpuMemoryBufferImplSharedMemory::CreateFromHandle(
73 const gfx::GpuMemoryBufferHandle& handle,
74 const gfx::Size& size,
75 unsigned internalformat,
76 const DestructionCallback& callback) {
77 DCHECK(IsLayoutSupported(size, internalformat));
79 if (!base::SharedMemory::IsHandleValid(handle.handle))
80 return scoped_ptr<GpuMemoryBufferImpl>();
82 return make_scoped_ptr<GpuMemoryBufferImpl>(
83 new GpuMemoryBufferImplSharedMemory(
87 make_scoped_ptr(new base::SharedMemory(handle.handle, false))));
91 bool GpuMemoryBufferImplSharedMemory::IsLayoutSupported(
92 const gfx::Size& size,
93 unsigned internalformat) {
94 base::CheckedNumeric<int> buffer_size = size.width();
95 buffer_size *= size.height();
96 buffer_size *= BytesPerPixel(internalformat);
97 return buffer_size.IsValid();
101 bool GpuMemoryBufferImplSharedMemory::IsUsageSupported(unsigned usage) {
103 case GL_IMAGE_MAP_CHROMIUM:
111 bool GpuMemoryBufferImplSharedMemory::IsConfigurationSupported(
112 const gfx::Size& size,
113 unsigned internalformat,
115 return IsLayoutSupported(size, internalformat) && IsUsageSupported(usage);
118 void* GpuMemoryBufferImplSharedMemory::Map() {
120 if (!shared_memory_->Map(size_.GetArea() * BytesPerPixel(internalformat_)))
123 return shared_memory_->memory();
126 void GpuMemoryBufferImplSharedMemory::Unmap() {
128 shared_memory_->Unmap();
132 uint32 GpuMemoryBufferImplSharedMemory::GetStride() const {
133 return size_.width() * BytesPerPixel(internalformat_);
136 gfx::GpuMemoryBufferHandle GpuMemoryBufferImplSharedMemory::GetHandle() const {
137 gfx::GpuMemoryBufferHandle handle;
138 handle.type = gfx::SHARED_MEMORY_BUFFER;
139 handle.handle = shared_memory_->handle();
143 } // namespace content