annotate svk/api.nim @ 1490:81da4be50663 default tip

did: some stuff
author sam <sam@basx.dev>
date Fri, 23 May 2025 23:42:19 +0700
parents e6bd1f553c1b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1488
3ce7c132fdac did: improvments
sam <sam@basx.dev>
parents: 1487
diff changeset
1 import std/sequtils
3ce7c132fdac did: improvments
sam <sam@basx.dev>
parents: 1487
diff changeset
2 import std/enumutils
1487
f786797a0cbe did: stuff
sam <sam@basx.dev>
parents: 1486
diff changeset
3 import std/tables
1485
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
4 import std/strutils
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
5 import std/logging
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
6 import std/os
1485
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
7
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
8 include ./vkapi
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
9
1489
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
10 # =============================================================================
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
11 # UTILS =======================================================================
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
12 # =============================================================================
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
13
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
14 if not defined(release):
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
15 addHandler(newConsoleLogger())
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
16 addHandler(newFileLogger("svk.log"))
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
17
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
18 # log level
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
19 when defined(release):
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
20 const LOGLEVEL {.strdefine.}: string = "Warn"
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
21 else:
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
22 const LOGLEVEL {.strdefine.}: string = "Debug"
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
23 setLogFilter(parseEnum[Level]("lvl" & LOGLEVEL))
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
24
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
25 template debugAssert(arg: untyped): untyped =
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
26 when not defined(release):
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
27 assert arg
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
28
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
29 # we will support vulkan 1.2 for maximum portability
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
30 const VULKAN_VERSION = VK_MAKE_API_VERSION(0, 1, 2, 0)
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
31
1488
3ce7c132fdac did: improvments
sam <sam@basx.dev>
parents: 1487
diff changeset
32 iterator items*[T: HoleyEnum](E: typedesc[T]): T =
3ce7c132fdac did: improvments
sam <sam@basx.dev>
parents: 1487
diff changeset
33 for a in enumFullRange(E):
3ce7c132fdac did: improvments
sam <sam@basx.dev>
parents: 1487
diff changeset
34 yield a
3ce7c132fdac did: improvments
sam <sam@basx.dev>
parents: 1487
diff changeset
35
1485
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
36 template checkVkResult*(call: untyped) =
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
37 when defined(release):
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
38 discard call
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
39 else:
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
40 # yes, a bit cheap, but this is only for nice debug output
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
41 var callstr = astToStr(call).replace("\n", "")
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
42 while callstr.find(" ") >= 0:
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
43 callstr = callstr.replace(" ", " ")
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
44 debug "Calling vulkan: ", callstr
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
45 let value = call
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
46 if value != VK_SUCCESS:
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
47 error "Vulkan error: ", astToStr(call), " returned ", $value
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
48 raise newException(
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
49 Exception, "Vulkan error: " & astToStr(call) & " returned " & $value
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
50 )
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
51
1489
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
52 # =============================================================================
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
53 # PLATFORM TYPES ==============================================================
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
54 # =============================================================================
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
55
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
56 when defined(windows):
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
57 type NativeWindow* = object
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
58 hinstance*: HINSTANCE
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
59 hwnd*: HWND
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
60 g_wpPrev*: WINDOWPLACEMENT
1490
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
61
1489
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
62 else:
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
63 type NativeWindow* = object
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
64 display*: ptr Display
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
65 window*: Window
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
66 emptyCursor*: Cursor
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
67 ic*: XIC
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
68
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
69 # =============================================================================
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
70 # VULKAN INSTANCE =============================================================
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
71 # =============================================================================
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
72
1485
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
73 type SVkInstance* = object
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
74 vkInstance: VkInstance
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
75 debugMessenger: VkDebugUtilsMessengerEXT
1489
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
76 window: NativeWindow
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
77 vkSurface*: VkSurfaceKHR
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
78
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
79 proc createWindow(title: string): NativeWindow
1485
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
80
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
81 proc `=copy`(a: var SVkInstance, b: SVkInstance) {.error.}
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
82
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
83 proc `=destroy`(a: SVkInstance) =
1489
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
84 debugAssert a.vkInstance.pointer == nil
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
85 debugAssert a.vkSurface.pointer == nil
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
86 debugAssert a.debugMessenger.pointer == nil
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
87
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
88 proc destroy*(a: var SVkInstance) =
1485
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
89 if a.vkInstance.pointer != nil:
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
90 if a.debugMessenger.pointer != nil:
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
91 vkDestroyDebugUtilsMessengerEXT(a.vkInstance, a.debugMessenger, nil)
1489
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
92 a.debugMessenger = VkDebugUtilsMessengerEXT(nil)
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
93 vkDestroySurfaceKHR(a.vkInstance, a.vkSurface, nil)
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
94 a.vkSurface = VkSurfaceKHR(nil)
1485
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
95 a.vkInstance.vkDestroyInstance(nil)
1489
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
96 a.vkInstance = VkInstance(nil)
1485
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
97
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
98 proc debugCallback(
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
99 messageSeverity: VkDebugUtilsMessageSeverityFlagBitsEXT,
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
100 messageTypes: VkDebugUtilsMessageTypeFlagsEXT,
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
101 pCallbackData: ptr VkDebugUtilsMessengerCallbackDataEXT,
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
102 userData: pointer,
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
103 ): VkBool32 {.cdecl.} =
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
104 const LOG_LEVEL_MAPPING = {
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
105 VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT: lvlDebug,
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
106 VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT: lvlInfo,
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
107 VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT: lvlWarn,
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
108 VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT: lvlError,
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
109 }.toTable
1489
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
110 log LOG_LEVEL_MAPPING[messageSeverity], "SVK-LOG: ", $pCallbackData.pMessage
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
111 if messageSeverity == VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT:
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
112 let errorMsg = $pCallbackData.pMessage & ": " & getStackTrace()
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
113 raise newException(Exception, errorMsg)
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
114 return VK_FALSE
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
115
1485
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
116 proc svkCreateInstance*(
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
117 applicationName: string,
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
118 enabledLayers: openArray[string] = [],
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
119 enabledExtensions: openArray[string] =
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
120 if defined(release):
1489
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
121 if defined(windows):
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
122 @["VK_KHR_surface", "VK_KHR_win32_surface"]
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
123 else:
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
124 @["VK_KHR_surface", "VK_KHR_xlib_surface"]
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
125 else:
1489
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
126 if defined(windows):
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
127 @["VK_KHR_surface", "VK_EXT_debug_utils", "VK_KHR_win32_surface"]
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
128 else:
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
129 @["VK_KHR_surface", "VK_EXT_debug_utils", "VK_KHR_xlib_surface"],
1485
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
130 engineName = "semicongine",
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
131 ): SVkInstance =
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
132 putEnv("VK_LOADER_LAYERS_ENABLE", "*validation")
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
133 putEnv(
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
134 "VK_LAYER_ENABLES",
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
135 "VALIDATION_CHECK_ENABLE_VENDOR_SPECIFIC_AMD,VALIDATION_CHECK_ENABLE_VENDOR_SPECIFIC_NVIDIA,VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION_EXTVK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT,VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION_EXT",
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
136 )
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
137 initVulkanLoader()
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
138
1489
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
139 var allLayers = @enabledLayers
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
140 when not defined(release):
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
141 allLayers.add "VK_LAYER_KHRONOS_validation"
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
142
1485
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
143 let
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
144 appinfo = VkApplicationInfo(
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
145 pApplicationName: applicationName,
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
146 pEngineName: engineName,
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
147 apiVersion: VULKAN_VERSION,
1485
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
148 )
1489
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
149 enabledLayersC = allocCStringArray(allLayers)
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
150 enabledExtensionsC = allocCStringArray(enabledExtensions)
1485
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
151 createinfo = VkInstanceCreateInfo(
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
152 pApplicationInfo: addr appinfo,
1489
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
153 enabledLayerCount: allLayers.len.uint32,
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
154 ppEnabledLayerNames: enabledLayersC,
1485
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
155 enabledExtensionCount: enabledExtensions.len.uint32,
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
156 ppEnabledExtensionNames: enabledExtensionsC,
1485
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
157 )
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
158 checkVkResult vkCreateInstance(addr createinfo, nil, addr result.vkInstance)
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
159
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
160 enabledLayersC.deallocCStringArray()
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
161 enabledExtensionsC.deallocCStringArray()
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
162
1489
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
163 # only support up to vulkan 1.2 for maximum portability
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
164 load_VK_VERSION_1_0(result.vkInstance)
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
165 load_VK_VERSION_1_1(result.vkInstance)
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
166 load_VK_VERSION_1_2(result.vkInstance)
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
167
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
168 for extension in enabledExtensions:
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
169 loadExtension(result.vkInstance, extension)
1489
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
170 load_VK_KHR_swapchain(result.vkInstance)
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
171
1489
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
172 var allTypes: VkDebugUtilsMessageTypeFlagsEXT
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
173 for t in VkDebugUtilsMessageTypeFlagBitsEXT:
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
174 allTypes = allTypes or t
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
175 when not defined(release):
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
176 var debugMessengerCreateInfo = VkDebugUtilsMessengerCreateInfoEXT(
1490
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
177 messageSeverity:
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
178 VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT or
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
179 VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT or
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
180 VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT or
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
181 VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT,
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
182 messageType:
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
183 VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT or
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
184 VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT or
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
185 VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT,
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
186 pfnUserCallback: debugCallback,
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
187 )
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
188 checkVkResult vkCreateDebugUtilsMessengerEXT(
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
189 result.vkInstance, addr debugMessengerCreateInfo, nil, addr result.debugMessenger
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
190 )
1489
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
191
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
192 result.window = createWindow(applicationName)
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
193 when defined(windows):
1490
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
194 var surfaceCreateInfo =
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
195 VkWin32SurfaceCreateInfoKHR(hinstance: window.hinstance, hwnd: window.hwnd)
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
196 checkVkResult vkCreateWin32SurfaceKHR(
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
197 instance, addr surfaceCreateInfo, nil, addr result.vkSurface
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
198 )
1489
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
199 else:
1490
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
200 var surfaceCreateInfo = VkXlibSurfaceCreateInfoKHR(
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
201 dpy: result.window.display, window: result.window.window
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
202 )
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
203 checkVkResult result.vkInstance.vkCreateXlibSurfaceKHR(
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
204 addr surfaceCreateInfo, nil, addr result.vkSurface
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
205 )
1489
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
206
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
207 # =============================================================================
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
208 # PHYSICAL DEVICES ============================================================
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
209 # =============================================================================
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
210
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
211 type
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
212 SVkMemoryType* = object
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
213 size: uint64
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
214 deviceLocal: bool # fast for gpu access
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
215 hostCached: bool # fast for host access
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
216 hostVisible: bool # can use vkMapMemory
1490
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
217 hostCohorent: bool
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
218 # does *not* require vkFlushMappedMemoryRanges and vkInvalidateMappedMemoryRanges
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
219
1489
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
220 SVkQueueFamilies* = object
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
221 count: int
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
222 hasGraphics: bool # implies "hasTransfer"
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
223 hasCompute: bool # implies "hasTransfer"
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
224
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
225 SVkPhysicalDevice* = object
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
226 name*: string
1490
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
227 discreteGPU*: bool
1489
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
228 vkPhysicalDevice*: VkPhysicalDevice
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
229 vkPhysicalDeviceFeatures*: VkPhysicalDeviceFeatures
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
230 vkPhysicalDeviceProperties*: VkPhysicalDeviceProperties
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
231 memoryTypes*: seq[SVkMemoryType]
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
232 queueFamily*: uint32
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
233
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
234 proc getUsablePhysicalDevices*(instance: SVkInstance): seq[SVkPhysicalDevice] =
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
235 var nDevices: uint32
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
236 checkVkResult instance.vkInstance.vkEnumeratePhysicalDevices(addr nDevices, nil)
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
237 var devices = newSeq[VkPhysicalDevice](nDevices)
1490
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
238 checkVkResult instance.vkInstance.vkEnumeratePhysicalDevices(
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
239 addr nDevices, addr devices[0]
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
240 )
1489
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
241 for d in devices:
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
242 var dev = SVkPhysicalDevice(vkPhysicalDevice: d)
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
243 d.vkGetPhysicalDeviceFeatures(addr dev.vkPhysicalDeviceFeatures)
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
244 d.vkGetPhysicalDeviceProperties(addr dev.vkPhysicalDeviceProperties)
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
245
1490
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
246 if dev.vkPhysicalDeviceProperties.deviceType notin
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
247 [VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU]:
1489
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
248 continue
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
249 dev.name = $cast[cstring](addr dev.vkPhysicalDeviceProperties.deviceName[0])
1490
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
250 dev.discreteGPU =
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
251 dev.vkPhysicalDeviceProperties.deviceType == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU
1489
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
252
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
253 var memoryProperties: VkPhysicalDeviceMemoryProperties
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
254 d.vkGetPhysicalDeviceMemoryProperties(addr memoryProperties)
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
255 for i in 0 ..< memoryProperties.memoryTypeCount:
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
256 let heapI = memoryProperties.memoryTypes[i].heapIndex
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
257 dev.memoryTypes.add SVkMemoryType(
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
258 size: memoryProperties.memoryHeaps[heapI].size.uint64,
1490
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
259 deviceLocal:
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
260 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT in
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
261 memoryProperties.memoryTypes[i].propertyFlags,
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
262 hostCached:
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
263 VK_MEMORY_PROPERTY_HOST_CACHED_BIT in
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
264 memoryProperties.memoryTypes[i].propertyFlags,
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
265 hostVisible:
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
266 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT in
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
267 memoryProperties.memoryTypes[i].propertyFlags,
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
268 hostCohorent:
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
269 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT in
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
270 memoryProperties.memoryTypes[i].propertyFlags,
1489
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
271 )
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
272
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
273 var familyQueueCount: uint32
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
274 var vkQueueFamilyProperties: seq[VkQueueFamilyProperties]
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
275 d.vkGetPhysicalDeviceQueueFamilyProperties(addr familyQueueCount, nil)
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
276 vkQueueFamilyProperties.setLen(familyQueueCount)
1490
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
277 d.vkGetPhysicalDeviceQueueFamilyProperties(
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
278 addr familyQueueCount, addr vkQueueFamilyProperties[0]
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
279 )
1489
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
280 dev.queueFamily = high(uint32)
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
281 for i in 0 ..< familyQueueCount:
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
282 let hasGraphics = VK_QUEUE_GRAPHICS_BIT in vkQueueFamilyProperties[i].queueFlags
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
283 let hasCompute = VK_QUEUE_COMPUTE_BIT in vkQueueFamilyProperties[i].queueFlags
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
284 let hasPresentation = VK_FALSE
1490
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
285 checkVkResult dev.vkPhysicalDevice.vkGetPhysicalDeviceSurfaceSupportKHR(
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
286 i, instance.vkSurface, addr hasPresentation
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
287 )
1489
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
288
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
289 if hasGraphics and hasCompute and bool(hasPresentation):
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
290 dev.queueFamily = i
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
291 break
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
292 if dev.queueFamily == high(uint32):
1490
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
293 raise newException(
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
294 Exception,
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
295 "Did not find queue family with graphics, compute and presentation support!",
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
296 )
1489
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
297
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
298 result.add dev
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
299
1490
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
300 # =============================================================================
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
301 # DEVICES =====================================================================
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
302 # =============================================================================
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
303
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
304 type SVkDevice* = object
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
305 vkDevice: VkDevice
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
306 vkQueue: VkQueue
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
307
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
308 proc `=copy`(a: var SVkDevice, b: SVkDevice) {.error.}
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
309
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
310 proc `=destroy`(a: SVkDevice) =
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
311 debugAssert a.vkDevice.pointer == nil
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
312 debugAssert a.vkQueue.pointer == nil
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
313
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
314 proc destroy*(a: var SVkDevice) =
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
315 if a.vkDevice.pointer != nil:
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
316 vkDestroyDevice(a.vkDevice, nil)
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
317 a.vkDevice = VkDevice(nil)
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
318 a.vkQueue = VkQueue(nil)
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
319
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
320 proc svkCreateDevice*(
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
321 instance: SVkInstance, physicalDevice: SVkPhysicalDevice
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
322 ): SVkDevice =
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
323 let
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
324 priority = cfloat(1)
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
325 queueInfo = VkDeviceQueueCreateInfo(
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
326 queueFamilyIndex: physicalDevice.queueFamily,
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
327 queueCount: 1,
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
328 pQueuePriorities: addr priority,
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
329 )
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
330 deviceExtensions = @["VK_KHR_swapchain"]
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
331 deviceExtensionsC = allocCStringArray(deviceExtensions)
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
332 enabledFeatures = VkPhysicalDeviceFeatures(
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
333 fillModeNonSolid: VK_TRUE,
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
334 depthClamp: VK_TRUE,
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
335 wideLines: VK_TRUE,
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
336 largePoints: VK_TRUE,
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
337 )
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
338 vk8bitExt = VkPhysicalDevice8BitStorageFeatures(
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
339 storageBuffer8BitAccess: VK_TRUE,
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
340 uniformAndStorageBuffer8BitAccess: VK_TRUE,
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
341 storagePushConstant8: VK_TRUE,
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
342 )
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
343 vk16bitExt = VkPhysicalDevice16BitStorageFeatures(
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
344 storageBuffer16BitAccess: VK_TRUE,
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
345 uniformAndStorageBuffer16BitAccess: VK_TRUE,
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
346 storagePushConstant16: VK_TRUE,
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
347 storageInputOutput16: VK_FALSE,
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
348 pNext: addr vk8bitExt,
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
349 )
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
350 createDeviceInfo = VkDeviceCreateInfo(
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
351 queueCreateInfoCount: 1,
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
352 pQueueCreateInfos: addr queueInfo,
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
353 enabledLayerCount: 0,
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
354 ppEnabledLayerNames: nil,
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
355 enabledExtensionCount: 1,
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
356 ppEnabledExtensionNames: deviceExtensionsC,
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
357 pEnabledFeatures: addr enabledFeatures,
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
358 pNext: addr vk16bitExt,
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
359 )
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
360 checkVkResult vkCreateDevice(
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
361 physicalDevice = physicalDevice.vkPhysicalDevice,
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
362 pCreateInfo = addr createDeviceInfo,
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
363 pAllocator = nil,
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
364 pDevice = addr result.vkDevice,
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
365 )
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
366 deviceExtensionsC.deallocCStringArray()
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
367 result.vkDevice.vkGetDeviceQueue(physicalDevice.queueFamily, 0, addr result.vkQueue)
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
368
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
369 # =============================================================================
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
370 # PLATFORM UTILS ==============================================================
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
371 # =============================================================================
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
372
1489
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
373 when defined(windows):
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
374 proc createWindow(title: string): NativeWindow =
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
375 result.hInstance = HINSTANCE(GetModuleHandle(nil))
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
376 var
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
377 windowClassName = T"EngineWindowClass"
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
378 windowName = T(title)
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
379 windowClass = WNDCLASSEX(
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
380 cbSize: UINT(WNDCLASSEX.sizeof),
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
381 lpfnWndProc: windowHandler,
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
382 hInstance: result.hInstance,
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
383 lpszClassName: windowClassName,
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
384 hcursor: currentCursor,
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
385 )
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
386
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
387 if (RegisterClassEx(addr(windowClass)) == 0):
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
388 raise newException(Exception, "Unable to register window class")
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
389
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
390 result.hwnd = CreateWindowEx(
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
391 DWORD(0),
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
392 windowClassName,
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
393 windowName,
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
394 DWORD(WS_OVERLAPPEDWINDOW),
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
395 CW_USEDEFAULT,
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
396 CW_USEDEFAULT,
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
397 CW_USEDEFAULT,
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
398 CW_USEDEFAULT,
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
399 HMENU(0),
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
400 HINSTANCE(0),
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
401 result.hInstance,
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
402 nil,
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
403 )
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
404
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
405 result.g_wpPrev.length = UINT(sizeof(WINDOWPLACEMENT))
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
406 discard result.hwnd.ShowWindow(SW_SHOW)
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
407 discard result.hwnd.SetForegroundWindow()
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
408 discard result.hwnd.SetFocus()
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
409
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
410 proc destroyWindow*(window: NativeWindow) =
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
411 DestroyWindow(window.hwnd)
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
412
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
413 else:
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
414 import ../semicongine/thirdparty/x11/xkblib
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
415 import ../semicongine/thirdparty/x11/xutil
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
416
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
417 var deleteMessage* {.hint[GlobalVar]: off.}: x.Atom # one internal use, not serious
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
418
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
419 proc XErrorLogger(display: PDisplay, event: PXErrorEvent): cint {.cdecl.} =
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
420 logging.error "Xlib: " & $event[]
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
421
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
422 proc createWindow(title: string): NativeWindow =
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
423 doAssert XInitThreads() != 0
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
424 let display = XOpenDisplay(nil)
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
425 if display == nil:
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
426 quit "Failed to open display"
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
427 discard XSetErrorHandler(XErrorLogger)
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
428
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
429 let screen = display.XDefaultScreen()
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
430 let rootWindow = display.XRootWindow(screen)
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
431 let vis = display.XDefaultVisual(screen)
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
432 discard display.XkbSetDetectableAutoRepeat(true, nil)
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
433 var
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
434 attribs: XWindowAttributes
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
435 width = cuint(800)
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
436 height = cuint(600)
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
437 doAssert display.XGetWindowAttributes(rootWindow, addr(attribs)) != 0
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
438
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
439 var attrs = XSetWindowAttributes(
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
440 event_mask:
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
441 FocusChangeMask or KeyPressMask or KeyReleaseMask or ExposureMask or
1490
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
442 VisibilityChangeMask or StructureNotifyMask or ButtonMotionMask or
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
443 ButtonPressMask or ButtonReleaseMask
1489
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
444 )
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
445 let window = display.XCreateWindow(
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
446 rootWindow,
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
447 (attribs.width - cint(width)) div 2,
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
448 (attribs.height - cint(height)) div 2,
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
449 width,
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
450 height,
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
451 0,
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
452 display.XDefaultDepth(screen),
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
453 InputOutput,
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
454 vis,
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
455 CWEventMask,
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
456 addr(attrs),
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
457 )
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
458 doAssert display.XSetStandardProperties(window, title, "window", 0, nil, 0, nil) != 0
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
459 # get an input context, to allow encoding of key-events to characters
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
460
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
461 let im = XOpenIM(display, nil, nil, nil)
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
462 assert im != nil
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
463 let ic = im.XCreateIC(XNInputStyle, XIMPreeditNothing or XIMStatusNothing, nil)
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
464 assert ic != nil
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
465
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
466 doAssert display.XMapWindow(window) != 0
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
467
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
468 deleteMessage = display.XInternAtom("WM_DELETE_WINDOW", XBool(false))
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
469 doAssert display.XSetWMProtocols(window, addr(deleteMessage), 1) != 0
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
470
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
471 var data = "\0".cstring
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
472 var pixmap = display.XCreateBitmapFromData(window, data, 1, 1)
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
473 var color: XColor
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
474 var empty_cursor =
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
475 display.XCreatePixmapCursor(pixmap, pixmap, addr(color), addr(color), 0, 0)
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
476 doAssert display.XFreePixmap(pixmap) != 0
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
477
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
478 discard display.XSync(0)
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
479
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
480 # wait until window is shown
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
481 var ev: XEvent
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
482 while ev.theType != MapNotify:
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
483 discard display.XNextEvent(addr(ev))
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
484
1490
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
485 result =
81da4be50663 did: some stuff
sam <sam@basx.dev>
parents: 1489
diff changeset
486 NativeWindow(display: display, window: window, emptyCursor: empty_cursor, ic: ic)
1489
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
487
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
488 proc destroyWindow*(window: NativeWindow) =
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
489 doAssert XDestroyWindow(window.display, window.window) != 0