forked from joejulian/gio
94f7fa3218
Before this change, it was unclear who owned the platform specific VkSurfaceKHR object, leading to a double-free in the error path for devices with no Vulkan support. This change moves the ownership to the platform specific code. Add vk.EnumeratePhysicalDevices while here (refactor was part of debugging of the double-free). Signed-off-by: Elias Naur <mail@eliasnaur.com>
82 lines
1.5 KiB
Go
82 lines
1.5 KiB
Go
// SPDX-License-Identifier: Unlicense OR MIT
|
|
|
|
//go:build ((linux && !android) || freebsd) && !nowayland && !novulkan
|
|
// +build linux,!android freebsd
|
|
// +build !nowayland
|
|
// +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() {
|
|
newWaylandVulkanContext = func(w *window) (context, error) {
|
|
inst, err := vk.CreateInstance("VK_KHR_surface", "VK_KHR_wayland_surface")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
disp := w.display()
|
|
wlSurf, _, _ := w.surface()
|
|
surf, err := vk.CreateWaylandSurface(inst, unsafe.Pointer(disp), unsafe.Pointer(wlSurf))
|
|
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()
|
|
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 {
|
|
_, w, h := c.win.surface()
|
|
return c.ctx.refresh(c.surf, w, h)
|
|
}
|