| // Copyright 2014 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| /* |
| Package gl implements Go bindings for OpenGL ES 2. |
| |
| The bindings are deliberately minimal, staying as close the C API as |
| possible. The semantics of each function maps onto functions |
| described in the Khronos documentation: |
| |
| https://www.khronos.org/opengles/sdk/docs/man/ |
| |
| One notable departure from the C API is the introduction of types |
| to represent common uses of GLint: Texture, Surface, Buffer, etc. |
| |
| Calls are not safe for concurrent use. However calls can be made from |
| any goroutine, the gl package removes the notion of thread-local |
| context. |
| |
| A tracing version of the OpenGL bindings is behind the `gldebug` build |
| tag. It acts as a simplified version of apitrace. Build your Go binary |
| with |
| |
| -tags gldebug |
| |
| and each call to a GL function will log its input, output, and any |
| error messages. For example, |
| |
| I/GoLog (27668): gl.GenBuffers(1) [Buffer(70001)] |
| I/GoLog (27668): gl.BindBuffer(ARRAY_BUFFER, Buffer(70001)) |
| I/GoLog (27668): gl.BufferData(ARRAY_BUFFER, 36, len(36), STATIC_DRAW) |
| I/GoLog (27668): gl.BindBuffer(ARRAY_BUFFER, Buffer(70001)) |
| I/GoLog (27668): gl.VertexAttribPointer(Attrib(0), 6, FLOAT, false, 0, 0) error: [INVALID_VALUE] |
| |
| The gldebug tracing has very high overhead, so make sure to remove |
| the build tag before deploying any binaries. |
| */ |
| package gl // import "golang.org/x/mobile/gl" |
| |
| /* |
| Implementation details. |
| |
| All GL function calls fill out a C.struct_fnargs and drop it on the work |
| queue. The Start function drains the work queue and hands over a batch |
| of calls to C.process which runs them. This allows multiple GL calls to |
| be executed in a single cgo call. |
| |
| A GL call is marked as blocking if it returns a value, or if it takes a |
| Go pointer. In this case the call will not return until C.process sends a |
| value on the retvalue channel. |
| |
| This implementation ensures any goroutine can make GL calls, but it does |
| not make the GL interface safe for simultaneous use by multiple goroutines. |
| For the purpose of analyzing this code for race conditions, picture two |
| separate goroutines: one blocked on gl.Start, and another making calls to |
| the gl package exported functions. |
| */ |
| |
| //go:generate go run gendebug.go -o gldebug.go |