Mercurial > games > semicongine
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/svk/api.nim Sat May 03 01:03:01 2025 +0700 @@ -0,0 +1,56 @@ +import std/strutils +import std/logging + +include ./vkapi + +template checkVkResult*(call: untyped) = + when defined(release): + discard call + else: + # yes, a bit cheap, but this is only for nice debug output + var callstr = astToStr(call).replace("\n", "") + while callstr.find(" ") >= 0: + callstr = callstr.replace(" ", " ") + debug "Calling vulkan: ", callstr + let value = call + if value != VK_SUCCESS: + error "Vulkan error: ", astToStr(call), " returned ", $value + raise newException( + Exception, "Vulkan error: " & astToStr(call) & " returned " & $value + ) + +type SVkInstance* = object + vkInstance: VkInstance + +proc `=copy`(a: var SVkInstance, b: SVkInstance) {.error.} + +proc `=destroy`(a: SVkInstance) = + if a.vkInstance.pointer != nil: + a.vkInstance.vkDestroyInstance(nil) + +proc svkCreateInstance*( + applicationName: string, + enabledLayers: openArray[string] = [], + enabledExtensions: openArray[string] = [], + engineName = "semicongine", + majorVersion = 1'u32, + minorVersion = 3'u32, +): SVkInstance = + let + appinfo = VkApplicationInfo( + pApplicationName: applicationName, + pEngineName: engineName, + apiVersion: VK_MAKE_API_VERSION(0, majorVersion, minorVersion, 0), + ) + layersC = enabledLayers.allocCStringArray() + extensionsC = enabledLayers.allocCStringArray() + createinfo = VkInstanceCreateInfo( + pApplicationInfo: addr appinfo, + enabledLayerCount: enabledLayers.len.uint32, + ppEnabledLayerNames: layersC, + enabledExtensionCount: enabledExtensions.len.uint32, + ppEnabledExtensionNames: extensionsC, + ) + checkVkResult vkCreateInstance(addr createinfo, nil, addr result.vkInstance) + layersC.deallocCStringArray() + extensionsC.deallocCStringArray()