您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 

317 行
14 KiB

  1. unit uvkuInstanceEx;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils,
  6. Vulkan, uvkuInstance;
  7. type
  8. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  9. TvkuApplicationInfo = packed record
  10. AppName: String;
  11. AppVersion: VkVersion;
  12. EngineName: String;
  13. EngineVersion: VkVersion;
  14. ApiVersion: VkVersion;
  15. end;
  16. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  17. TvkuAllocationHandler = class(TObject)
  18. protected
  19. function AllocateMemory(const aSize: VkSize; const aAlignment: VkSize; const aScope: TVkSystemAllocationScope): PVkVoid; virtual;
  20. function ReallocateMemory(const aOriginal: PVkVoid; const aSize: VkSize; const aAlignment: VkSize; const aScope: TVkSystemAllocationScope): PVkVoid; virtual;
  21. procedure FreeMemory(const aMemory: PVkVoid); virtual;
  22. procedure InternalAllocationNotification(const aSize: VkSize; const aType: TVkInternalAllocationType; const aScope: TVkSystemAllocationScope);
  23. procedure InternalFreeNotification(const aSize: VkSize; const aType: TVkInternalAllocationType; const aScope: TVkSystemAllocationScope);
  24. end;
  25. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  26. TvkuInstanceEx = class(TvkuInstance)
  27. private
  28. fFlags: VkInstanceCreateFlags;
  29. fOwnsAllocHandler: Boolean;
  30. fAllocationHandler: TvkuAllocationHandler;
  31. fApplicationInfo: TvkuApplicationInfo;
  32. fLayers: TStringList;
  33. fExtensions: TStringList;
  34. function GetLayers: TStrings;
  35. function GetExtensions: TStrings;
  36. procedure Initialize;
  37. procedure MakeStringsFromArray(const aArray: array of String; const aStrings: TStrings);
  38. procedure CreateHandle;
  39. public
  40. property Flags: VkInstanceCreateFlags read fFlags;
  41. property OwnsAllocHandler: Boolean read fOwnsAllocHandler;
  42. property AllocationHandler: TvkuAllocationHandler read fAllocationHandler;
  43. property ApplicationInfo: TvkuApplicationInfo read fApplicationInfo;
  44. property Layers: TStrings read GetLayers;
  45. property Extensions: TStrings read GetExtensions;
  46. constructor Create;
  47. constructor Create(
  48. const aFlags: VkInstanceCreateFlags;
  49. const aLayers: array of String;
  50. const aExtensions: array of String);
  51. constructor Create(
  52. const aFlags: VkInstanceCreateFlags;
  53. const aLayers: array of String;
  54. const aExtensions: array of String;
  55. const aAppInfo: TvkuApplicationInfo);
  56. constructor Create(
  57. const aFlags: VkInstanceCreateFlags;
  58. const aLayers: array of String;
  59. const aExtensions: array of String;
  60. const aAppInfo: TvkuApplicationInfo;
  61. const aAllocHandler: TvkuAllocationHandler;
  62. const aOwnsAllocHandler: Boolean);
  63. destructor Destroy; override;
  64. public
  65. class function DefaultApplicationInfo: TvkuApplicationInfo;
  66. class function MakeApplicationInfo(
  67. aAppName: String;
  68. aAppVersion: VkVersion;
  69. aEngineName: String;
  70. aEngineVersion: VkVersion;
  71. aApiVersion: VkVersion = VK_API_VERSION): TvkuApplicationInfo;
  72. end;
  73. implementation
  74. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  75. //TvkuAllocationHandler//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  76. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  77. function TvkuAllocationHandler.AllocateMemory(const aSize: VkSize; const aAlignment: VkSize; const aScope: TVkSystemAllocationScope): PVkVoid;
  78. begin
  79. result := System.GetMemory(aSize);
  80. end;
  81. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  82. function TvkuAllocationHandler.ReallocateMemory(const aOriginal: PVkVoid; const aSize: VkSize; const aAlignment: VkSize; const aScope: TVkSystemAllocationScope): PVkVoid;
  83. begin
  84. result := System.ReAllocMemory(aOriginal, aSize);
  85. end;
  86. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  87. procedure TvkuAllocationHandler.FreeMemory(const aMemory: PVkVoid);
  88. begin
  89. System.FreeMemory(aMemory);
  90. end;
  91. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  92. procedure TvkuAllocationHandler.InternalAllocationNotification(const aSize: VkSize; const aType: TVkInternalAllocationType; const aScope: TVkSystemAllocationScope);
  93. begin
  94. // DUMMY
  95. end;
  96. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  97. procedure TvkuAllocationHandler.InternalFreeNotification(const aSize: VkSize; const aType: TVkInternalAllocationType; const aScope: TVkSystemAllocationScope);
  98. begin
  99. // DUMMY
  100. end;
  101. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  102. function AllocateMemoryCallback(aUserData: PVkVoid; aSize: VkSize; aAlignment: VkSize; aScope: TVkSystemAllocationScope): PVkVoid; stdcall;
  103. begin
  104. result := TvkuAllocationHandler(aUserData).AllocateMemory(aSize, aAlignment, aScope);
  105. end;
  106. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  107. function ReallocateMemoryCallback(aUserData: PVkVoid; aOriginal: PVkVoid; aSize: VkSize;
  108. aAlignment: VkSize; aScope: TVkSystemAllocationScope): PVkVoid; stdcall;
  109. begin
  110. result := TvkuAllocationHandler(aUserData).ReallocateMemory(aOriginal, aSize, aAlignment, aScope);
  111. end;
  112. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  113. procedure FreeMemoryCallback(aUserData: PVkVoid; aMemory: PVkVoid); stdcall;
  114. begin
  115. TvkuAllocationHandler(aUserData).FreeMemory(aMemory);
  116. end;
  117. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  118. procedure InternalAllocationCallback(aUserData: PVkVoid; aSize: VkSize; aType: TVkInternalAllocationType; aScope: TVkSystemAllocationScope); stdcall;
  119. begin
  120. TvkuAllocationHandler(aUserData).InternalAllocationNotification(aSize, aType, aScope);
  121. end;
  122. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  123. procedure InternalFreeCallback(aUserData: PVkVoid; aSize: VkSize; aType: TVkInternalAllocationType; aScope: TVkSystemAllocationScope); stdcall;
  124. begin
  125. TvkuAllocationHandler(aUserData).InternalFreeNotification(aSize, aType, aScope);
  126. end;
  127. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  128. //TvkuInstanceEx///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  129. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  130. function TvkuInstanceEx.GetLayers: TStrings;
  131. begin
  132. result := fLayers;
  133. end;
  134. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  135. function TvkuInstanceEx.GetExtensions: TStrings;
  136. begin
  137. result := fExtensions;
  138. end;
  139. procedure TvkuInstanceEx.Initialize;
  140. begin
  141. fLayers := TStringList.Create;
  142. fExtensions := TStringList.Create;
  143. fApplicationInfo := DefaultApplicationInfo;
  144. fFlags := 0;
  145. fAllocationHandler := nil;
  146. fOwnsAllocHandler := false;
  147. end;
  148. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  149. procedure TvkuInstanceEx.MakeStringsFromArray(const aArray: array of String; const aStrings: TStrings);
  150. var i: Integer;
  151. begin
  152. for i := Low(aArray) to High(aArray) do
  153. aStrings.Add(aArray[i]);
  154. end;
  155. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  156. procedure TvkuInstanceEx.CreateHandle;
  157. var
  158. CreateInfo: TVkInstanceCreateInfo;
  159. AppInfo: TVkApplicationInfo;
  160. AllocCallbacks: TVkAllocationCallbacks;
  161. i: Integer;
  162. lay: array of PVkChar;
  163. ext: array of PVkChar;
  164. begin
  165. FillByte(AppInfo, SizeOf(AppInfo), 0);
  166. AppInfo.sType := VK_STRUCTURE_TYPE_APPLICATION_INFO;
  167. AppInfo.pNext := nil;
  168. AppInfo.pApplicationName := PVkChar(fApplicationInfo.AppName);
  169. AppInfo.applicationVersion := fApplicationInfo.AppVersion;
  170. AppInfo.pEngineName := PVkChar(fApplicationInfo.EngineName);
  171. AppInfo.engineVersion := fApplicationInfo.EngineVersion;
  172. AppInfo.apiVersion := fApplicationInfo.ApiVersion;
  173. SetLength(lay, fLayers.Count);
  174. for i := 0 to fLayers.Count-1 do
  175. lay[i] := PVkChar(fLayers[i]);
  176. SetLength(ext, fExtensions.Count);
  177. for i := 0 to fExtensions.Count-1 do
  178. ext[i] := PVkChar(fExtensions[i]);
  179. FillByte(CreateInfo, SizeOf(CreateInfo), 0);
  180. CreateInfo.sType := VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
  181. CreateInfo.pNext := nil;
  182. CreateInfo.flags := fFlags;
  183. CreateInfo.pApplicationInfo := @AppInfo;
  184. CreateInfo.enabledLayerCount := Length(lay);
  185. CreateInfo.ppEnabledLayerNames := @lay[0];
  186. CreateInfo.enabledExtensionCount := Length(ext);
  187. CreateInfo.ppEnabledExtensionNames := @ext[0];
  188. if Assigned(fAllocationHandler) then begin
  189. FillByte(AllocCallbacks, SizeOf(AllocCallbacks), 0);
  190. AllocCallbacks.pUserData := fAllocationHandler;
  191. AllocCallbacks.pfnAllocation := @AllocateMemoryCallback;
  192. AllocCallbacks.pfnReallocation := @ReallocateMemoryCallback;
  193. AllocCallbacks.pfnFree := @FreeMemoryCallback;
  194. AllocCallbacks.pfnInternalAllocation := @InternalAllocationCallback;
  195. AllocCallbacks.pfnInternalFree := @InternalFreeCallback;
  196. inherited CreateHandle(@CreateInfo, @AllocCallbacks);
  197. end else
  198. inherited CreateHandle(@CreateInfo, nil);
  199. end;
  200. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  201. constructor TvkuInstanceEx.Create;
  202. begin
  203. Initialize;
  204. CreateHandle;
  205. end;
  206. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  207. constructor TvkuInstanceEx.Create(const aFlags: VkInstanceCreateFlags;
  208. const aLayers: array of String; const aExtensions: array of String);
  209. begin
  210. inherited Create;
  211. Initialize;
  212. fFlags := aFlags;
  213. MakeStringsFromArray(aLayers, fLayers);
  214. MakeStringsFromArray(aExtensions, fExtensions);
  215. CreateHandle;
  216. end;
  217. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  218. constructor TvkuInstanceEx.Create(const aFlags: VkInstanceCreateFlags;const aLayers: array of String;
  219. const aExtensions: array of String; const aAppInfo: TvkuApplicationInfo);
  220. begin
  221. inherited Create;
  222. Initialize;
  223. fFlags := aFlags;
  224. fApplicationInfo := aAppInfo;
  225. MakeStringsFromArray(aLayers, fLayers);
  226. MakeStringsFromArray(aExtensions, fExtensions);
  227. CreateHandle;
  228. end;
  229. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  230. constructor TvkuInstanceEx.Create(const aFlags: VkInstanceCreateFlags; const aLayers: array of String;const aExtensions: array of String;
  231. const aAppInfo: TvkuApplicationInfo; const aAllocHandler: TvkuAllocationHandler; const aOwnsAllocHandler: Boolean);
  232. begin
  233. inherited Create;
  234. Initialize;
  235. fFlags := aFlags;
  236. fApplicationInfo := aAppInfo;
  237. fAllocationHandler := aAllocHandler;
  238. fOwnsAllocHandler := aOwnsAllocHandler;
  239. MakeStringsFromArray(aLayers, fLayers);
  240. MakeStringsFromArray(aExtensions, fExtensions);
  241. CreateHandle;
  242. end;
  243. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  244. destructor TvkuInstanceEx.Destroy;
  245. begin
  246. inherited Destroy;
  247. if fOwnsAllocHandler then
  248. FreeAndNil(fAllocationHandler);
  249. FreeAndNil(fLayers);
  250. FreeAndNil(fExtensions);
  251. end;
  252. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  253. class function TvkuInstanceEx.DefaultApplicationInfo: TvkuApplicationInfo;
  254. begin
  255. result.AppName := ExtractFileName(ParamStr(0));
  256. result.AppVersion := 0;
  257. result.EngineName := ExtractFileName(ParamStr(0));
  258. result.EngineVersion := 0;
  259. result.ApiVersion := VK_API_VERSION;
  260. end;
  261. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  262. class function TvkuInstanceEx.MakeApplicationInfo(aAppName: String; aAppVersion: VkVersion; aEngineName: String; aEngineVersion: VkVersion; aApiVersion: VkVersion): TvkuApplicationInfo;
  263. begin
  264. result := DefaultApplicationInfo;
  265. result.AppName := aAppName;
  266. result.AppVersion := aAppVersion;
  267. result.EngineName := aEngineName;
  268. result.EngineVersion := aEngineVersion;
  269. result.ApiVersion := aApiVersion;
  270. end;
  271. end.