gioui.org@v0.6.1-0.20240506124620-7a9ce51988ce/internal/vk/vulkan_wayland.go (about)

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