/* * 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 (NULL != fContext) { CGLReleaseContext(fContext); } } const GrGLInterface* SkNativeGLContext::createGLContext() { SkASSERT(NULL == fContext); 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); }