- add sources.
[platform/framework/web/crosswalk.git] / src / ui / gl / io_surface_support_mac.cc
1 // Copyright (c) 2012 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 <dlfcn.h>
6
7 #include "base/memory/singleton.h"
8 #include "ui/gl/io_surface_support_mac.h"
9
10 typedef CFTypeRef (*IOSurfaceCreateProcPtr)(CFDictionaryRef properties);
11 typedef uint32 (*IOSurfaceGetIDProcPtr)(CFTypeRef io_surface);
12 typedef CFTypeRef (*IOSurfaceLookupProcPtr)(uint32 io_surface_id);
13 typedef mach_port_t (*IOSurfaceCreateMachPortProcPtr)(CFTypeRef io_surface);
14 typedef CFTypeRef (*IOSurfaceLookupFromMachPortProcPtr)(mach_port_t port);
15 typedef size_t (*IOSurfaceGetWidthPtr)(CFTypeRef io_surface);
16 typedef size_t (*IOSurfaceGetHeightPtr)(CFTypeRef io_surface);
17 typedef CGLError (*CGLTexImageIOSurface2DProcPtr)(CGLContextObj ctx,
18                                                   GLenum target,
19                                                   GLenum internal_format,
20                                                   GLsizei width,
21                                                   GLsizei height,
22                                                   GLenum format,
23                                                   GLenum type,
24                                                   CFTypeRef io_surface,
25                                                   GLuint plane);
26 typedef CFTypeRef (*CVPixelBufferGetIOSurfaceProcPtr)(
27     CVPixelBufferRef pixel_buffer);
28
29 class IOSurfaceSupportImpl : public IOSurfaceSupport {
30  public:
31   static IOSurfaceSupportImpl* GetInstance();
32
33   bool InitializedSuccessfully() {
34     return initialized_successfully_;
35   }
36
37   virtual CFStringRef GetKIOSurfaceWidth() OVERRIDE;
38   virtual CFStringRef GetKIOSurfaceHeight() OVERRIDE;
39   virtual CFStringRef GetKIOSurfaceBytesPerElement() OVERRIDE;
40   virtual CFStringRef GetKIOSurfaceIsGlobal() OVERRIDE;
41
42   virtual CFTypeRef IOSurfaceCreate(CFDictionaryRef properties) OVERRIDE;
43   virtual uint32 IOSurfaceGetID(CFTypeRef io_surface) OVERRIDE;
44   virtual CFTypeRef IOSurfaceLookup(uint32 io_surface_id) OVERRIDE;
45   virtual mach_port_t IOSurfaceCreateMachPort(CFTypeRef io_surface) OVERRIDE;
46   virtual CFTypeRef IOSurfaceLookupFromMachPort(mach_port_t port) OVERRIDE;
47
48   virtual size_t IOSurfaceGetWidth(CFTypeRef io_surface) OVERRIDE;
49   virtual size_t IOSurfaceGetHeight(CFTypeRef io_surface) OVERRIDE;
50
51   virtual CGLError CGLTexImageIOSurface2D(CGLContextObj ctx,
52                                           GLenum target,
53                                           GLenum internal_format,
54                                           GLsizei width,
55                                           GLsizei height,
56                                           GLenum format,
57                                           GLenum type,
58                                           CFTypeRef io_surface,
59                                           GLuint plane) OVERRIDE;
60
61   virtual CFTypeRef CVPixelBufferGetIOSurface(
62       CVPixelBufferRef pixel_buffer) OVERRIDE;
63
64  private:
65   IOSurfaceSupportImpl();
66   virtual ~IOSurfaceSupportImpl();
67
68   void CloseLibraryHandles();
69
70   void* iosurface_handle_;
71   void* opengl_handle_;
72   void* core_video_handle_;
73   CFStringRef k_io_surface_width_;
74   CFStringRef k_io_surface_height_;
75   CFStringRef k_io_surface_bytes_per_element_;
76   CFStringRef k_io_surface_is_global_;
77   IOSurfaceCreateProcPtr io_surface_create_;
78   IOSurfaceGetIDProcPtr io_surface_get_id_;
79   IOSurfaceLookupProcPtr io_surface_lookup_;
80   IOSurfaceCreateMachPortProcPtr io_surface_create_mach_port_;
81   IOSurfaceLookupFromMachPortProcPtr io_surface_lookup_from_mach_port_;
82   IOSurfaceGetWidthPtr io_surface_get_width_;
83   IOSurfaceGetHeightPtr io_surface_get_height_;
84   CGLTexImageIOSurface2DProcPtr cgl_tex_image_io_surface_2d_;
85   CVPixelBufferGetIOSurfaceProcPtr cv_pixel_buffer_get_io_surface_;
86   bool initialized_successfully_;
87
88   friend struct DefaultSingletonTraits<IOSurfaceSupportImpl>;
89   DISALLOW_COPY_AND_ASSIGN(IOSurfaceSupportImpl);
90 };
91
92 IOSurfaceSupportImpl* IOSurfaceSupportImpl::GetInstance() {
93   IOSurfaceSupportImpl* impl = Singleton<IOSurfaceSupportImpl>::get();
94   if (impl->InitializedSuccessfully())
95     return impl;
96   return NULL;
97 }
98
99 CFStringRef IOSurfaceSupportImpl::GetKIOSurfaceWidth() {
100   return k_io_surface_width_;
101 }
102
103 CFStringRef IOSurfaceSupportImpl::GetKIOSurfaceHeight() {
104   return k_io_surface_height_;
105 }
106
107 CFStringRef IOSurfaceSupportImpl::GetKIOSurfaceBytesPerElement() {
108   return k_io_surface_bytes_per_element_;
109 }
110
111 CFStringRef IOSurfaceSupportImpl::GetKIOSurfaceIsGlobal() {
112   return k_io_surface_is_global_;
113 }
114
115 CFTypeRef IOSurfaceSupportImpl::IOSurfaceCreate(CFDictionaryRef properties) {
116   return io_surface_create_(properties);
117 }
118
119 uint32 IOSurfaceSupportImpl::IOSurfaceGetID(
120     CFTypeRef io_surface) {
121   return io_surface_get_id_(io_surface);
122 }
123
124 CFTypeRef IOSurfaceSupportImpl::IOSurfaceLookup(uint32 io_surface_id) {
125   return io_surface_lookup_(io_surface_id);
126 }
127
128 mach_port_t IOSurfaceSupportImpl::IOSurfaceCreateMachPort(
129     CFTypeRef io_surface) {
130   return io_surface_create_mach_port_(io_surface);
131 }
132
133 CFTypeRef IOSurfaceSupportImpl::IOSurfaceLookupFromMachPort(mach_port_t port) {
134   return io_surface_lookup_from_mach_port_(port);
135 }
136
137 size_t IOSurfaceSupportImpl::IOSurfaceGetWidth(CFTypeRef io_surface) {
138   return io_surface_get_width_(io_surface);
139 }
140
141 size_t IOSurfaceSupportImpl::IOSurfaceGetHeight(CFTypeRef io_surface) {
142   return io_surface_get_height_(io_surface);
143 }
144
145
146 CGLError IOSurfaceSupportImpl::CGLTexImageIOSurface2D(CGLContextObj ctx,
147                                                       GLenum target,
148                                                       GLenum internal_format,
149                                                       GLsizei width,
150                                                       GLsizei height,
151                                                       GLenum format,
152                                                       GLenum type,
153                                                       CFTypeRef io_surface,
154                                                       GLuint plane) {
155   return cgl_tex_image_io_surface_2d_(ctx,
156                                       target,
157                                       internal_format,
158                                       width,
159                                       height,
160                                       format,
161                                       type,
162                                       io_surface,
163                                       plane);
164 }
165
166 CFTypeRef IOSurfaceSupportImpl::CVPixelBufferGetIOSurface(
167       CVPixelBufferRef pixel_buffer) {
168   return cv_pixel_buffer_get_io_surface_(pixel_buffer);
169 }
170
171 IOSurfaceSupportImpl::IOSurfaceSupportImpl()
172     : iosurface_handle_(NULL),
173       opengl_handle_(NULL),
174       core_video_handle_(NULL),
175       k_io_surface_width_(NULL),
176       k_io_surface_height_(NULL),
177       k_io_surface_bytes_per_element_(NULL),
178       k_io_surface_is_global_(NULL),
179       io_surface_create_(NULL),
180       io_surface_get_id_(NULL),
181       io_surface_lookup_(NULL),
182       io_surface_create_mach_port_(NULL),
183       io_surface_lookup_from_mach_port_(NULL),
184       io_surface_get_width_(NULL),
185       io_surface_get_height_(NULL),
186       cgl_tex_image_io_surface_2d_(NULL),
187       cv_pixel_buffer_get_io_surface_(NULL),
188       initialized_successfully_(false) {
189   iosurface_handle_ = dlopen(
190       "/System/Library/Frameworks/IOSurface.framework/IOSurface",
191       RTLD_LAZY | RTLD_LOCAL);
192   opengl_handle_ = dlopen(
193       "/System/Library/Frameworks/OpenGL.framework/OpenGL",
194       RTLD_LAZY | RTLD_LOCAL);
195   core_video_handle_ = dlopen(
196       "/System/Library/Frameworks/CoreVideo.framework/CoreVideo",
197       RTLD_LAZY | RTLD_LOCAL);
198   if (!iosurface_handle_ ||
199       !opengl_handle_ ||
200       !core_video_handle_) {
201     CloseLibraryHandles();
202     return;
203   }
204
205   void* surface_width_ptr = dlsym(iosurface_handle_, "kIOSurfaceWidth");
206   void* surface_height_ptr = dlsym(iosurface_handle_, "kIOSurfaceHeight");
207   void* surface_bytes_per_element_ptr =
208       dlsym(iosurface_handle_, "kIOSurfaceBytesPerElement");
209   void* surface_is_global_ptr =
210       dlsym(iosurface_handle_, "kIOSurfaceIsGlobal");
211   void* surface_create_ptr = dlsym(iosurface_handle_, "IOSurfaceCreate");
212   void* surface_get_id_ptr = dlsym(iosurface_handle_, "IOSurfaceGetID");
213   void* surface_lookup_ptr = dlsym(iosurface_handle_, "IOSurfaceLookup");
214   void* surface_create_mach_port_ptr =
215       dlsym(iosurface_handle_, "IOSurfaceCreateMachPort");
216   void* surface_lookup_from_mach_port_ptr =
217       dlsym(iosurface_handle_, "IOSurfaceLookupFromMachPort");
218   void* io_surface_get_width_ptr =
219       dlsym(iosurface_handle_, "IOSurfaceGetWidth");
220   void* io_surface_get_height_ptr =
221       dlsym(iosurface_handle_, "IOSurfaceGetHeight");
222   void* tex_image_io_surface_2d_ptr =
223       dlsym(opengl_handle_, "CGLTexImageIOSurface2D");
224   void* cv_pixel_buffer_get_io_surface =
225       dlsym(core_video_handle_, "CVPixelBufferGetIOSurface");
226   if (!surface_width_ptr ||
227       !surface_height_ptr ||
228       !surface_bytes_per_element_ptr ||
229       !surface_is_global_ptr ||
230       !surface_create_ptr ||
231       !surface_get_id_ptr ||
232       !surface_lookup_ptr ||
233       !surface_create_mach_port_ptr ||
234       !surface_lookup_from_mach_port_ptr ||
235       !io_surface_get_width_ptr ||
236       !io_surface_get_height_ptr ||
237       !tex_image_io_surface_2d_ptr ||
238       !cv_pixel_buffer_get_io_surface) {
239     CloseLibraryHandles();
240     return;
241   }
242
243   k_io_surface_width_ = *static_cast<CFStringRef*>(surface_width_ptr);
244   k_io_surface_height_ = *static_cast<CFStringRef*>(surface_height_ptr);
245   k_io_surface_bytes_per_element_ =
246       *static_cast<CFStringRef*>(surface_bytes_per_element_ptr);
247   k_io_surface_is_global_ = *static_cast<CFStringRef*>(surface_is_global_ptr);
248   io_surface_create_ = reinterpret_cast<IOSurfaceCreateProcPtr>(
249       surface_create_ptr);
250   io_surface_get_id_ =
251       reinterpret_cast<IOSurfaceGetIDProcPtr>(surface_get_id_ptr);
252   io_surface_lookup_ =
253       reinterpret_cast<IOSurfaceLookupProcPtr>(surface_lookup_ptr);
254   io_surface_create_mach_port_ =
255       reinterpret_cast<IOSurfaceCreateMachPortProcPtr>(
256           surface_create_mach_port_ptr);
257   io_surface_lookup_from_mach_port_ =
258       reinterpret_cast<IOSurfaceLookupFromMachPortProcPtr>(
259           surface_lookup_from_mach_port_ptr);
260   io_surface_get_width_ =
261       reinterpret_cast<IOSurfaceGetWidthPtr>(
262           io_surface_get_width_ptr);
263   io_surface_get_height_ =
264       reinterpret_cast<IOSurfaceGetHeightPtr>(
265           io_surface_get_height_ptr);
266   cgl_tex_image_io_surface_2d_ =
267       reinterpret_cast<CGLTexImageIOSurface2DProcPtr>(
268           tex_image_io_surface_2d_ptr);
269   cv_pixel_buffer_get_io_surface_ =
270       reinterpret_cast<CVPixelBufferGetIOSurfaceProcPtr>(
271           cv_pixel_buffer_get_io_surface);
272   initialized_successfully_ = true;
273 }
274
275 IOSurfaceSupportImpl::~IOSurfaceSupportImpl() {
276   CloseLibraryHandles();
277 }
278
279 void IOSurfaceSupportImpl::CloseLibraryHandles() {
280   if (iosurface_handle_) {
281     dlclose(iosurface_handle_);
282     iosurface_handle_ = NULL;
283   }
284   if (opengl_handle_) {
285     dlclose(opengl_handle_);
286     opengl_handle_ = NULL;
287   }
288   if (core_video_handle_) {
289     dlclose(core_video_handle_);
290     core_video_handle_ = NULL;
291   }
292 }
293
294 IOSurfaceSupport* IOSurfaceSupport::Initialize() {
295   return IOSurfaceSupportImpl::GetInstance();
296 }
297
298 IOSurfaceSupport::IOSurfaceSupport() {
299 }
300
301 IOSurfaceSupport::~IOSurfaceSupport() {
302 }
303