annotate svk/api.nim @ 1488:3ce7c132fdac default tip

did: improvments
author sam <sam@basx.dev>
date Sun, 18 May 2025 16:36:52 +0700
parents f786797a0cbe
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
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
10 const VULKAN_VERSION = VK_MAKE_API_VERSION(0, 1, 3, 0)
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
11
1488
3ce7c132fdac did: improvments
sam <sam@basx.dev>
parents: 1487
diff changeset
12 iterator items*[T: HoleyEnum](E: typedesc[T]): T =
3ce7c132fdac did: improvments
sam <sam@basx.dev>
parents: 1487
diff changeset
13 for a in enumFullRange(E):
3ce7c132fdac did: improvments
sam <sam@basx.dev>
parents: 1487
diff changeset
14 yield a
3ce7c132fdac did: improvments
sam <sam@basx.dev>
parents: 1487
diff changeset
15
1485
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
16 template checkVkResult*(call: untyped) =
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
17 when defined(release):
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
18 discard call
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
19 else:
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
20 # yes, a bit cheap, but this is only for nice debug output
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
21 var callstr = astToStr(call).replace("\n", "")
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
22 while callstr.find(" ") >= 0:
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
23 callstr = callstr.replace(" ", " ")
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
24 debug "Calling vulkan: ", callstr
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
25 let value = call
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
26 if value != VK_SUCCESS:
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
27 error "Vulkan error: ", astToStr(call), " returned ", $value
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
28 raise newException(
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
29 Exception, "Vulkan error: " & astToStr(call) & " returned " & $value
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
30 )
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
31
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
32 type SVkInstance* = object
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
33 vkInstance: VkInstance
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
34 debugMessenger: VkDebugUtilsMessengerEXT
1485
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
35
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
36 proc `=copy`(a: var SVkInstance, b: SVkInstance) {.error.}
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
37
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
38 proc `=destroy`(a: SVkInstance) =
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
39 if a.vkInstance.pointer != nil:
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
40 if a.debugMessenger.pointer != nil:
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
41 vkDestroyDebugUtilsMessengerEXT(a.vkInstance, a.debugMessenger, nil)
1485
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
42 a.vkInstance.vkDestroyInstance(nil)
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
43
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
44 proc debugCallback(
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
45 messageSeverity: VkDebugUtilsMessageSeverityFlagBitsEXT,
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
46 messageTypes: VkDebugUtilsMessageTypeFlagsEXT,
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
47 pCallbackData: ptr VkDebugUtilsMessengerCallbackDataEXT,
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
48 userData: pointer,
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
49 ): VkBool32 {.cdecl.} =
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
50 const LOG_LEVEL_MAPPING = {
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
51 VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT: lvlDebug,
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
52 VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT: lvlInfo,
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
53 VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT: lvlWarn,
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
54 VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT: lvlError,
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
55 }.toTable
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
56 log LOG_LEVEL_MAPPING[messageSeverity]
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
57 if messageSeverity == VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT:
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
58 # stderr.write getStackTrace()
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
59 # stderr.writeLine LOG_LEVEL_MAPPING[messageSeverity], &"{toEnums messageTypes}: {pCallbackData.pMessage}"
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
60 let errorMsg = $pCallbackData.pMessage & ": " & getStackTrace()
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
61 raise newException(Exception, errorMsg)
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
62 return VK_FALSE
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
63
1485
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
64 proc svkCreateInstance*(
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
65 applicationName: string,
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
66 enabledLayers: openArray[string] = [],
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
67 enabledExtensions: openArray[string] =
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
68 if defined(release):
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
69 @["VK_KHR_surface"]
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
70 else:
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
71 @["VK_KHR_surface", "VK_EXT_debug_utils"],
1485
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
72 engineName = "semicongine",
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
73 withSwapchain = true,
1485
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
74 ): SVkInstance =
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
75 putEnv("VK_LOADER_LAYERS_ENABLE", "*validation")
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
76 putEnv(
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
77 "VK_LAYER_ENABLES",
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
78 "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
79 )
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
80 initVulkanLoader()
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
81
1485
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
82 let
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
83 appinfo = VkApplicationInfo(
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
84 pApplicationName: applicationName,
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
85 pEngineName: engineName,
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
86 apiVersion: VULKAN_VERSION,
1485
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
87 )
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
88 enabledLayersC = allocCStringArray(enabledLayers)
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
89 enabledExtensionsC = allocCStringArray(enabledExtensions)
1485
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
90 createinfo = VkInstanceCreateInfo(
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
91 pApplicationInfo: addr appinfo,
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
92 enabledLayerCount: enabledLayers.len.uint32,
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
93 ppEnabledLayerNames: enabledLayersC,
1485
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
94 enabledExtensionCount: enabledExtensions.len.uint32,
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
95 ppEnabledExtensionNames: enabledExtensionsC,
1485
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
96 )
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents:
diff changeset
97 checkVkResult vkCreateInstance(addr createinfo, nil, addr result.vkInstance)
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
98
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
99 enabledLayersC.deallocCStringArray()
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
100 enabledExtensionsC.deallocCStringArray()
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
101
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
102 load_VK_VERSION_1_0(result.vkInstance)
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
103 load_VK_VERSION_1_1(result.vkInstance)
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
104 load_VK_VERSION_1_2(result.vkInstance)
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
105 load_VK_VERSION_1_3(result.vkInstance)
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
106
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
107 for extension in enabledExtensions:
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
108 loadExtension(result.vkInstance, extension)
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
109 if withSwapchain:
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
110 load_VK_KHR_swapchain(result.vkInstance)
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
111
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
112 when not defined(release):
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
113 var debugMessengerCreateInfo = VkDebugUtilsMessengerCreateInfoEXT(
1488
3ce7c132fdac did: improvments
sam <sam@basx.dev>
parents: 1487
diff changeset
114 messageSeverity: VkDebugUtilsMessageSeverityFlagBitsEXT.items.toSeq,
3ce7c132fdac did: improvments
sam <sam@basx.dev>
parents: 1487
diff changeset
115 messageType: VkDebugUtilsMessageTypeFlagBitsEXT.items.toSeq,
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
116 pfnUserCallback: debugCallback,
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
117 )
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
118 checkVkResult vkCreateDebugUtilsMessengerEXT(
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
119 result.vkInstance, addr debugMessengerCreateInfo, nil, addr result.debugMessenger
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
120 )