|
- 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.
|