Mercurial > games > semicongine
comparison src/vulkan_helpers.nim @ 1:bb2a7d3a7003
add: more steps in setup
author | Sam <sam@basx.dev> |
---|---|
date | Fri, 16 Dec 2022 00:05:41 +0700 |
parents | 5daf3f236d87 |
children | 213fdf8d31dd |
comparison
equal
deleted
inserted
replaced
0:5daf3f236d87 | 1:bb2a7d3a7003 |
---|---|
1 import std/tables | |
1 import std/strutils | 2 import std/strutils |
2 import std/enumerate | 3 |
3 import vulkan | 4 import ./glslang/glslang |
5 import ./vulkan | |
6 | |
4 | 7 |
5 when defined(release): | 8 when defined(release): |
6 const ENABLEVULKANVALIDATIONLAYERS = false | 9 const ENABLEVULKANVALIDATIONLAYERS = false |
7 else: | 10 else: |
8 const ENABLEVULKANVALIDATIONLAYERS = true | 11 const ENABLEVULKANVALIDATIONLAYERS = true |
14 raise newException(Exception, "Vulkan error: " & astToStr(call) & " returned " & $value) | 17 raise newException(Exception, "Vulkan error: " & astToStr(call) & " returned " & $value) |
15 | 18 |
16 | 19 |
17 proc VK_MAKE_API_VERSION*(variant: uint32, major: uint32, minor: uint32, patch: uint32): uint32 {.compileTime.} = | 20 proc VK_MAKE_API_VERSION*(variant: uint32, major: uint32, minor: uint32, patch: uint32): uint32 {.compileTime.} = |
18 (variant shl 29) or (major shl 22) or (minor shl 12) or patch | 21 (variant shl 29) or (major shl 22) or (minor shl 12) or patch |
22 | |
19 | 23 |
20 proc getInstanceExtensions*(): seq[string] = | 24 proc getInstanceExtensions*(): seq[string] = |
21 var extensionCount: uint32 | 25 var extensionCount: uint32 |
22 checkVkResult vkEnumerateInstanceExtensionProperties(nil, addr(extensionCount), nil) | 26 checkVkResult vkEnumerateInstanceExtensionProperties(nil, addr(extensionCount), nil) |
23 var extensions = newSeq[VkExtensionProperties](extensionCount) | 27 var extensions = newSeq[VkExtensionProperties](extensionCount) |
165 enabledExtensionCount: requiredExtensions.len.uint32, | 169 enabledExtensionCount: requiredExtensions.len.uint32, |
166 ppEnabledExtensionNames: cast[ptr UncheckedArray[cstring]](addr(requiredExtensions)) | 170 ppEnabledExtensionNames: cast[ptr UncheckedArray[cstring]](addr(requiredExtensions)) |
167 ) | 171 ) |
168 checkVkResult vkCreateDevice(physicalDevice, addr(deviceCreateInfo), nil, addr(result[0])) | 172 checkVkResult vkCreateDevice(physicalDevice, addr(deviceCreateInfo), nil, addr(result[0])) |
169 vkGetDeviceQueue(result[0], selectedQueueFamily, 0'u32, addr(result[1])); | 173 vkGetDeviceQueue(result[0], selectedQueueFamily, 0'u32, addr(result[1])); |
174 | |
175 proc createShaderStage*(device: VkDevice, stage: VkShaderStageFlagBits, shader: string): VkPipelineShaderStageCreateInfo = | |
176 const VK_GLSL_MAP = { | |
177 VK_SHADER_STAGE_VERTEX_BIT: GLSLANG_STAGE_VERTEX, | |
178 VK_SHADER_STAGE_FRAGMENT_BIT: GLSLANG_STAGE_FRAGMENT, | |
179 }.toTable() | |
180 var code = compileGLSLToSPIRV(VK_GLSL_MAP[stage], shader, "<memory-shader>") | |
181 var createInfo = VkShaderModuleCreateInfo( | |
182 sType: VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, | |
183 codeSize: code.len.uint, | |
184 pCode: addr(code[0]), | |
185 ) | |
186 var shaderModule: VkShaderModule | |
187 checkVkResult vkCreateShaderModule(device, addr(createInfo), nil, addr(shaderModule)) | |
188 | |
189 var vertShaderStageInfo = VkPipelineShaderStageCreateInfo( | |
190 sType: VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, | |
191 stage: stage, | |
192 module: shaderModule, | |
193 pName: "main", # entry point for shader | |
194 ) |