/
vulkan.go
165 lines (134 loc) · 4.58 KB
/
vulkan.go
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
package sdl
/*
#include "sdl_wrapper.h"
#if (SDL_VERSION_ATLEAST(2,0,6))
#if defined(_WIN32)
#include <SDL2/SDL_vulkan.h>
#else
#include <SDL_vulkan.h>
#endif
#else //!SDL_VERSION_ATLEAST(2,0,6)
#define VK_DEFINE_HANDLE(object) typedef struct object##_T* object;
#if defined(__LP64__) || defined(_WIN64) || defined(__x86_64__) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__)
#define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef struct object##_T *object;
#else
#define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef uint64_t object;
#endif
VK_DEFINE_HANDLE(VkInstance)
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSurfaceKHR)
typedef VkInstance SDL_vulkanInstance;
typedef VkSurfaceKHR SDL_vulkanSurface;
#if defined(WARN_OUTDATED)
#pragma message("SDL_Vulkan_LoadLibrary is not supported before SDL 2.0.6")
#endif
static int SDL_Vulkan_LoadLibrary(const char *path)
{
return 0;
}
#if defined(WARN_OUTDATED)
#pragma message("SDL_Vulkan_GetVkGetInstanceProcAddr is not supported before SDL 2.0.6")
#endif
static void* SDL_Vulkan_GetVkGetInstanceProcAddr(void)
{
return NULL;
}
#if defined(WARN_OUTDATED)
#pragma message("SDL_Vulkan_UnloadLibrary is not supported before SDL 2.0.6")
#endif
static void SDL_Vulkan_UnloadLibrary(void) {}
#if defined(WARN_OUTDATED)
#pragma message("SDL_Vulkan_GetInstanceExtensions is not supported before SDL 2.0.6")
#endif
static int SDL_Vulkan_GetInstanceExtensions(SDL_Window *window, unsigned int *pCount, const char **pNames)
{
return 0;
}
#if defined(WARN_OUTDATED)
#pragma message("SDL_Vulkan_CreateSurface is not supported before SDL 2.0.6")
#endif
static int SDL_Vulkan_CreateSurface(SDL_Window *window, VkInstance instance, VkSurfaceKHR *surface)
{
return 0;
}
#if defined(WARN_OUTDATED)
#pragma message("SDL_Vulkan_GetDrawableSize is not supported before SDL 2.0.6")
#endif
static void SDL_Vulkan_GetDrawableSize(SDL_Window *window, int *w, int *h) {
*w = 0;
*h = 0;
}
#endif
*/
import "C"
import (
"errors"
"reflect"
"unsafe"
)
// VulkanLoadLibrary dynamically loads a Vulkan loader library.
// (https://wiki.libsdl.org/SDL_Vulkan_LoadLibrary)
func VulkanLoadLibrary(path string) error {
var ret C.int
if path == "" {
ret = C.SDL_Vulkan_LoadLibrary(nil)
} else {
cpath := C.CString(path)
defer C.free(unsafe.Pointer(cpath))
ret = C.SDL_Vulkan_LoadLibrary(cpath)
}
if int(ret) == -1 {
return GetError()
}
return nil
}
// VulkanGetVkGetInstanceProcAddr gets the address of the vkGetInstanceProcAddr function.
// (https://wiki.libsdl.org/SDL_Vulkan_GetVkInstanceProcAddr)
func VulkanGetVkGetInstanceProcAddr() unsafe.Pointer {
return C.SDL_Vulkan_GetVkGetInstanceProcAddr()
}
// VulkanUnloadLibrary unloads the Vulkan loader library previously loaded by VulkanLoadLibrary().
// (https://wiki.libsdl.org/SDL_Vulkan_UnloadLibrary)
func VulkanUnloadLibrary() {
C.SDL_Vulkan_UnloadLibrary()
}
// VulkanGetInstanceExtensions gets the names of the Vulkan instance extensions needed to create a surface with VulkanCreateSurface().
// (https://wiki.libsdl.org/SDL_Vulkan_GetInstanceExtensions)
func (window *Window) VulkanGetInstanceExtensions() []string {
var count C.uint
C.SDL_Vulkan_GetInstanceExtensions(window.cptr(), &count, nil)
if count == 0 {
return nil
}
strptrs := make([]*C.char, uint(count))
C.SDL_Vulkan_GetInstanceExtensions(window.cptr(), &count, &strptrs[0])
extensions := make([]string, uint(count))
for i := range strptrs {
extensions[i] = C.GoString(strptrs[i])
}
return extensions
}
// VulkanCreateSurface creates a Vulkan rendering surface for a window.
// (https://wiki.libsdl.org/SDL_Vulkan_CreateSurface)
func (window *Window) VulkanCreateSurface(instance interface{}) (surface unsafe.Pointer, err error) {
if instance == nil {
return nil, errors.New("vulkan: instance is nil")
}
val := reflect.ValueOf(instance)
if val.Kind() != reflect.Ptr {
return nil, errors.New("vulkan: instance is not a VkInstance (expected kind Ptr, got " + val.Kind().String() + ")")
}
var vulkanSurface C.VkSurfaceKHR
if C.SDL_Vulkan_CreateSurface(window.cptr(),
(C.VkInstance)(unsafe.Pointer(val.Pointer())),
(*C.VkSurfaceKHR)(unsafe.Pointer(&vulkanSurface))) == C.SDL_FALSE {
return nil, GetError()
}
return unsafe.Pointer(&vulkanSurface), nil
}
// VulkanGetDrawableSize gets the size of a window's underlying drawable in pixels (for use with setting viewport, scissor & etc).
// (https://wiki.libsdl.org/SDL_Vulkan_GetDrawableSize)
func (window *Window) VulkanGetDrawableSize() (w, h int32) {
var _w, _h C.int
C.SDL_Vulkan_GetDrawableSize(window.cptr(), &_w, &_h)
return int32(_w), int32(_h)
}