vulkan_x11.go 1.5 KB

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