180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2011 Google Inc. 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file. 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "gl/SkNativeGLContext.h" 9096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#include "AvailabilityMacros.h" 1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkNativeGLContext::AutoContextRestore::AutoContextRestore() { 12096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger fOldCGLContext = CGLGetCurrentContext(); 1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkNativeGLContext::AutoContextRestore::~AutoContextRestore() { 16096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger CGLSetCurrentContext(fOldCGLContext); 1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/////////////////////////////////////////////////////////////////////////////// 2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkNativeGLContext::SkNativeGLContext() 2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru : fContext(NULL) { 2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkNativeGLContext::~SkNativeGLContext() { 2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru this->destroyGLContext(); 2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkNativeGLContext::destroyGLContext() { 30096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger if (NULL != fContext) { 31096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger CGLReleaseContext(fContext); 3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst GrGLInterface* SkNativeGLContext::createGLContext() { 36096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SkASSERT(NULL == fContext); 3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 38096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger CGLPixelFormatAttribute attributes[] = { 39096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#if MAC_OS_X_VERSION_10_7 40096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger kCGLPFAOpenGLProfile, (CGLPixelFormatAttribute) kCGLOGLPVersion_3_2_Core, 41096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#endif 420a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger kCGLPFADoubleBuffer, 43096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger (CGLPixelFormatAttribute)0 4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru }; 45096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger CGLPixelFormatObj pixFormat; 46096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger GLint npix; 47096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 48096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger CGLChoosePixelFormat(attributes, &pixFormat, &npix); 49096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 50096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger if (NULL == pixFormat) { 51096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SkDebugf("CGLChoosePixelFormat failed."); 5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return NULL; 5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 54096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 55096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger CGLCreateContext(pixFormat, NULL, &fContext); 56096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger CGLReleasePixelFormat(pixFormat); 57096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (NULL == fContext) { 59096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SkDebugf("CGLCreateContext failed."); 6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return NULL; 6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 63096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger CGLSetCurrentContext(fContext); 6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const GrGLInterface* interface = GrGLCreateNativeInterface(); 6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (NULL == interface) { 6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDebugf("Context could not create GL interface.\n"); 6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru this->destroyGLContext(); 6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return NULL; 7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return interface; 7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkNativeGLContext::makeCurrent() const { 76096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger CGLSetCurrentContext(fContext); 7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 780a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger 790a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenbergervoid SkNativeGLContext::swapBuffers() const { 800a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger CGLFlushDrawable(fContext); 810a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger} 82