unit Vulkan; {$IFDEF FPC} {$MODE Delphi} {$IFNDEF WINDOWS} {$LINKLIB c} {$ENDIF} {$MINENUMSIZE 4} {$ENDIF} {$IFDEF Win32} {$DEFINE VK_WIN} {$ENDIF} {$IFDEF Win64} {$DEFINE VK_WIN} {$ENDIF} {$IFDEF linux} {$DEFINE VK_LINUX} {$DEFINE VK_CDECL} {$ENDIF} {$IFDEF DARWIN} {$DEFINE VK_MAC} {$DEFINE VK_CDECL} {$ENDIF} interface {%INTERFACE%} const VULKAN_LIBNAME = 'vulkan-1.dll'; type VkVersion = VkInt32; function vkMakeVersion(const aMajor, aMinor, aPatch: Integer): VkVersion; function vkGetVersionMajor(const aVersion: VkVersion): Integer; function vkGetVersionMinor(const aVersion: VkVersion): Integer; function vkgetVersionPatch(const aVersion: VkVersion): Integer; function InitializeVulkan(const aLibName: String = VULKAN_LIBNAME): Boolean; procedure FinalizeVulkan; implementation type {$IF DEFINED(VK_WIN)} TvkLibHandle = TLibHandle; {$ELSE} TvkLibHandle = Pointer; {$ENDIF} const {$IF DEFINED(VK_WIN)} InvalidLibHandle = 0; {$ELSE} InvalidLibHandle = nil; {$ENDIF} var vkLibHandle: TvkLibHandle = InvalidLibHandle; function vkLoadLibrary(const aLibName: String): TvkLibHandle; begin {$IF DEFINED(VK_WIN)} result := LoadLibrary(aLibName); {$ELSE} result := InvalidLibHandle; {$ENDIF} end; function vkGetProcAddress(const aProcName: String; aLibHandle: TvkLibHandle = InvalidLibHandle): Pointer; begin if (aLibHandle = InvalidLibHandle) then aLibHandle := vkLibHandle; {$IF DEFINED(VK_WIN)} result := GetProcAddress(aLibHandle, AnsiString(aProcName)); {$ELSE} result := nil; {$ENDIF} end; procedure vkFreeLibrary(var aLibHandle: TvkLibHandle); begin if (aLibHandle <> InvalidLibHandle) then begin {$IF DEFINED(VK_WIN)} FreeLibrary(aLibHandle); {$ENDIF} aLibHandle := InvalidLibHandle; end; end; function vkMakeVersion(const aMajor, aMinor, aPatch: Integer): VkVersion; begin result := (aMajor shl 22) or (aMinor shl 12) or aPatch; end; function vkGetVersionMajor(const aVersion: VkVersion): Integer; begin result := (aVersion shr 22); end; function vkGetVersionMinor(const aVersion: VkVersion): Integer; begin result := (aVersion shr 12) and $3FF; end; function vkGetVersionPatch(const aVersion: VkVersion): Integer; begin result := (aVersion and $FFF); end; function InitializeVulkan(const aLibName: String = VULKAN_LIBNAME): Boolean; begin FinalizeVulkan; vkLibHandle := vkLoadLibrary(aLibName); result := (vkLibHandle <> InvalidLibHandle); if not result then exit; {%IMPLEMENTATION%} end; procedure FinalizeVulkan; begin vkFreeLibrary(vkLibHandle); end; initialization finalization FinalizeVulkan; end.