vulkan_android.go 1.6 KB

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