You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

138 lines
2.6 KiB

  1. unit Vulkan;
  2. {$IFDEF FPC}
  3. {$MODE Delphi}
  4. {$IFNDEF WINDOWS}
  5. {$LINKLIB c}
  6. {$ENDIF}
  7. {$MINENUMSIZE 4}
  8. {$ENDIF}
  9. {$IFDEF Win32}
  10. {$DEFINE VK_WIN}
  11. {$ENDIF}
  12. {$IFDEF Win64}
  13. {$DEFINE VK_WIN}
  14. {$ENDIF}
  15. {$IFDEF linux}
  16. {$DEFINE VK_LINUX}
  17. {$DEFINE VK_CDECL}
  18. {$ENDIF}
  19. {$IFDEF DARWIN}
  20. {$DEFINE VK_MAC}
  21. {$DEFINE VK_CDECL}
  22. {$ENDIF}
  23. interface
  24. {%INTERFACE%}
  25. const
  26. VULKAN_LIBNAME = 'vulkan-1.dll';
  27. type
  28. VkVersion = VkInt32;
  29. function vkMakeVersion(const aMajor, aMinor, aPatch: Integer): VkVersion;
  30. function vkGetVersionMajor(const aVersion: VkVersion): Integer;
  31. function vkGetVersionMinor(const aVersion: VkVersion): Integer;
  32. function vkgetVersionPatch(const aVersion: VkVersion): Integer;
  33. function InitializeVulkan(const aLibName: String = VULKAN_LIBNAME): Boolean;
  34. procedure FinalizeVulkan;
  35. implementation
  36. type
  37. {$IF DEFINED(VK_WIN)}
  38. TvkLibHandle = TLibHandle;
  39. {$ELSE}
  40. TvkLibHandle = Pointer;
  41. {$ENDIF}
  42. const
  43. {$IF DEFINED(VK_WIN)}
  44. InvalidLibHandle = 0;
  45. {$ELSE}
  46. InvalidLibHandle = nil;
  47. {$ENDIF}
  48. var
  49. vkLibHandle: TvkLibHandle = InvalidLibHandle;
  50. function vkLoadLibrary(const aLibName: String): TvkLibHandle;
  51. begin
  52. {$IF DEFINED(VK_WIN)}
  53. result := LoadLibrary(aLibName);
  54. {$ELSE}
  55. result := InvalidLibHandle;
  56. {$ENDIF}
  57. end;
  58. function vkGetProcAddress(const aProcName: String; aLibHandle: TvkLibHandle = InvalidLibHandle): Pointer;
  59. begin
  60. if (aLibHandle = InvalidLibHandle) then
  61. aLibHandle := vkLibHandle;
  62. {$IF DEFINED(VK_WIN)}
  63. result := GetProcAddress(aLibHandle, AnsiString(aProcName));
  64. {$ELSE}
  65. result := nil;
  66. {$ENDIF}
  67. end;
  68. procedure vkFreeLibrary(var aLibHandle: TvkLibHandle);
  69. begin
  70. if (aLibHandle <> InvalidLibHandle) then begin
  71. {$IF DEFINED(VK_WIN)}
  72. FreeLibrary(aLibHandle);
  73. {$ENDIF}
  74. aLibHandle := InvalidLibHandle;
  75. end;
  76. end;
  77. function vkMakeVersion(const aMajor, aMinor, aPatch: Integer): VkVersion;
  78. begin
  79. result := (aMajor shl 22) or (aMinor shl 12) or aPatch;
  80. end;
  81. function vkGetVersionMajor(const aVersion: VkVersion): Integer;
  82. begin
  83. result := (aVersion shr 22);
  84. end;
  85. function vkGetVersionMinor(const aVersion: VkVersion): Integer;
  86. begin
  87. result := (aVersion shr 12) and $3FF;
  88. end;
  89. function vkGetVersionPatch(const aVersion: VkVersion): Integer;
  90. begin
  91. result := (aVersion and $FFF);
  92. end;
  93. function InitializeVulkan(const aLibName: String = VULKAN_LIBNAME): Boolean;
  94. begin
  95. FinalizeVulkan;
  96. vkLibHandle := vkLoadLibrary(aLibName);
  97. result := (vkLibHandle <> InvalidLibHandle);
  98. if not result then
  99. exit;
  100. {%IMPLEMENTATION%}
  101. end;
  102. procedure FinalizeVulkan;
  103. begin
  104. vkFreeLibrary(vkLibHandle);
  105. end;
  106. initialization
  107. finalization
  108. FinalizeVulkan;
  109. end.