123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- // SPDX-License-Identifier: Unlicense OR MIT
- //go:build !novulkan
- // +build !novulkan
- package app
- import (
- "unsafe"
- "gioui.org/gpu"
- "gioui.org/internal/vk"
- )
- type wlVkContext struct {
- win *window
- inst vk.Instance
- surf vk.Surface
- ctx *vkContext
- }
- func init() {
- newAndroidVulkanContext = func(w *window) (context, error) {
- inst, err := vk.CreateInstance("VK_KHR_surface", "VK_KHR_android_surface")
- if err != nil {
- return nil, err
- }
- window, _, _ := w.nativeWindow()
- surf, err := vk.CreateAndroidSurface(inst, unsafe.Pointer(window))
- if err != nil {
- vk.DestroyInstance(inst)
- return nil, err
- }
- ctx, err := newVulkanContext(inst, surf)
- if err != nil {
- vk.DestroySurface(inst, surf)
- vk.DestroyInstance(inst)
- return nil, err
- }
- c := &wlVkContext{
- win: w,
- inst: inst,
- surf: surf,
- ctx: ctx,
- }
- return c, nil
- }
- }
- func (c *wlVkContext) RenderTarget() (gpu.RenderTarget, error) {
- return c.ctx.RenderTarget()
- }
- func (c *wlVkContext) API() gpu.API {
- return c.ctx.api()
- }
- func (c *wlVkContext) Release() {
- c.ctx.release()
- if c.surf != 0 {
- vk.DestroySurface(c.inst, c.surf)
- }
- vk.DestroyInstance(c.inst)
- *c = wlVkContext{}
- }
- func (c *wlVkContext) Present() error {
- return c.ctx.present()
- }
- func (c *wlVkContext) Lock() error {
- return nil
- }
- func (c *wlVkContext) Unlock() {}
- func (c *wlVkContext) Refresh() error {
- win, w, h := c.win.nativeWindow()
- if c.surf != 0 {
- c.ctx.destroySwapchain()
- vk.DestroySurface(c.inst, c.surf)
- c.surf = 0
- }
- surf, err := vk.CreateAndroidSurface(c.inst, unsafe.Pointer(win))
- if err != nil {
- return err
- }
- c.surf = surf
- return c.ctx.refresh(c.surf, w, h)
- }
|