Home | History | Annotate | Download | only in gl
      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 #ifndef UI_GL_IO_SURFACE_SUPPORT_MAC_H_
      6 #define UI_GL_IO_SURFACE_SUPPORT_MAC_H_
      7 
      8 #include <CoreFoundation/CoreFoundation.h>
      9 #include <CoreVideo/CoreVideo.h>
     10 #include <mach/mach.h>
     11 #include <OpenGL/OpenGL.h>
     12 
     13 #include "base/basictypes.h"
     14 #include "ui/gl/gl_export.h"
     15 
     16 // This Mac OS X-specific class provides dynamically-linked access to
     17 // IOSurface.framework, which is only available on 10.6 and later.
     18 // Since Chromium is built on 10.5 we must dynamically look up all of
     19 // the entry points we need in this framework.
     20 
     21 // See IOSurface/IOSurfaceAPI.h and OpenGL/CGLIOSurface.h on 10.6 for
     22 // documentation of the fields and methods of this class.
     23 
     24 class GL_EXPORT IOSurfaceSupport {
     25  public:
     26   // Returns an instance of the IOSurfaceSupport class if the
     27   // operating system supports it, NULL otherwise. It is safe to call
     28   // this multiple times.
     29   static IOSurfaceSupport* Initialize();
     30 
     31   virtual CFStringRef GetKIOSurfaceWidth() = 0;
     32   virtual CFStringRef GetKIOSurfaceHeight() = 0;
     33   virtual CFStringRef GetKIOSurfaceBytesPerElement() = 0;
     34   virtual CFStringRef GetKIOSurfacePixelFormat() = 0;
     35   virtual CFStringRef GetKIOSurfaceIsGlobal() = 0;
     36 
     37   virtual CFTypeRef IOSurfaceCreate(CFDictionaryRef properties) = 0;
     38 
     39   // The following two APIs assume the IOSurface was created with the
     40   // kIOSurfaceIsGlobal key set to true
     41   virtual uint32 IOSurfaceGetID(CFTypeRef io_surface) = 0;
     42   virtual CFTypeRef IOSurfaceLookup(uint32 io_surface_id) = 0;
     43 
     44   // The following two APIs are more robust and secure, but
     45   // unfortunately it looks like it will be a lot of work to correctly
     46   // transmit a mach port from process to process (possibly requiring
     47   // a side channel for or extension of the Chrome IPC mechanism)
     48   virtual mach_port_t IOSurfaceCreateMachPort(CFTypeRef io_surface) = 0;
     49   virtual CFTypeRef IOSurfaceLookupFromMachPort(mach_port_t port) = 0;
     50 
     51   virtual size_t IOSurfaceGetWidth(CFTypeRef io_surface) = 0;
     52   virtual size_t IOSurfaceGetHeight(CFTypeRef io_surface) = 0;
     53   virtual size_t IOSurfaceGetBytesPerRow(CFTypeRef io_surface) = 0;
     54   virtual void* IOSurfaceGetBaseAddress(CFTypeRef io_surface) = 0;
     55 
     56   virtual IOReturn IOSurfaceLock(CFTypeRef io_surface,
     57                                  uint32 options,
     58                                  uint32* seed) = 0;
     59   virtual IOReturn IOSurfaceUnlock(CFTypeRef io_surface,
     60                                    uint32 options,
     61                                    uint32* seed) = 0;
     62 
     63   virtual CGLError CGLTexImageIOSurface2D(CGLContextObj ctx,
     64                                           GLenum target,
     65                                           GLenum internal_format,
     66                                           GLsizei width,
     67                                           GLsizei height,
     68                                           GLenum format,
     69                                           GLenum type,
     70                                           CFTypeRef io_surface,
     71                                           GLuint plane) = 0;
     72 
     73   virtual CFTypeRef CVPixelBufferGetIOSurface(
     74       CVPixelBufferRef pixel_buffer) = 0;
     75 
     76  protected:
     77   IOSurfaceSupport();
     78   virtual ~IOSurfaceSupport();
     79 
     80   DISALLOW_COPY_AND_ASSIGN(IOSurfaceSupport);
     81 };
     82 
     83 #endif  // UI_GL_IO_SURFACE_SUPPORT_MAC_H_
     84