Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / content / common / gpu / gpu_memory_buffer_factory_x11.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 "content/common/gpu/gpu_memory_buffer_factory.h"
6
7 #include "base/logging.h"
8 #include "content/common/gpu/gpu_memory_buffer_factory_x11_pixmap.h"
9 #include "ui/gl/gl_image.h"
10 #include "ui/gl/gl_image_shared_memory.h"
11
12 namespace content {
13 namespace {
14
15 class GpuMemoryBufferFactoryImpl : public GpuMemoryBufferFactory {
16  public:
17   // Overridden from GpuMemoryBufferFactory:
18   virtual gfx::GpuMemoryBufferHandle CreateGpuMemoryBuffer(
19       const gfx::GpuMemoryBufferHandle& handle,
20       const gfx::Size& size,
21       unsigned internalformat,
22       unsigned usage) OVERRIDE {
23     switch (handle.type) {
24       case gfx::X11_PIXMAP_BUFFER:
25         x11_pixmap_factory_.CreateGpuMemoryBuffer(handle.global_id,
26                                                   handle.pixmap);
27         return handle;
28       default:
29         NOTREACHED();
30         return gfx::GpuMemoryBufferHandle();
31     }
32   }
33   virtual void DestroyGpuMemoryBuffer(
34       const gfx::GpuMemoryBufferHandle& handle) OVERRIDE {
35     switch (handle.type) {
36       case gfx::X11_PIXMAP_BUFFER:
37         x11_pixmap_factory_.DestroyGpuMemoryBuffer(handle.global_id);
38         break;
39       default:
40         NOTREACHED();
41         break;
42     }
43   }
44   virtual scoped_refptr<gfx::GLImage> CreateImageForGpuMemoryBuffer(
45       const gfx::GpuMemoryBufferHandle& handle,
46       const gfx::Size& size,
47       unsigned internalformat,
48       int client_id) OVERRIDE {
49     switch (handle.type) {
50       case gfx::SHARED_MEMORY_BUFFER: {
51         scoped_refptr<gfx::GLImageSharedMemory> image(
52             new gfx::GLImageSharedMemory(size, internalformat));
53         if (!image->Initialize(handle))
54           return NULL;
55
56         return image;
57       }
58       case gfx::X11_PIXMAP_BUFFER:
59         // Verify that client is the owner of the buffer we're about to use.
60         if (handle.global_id.secondary_id != client_id)
61           return scoped_refptr<gfx::GLImage>();
62
63         return x11_pixmap_factory_.CreateImageForGpuMemoryBuffer(
64             handle.global_id, size, internalformat);
65       default:
66         NOTREACHED();
67         return scoped_refptr<gfx::GLImage>();
68     }
69   }
70
71  private:
72   GpuMemoryBufferFactoryX11Pixmap x11_pixmap_factory_;
73 };
74
75 }  // namespace
76
77 // static
78 scoped_ptr<GpuMemoryBufferFactory> GpuMemoryBufferFactory::Create() {
79   return make_scoped_ptr<GpuMemoryBufferFactory>(
80       new GpuMemoryBufferFactoryImpl);
81 }
82
83 }  // namespace content