Index: chrome/common/io_surface_support_mac.cc |
=================================================================== |
--- chrome/common/io_surface_support_mac.cc (revision 0) |
+++ chrome/common/io_surface_support_mac.cc (revision 0) |
@@ -0,0 +1,242 @@ |
+// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include <dlfcn.h> |
+ |
+#include "base/singleton.h" |
+#include "chrome/common/io_surface_support_mac.h" |
+ |
+typedef CFTypeRef (*IOSurfaceCreateProcPtr)(CFDictionaryRef properties); |
+typedef uint32 (*IOSurfaceGetIDProcPtr)(CFTypeRef io_surface); |
+typedef CFTypeRef (*IOSurfaceLookupProcPtr)(uint32 io_surface_id); |
+typedef mach_port_t (*IOSurfaceCreateMachPortProcPtr)(CFTypeRef io_surface); |
+typedef CFTypeRef (*IOSurfaceLookupFromMachPortProcPtr)(mach_port_t port); |
+typedef CGLError (*CGLTexImageIOSurface2DProcPtr)(CGLContextObj ctx, |
+ GLenum target, |
+ GLenum internal_format, |
+ GLsizei width, |
+ GLsizei height, |
+ GLenum format, |
+ GLenum type, |
+ CFTypeRef io_surface, |
+ GLuint plane); |
+ |
+class IOSurfaceSupportImpl : public IOSurfaceSupport { |
+ public: |
+ static IOSurfaceSupportImpl* Initialize(); |
+ |
+ bool InitializedSuccessfully() { |
+ return initialized_successfully_; |
+ } |
+ |
+ virtual CFStringRef GetKIOSurfaceWidth(); |
+ virtual CFStringRef GetKIOSurfaceHeight(); |
+ virtual CFStringRef GetKIOSurfaceBytesPerElement(); |
+ virtual CFStringRef GetKIOSurfaceIsGlobal(); |
+ |
+ virtual CFTypeRef IOSurfaceCreate(CFDictionaryRef properties); |
+ virtual uint32 IOSurfaceGetID(CFTypeRef io_surface); |
+ virtual CFTypeRef IOSurfaceLookup(uint32 io_surface_id); |
+ virtual mach_port_t IOSurfaceCreateMachPort(CFTypeRef io_surface); |
+ virtual CFTypeRef IOSurfaceLookupFromMachPort(mach_port_t port); |
+ |
+ virtual CGLError CGLTexImageIOSurface2D(CGLContextObj ctx, |
+ GLenum target, |
+ GLenum internal_format, |
+ GLsizei width, |
+ GLsizei height, |
+ GLenum format, |
+ GLenum type, |
+ CFTypeRef io_surface, |
+ GLuint plane); |
+ |
+ private: |
+ IOSurfaceSupportImpl(); |
+ ~IOSurfaceSupportImpl(); |
+ |
+ void* iosurface_handle_; |
+ void* opengl_handle_; |
+ CFStringRef k_io_surface_width_; |
+ CFStringRef k_io_surface_height_; |
+ CFStringRef k_io_surface_bytes_per_element_; |
+ CFStringRef k_io_surface_is_global_; |
+ IOSurfaceCreateProcPtr io_surface_create_; |
+ IOSurfaceGetIDProcPtr io_surface_get_id_; |
+ IOSurfaceLookupProcPtr io_surface_lookup_; |
+ IOSurfaceCreateMachPortProcPtr io_surface_create_mach_port_; |
+ IOSurfaceLookupFromMachPortProcPtr io_surface_lookup_from_mach_port_; |
+ CGLTexImageIOSurface2DProcPtr cgl_tex_image_io_surface_2d_; |
+ bool initialized_successfully_; |
+ |
+ friend struct DefaultSingletonTraits<IOSurfaceSupportImpl>; |
+ DISALLOW_EVIL_CONSTRUCTORS(IOSurfaceSupportImpl); |
+}; |
+ |
+static Singleton<IOSurfaceSupportImpl> sole_instance_; |
+ |
+IOSurfaceSupportImpl* IOSurfaceSupportImpl::Initialize() { |
+ IOSurfaceSupportImpl* impl = sole_instance_.get(); |
+ if (impl->InitializedSuccessfully()) |
+ return impl; |
+ return NULL; |
+} |
+ |
+CFStringRef IOSurfaceSupportImpl::GetKIOSurfaceWidth() { |
+ return k_io_surface_width_; |
+} |
+ |
+CFStringRef IOSurfaceSupportImpl::GetKIOSurfaceHeight() { |
+ return k_io_surface_height_; |
+} |
+ |
+CFStringRef IOSurfaceSupportImpl::GetKIOSurfaceBytesPerElement() { |
+ return k_io_surface_bytes_per_element_; |
+} |
+ |
+CFStringRef IOSurfaceSupportImpl::GetKIOSurfaceIsGlobal() { |
+ return k_io_surface_is_global_; |
+} |
+ |
+CFTypeRef IOSurfaceSupportImpl::IOSurfaceCreate(CFDictionaryRef properties) { |
+ return io_surface_create_(properties); |
+} |
+ |
+uint32 IOSurfaceSupportImpl::IOSurfaceGetID( |
+ CFTypeRef io_surface) { |
+ return io_surface_get_id_(io_surface); |
+} |
+ |
+CFTypeRef IOSurfaceSupportImpl::IOSurfaceLookup(uint32 io_surface_id) { |
+ return io_surface_lookup_(io_surface_id); |
+} |
+ |
+mach_port_t IOSurfaceSupportImpl::IOSurfaceCreateMachPort( |
+ CFTypeRef io_surface) { |
+ return io_surface_create_mach_port_(io_surface); |
+} |
+ |
+CFTypeRef IOSurfaceSupportImpl::IOSurfaceLookupFromMachPort(mach_port_t port) { |
+ return io_surface_lookup_from_mach_port_(port); |
+} |
+ |
+CGLError IOSurfaceSupportImpl::CGLTexImageIOSurface2D(CGLContextObj ctx, |
+ GLenum target, |
+ GLenum internal_format, |
+ GLsizei width, |
+ GLsizei height, |
+ GLenum format, |
+ GLenum type, |
+ CFTypeRef io_surface, |
+ GLuint plane) { |
+ return cgl_tex_image_io_surface_2d_(ctx, |
+ target, |
+ internal_format, |
+ width, |
+ height, |
+ format, |
+ type, |
+ io_surface, |
+ plane); |
+} |
+ |
+IOSurfaceSupportImpl::IOSurfaceSupportImpl() |
+ : iosurface_handle_(NULL), |
+ opengl_handle_(NULL), |
+ k_io_surface_width_(NULL), |
+ k_io_surface_height_(NULL), |
+ k_io_surface_bytes_per_element_(NULL), |
+ k_io_surface_is_global_(NULL), |
+ io_surface_create_(NULL), |
+ io_surface_get_id_(NULL), |
+ io_surface_lookup_(NULL), |
+ io_surface_create_mach_port_(NULL), |
+ io_surface_lookup_from_mach_port_(NULL), |
+ cgl_tex_image_io_surface_2d_(NULL), |
+ initialized_successfully_(false) { |
+ iosurface_handle_ = dlopen( |
+ "/System/Library/Frameworks/IOSurface.framework/IOSurface", |
+ RTLD_LAZY | RTLD_LOCAL); |
+ if (!iosurface_handle_) |
+ return; |
+ opengl_handle_ = dlopen( |
+ "/System/Library/Frameworks/OpenGL.framework/OpenGL", |
+ RTLD_LAZY | RTLD_LOCAL); |
+ if (!opengl_handle_) { |
+ dlclose(iosurface_handle_); |
+ iosurface_handle_ = NULL; |
+ return; |
+ } |
+ |
+ void* surface_width_ptr = dlsym(iosurface_handle_, "kIOSurfaceWidth"); |
+ void* surface_height_ptr = dlsym(iosurface_handle_, "kIOSurfaceHeight"); |
+ void* surface_bytes_per_element_ptr = |
+ dlsym(iosurface_handle_, "kIOSurfaceBytesPerElement"); |
+ void* surface_is_global_ptr = |
+ dlsym(iosurface_handle_, "kIOSurfaceIsGlobal"); |
+ void* surface_create_ptr = dlsym(iosurface_handle_, "IOSurfaceCreate"); |
+ void* surface_get_id_ptr = dlsym(iosurface_handle_, "IOSurfaceGetID"); |
+ void* surface_lookup_ptr = dlsym(iosurface_handle_, "IOSurfaceLookup"); |
+ void* surface_create_mach_port_ptr = |
+ dlsym(iosurface_handle_, "IOSurfaceCreateMachPort"); |
+ void* surface_lookup_from_mach_port_ptr = |
+ dlsym(iosurface_handle_, "IOSurfaceLookupFromMachPort"); |
+ void* tex_image_io_surface_2d_ptr = |
+ dlsym(opengl_handle_, "CGLTexImageIOSurface2D"); |
+ if (!surface_width_ptr || |
+ !surface_height_ptr || |
+ !surface_bytes_per_element_ptr || |
+ !surface_is_global_ptr || |
+ !surface_create_ptr || |
+ !surface_get_id_ptr || |
+ !surface_lookup_ptr || |
+ !surface_create_mach_port_ptr || |
+ !surface_lookup_from_mach_port_ptr || |
+ !tex_image_io_surface_2d_ptr) { |
+ dlclose(iosurface_handle_); |
+ iosurface_handle_ = NULL; |
+ dlclose(opengl_handle_); |
+ opengl_handle_ = NULL; |
+ return; |
+ } |
+ |
+ k_io_surface_width_ = *static_cast<CFStringRef*>(surface_width_ptr); |
+ k_io_surface_height_ = *static_cast<CFStringRef*>(surface_height_ptr); |
+ k_io_surface_bytes_per_element_ = |
+ *static_cast<CFStringRef*>(surface_bytes_per_element_ptr); |
+ k_io_surface_is_global_ = *static_cast<CFStringRef*>(surface_is_global_ptr); |
+ io_surface_create_ = reinterpret_cast<IOSurfaceCreateProcPtr>( |
+ surface_create_ptr); |
+ io_surface_get_id_ = |
+ reinterpret_cast<IOSurfaceGetIDProcPtr>(surface_get_id_ptr); |
+ io_surface_lookup_ = |
+ reinterpret_cast<IOSurfaceLookupProcPtr>(surface_lookup_ptr); |
+ io_surface_create_mach_port_ = |
+ reinterpret_cast<IOSurfaceCreateMachPortProcPtr>( |
+ surface_create_mach_port_ptr); |
+ io_surface_lookup_from_mach_port_ = |
+ reinterpret_cast<IOSurfaceLookupFromMachPortProcPtr>( |
+ surface_lookup_from_mach_port_ptr); |
+ cgl_tex_image_io_surface_2d_ = |
+ reinterpret_cast<CGLTexImageIOSurface2DProcPtr>( |
+ tex_image_io_surface_2d_ptr); |
+ initialized_successfully_ = true; |
+} |
+ |
+IOSurfaceSupportImpl::~IOSurfaceSupportImpl() { |
+ if (iosurface_handle_) |
+ dlclose(iosurface_handle_); |
+ if (opengl_handle_) |
+ dlclose(opengl_handle_); |
+} |
+ |
+IOSurfaceSupport* IOSurfaceSupport::Initialize() { |
+ return IOSurfaceSupportImpl::Initialize(); |
+} |
+ |
+IOSurfaceSupport::IOSurfaceSupport() { |
+} |
+ |
+IOSurfaceSupport::~IOSurfaceSupport() { |
+} |
+ |
Property changes on: chrome/common/io_surface_support_mac.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |