gioui.org@v0.6.1-0.20240506124620-7a9ce51988ce/app/vulkan_wayland.go (about) 1 // SPDX-License-Identifier: Unlicense OR MIT 2 3 //go:build ((linux && !android) || freebsd) && !nowayland && !novulkan 4 // +build linux,!android freebsd 5 // +build !nowayland 6 // +build !novulkan 7 8 package app 9 10 import ( 11 "unsafe" 12 13 "gioui.org/gpu" 14 "gioui.org/internal/vk" 15 ) 16 17 type wlVkContext struct { 18 win *window 19 inst vk.Instance 20 surf vk.Surface 21 ctx *vkContext 22 } 23 24 func init() { 25 newWaylandVulkanContext = func(w *window) (context, error) { 26 inst, err := vk.CreateInstance("VK_KHR_surface", "VK_KHR_wayland_surface") 27 if err != nil { 28 return nil, err 29 } 30 disp := w.display() 31 wlSurf, _, _ := w.surface() 32 surf, err := vk.CreateWaylandSurface(inst, unsafe.Pointer(disp), unsafe.Pointer(wlSurf)) 33 if err != nil { 34 vk.DestroyInstance(inst) 35 return nil, err 36 } 37 ctx, err := newVulkanContext(inst, surf) 38 if err != nil { 39 vk.DestroySurface(inst, surf) 40 vk.DestroyInstance(inst) 41 return nil, err 42 } 43 c := &wlVkContext{ 44 win: w, 45 inst: inst, 46 surf: surf, 47 ctx: ctx, 48 } 49 return c, nil 50 } 51 } 52 53 func (c *wlVkContext) RenderTarget() (gpu.RenderTarget, error) { 54 return c.ctx.RenderTarget() 55 } 56 57 func (c *wlVkContext) API() gpu.API { 58 return c.ctx.api() 59 } 60 61 func (c *wlVkContext) Release() { 62 c.ctx.release() 63 vk.DestroySurface(c.inst, c.surf) 64 vk.DestroyInstance(c.inst) 65 *c = wlVkContext{} 66 } 67 68 func (c *wlVkContext) Present() error { 69 return c.ctx.present() 70 } 71 72 func (c *wlVkContext) Lock() error { 73 return nil 74 } 75 76 func (c *wlVkContext) Unlock() {} 77 78 func (c *wlVkContext) Refresh() error { 79 _, w, h := c.win.surface() 80 return c.ctx.refresh(c.surf, w, h) 81 }