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 )