1485
|
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()
|