annotate fuhtark_test/generate_vulkan_api.sh @ 1501:f40d9d814c08 default tip

did: correct vulkan-api generator
author sam <sam@basx.dev>
date Wed, 26 Nov 2025 23:34:29 +0700
parents 91c8c3b7cbf0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1500
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
1 #!/bin/sh -e
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
2
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
3 # Variables
1501
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
4 VULKAN_VERSION=1.4.334
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
5 HOME_DIR=$( realpath $( dirname $0 ) )
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
6 BASE_INCLUDE="$HOME_DIR/include"
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
7 WIN_INCLUDE="$HOME_DIR/include/winapi"
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
8 VULKAN_INCLUDE="$HOME_DIR/Vulkan-Headers-$VULKAN_VERSION/include/vulkan"
1500
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
9 OUT_BIN=vulkan
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
10 OUTFILE=$OUT_BIN.nim
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
11 OUTFILE_FUTHARK=$OUT_BIN".gen.nim"
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
12
1501
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
13 # setup
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
14 # sudo apt install clang libclang-dev
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
15 # nimble install futhark
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
16 # rm -rf Vulkan-Headers-$VULKAN_VERSION
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
17 # curl -L https://github.com/KhronosGroup/Vulkan-Headers/archive/refs/tags/v$VULKAN_VERSION.tar.gz | tar -xzf -
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
18
1500
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
19 # Convert C-headers to Nim using Futhark, if not existing yet
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
20 NIM_GEN_CODE='import futhark, os
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
21 importc:
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
22 outputPath "'"$OUTFILE_FUTHARK"'"
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
23 define VK_USE_PLATFORM_WIN32_KHR
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
24 define VK_USE_PLATFORM_XLIB_KHR
1501
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
25 define VK_ENABLE_BETA_EXTENSIONS
1500
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
26 sysPath "'"$BASE_INCLUDE"'"
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
27 sysPath "'"$WIN_INCLUDE"'"
1501
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
28 path "'"$VULKAN_INCLUDE"'"
1500
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
29 "vulkan.h"'
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
30
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
31 if [ ! -f $OUTFILE_FUTHARK ] ; then
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
32 nim c --maxLoopIterationsVM:1000000000 --eval:"$NIM_GEN_CODE"
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
33 fi
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
34
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
35 cp $OUTFILE_FUTHARK $OUTFILE
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
36
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
37 # convert futhark's function definition to function pointers to allow loading functions at runtime
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
38 sed -i 's/^ proc \([a-zA-Z]*\*\)/ var \1: proc/' $OUTFILE
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
39 sed -i 's/[, ] importc: "vk[a-zA-Z]*"//' $OUTFILE
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
40
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
41 # ensure struct-name-definitions are on single line
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
42 # needed for correct parsing and setting of sType struct values in the next step
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
43 sed -i '/struct_Vk.*inheritable,$/{N;s/\n/ /}' $OUTFILE
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
44 sed -i '/struct_Vk.*pure,$/{N;s/\n/ /}' $OUTFILE
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
45 sed -i '/struct_Vk.* {\.$/{N;s/\n/ /}' $OUTFILE
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
46
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
47 # set default struct values for member "sType"
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
48 # not very clean, as we "abuse" the fact that Nim does not differentiate between camel-case and snake-case for identifiers
1501
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
49
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
50 # VkStructureType_1124073999 = (when declared(VkStructureType):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
51 TYPESTRUCTNAME=$( cat $OUTFILE | awk '/enum_VkStructureType\* =/ { print $3; }' )
1500
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
52 awk -i inplace '{
1501
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
53 if ( $0 ~ /^ struct_Vk.* = object/ && $0 !~ /VkBaseInStructure/ && $0 !~ /VkBaseOutStructure/ ) {
1500
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
54 split($0, arr, "_");
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
55 print $0;
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
56 getline;
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
57 if ( $0 ~ / sType\*:/ ) {
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
58 split($0, arr2, "##");
1501
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
59 print " sType*: '$TYPESTRUCTNAME' = '$TYPESTRUCTNAME'.VK_STRUCTURE_TYPE_" substr(arr[2], 3) " ##" arr2[2];
1500
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
60 } else {
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
61 print;
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
62 }
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
63 } else {
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
64 print;
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
65 }
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
66 }' $OUTFILE
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
67
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
68 # allow to printing Vulkan handles with Nim, as those are using pointer-types
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
69 cat $OUTFILE_FUTHARK | awk '/ = ptr struct_/ {print "proc `$`*(val: " $1 "): string = $(cast[int](val))"}' >> $OUTFILE
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
70
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
71 # add some helper functions, the vulkan loader and instance creation
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
72 cat <<EOF >> $OUTFILE
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
73
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
74 import std/dynlib
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
75 import std/strutils
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
76 import std/logging
1501
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
77 import std/envvars
1500
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
78
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
79 var vkInstance*: VkInstance = VkInstance(nil)
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
80 var vkPhysicalDevices: seq[VkPhysicalDevice]
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
81
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
82 template checkVkResult*(call: untyped) =
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
83 when defined(release):
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
84 discard call
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
85 else:
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
86 # yes, a bit cheap, but this is only for nice debug output
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
87 var callstr = astToStr(call).replace("\n", "")
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
88 while callstr.find(" ") >= 0:
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
89 callstr = callstr.replace(" ", " ")
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
90 debug "Calling vulkan: ", callstr
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
91 let value = call
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
92 if value != VK_SUCCESS:
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
93 error "Vulkan error: ", astToStr(call), " returned ", \$value
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
94 raise newException(
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
95 Exception, "Vulkan error: " & astToStr(call) & " returned " & \$value
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
96 )
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
97
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
98 proc loadFunc[T](instance: VkInstance, f: var T, name: string) =
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
99 f = cast[T](vkGetInstanceProcAddr(instance, name))
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
100
1501
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
101 proc hasValidationLayer*(): bool =
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
102 const val_layer = "VK_LAYER_KHRONOS_validation"
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
103 var n_layers: uint32
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
104 checkVkResult vkEnumerateInstanceLayerProperties(addr(n_layers), nil)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
105 if n_layers > 0:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
106 var layers = newSeq[VkLayerProperties](n_layers)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
107 checkVkResult vkEnumerateInstanceLayerProperties(addr(n_layers), addr layers[0])
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
108 for layer in layers:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
109 let layerName = \$(cast[cstring](addr layer.layerName[0]))
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
110 if layerName.startsWith(val_layer):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
111 return true
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
112 return false
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
113
1500
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
114 proc initVulkan*() =
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
115 if vkGetInstanceProcAddr != nil:
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
116 return
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
117
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
118 when defined(linux):
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
119 let vulkanLib = loadLib("libvulkan.so.1")
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
120 when defined(windows):
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
121 let vulkanLib = loadLib("vulkan-1.dll")
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
122 if vulkanLib == nil:
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
123 raise newException(Exception, "Unable to load vulkan library")
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
124
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
125 # load function-pointer resolver function
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
126 vkGetInstanceProcAddr = cast[typeof(vkGetInstanceProcAddr)](checkedSymAddr(vulkanLib, "vkGetInstanceProcAddr"))
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
127
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
128 # need to create an instance before loading other function points
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
129 loadFunc(vkInstance, vkCreateInstance, "vkCreateInstance")
1501
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
130 # and this one, to check which layers are available for instance creation
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
131 loadFunc(vkInstance, vkEnumerateInstanceLayerProperties, "vkEnumerateInstanceLayerProperties")
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
132
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
133 # extensions
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
134 var extensions = @["VK_KHR_surface"]
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
135 when not defined(release):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
136 extensions.add "VK_EXT_debug_utils"
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
137 when defined(windows):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
138 extensions.add "VK_KHR_win32_surface"
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
139 when defined(linux):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
140 extensions.add "VK_KHR_xlib_surface"
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
141 let extensionsC = allocCStringArray(extensions)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
142 defer: deallocCStringArray(extensionsC)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
143
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
144 # layers
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
145 var layers: seq[string]
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
146 when not defined(release):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
147 if hasValidationLayer():
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
148 layers.add "VK_LAYER_KHRONOS_validation"
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
149 var layersC = allocCStringArray(layers)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
150 defer: deallocCStringArray(layersC)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
151
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
152 putEnv(
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
153 "VK_LAYER_ENABLES",
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
154 "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",
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
155 )
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
156
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
157 echo "Use instance extensions: ", extensions
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
158 echo "Use layers: ", layers
1500
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
159 let createInfo = VkInstanceCreateInfo(
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
160 pNext: nil,
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
161 flags: 0,
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
162 pApplicationInfo: nil,
1501
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
163 enabledLayerCount: layers.len.uint32,
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
164 ppEnabledLayerNames: cast[ptr cstring](layersC),
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
165 enabledExtensionCount: extensions.len.uint32,
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents: 1500
diff changeset
166 ppEnabledExtensionNames: cast[ptr cstring](extensionsC),
1500
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
167 )
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
168 checkVkResult vkCreateInstance(addr createInfo, nil, addr vkInstance)
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
169
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
170 # load all functions (some might be null, not checking here)
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
171 EOF
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
172
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
173 cat vulkan.nim | grep -o '^ var vk[a-zA-Z]*' | grep -v vkInstance | grep -v vkGetInstanceProcAddr | grep -v vkCreateInstance | awk '{print " loadFunc(vkInstance, " $2 ", \"" $2 "\")"}' >> $OUTFILE
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
174
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
175 cat <<EOF >> $OUTFILE
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
176
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
177 # load and print all found devices
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
178 var nPhysicalDevices: uint32
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
179 checkVkResult vkEnumeratePhysicalDevices(vkInstance, addr nPhysicalDevices, nil)
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
180
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
181 if nPhysicalDevices > 0:
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
182 vkPhysicalDevices.setLen(nPhysicalDevices)
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
183 checkVkResult vkEnumeratePhysicalDevices(vkInstance, addr nPhysicalDevices, addr vkPhysicalDevices[0])
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
184 vkPhysicalDevices.setLen(nPhysicalDevices)
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
185 echo "physical devices: ", vkPhysicalDevices
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
186
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
187 proc destroyVulkan*() =
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
188 vkDestroyInstance(vkInstance, nil)
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
189
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
190 initVulkan()
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
191 EOF
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
192
91c8c3b7cbf0 add: futhark tests for generating vulkan api
sam <sam@basx.dev>
parents:
diff changeset
193 nim c --run ./$OUTFILE && rm ./$OUT_BIN