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 "SkTypes.h" 9 10 #include "gl/GLTestContext.h" 11 #include "AvailabilityMacros.h" 12 13 #include <OpenGL/OpenGL.h> 14 #include <dlfcn.h> 15 16 namespace { 17 class MacGLTestContext : public sk_gpu_test::GLTestContext { 18 public: 19 MacGLTestContext(MacGLTestContext* shareContext); 20 ~MacGLTestContext() override; 21 22 private: 23 void destroyGLContext(); 24 25 void onPlatformMakeCurrent() const override; 26 void onPlatformSwapBuffers() const override; 27 GrGLFuncPtr onPlatformGetProcAddress(const char*) const override; 28 29 CGLContextObj fContext; 30 void* fGLLibrary; 31 }; 32 33 MacGLTestContext::MacGLTestContext(MacGLTestContext* shareContext) 34 : fContext(nullptr) 35 , fGLLibrary(RTLD_DEFAULT) { 36 CGLPixelFormatAttribute attributes[] = { 37 #if MAC_OS_X_VERSION_10_7 38 kCGLPFAOpenGLProfile, (CGLPixelFormatAttribute) kCGLOGLPVersion_3_2_Core, 39 #endif 40 kCGLPFADoubleBuffer, 41 (CGLPixelFormatAttribute)0 42 }; 43 CGLPixelFormatObj pixFormat; 44 GLint npix; 45 46 CGLChoosePixelFormat(attributes, &pixFormat, &npix); 47 48 if (nullptr == pixFormat) { 49 SkDebugf("CGLChoosePixelFormat failed."); 50 return; 51 } 52 53 CGLCreateContext(pixFormat, shareContext ? shareContext->fContext : nullptr, &fContext); 54 CGLReleasePixelFormat(pixFormat); 55 56 if (nullptr == fContext) { 57 SkDebugf("CGLCreateContext failed."); 58 return; 59 } 60 61 CGLSetCurrentContext(fContext); 62 63 sk_sp<const GrGLInterface> gl(GrGLCreateNativeInterface()); 64 if (nullptr == gl.get()) { 65 SkDebugf("Context could not create GL interface.\n"); 66 this->destroyGLContext(); 67 return; 68 } 69 if (!gl->validate()) { 70 SkDebugf("Context could not validate GL interface.\n"); 71 this->destroyGLContext(); 72 return; 73 } 74 75 fGLLibrary = dlopen( 76 "/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib", 77 RTLD_LAZY); 78 79 this->init(gl.release()); 80 } 81 82 MacGLTestContext::~MacGLTestContext() { 83 this->teardown(); 84 this->destroyGLContext(); 85 } 86 87 void MacGLTestContext::destroyGLContext() { 88 if (fContext) { 89 CGLReleaseContext(fContext); 90 fContext = nullptr; 91 } 92 if (RTLD_DEFAULT != fGLLibrary) { 93 dlclose(fGLLibrary); 94 } 95 } 96 97 void MacGLTestContext::onPlatformMakeCurrent() const { 98 CGLSetCurrentContext(fContext); 99 } 100 101 void MacGLTestContext::onPlatformSwapBuffers() const { 102 CGLFlushDrawable(fContext); 103 } 104 105 GrGLFuncPtr MacGLTestContext::onPlatformGetProcAddress(const char* procName) const { 106 return reinterpret_cast<GrGLFuncPtr>(dlsym(fGLLibrary, procName)); 107 } 108 109 } // anonymous namespace 110 111 namespace sk_gpu_test { 112 GLTestContext* CreatePlatformGLTestContext(GrGLStandard forcedGpuAPI, 113 GLTestContext* shareContext) { 114 if (kGLES_GrGLStandard == forcedGpuAPI) { 115 return nullptr; 116 } 117 MacGLTestContext* macShareContext = reinterpret_cast<MacGLTestContext*>(shareContext); 118 MacGLTestContext* ctx = new MacGLTestContext(macShareContext); 119 if (!ctx->isValid()) { 120 delete ctx; 121 return nullptr; 122 } 123 return ctx; 124 } 125 } // namespace sk_gpu_test 126