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