comparison svk/api.nim @ 1485:6e062a84c157

add: more api-starting
author sam <sam@basx.dev>
date Sat, 03 May 2025 01:03:01 +0700
parents
children 0ba3f0b2be2e
comparison
equal deleted inserted replaced
1484:a2af327f19df 1485:6e062a84c157
1 import std/strutils
2 import std/logging
3
4 include ./vkapi
5
6 template checkVkResult*(call: untyped) =
7 when defined(release):
8 discard call
9 else:
10 # yes, a bit cheap, but this is only for nice debug output
11 var callstr = astToStr(call).replace("\n", "")
12 while callstr.find(" ") >= 0:
13 callstr = callstr.replace(" ", " ")
14 debug "Calling vulkan: ", callstr
15 let value = call
16 if value != VK_SUCCESS:
17 error "Vulkan error: ", astToStr(call), " returned ", $value
18 raise newException(
19 Exception, "Vulkan error: " & astToStr(call) & " returned " & $value
20 )
21
22 type SVkInstance* = object
23 vkInstance: VkInstance
24
25 proc `=copy`(a: var SVkInstance, b: SVkInstance) {.error.}
26
27 proc `=destroy`(a: SVkInstance) =
28 if a.vkInstance.pointer != nil:
29 a.vkInstance.vkDestroyInstance(nil)
30
31 proc svkCreateInstance*(
32 applicationName: string,
33 enabledLayers: openArray[string] = [],
34 enabledExtensions: openArray[string] = [],
35 engineName = "semicongine",
36 majorVersion = 1'u32,
37 minorVersion = 3'u32,
38 ): SVkInstance =
39 let
40 appinfo = VkApplicationInfo(
41 pApplicationName: applicationName,
42 pEngineName: engineName,
43 apiVersion: VK_MAKE_API_VERSION(0, majorVersion, minorVersion, 0),
44 )
45 layersC = enabledLayers.allocCStringArray()
46 extensionsC = enabledLayers.allocCStringArray()
47 createinfo = VkInstanceCreateInfo(
48 pApplicationInfo: addr appinfo,
49 enabledLayerCount: enabledLayers.len.uint32,
50 ppEnabledLayerNames: layersC,
51 enabledExtensionCount: enabledExtensions.len.uint32,
52 ppEnabledExtensionNames: extensionsC,
53 )
54 checkVkResult vkCreateInstance(addr createinfo, nil, addr result.vkInstance)
55 layersC.deallocCStringArray()
56 extensionsC.deallocCStringArray()