Mercurial > games > semicongine
comparison svk/api.nim @ 1486:0ba3f0b2be2e
did: more
| author | sam <sam@basx.dev> |
|---|---|
| date | Sat, 03 May 2025 20:16:04 +0700 |
| parents | 6e062a84c157 |
| children | f786797a0cbe |
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 ) |
