Mercurial > games > semicongine
comparison svk/api.nim @ 1486:0ba3f0b2be2e default tip main
did: more
author | sam <sam@basx.dev> |
---|---|
date | Sat, 03 May 2025 20:16:04 +0700 |
parents | 6e062a84c157 |
children |
comparison
equal
deleted
inserted
replaced
1485:6e062a84c157 | 1486:0ba3f0b2be2e |
---|---|
1 import std/strutils | 1 import std/strutils |
2 import std/logging | 2 import std/logging |
3 import std/os | |
3 | 4 |
4 include ./vkapi | 5 include ./vkapi |
6 | |
7 const VULKAN_VERSION = VK_MAKE_API_VERSION(0, 1, 3, 0) | |
5 | 8 |
6 template checkVkResult*(call: untyped) = | 9 template checkVkResult*(call: untyped) = |
7 when defined(release): | 10 when defined(release): |
8 discard call | 11 discard call |
9 else: | 12 else: |
19 Exception, "Vulkan error: " & astToStr(call) & " returned " & $value | 22 Exception, "Vulkan error: " & astToStr(call) & " returned " & $value |
20 ) | 23 ) |
21 | 24 |
22 type SVkInstance* = object | 25 type SVkInstance* = object |
23 vkInstance: VkInstance | 26 vkInstance: VkInstance |
27 debugMessenger: VkDebugUtilsMessengerEXT | |
24 | 28 |
25 proc `=copy`(a: var SVkInstance, b: SVkInstance) {.error.} | 29 proc `=copy`(a: var SVkInstance, b: SVkInstance) {.error.} |
26 | 30 |
27 proc `=destroy`(a: SVkInstance) = | 31 proc `=destroy`(a: SVkInstance) = |
28 if a.vkInstance.pointer != nil: | 32 if a.vkInstance.pointer != nil: |
33 if a.debugMessenger.pointer != nil: | |
34 vkDestroyDebugUtilsMessengerEXT(a.vkInstance, a.debugMessenger, nil) | |
29 a.vkInstance.vkDestroyInstance(nil) | 35 a.vkInstance.vkDestroyInstance(nil) |
36 | |
37 proc debugCallback( | |
38 messageSeverity: VkDebugUtilsMessageSeverityFlagBitsEXT, | |
39 messageTypes: VkDebugUtilsMessageTypeFlagsEXT, | |
40 pCallbackData: ptr VkDebugUtilsMessengerCallbackDataEXT, | |
41 userData: pointer, | |
42 ): VkBool32 {.cdecl.} = | |
43 const LOG_LEVEL_MAPPING = { | |
44 VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT: lvlDebug, | |
45 VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT: lvlInfo, | |
46 VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT: lvlWarn, | |
47 VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT: lvlError, | |
48 }.toTable | |
49 log LOG_LEVEL_MAPPING[messageSeverity] | |
50 if messageSeverity == VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT: | |
51 # stderr.write getStackTrace() | |
52 # stderr.writeLine LOG_LEVEL_MAPPING[messageSeverity], &"{toEnums messageTypes}: {pCallbackData.pMessage}" | |
53 let errorMsg = $pCallbackData.pMessage & ": " & getStackTrace() | |
54 raise newException(Exception, errorMsg) | |
55 return VK_FALSE | |
30 | 56 |
31 proc svkCreateInstance*( | 57 proc svkCreateInstance*( |
32 applicationName: string, | 58 applicationName: string, |
33 enabledLayers: openArray[string] = [], | 59 enabledLayers: openArray[string] = [], |
34 enabledExtensions: openArray[string] = [], | 60 enabledExtensions: openArray[string] = |
61 if defined(release): | |
62 @["VK_KHR_surface"] | |
63 else: | |
64 @["VK_KHR_surface", "VK_EXT_debug_utils"], | |
35 engineName = "semicongine", | 65 engineName = "semicongine", |
36 majorVersion = 1'u32, | 66 withSwapchain = true, |
37 minorVersion = 3'u32, | |
38 ): SVkInstance = | 67 ): SVkInstance = |
68 putEnv("VK_LOADER_LAYERS_ENABLE", "*validation") | |
69 putEnv( | |
70 "VK_LAYER_ENABLES", | |
71 "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", | |
72 ) | |
73 initVulkanLoader() | |
74 | |
39 let | 75 let |
40 appinfo = VkApplicationInfo( | 76 appinfo = VkApplicationInfo( |
41 pApplicationName: applicationName, | 77 pApplicationName: applicationName, |
42 pEngineName: engineName, | 78 pEngineName: engineName, |
43 apiVersion: VK_MAKE_API_VERSION(0, majorVersion, minorVersion, 0), | 79 apiVersion: VULKAN_VERSION, |
44 ) | 80 ) |
45 layersC = enabledLayers.allocCStringArray() | 81 enabledLayersC = allocCStringArray(enabledLayers) |
46 extensionsC = enabledLayers.allocCStringArray() | 82 enabledExtensionsC = allocCStringArray(enabledExtensions) |
47 createinfo = VkInstanceCreateInfo( | 83 createinfo = VkInstanceCreateInfo( |
48 pApplicationInfo: addr appinfo, | 84 pApplicationInfo: addr appinfo, |
49 enabledLayerCount: enabledLayers.len.uint32, | 85 enabledLayerCount: enabledLayers.len.uint32, |
50 ppEnabledLayerNames: layersC, | 86 ppEnabledLayerNames: enabledLayersC, |
51 enabledExtensionCount: enabledExtensions.len.uint32, | 87 enabledExtensionCount: enabledExtensions.len.uint32, |
52 ppEnabledExtensionNames: extensionsC, | 88 ppEnabledExtensionNames: enabledExtensionsC, |
53 ) | 89 ) |
90 # this one we will load manually | |
54 checkVkResult vkCreateInstance(addr createinfo, nil, addr result.vkInstance) | 91 checkVkResult vkCreateInstance(addr createinfo, nil, addr result.vkInstance) |
55 layersC.deallocCStringArray() | 92 |
56 extensionsC.deallocCStringArray() | 93 enabledLayersC.deallocCStringArray() |
94 enabledExtensionsC.deallocCStringArray() | |
95 | |
96 load_VK_VERSION_1_0(result.vkInstance) | |
97 load_VK_VERSION_1_1(result.vkInstance) | |
98 load_VK_VERSION_1_2(result.vkInstance) | |
99 load_VK_VERSION_1_3(result.vkInstance) | |
100 | |
101 for extension in enabledExtensions: | |
102 loadExtension(result.vkInstance, extension) | |
103 if withSwapchain: | |
104 load_VK_KHR_swapchain(result.vkInstance) | |
105 | |
106 when not defined(release): | |
107 var debugMessengerCreateInfo = VkDebugUtilsMessengerCreateInfoEXT( | |
108 messageSeverity: VkDebugUtilsMessageSeverityFlagBitsEXT.items.toSeq.toBits, | |
109 messageType: VkDebugUtilsMessageTypeFlagBitsEXT.items.toSeq.toBits, | |
110 pfnUserCallback: debugCallback, | |
111 ) | |
112 checkVkResult vkCreateDebugUtilsMessengerEXT( | |
113 result.vkInstance, addr debugMessengerCreateInfo, nil, addr result.debugMessenger | |
114 ) |