github.com/gop9/olt@v0.0.0-20200202132135-d956aad50b08/gio/app/headless/headless_macos.m (about) 1 // SPDX-License-Identifier: Unlicense OR MIT 2 3 // +build darwin,!ios 4 5 @import AppKit; 6 @import OpenGL; 7 @import OpenGL.GL; 8 @import OpenGL.GL3; 9 10 #include <CoreFoundation/CoreFoundation.h> 11 #include "headless_darwin.h" 12 13 void gio_headless_releaseContext(CFTypeRef ctxRef) { 14 CFBridgingRelease(ctxRef); 15 } 16 17 CFTypeRef gio_headless_newContext(void) { 18 NSOpenGLPixelFormatAttribute attr[] = { 19 NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core, 20 NSOpenGLPFAColorSize, 24, 21 NSOpenGLPFAAccelerated, 22 // Opt-in to automatic GPU switching. CGL-only property. 23 kCGLPFASupportsAutomaticGraphicsSwitching, 24 NSOpenGLPFAAllowOfflineRenderers, 25 0 26 }; 27 NSOpenGLPixelFormat *pixFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attr]; 28 if (pixFormat == nil) { 29 return NULL; 30 } 31 NSOpenGLContext *ctx = [[NSOpenGLContext alloc] initWithFormat:pixFormat shareContext:nil]; 32 return CFBridgingRetain(ctx); 33 } 34 35 void gio_headless_clearCurrentContext(CFTypeRef ctxRef) { 36 NSOpenGLContext *ctx = (__bridge NSOpenGLContext *)ctxRef; 37 CGLUnlockContext([ctx CGLContextObj]); 38 [NSOpenGLContext clearCurrentContext]; 39 } 40 41 void gio_headless_makeCurrentContext(CFTypeRef ctxRef) { 42 NSOpenGLContext *ctx = (__bridge NSOpenGLContext *)ctxRef; 43 [ctx makeCurrentContext]; 44 CGLLockContext([ctx CGLContextObj]); 45 } 46 47 void gio_headless_prepareContext(CFTypeRef ctxRef) { 48 // Bind a default VBA to emulate OpenGL ES 2. 49 GLuint defVBA; 50 glGenVertexArrays(1, &defVBA); 51 glBindVertexArray(defVBA); 52 glEnable(GL_FRAMEBUFFER_SRGB); 53 }