aboutsummaryrefslogtreecommitdiff
path: root/vendor/gioui.org/internal/vk/vulkan_x11.go
blob: 780a5d52c087c6835d6478fded4bfb0b15002e66 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// SPDX-License-Identifier: Unlicense OR MIT

//go:build ((linux && !android) || freebsd) && !nox11
// +build linux,!android freebsd
// +build !nox11

package vk

/*
#define VK_USE_PLATFORM_XLIB_KHR
#define VK_NO_PROTOTYPES 1
#define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef uint64_t object;
#include <vulkan/vulkan.h>

static VkResult vkCreateXlibSurfaceKHR(PFN_vkCreateXlibSurfaceKHR f, VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
	return f(instance, pCreateInfo, pAllocator, pSurface);
}
*/
import "C"
import (
	"fmt"
	"unsafe"
)

var x11Funcs struct {
	vkCreateXlibSurfaceKHR C.PFN_vkCreateXlibSurfaceKHR
}

func init() {
	loadFuncs = append(loadFuncs, func(dlopen func(name string) *[0]byte) {
		x11Funcs.vkCreateXlibSurfaceKHR = dlopen("vkCreateXlibSurfaceKHR")
	})
}

func CreateXlibSurface(inst Instance, dpy unsafe.Pointer, window uintptr) (Surface, error) {
	inf := C.VkXlibSurfaceCreateInfoKHR{
		sType:  C.VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR,
		dpy:    (*C.Display)(dpy),
		window: (C.Window)(window),
	}
	var surf Surface
	if err := vkErr(C.vkCreateXlibSurfaceKHR(x11Funcs.vkCreateXlibSurfaceKHR, inst, &inf, nil, &surf)); err != nil {
		return 0, fmt.Errorf("vulkan: vkCreateXlibSurfaceKHR: %w", err)
	}
	return surf, nil
}