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 GetKIOSurfaceIsGlobal() = 0;
     35 
     36   virtual CFTypeRef IOSurfaceCreate(CFDictionaryRef properties) = 0;
     37 
     38   // The following two APIs assume the IOSurface was created with the
     39   // kIOSurfaceIsGlobal key set to true
     40   virtual uint32 IOSurfaceGetID(CFTypeRef io_surface) = 0;
     41   virtual CFTypeRef IOSurfaceLookup(uint32 io_surface_id) = 0;
     42 
     43   // The following two APIs are more robust and secure, but
     44   // unfortunately it looks like it will be a lot of work to correctly
     45   // transmit a mach port from process to process (possibly requiring
     46   // a side channel for or extension of the Chrome IPC mechanism)
     47   virtual mach_port_t IOSurfaceCreateMachPort(CFTypeRef io_surface) = 0;
     48   virtual CFTypeRef IOSurfaceLookupFromMachPort(mach_port_t port) = 0;
     49 
     50   virtual size_t IOSurfaceGetWidth(CFTypeRef io_surface) = 0;
     51   virtual size_t IOSurfaceGetHeight(CFTypeRef io_surface) = 0;
     52 
     53   virtual CGLError CGLTexImageIOSurface2D(CGLContextObj ctx,
     54                                           GLenum target,
     55                                           GLenum internal_format,
     56                                           GLsizei width,
     57                                           GLsizei height,
     58                                           GLenum format,
     59                                           GLenum type,
     60                                           CFTypeRef io_surface,
     61                                           GLuint plane) = 0;
     62 
     63   virtual CFTypeRef CVPixelBufferGetIOSurface(
     64       CVPixelBufferRef pixel_buffer) = 0;
     65 
     66  protected:
     67   IOSurfaceSupport();
     68   virtual ~IOSurfaceSupport();
     69 
     70   DISALLOW_COPY_AND_ASSIGN(IOSurfaceSupport);
     71 };
     72 
     73 #endif  // UI_GL_IO_SURFACE_SUPPORT_MAC_H_
     74