Home | History | Annotate | Download | only in mac
      1 
      2 /*
      3  * Copyright 2011 Google Inc.
      4  *
      5  * Use of this source code is governed by a BSD-style license that can be
      6  * found in the LICENSE file.
      7  */
      8 #include "gl/SkNativeGLContext.h"
      9 #include "AvailabilityMacros.h"
     10 
     11 SkNativeGLContext::AutoContextRestore::AutoContextRestore() {
     12     fOldCGLContext = CGLGetCurrentContext();
     13 }
     14 
     15 SkNativeGLContext::AutoContextRestore::~AutoContextRestore() {
     16     CGLSetCurrentContext(fOldCGLContext);
     17 }
     18 
     19 ///////////////////////////////////////////////////////////////////////////////
     20 
     21 SkNativeGLContext::SkNativeGLContext()
     22     : fContext(NULL) {
     23 }
     24 
     25 SkNativeGLContext::~SkNativeGLContext() {
     26     this->destroyGLContext();
     27 }
     28 
     29 void SkNativeGLContext::destroyGLContext() {
     30     if (NULL != fContext) {
     31         CGLReleaseContext(fContext);
     32     }
     33 }
     34 
     35 const GrGLInterface* SkNativeGLContext::createGLContext() {
     36     SkASSERT(NULL == fContext);
     37 
     38     CGLPixelFormatAttribute attributes[] = {
     39 #if MAC_OS_X_VERSION_10_7
     40         kCGLPFAOpenGLProfile, (CGLPixelFormatAttribute) kCGLOGLPVersion_3_2_Core,
     41 #endif
     42         kCGLPFADoubleBuffer,
     43         (CGLPixelFormatAttribute)0
     44     };
     45     CGLPixelFormatObj pixFormat;
     46     GLint npix;
     47 
     48     CGLChoosePixelFormat(attributes, &pixFormat, &npix);
     49 
     50     if (NULL == pixFormat) {
     51         SkDebugf("CGLChoosePixelFormat failed.");
     52         return NULL;
     53     }
     54 
     55     CGLCreateContext(pixFormat, NULL, &fContext);
     56     CGLReleasePixelFormat(pixFormat);
     57 
     58     if (NULL == fContext) {
     59         SkDebugf("CGLCreateContext failed.");
     60         return NULL;
     61     }
     62 
     63     CGLSetCurrentContext(fContext);
     64 
     65     const GrGLInterface* interface = GrGLCreateNativeInterface();
     66     if (NULL == interface) {
     67         SkDebugf("Context could not create GL interface.\n");
     68         this->destroyGLContext();
     69         return NULL;
     70     }
     71 
     72     return interface;
     73 }
     74 
     75 void SkNativeGLContext::makeCurrent() const {
     76     CGLSetCurrentContext(fContext);
     77 }
     78 
     79 void SkNativeGLContext::swapBuffers() const {
     80     CGLFlushDrawable(fContext);
     81 }
     82