github.com/utopiagio/gio@v0.0.8/app/egl_android.go (about)

     1  // SPDX-License-Identifier: Unlicense OR MIT
     2  
     3  //go:build !noopengl
     4  
     5  package app
     6  
     7  /*
     8  #include <android/native_window_jni.h>
     9  #include <EGL/egl.h>
    10  */
    11  import "C"
    12  
    13  import (
    14  	"unsafe"
    15  
    16  	"github.com/utopiagio/gio/internal/egl"
    17  )
    18  
    19  type androidContext struct {
    20  	win           *window
    21  	eglSurf       egl.NativeWindowType
    22  	width, height int
    23  	*egl.Context
    24  }
    25  
    26  func init() {
    27  	newAndroidGLESContext = func(w *window) (context, error) {
    28  		ctx, err := egl.NewContext(nil)
    29  		if err != nil {
    30  			return nil, err
    31  		}
    32  		return &androidContext{win: w, Context: ctx}, nil
    33  	}
    34  }
    35  
    36  func (c *androidContext) Release() {
    37  	if c.Context != nil {
    38  		c.Context.Release()
    39  		c.Context = nil
    40  	}
    41  }
    42  
    43  func (c *androidContext) Refresh() error {
    44  	c.Context.ReleaseSurface()
    45  	if err := c.win.setVisual(c.Context.VisualID()); err != nil {
    46  		return err
    47  	}
    48  	win, width, height := c.win.nativeWindow()
    49  	c.eglSurf = egl.NativeWindowType(unsafe.Pointer(win))
    50  	c.width, c.height = width, height
    51  	return nil
    52  }
    53  
    54  func (c *androidContext) Lock() error {
    55  	// The Android emulator creates a broken surface if it is not
    56  	// created on the same thread as the context is made current.
    57  	if c.eglSurf != nil {
    58  		if err := c.Context.CreateSurface(c.eglSurf, c.width, c.height); err != nil {
    59  			return err
    60  		}
    61  		c.eglSurf = nil
    62  	}
    63  	return c.Context.MakeCurrent()
    64  }
    65  
    66  func (c *androidContext) Unlock() {
    67  	c.Context.ReleaseCurrent()
    68  }