github.com/acrespo/mobile@v0.0.0-20190107162257-dc0771356504/exp/gl/glutil/context_darwin_desktop.go (about) 1 // Copyright 2014 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // +build darwin 6 // +build !ios 7 8 package glutil 9 10 // TODO(crawshaw): Only used in glutil tests for now (cgo is not support in _test.go files). 11 // TODO(crawshaw): Export some kind of Context. Work out what we can offer, where. Maybe just for tests. 12 // TODO(crawshaw): Support android and windows. 13 14 /* 15 #cgo LDFLAGS: -framework OpenGL 16 #import <OpenGL/OpenGL.h> 17 #import <OpenGL/gl3.h> 18 19 CGLError CGCreate(CGLContextObj* ctx) { 20 CGLError err; 21 CGLPixelFormatAttribute attributes[] = { 22 kCGLPFAOpenGLProfile, (CGLPixelFormatAttribute)kCGLOGLPVersion_3_2_Core, 23 kCGLPFAColorSize, (CGLPixelFormatAttribute)24, 24 kCGLPFAAlphaSize, (CGLPixelFormatAttribute)8, 25 kCGLPFADepthSize, (CGLPixelFormatAttribute)16, 26 kCGLPFAAccelerated, 27 kCGLPFADoubleBuffer, 28 (CGLPixelFormatAttribute) 0 29 }; 30 CGLPixelFormatObj pix; 31 GLint num; 32 33 if ((err = CGLChoosePixelFormat(attributes, &pix, &num)) != kCGLNoError) { 34 return err; 35 } 36 if ((err = CGLCreateContext(pix, 0, ctx)) != kCGLNoError) { 37 return err; 38 } 39 if ((err = CGLDestroyPixelFormat(pix)) != kCGLNoError) { 40 return err; 41 } 42 if ((err = CGLSetCurrentContext(*ctx)) != kCGLNoError) { 43 return err; 44 } 45 if ((err = CGLLockContext(*ctx)) != kCGLNoError) { 46 return err; 47 } 48 return kCGLNoError; 49 } 50 */ 51 import "C" 52 53 import ( 54 "fmt" 55 "runtime" 56 ) 57 58 // contextGL holds a copy of the OpenGL Context from thread-local storage. 59 // 60 // Do not move a contextGL between goroutines or OS threads. 61 type contextGL struct { 62 ctx C.CGLContextObj 63 } 64 65 // createContext creates an OpenGL context, binds it as the current context 66 // stored in thread-local storage, and locks the current goroutine to an os 67 // thread. 68 func createContext() (*contextGL, error) { 69 // The OpenGL active context is stored in TLS. 70 runtime.LockOSThread() 71 72 c := new(contextGL) 73 if cglErr := C.CGCreate(&c.ctx); cglErr != C.kCGLNoError { 74 return nil, fmt.Errorf("CGL: %v", C.GoString(C.CGLErrorString(cglErr))) 75 } 76 77 // Using attribute arrays in OpenGL 3.3 requires the use of a VBA. 78 // But VBAs don't exist in ES 2. So we bind a default one. 79 var id C.GLuint 80 C.glGenVertexArrays(1, &id) 81 C.glBindVertexArray(id) 82 83 return c, nil 84 } 85 86 // destroy destroys an OpenGL context and unlocks the current goroutine from 87 // its os thread. 88 func (c *contextGL) destroy() { 89 C.CGLUnlockContext(c.ctx) 90 C.CGLSetCurrentContext(nil) 91 C.CGLDestroyContext(c.ctx) 92 c.ctx = nil 93 runtime.UnlockOSThread() 94 }