mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-01 07:35:40 +00:00
6913c856a2
On Android it's possible that the Activity/View must be restore. But, before that patch, an new VkSurfaceKHR is created but never used and that may lead to crash, in an attempt to destroy/use one invalid surface. Fixes: https://todo.sr.ht/~eliasnaur/gio/327 Signed-off-by: Inkeliz <inkeliz@inkeliz.com>
91 lines
1.6 KiB
Go
91 lines
1.6 KiB
Go
// 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)
|
|
}
|