1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2bd3e3202ad5111a8a259e976594d7e6864e3b6d2yangsu@google.com/*
3a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon * Copyright 2014 Google Inc.
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7bd3e3202ad5111a8a259e976594d7e6864e3b6d2yangsu@google.com */
8bd3e3202ad5111a8a259e976594d7e6864e3b6d2yangsu@google.com
96c8c34e65ff8248ec7374e0d662d7f5684d800fatomhudson@google.com#include "gl/GrGLInterface.h"
10a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon#include "gl/GrGLAssembleInterface.h"
11a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon#include <dlfcn.h>
12a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon
13a721c8167222a0b2b442a00052104b2a78ab93e5bsalomonclass GLLoader {
14a721c8167222a0b2b442a00052104b2a78ab93e5bsalomonpublic:
15a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon    GLLoader() {
16a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon        fLibrary = dlopen(
17a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon            "/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib",
18a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon            RTLD_LAZY);
19a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon    }
20a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon
21a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon    ~GLLoader() {
2249f085dddff10473b6ebf832a974288300224e60bsalomon        if (fLibrary) {
23a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon            dlclose(fLibrary);
24a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon        }
25a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon    }
26a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon
27a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon    void* handle() const {
28a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon        return NULL == fLibrary ? RTLD_DEFAULT : fLibrary;
29a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon    }
30a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon
31a721c8167222a0b2b442a00052104b2a78ab93e5bsalomonprivate:
32a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon    void* fLibrary;
33a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon};
34a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon
35a721c8167222a0b2b442a00052104b2a78ab93e5bsalomonclass GLProcGetter {
36a721c8167222a0b2b442a00052104b2a78ab93e5bsalomonpublic:
37a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon    GLProcGetter() {}
38a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon
39a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon    GrGLFuncPtr getProc(const char name[]) const {
40a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon        return (GrGLFuncPtr) dlsym(fLoader.handle(), name);
41a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon    }
42a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon
43a721c8167222a0b2b442a00052104b2a78ab93e5bsalomonprivate:
44a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon    GLLoader fLoader;
45a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon};
46a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon
47a721c8167222a0b2b442a00052104b2a78ab93e5bsalomonstatic GrGLFuncPtr ios_get_gl_proc(void* ctx, const char name[]) {
4849f085dddff10473b6ebf832a974288300224e60bsalomon    SkASSERT(ctx);
49a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon    const GLProcGetter* getter = (const GLProcGetter*) ctx;
50a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon    return getter->getProc(name);
51a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon}
52bd3e3202ad5111a8a259e976594d7e6864e3b6d2yangsu@google.com
53cca3c8f21b80f515a236a4b0d1e1f0b6418fcc97bsalomon@google.comconst GrGLInterface* GrGLCreateNativeInterface() {
54a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon    GLProcGetter getter;
55a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon    return GrGLAssembleGLESInterface(&getter, ios_get_gl_proc);
566fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com}
57