vulkan_wayland.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. // SPDX-License-Identifier: Unlicense OR MIT
  2. //go:build ((linux && !android) || freebsd) && !nowayland
  3. // +build linux,!android freebsd
  4. // +build !nowayland
  5. package vk
  6. /*
  7. #cgo linux pkg-config: wayland-client
  8. #define VK_USE_PLATFORM_WAYLAND_KHR
  9. #define VK_NO_PROTOTYPES 1
  10. #define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef uint64_t object;
  11. #include <vulkan/vulkan.h>
  12. static VkResult vkCreateWaylandSurfaceKHR(PFN_vkCreateWaylandSurfaceKHR f, VkInstance instance, const VkWaylandSurfaceCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
  13. return f(instance, pCreateInfo, pAllocator, pSurface);
  14. }
  15. */
  16. import "C"
  17. import (
  18. "fmt"
  19. "unsafe"
  20. )
  21. var wlFuncs struct {
  22. vkCreateWaylandSurfaceKHR C.PFN_vkCreateWaylandSurfaceKHR
  23. }
  24. func init() {
  25. loadFuncs = append(loadFuncs, func(dlopen func(name string) *[0]byte) {
  26. wlFuncs.vkCreateWaylandSurfaceKHR = dlopen("vkCreateWaylandSurfaceKHR")
  27. })
  28. }
  29. func CreateWaylandSurface(inst Instance, disp unsafe.Pointer, wlSurf unsafe.Pointer) (Surface, error) {
  30. inf := C.VkWaylandSurfaceCreateInfoKHR{
  31. sType: C.VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR,
  32. display: (*C.struct_wl_display)(disp),
  33. surface: (*C.struct_wl_surface)(wlSurf),
  34. }
  35. var surf Surface
  36. if err := vkErr(C.vkCreateWaylandSurfaceKHR(wlFuncs.vkCreateWaylandSurfaceKHR, inst, &inf, nil, &surf)); err != nil {
  37. return 0, fmt.Errorf("vulkan: vkCreateWaylandSurfaceKHR: %w", err)
  38. }
  39. return surf, nil
  40. }