| Index: src/gpu/gl/iOS/SkCreatePlatformGLContext_iOS.mm
|
| diff --git a/src/gpu/gl/iOS/SkCreatePlatformGLContext_iOS.mm b/src/gpu/gl/iOS/SkCreatePlatformGLContext_iOS.mm
|
| index 884216845cdf9ef1237e7060fd6404f38aa9d49b..08e6f239eed1c25546bfb022df59a7208b66cf16 100644
|
| --- a/src/gpu/gl/iOS/SkCreatePlatformGLContext_iOS.mm
|
| +++ b/src/gpu/gl/iOS/SkCreatePlatformGLContext_iOS.mm
|
| @@ -8,6 +8,7 @@
|
|
|
| #include "gl/SkGLContext.h"
|
| #import <OpenGLES/EAGL.h>
|
| +#include <dlfcn.h>
|
|
|
| #define EAGLCTX ((EAGLContext*)(fEAGLContext))
|
|
|
| @@ -17,40 +18,50 @@ class IOSGLContext : public SkGLContext {
|
| public:
|
| IOSGLContext();
|
| ~IOSGLContext() override;
|
| - void makeCurrent() const override;
|
| - void swapBuffers() const override;
|
|
|
| private:
|
| void destroyGLContext();
|
|
|
| + void onPlatformMakeCurrent() const override;
|
| + void onPlatformSwapBuffers() const override;
|
| + GrGLFuncPtr onPlatformGetProcAddress(const char*) const override;
|
| +
|
| void* fEAGLContext;
|
| + void* fGLLibrary;
|
| };
|
|
|
| IOSGLContext::IOSGLContext()
|
| - : fEAGLContext(NULL) {
|
| + : fEAGLContext(NULL)
|
| + , fGLLibrary(RTLD_DEFAULT) {
|
|
|
| fEAGLContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
|
| [EAGLContext setCurrentContext:EAGLCTX];
|
|
|
| - fGL.reset(GrGLCreateNativeInterface());
|
| - if (NULL == fGL.get()) {
|
| + SkAutoTUnref<const GrGLInterface> gl(GrGLCreateNativeInterface());
|
| + if (NULL == gl.get()) {
|
| SkDebugf("Failed to create gl interface");
|
| this->destroyGLContext();
|
| return;
|
| }
|
| - if (!fGL->validate()) {
|
| + if (!gl->validate()) {
|
| SkDebugf("Failed to validate gl interface");
|
| this->destroyGLContext();
|
| return;
|
| }
|
| +
|
| + fGLLibrary = dlopen(
|
| + "/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib",
|
| + RTLD_LAZY);
|
| +
|
| + this->init(gl.detach());
|
| }
|
|
|
| IOSGLContext::~IOSGLContext() {
|
| + this->teardown();
|
| this->destroyGLContext();
|
| }
|
|
|
| void IOSGLContext::destroyGLContext() {
|
| - fGL.reset(NULL);
|
| if (fEAGLContext) {
|
| if ([EAGLContext currentContext] == EAGLCTX) {
|
| [EAGLContext setCurrentContext:nil];
|
| @@ -58,16 +69,23 @@ void IOSGLContext::destroyGLContext() {
|
| [EAGLCTX release];
|
| fEAGLContext = NULL;
|
| }
|
| + if (RTLD_DEFAULT != fGLLibrary) {
|
| + dlclose(fGLLibrary);
|
| + }
|
| }
|
|
|
|
|
| -void IOSGLContext::makeCurrent() const {
|
| +void IOSGLContext::onPlatformMakeCurrent() const {
|
| if (![EAGLContext setCurrentContext:EAGLCTX]) {
|
| SkDebugf("Could not set the context.\n");
|
| }
|
| }
|
|
|
| -void IOSGLContext::swapBuffers() const { }
|
| +void IOSGLContext::onPlatformSwapBuffers() const { }
|
| +
|
| +GrGLFuncPtr IOSGLContext::onPlatformGetProcAddress(const char* procName) const {
|
| + return reinterpret_cast<GrGLFuncPtr>(dlsym(fGLLibrary, procName));
|
| +}
|
|
|
| } // anonymous namespace
|
|
|
|
|