1 2 /* 3 * Copyright 2012 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 9 #include "gl/SkNativeGLContext.h" 10 #import <OpenGLES/EAGL.h> 11 12 #define EAGLCTX ((EAGLContext*)(fEAGLContext)) 13 14 SkNativeGLContext::AutoContextRestore::AutoContextRestore() { 15 fEAGLContext = [EAGLContext currentContext]; 16 if (EAGLCTX) { 17 [EAGLCTX retain]; 18 } 19 } 20 21 SkNativeGLContext::AutoContextRestore::~AutoContextRestore() { 22 if (EAGLCTX) { 23 [EAGLContext setCurrentContext:EAGLCTX]; 24 [EAGLCTX release]; 25 } 26 } 27 28 /////////////////////////////////////////////////////////////////////////////// 29 30 SkNativeGLContext::SkNativeGLContext() 31 : fEAGLContext(NULL) { 32 } 33 34 SkNativeGLContext::~SkNativeGLContext() { 35 this->destroyGLContext(); 36 } 37 38 void SkNativeGLContext::destroyGLContext() { 39 if ([EAGLContext currentContext] == EAGLCTX) { 40 [EAGLContext setCurrentContext:nil]; 41 } 42 [EAGLCTX release]; 43 } 44 45 const GrGLInterface* SkNativeGLContext::createGLContext() { 46 fEAGLContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; 47 [EAGLContext setCurrentContext:EAGLCTX]; 48 49 const GrGLInterface* interface = GrGLCreateNativeInterface(); 50 if (!interface) { 51 SkDebugf("Failed to create gl interface"); 52 this->destroyGLContext(); 53 return NULL; 54 } 55 return interface; 56 } 57 58 void SkNativeGLContext::makeCurrent() const { 59 if (![EAGLContext setCurrentContext:EAGLCTX]) { 60 SkDebugf("Could not set the context.\n"); 61 } 62 } 63