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