12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- // SPDX-License-Identifier: Unlicense OR MIT
- package app
- import (
- "errors"
- "syscall/js"
- "gioui.org/gpu"
- "gioui.org/internal/gl"
- )
- type glContext struct {
- ctx js.Value
- cnv js.Value
- w *window
- }
- func newContext(w *window) (*glContext, error) {
- args := map[string]interface{}{
- // Enable low latency rendering.
- // See https://developers.google.com/web/updates/2019/05/desynchronized.
- "desynchronized": true,
- "preserveDrawingBuffer": true,
- }
- ctx := w.cnv.Call("getContext", "webgl2", args)
- if ctx.IsNull() {
- ctx = w.cnv.Call("getContext", "webgl", args)
- }
- if ctx.IsNull() {
- return nil, errors.New("app: webgl is not supported")
- }
- c := &glContext{
- ctx: ctx,
- cnv: w.cnv,
- w: w,
- }
- return c, nil
- }
- func (c *glContext) RenderTarget() (gpu.RenderTarget, error) {
- if c.w.contextStatus != contextStatusOkay {
- return nil, gpu.ErrDeviceLost
- }
- return gpu.OpenGLRenderTarget{}, nil
- }
- func (c *glContext) API() gpu.API {
- return gpu.OpenGL{Context: gl.Context(c.ctx)}
- }
- func (c *glContext) Release() {
- }
- func (c *glContext) Present() error {
- return nil
- }
- func (c *glContext) Lock() error {
- return nil
- }
- func (c *glContext) Unlock() {}
- func (c *glContext) Refresh() error {
- switch c.w.contextStatus {
- case contextStatusLost:
- return errOutOfDate
- case contextStatusRestored:
- c.w.contextStatus = contextStatusOkay
- return gpu.ErrDeviceLost
- default:
- return nil
- }
- }
- func (w *window) NewContext() (context, error) {
- return newContext(w)
- }
|