1// Copyright 2013 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 "content/common/gpu/client/gpu_memory_buffer_impl.h"
6
7#include "content/common/gpu/client/gpu_memory_buffer_impl_io_surface.h"
8#include "content/common/gpu/client/gpu_memory_buffer_impl_shared_memory.h"
9
10namespace content {
11
12// static
13void GpuMemoryBufferImpl::Create(const gfx::Size& size,
14                                 unsigned internalformat,
15                                 unsigned usage,
16                                 int client_id,
17                                 const CreationCallback& callback) {
18  if (GpuMemoryBufferImplIOSurface::IsConfigurationSupported(internalformat,
19                                                             usage)) {
20    GpuMemoryBufferImplIOSurface::Create(
21        size, internalformat, usage, client_id, callback);
22    return;
23  }
24
25  if (GpuMemoryBufferImplSharedMemory::IsConfigurationSupported(
26          size, internalformat, usage)) {
27    GpuMemoryBufferImplSharedMemory::Create(
28        size, internalformat, usage, callback);
29    return;
30  }
31
32  callback.Run(scoped_ptr<GpuMemoryBufferImpl>());
33}
34
35// static
36void GpuMemoryBufferImpl::AllocateForChildProcess(
37    const gfx::Size& size,
38    unsigned internalformat,
39    unsigned usage,
40    base::ProcessHandle child_process,
41    int child_client_id,
42    const AllocationCallback& callback) {
43  if (GpuMemoryBufferImplIOSurface::IsConfigurationSupported(internalformat,
44                                                             usage)) {
45    GpuMemoryBufferImplIOSurface::AllocateForChildProcess(
46        size, internalformat, usage, child_client_id, callback);
47    return;
48  }
49
50  if (GpuMemoryBufferImplSharedMemory::IsConfigurationSupported(
51          size, internalformat, usage)) {
52    GpuMemoryBufferImplSharedMemory::AllocateForChildProcess(
53        size, internalformat, child_process, callback);
54    return;
55  }
56
57  callback.Run(gfx::GpuMemoryBufferHandle());
58}
59
60// static
61void GpuMemoryBufferImpl::DeletedByChildProcess(
62    gfx::GpuMemoryBufferType type,
63    const gfx::GpuMemoryBufferId& id,
64    base::ProcessHandle child_process) {
65}
66
67// static
68scoped_ptr<GpuMemoryBufferImpl> GpuMemoryBufferImpl::CreateFromHandle(
69    const gfx::GpuMemoryBufferHandle& handle,
70    const gfx::Size& size,
71    unsigned internalformat,
72    const DestructionCallback& callback) {
73  switch (handle.type) {
74    case gfx::SHARED_MEMORY_BUFFER:
75      return GpuMemoryBufferImplSharedMemory::CreateFromHandle(
76          handle, size, internalformat, callback);
77    case gfx::IO_SURFACE_BUFFER:
78      return GpuMemoryBufferImplIOSurface::CreateFromHandle(
79          handle, size, internalformat, callback);
80    default:
81      return scoped_ptr<GpuMemoryBufferImpl>();
82  }
83}
84
85}  // namespace content
86