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