1
2/*
3 * Copyright 2011 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#include "gl/SkNativeGLContext.h"
9#include "AvailabilityMacros.h"
10
11SkNativeGLContext::AutoContextRestore::AutoContextRestore() {
12    fOldCGLContext = CGLGetCurrentContext();
13}
14
15SkNativeGLContext::AutoContextRestore::~AutoContextRestore() {
16    CGLSetCurrentContext(fOldCGLContext);
17}
18
19///////////////////////////////////////////////////////////////////////////////
20
21SkNativeGLContext::SkNativeGLContext()
22    : fContext(NULL) {
23}
24
25SkNativeGLContext::~SkNativeGLContext() {
26    this->destroyGLContext();
27}
28
29void SkNativeGLContext::destroyGLContext() {
30    if (fContext) {
31        CGLReleaseContext(fContext);
32    }
33}
34
35const GrGLInterface* SkNativeGLContext::createGLContext(GrGLStandard forcedGpuAPI) {
36    SkASSERT(NULL == fContext);
37    if (kGLES_GrGLStandard == forcedGpuAPI) {
38        return NULL;
39    }
40
41    CGLPixelFormatAttribute attributes[] = {
42#if MAC_OS_X_VERSION_10_7
43        kCGLPFAOpenGLProfile, (CGLPixelFormatAttribute) kCGLOGLPVersion_3_2_Core,
44#endif
45        kCGLPFADoubleBuffer,
46        (CGLPixelFormatAttribute)0
47    };
48    CGLPixelFormatObj pixFormat;
49    GLint npix;
50
51    CGLChoosePixelFormat(attributes, &pixFormat, &npix);
52
53    if (NULL == pixFormat) {
54        SkDebugf("CGLChoosePixelFormat failed.");
55        return NULL;
56    }
57
58    CGLCreateContext(pixFormat, NULL, &fContext);
59    CGLReleasePixelFormat(pixFormat);
60
61    if (NULL == fContext) {
62        SkDebugf("CGLCreateContext failed.");
63        return NULL;
64    }
65
66    CGLSetCurrentContext(fContext);
67
68    const GrGLInterface* interface = GrGLCreateNativeInterface();
69    if (NULL == interface) {
70        SkDebugf("Context could not create GL interface.\n");
71        this->destroyGLContext();
72        return NULL;
73    }
74
75    return interface;
76}
77
78void SkNativeGLContext::makeCurrent() const {
79    CGLSetCurrentContext(fContext);
80}
81
82void SkNativeGLContext::swapBuffers() const {
83    CGLFlushDrawable(fContext);
84}
85