| |
| /* |
| * Copyright 2011 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| #include "gl/SkNativeGLContext.h" |
| #include "AvailabilityMacros.h" |
| |
| SkNativeGLContext::AutoContextRestore::AutoContextRestore() { |
| fOldCGLContext = CGLGetCurrentContext(); |
| } |
| |
| SkNativeGLContext::AutoContextRestore::~AutoContextRestore() { |
| CGLSetCurrentContext(fOldCGLContext); |
| } |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| SkNativeGLContext::SkNativeGLContext() |
| : fContext(NULL) { |
| } |
| |
| SkNativeGLContext::~SkNativeGLContext() { |
| this->destroyGLContext(); |
| } |
| |
| void SkNativeGLContext::destroyGLContext() { |
| if (fContext) { |
| CGLReleaseContext(fContext); |
| } |
| } |
| |
| const GrGLInterface* SkNativeGLContext::createGLContext(GrGLStandard forcedGpuAPI) { |
| SkASSERT(NULL == fContext); |
| if (kGLES_GrGLStandard == forcedGpuAPI) { |
| return NULL; |
| } |
| |
| CGLPixelFormatAttribute attributes[] = { |
| #if MAC_OS_X_VERSION_10_7 |
| kCGLPFAOpenGLProfile, (CGLPixelFormatAttribute) kCGLOGLPVersion_3_2_Core, |
| #endif |
| kCGLPFADoubleBuffer, |
| (CGLPixelFormatAttribute)0 |
| }; |
| CGLPixelFormatObj pixFormat; |
| GLint npix; |
| |
| CGLChoosePixelFormat(attributes, &pixFormat, &npix); |
| |
| if (NULL == pixFormat) { |
| SkDebugf("CGLChoosePixelFormat failed."); |
| return NULL; |
| } |
| |
| CGLCreateContext(pixFormat, NULL, &fContext); |
| CGLReleasePixelFormat(pixFormat); |
| |
| if (NULL == fContext) { |
| SkDebugf("CGLCreateContext failed."); |
| return NULL; |
| } |
| |
| CGLSetCurrentContext(fContext); |
| |
| const GrGLInterface* interface = GrGLCreateNativeInterface(); |
| if (NULL == interface) { |
| SkDebugf("Context could not create GL interface.\n"); |
| this->destroyGLContext(); |
| return NULL; |
| } |
| |
| return interface; |
| } |
| |
| void SkNativeGLContext::makeCurrent() const { |
| CGLSetCurrentContext(fContext); |
| } |
| |
| void SkNativeGLContext::swapBuffers() const { |
| CGLFlushDrawable(fContext); |
| } |