1373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com 2373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com/* 3373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com * Copyright 2011 Google Inc. 4373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com * 5373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com * Use of this source code is governed by a BSD-style license that can be 6373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com * found in the LICENSE file. 7373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com */ 86c8c34e65ff8248ec7374e0d662d7f5684d800fatomhudson@google.com#include "gl/SkNativeGLContext.h" 96918d482d64f045a4c980b2fb267bc939953638ebsalomon@google.com#include "AvailabilityMacros.h" 10373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com 1157f5d9854bfc78c347cb587e044fb3950f9ad298bsalomon@google.comSkNativeGLContext::AutoContextRestore::AutoContextRestore() { 12682e1f92455e398804f413d4c223d1d05c4ea2a1bsalomon@google.com fOldCGLContext = CGLGetCurrentContext(); 1357f5d9854bfc78c347cb587e044fb3950f9ad298bsalomon@google.com} 1457f5d9854bfc78c347cb587e044fb3950f9ad298bsalomon@google.com 1557f5d9854bfc78c347cb587e044fb3950f9ad298bsalomon@google.comSkNativeGLContext::AutoContextRestore::~AutoContextRestore() { 16682e1f92455e398804f413d4c223d1d05c4ea2a1bsalomon@google.com CGLSetCurrentContext(fOldCGLContext); 1757f5d9854bfc78c347cb587e044fb3950f9ad298bsalomon@google.com} 1857f5d9854bfc78c347cb587e044fb3950f9ad298bsalomon@google.com 1957f5d9854bfc78c347cb587e044fb3950f9ad298bsalomon@google.com/////////////////////////////////////////////////////////////////////////////// 2057f5d9854bfc78c347cb587e044fb3950f9ad298bsalomon@google.com 21fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.comSkNativeGLContext::SkNativeGLContext() 22373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com : fContext(NULL) { 23373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com} 24373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com 25373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.comSkNativeGLContext::~SkNativeGLContext() { 26373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com this->destroyGLContext(); 27373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com} 28373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com 29373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.comvoid SkNativeGLContext::destroyGLContext() { 3049f085dddff10473b6ebf832a974288300224e60bsalomon if (fContext) { 31682e1f92455e398804f413d4c223d1d05c4ea2a1bsalomon@google.com CGLReleaseContext(fContext); 32373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com } 33373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com} 34373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com 3580549fcdd50269d7e069d6db02b395fca128056ckkinnunenconst GrGLInterface* SkNativeGLContext::createGLContext(GrGLStandard forcedGpuAPI) { 36682e1f92455e398804f413d4c223d1d05c4ea2a1bsalomon@google.com SkASSERT(NULL == fContext); 3780549fcdd50269d7e069d6db02b395fca128056ckkinnunen if (kGLES_GrGLStandard == forcedGpuAPI) { 3880549fcdd50269d7e069d6db02b395fca128056ckkinnunen return NULL; 3980549fcdd50269d7e069d6db02b395fca128056ckkinnunen } 40044679ef8c08e1f01afadf5bc08251fe8597df81skia.committer@gmail.com 41682e1f92455e398804f413d4c223d1d05c4ea2a1bsalomon@google.com CGLPixelFormatAttribute attributes[] = { 426918d482d64f045a4c980b2fb267bc939953638ebsalomon@google.com#if MAC_OS_X_VERSION_10_7 431744f97ea73384b9f75b0ccee0a36a213c681d3absalomon@google.com kCGLPFAOpenGLProfile, (CGLPixelFormatAttribute) kCGLOGLPVersion_3_2_Core, 44682e1f92455e398804f413d4c223d1d05c4ea2a1bsalomon@google.com#endif 45c9542ca3d00878a18a57af80037060d6374d5650djsollen@google.com kCGLPFADoubleBuffer, 46682e1f92455e398804f413d4c223d1d05c4ea2a1bsalomon@google.com (CGLPixelFormatAttribute)0 47373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com }; 48682e1f92455e398804f413d4c223d1d05c4ea2a1bsalomon@google.com CGLPixelFormatObj pixFormat; 49682e1f92455e398804f413d4c223d1d05c4ea2a1bsalomon@google.com GLint npix; 50044679ef8c08e1f01afadf5bc08251fe8597df81skia.committer@gmail.com 51682e1f92455e398804f413d4c223d1d05c4ea2a1bsalomon@google.com CGLChoosePixelFormat(attributes, &pixFormat, &npix); 52044679ef8c08e1f01afadf5bc08251fe8597df81skia.committer@gmail.com 53682e1f92455e398804f413d4c223d1d05c4ea2a1bsalomon@google.com if (NULL == pixFormat) { 54682e1f92455e398804f413d4c223d1d05c4ea2a1bsalomon@google.com SkDebugf("CGLChoosePixelFormat failed."); 55373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com return NULL; 56373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com } 57044679ef8c08e1f01afadf5bc08251fe8597df81skia.committer@gmail.com 58682e1f92455e398804f413d4c223d1d05c4ea2a1bsalomon@google.com CGLCreateContext(pixFormat, NULL, &fContext); 59682e1f92455e398804f413d4c223d1d05c4ea2a1bsalomon@google.com CGLReleasePixelFormat(pixFormat); 60044679ef8c08e1f01afadf5bc08251fe8597df81skia.committer@gmail.com 61373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com if (NULL == fContext) { 62682e1f92455e398804f413d4c223d1d05c4ea2a1bsalomon@google.com SkDebugf("CGLCreateContext failed."); 63373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com return NULL; 64373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com } 65044679ef8c08e1f01afadf5bc08251fe8597df81skia.committer@gmail.com 66682e1f92455e398804f413d4c223d1d05c4ea2a1bsalomon@google.com CGLSetCurrentContext(fContext); 67fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 68373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com const GrGLInterface* interface = GrGLCreateNativeInterface(); 69373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com if (NULL == interface) { 70373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com SkDebugf("Context could not create GL interface.\n"); 71373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com this->destroyGLContext(); 72373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com return NULL; 73373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com } 74fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 75373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com return interface; 76373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com} 77373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com 78373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.comvoid SkNativeGLContext::makeCurrent() const { 79682e1f92455e398804f413d4c223d1d05c4ea2a1bsalomon@google.com CGLSetCurrentContext(fContext); 80373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com} 81c9542ca3d00878a18a57af80037060d6374d5650djsollen@google.com 82c9542ca3d00878a18a57af80037060d6374d5650djsollen@google.comvoid SkNativeGLContext::swapBuffers() const { 83c9542ca3d00878a18a57af80037060d6374d5650djsollen@google.com CGLFlushDrawable(fContext); 84c9542ca3d00878a18a57af80037060d6374d5650djsollen@google.com} 85