Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

386 lignes
21 KiB

  1. unit uvkuDeviceFactory;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils,
  6. Vulkan, uvkuDevice, uvkuTypes, uvkuFactoryBase, uvkuUtils;
  7. type
  8. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  9. TvkuQueueCreateInfo = class(TvkuStructure)
  10. private
  11. fQueuePriorities: TVkFloatList;
  12. public
  13. Flags: VkDeviceQueueCreateFlags;
  14. QueueFamilyIndex: VkUint32;
  15. property QueuePriorities: TVkFloatList read fQueuePriorities;
  16. function GetStructure: TVkDeviceQueueCreateInfo;
  17. procedure SetStructure(const aData: TVkDeviceQueueCreateInfo);
  18. procedure AfterConstruction; override;
  19. procedure BeforeDestruction; override;
  20. end;
  21. TvkuQueueCreateInfoList = specialize TvkuObjList<TvkuQueueCreateInfo>;
  22. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  23. TvkuPhysicalDeviceFeatures = class(TvkuStructure)
  24. RobustBufferAccess: VkBool32;
  25. FullDrawIndexUint32: VkBool32;
  26. ImageCubeArray: VkBool32;
  27. IndependentBlend: VkBool32;
  28. GeometryShader: VkBool32;
  29. TessellationShader: VkBool32;
  30. SampleRateShading: VkBool32;
  31. DualSrcBlend: VkBool32;
  32. LogicOp: VkBool32;
  33. MultiDrawIndirect: VkBool32;
  34. DrawIndirectFirstInstance: VkBool32;
  35. DepthClamp: VkBool32;
  36. DepthBiasClamp: VkBool32;
  37. FillModeNonSolid: VkBool32;
  38. DepthBounds: VkBool32;
  39. WideLines: VkBool32;
  40. LargePoints: VkBool32;
  41. AlphaToOne: VkBool32;
  42. MultiViewport: VkBool32;
  43. SamplerAnisotropy: VkBool32;
  44. TextureCompressionETC2: VkBool32;
  45. TextureCompressionASTC_LDR: VkBool32;
  46. TextureCompressionBC: VkBool32;
  47. OcclusionQueryPrecise: VkBool32;
  48. PipelineStatisticsQuery: VkBool32;
  49. VertexPipelineStoresAndAtomics: VkBool32;
  50. FragmentStoresAndAtomics: VkBool32;
  51. ShaderTessellationAndGeometryPointSize: VkBool32;
  52. ShaderImageGatherExtended: VkBool32;
  53. ShaderStorageImageExtendedFormats: VkBool32;
  54. ShaderStorageImageMultisample: VkBool32;
  55. ShaderStorageImageReadWithoutFormat: VkBool32;
  56. ShaderStorageImageWriteWithoutFormat: VkBool32;
  57. ShaderUniformBufferArrayDynamicIndexing: VkBool32;
  58. ShaderSampledImageArrayDynamicIndexing: VkBool32;
  59. ShaderStorageBufferArrayDynamicIndexing: VkBool32;
  60. ShaderStorageImageArrayDynamicIndexing: VkBool32;
  61. ShaderClipDistance: VkBool32;
  62. ShaderCullDistance: VkBool32;
  63. ShaderFloat64: VkBool32;
  64. ShaderInt64: VkBool32;
  65. ShaderInt16: VkBool32;
  66. ShaderResourceResidency: VkBool32;
  67. ShaderResourceMinLod: VkBool32;
  68. SparseBinding: VkBool32;
  69. SparseResidencyBuffer: VkBool32;
  70. SparseResidencyImage2D: VkBool32;
  71. SparseResidencyImage3D: VkBool32;
  72. SparseResidency2Samples: VkBool32;
  73. SparseResidency4Samples: VkBool32;
  74. SparseResidency8Samples: VkBool32;
  75. SparseResidency16Samples: VkBool32;
  76. SparseResidencyAliased: VkBool32;
  77. VariableMultisampleRate: VkBool32;
  78. InheritedQueries: VkBool32;
  79. function GetStructure: TVkPhysicalDeviceFeatures;
  80. procedure SetStructure(const aData: TVkPhysicalDeviceFeatures);
  81. end;
  82. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  83. TvkuDeviceFactory = class(TvkuInstanceObjFactory)
  84. private
  85. fEnabledFeatures: TvkuPhysicalDeviceFeatures;
  86. fFlags: VkDeviceCreateFlags;
  87. fEnabledLayerNames: TStringList;
  88. fEnabledExtensionNames: TStringList;
  89. fQueueCreateInfos: TvkuQueueCreateInfoList;
  90. fvkEnabledFeatures: TVkPhysicalDeviceFeatures;
  91. fvkEnabledLayerNames: array of PVkChar;
  92. fvkEnabledExtensionNames: array of PVkChar;
  93. fvkQueueCreateInfos: array of TVkDeviceQueueCreateInfo;
  94. function GetEnabledLayerNames: TStrings;
  95. function GetEnabledExtensionNames: TStrings;
  96. public
  97. property Flags: VkDeviceCreateFlags read fFlags write fFlags;
  98. property EnabledLayerNames: TStrings read GetEnabledLayerNames;
  99. property EnabledExtensionNames: TStrings read GetEnabledExtensionNames;
  100. property EnabledFeatures: TvkuPhysicalDeviceFeatures read fEnabledFeatures;
  101. property QueueCreateInfos: TvkuQueueCreateInfoList read fQueueCreateInfos;
  102. function GetStructure: TVkDeviceCreateInfo;
  103. procedure SetStructure(const aData: TVkDeviceCreateInfo);
  104. function CreateDevice(const aPhysicalDevice: VkPhysicalDevice): TvkuDevice;
  105. procedure AfterConstruction; override;
  106. procedure BeforeDestruction; override;
  107. end;
  108. implementation
  109. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  110. //TvkuQueueCreateInfo////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  111. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  112. function TvkuQueueCreateInfo.GetStructure: TVkDeviceQueueCreateInfo;
  113. begin
  114. FillByte(result, SizeOf(result), 0);
  115. result.sType := VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
  116. result.pNext := nil;
  117. result.flags := Flags;
  118. result.queueFamilyIndex := QueueFamilyIndex;
  119. result.queueCount := fQueuePriorities.Length;
  120. result.pQueuePriorities := fQueuePriorities.PData;
  121. end;
  122. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  123. procedure TvkuQueueCreateInfo.SetStructure(const aData: TVkDeviceQueueCreateInfo);
  124. var i: Integer;
  125. begin
  126. Flags := aData.flags;
  127. QueueFamilyIndex := aData.queueFamilyIndex;
  128. fQueuePriorities.Length := aData.queueCount;
  129. for i := 0 to fQueuePriorities.Length-1 do
  130. fQueuePriorities[i] := (aData.pQueuePriorities + i)^;
  131. end;
  132. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  133. procedure TvkuQueueCreateInfo.AfterConstruction;
  134. begin
  135. inherited AfterConstruction;
  136. fQueuePriorities := TVkFloatList.Create;
  137. end;
  138. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  139. procedure TvkuQueueCreateInfo.BeforeDestruction;
  140. begin
  141. FreeAndNil(fQueuePriorities);
  142. inherited BeforeDestruction;
  143. end;
  144. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  145. //TvkuPhysicalDeviceFeatures/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  146. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  147. function TvkuPhysicalDeviceFeatures.GetStructure: TVkPhysicalDeviceFeatures;
  148. begin
  149. FillByte(result, SizeOf(result), 0);
  150. result.robustBufferAccess := RobustBufferAccess;
  151. result.fullDrawIndexUint32 := FullDrawIndexUint32;
  152. result.imageCubeArray := ImageCubeArray;
  153. result.independentBlend := IndependentBlend;
  154. result.geometryShader := GeometryShader;
  155. result.tessellationShader := TessellationShader;
  156. result.sampleRateShading := SampleRateShading;
  157. result.dualSrcBlend := DualSrcBlend;
  158. result.logicOp := LogicOp;
  159. result.multiDrawIndirect := MultiDrawIndirect;
  160. result.drawIndirectFirstInstance := DrawIndirectFirstInstance;
  161. result.depthClamp := DepthClamp;
  162. result.depthBiasClamp := DepthBiasClamp;
  163. result.fillModeNonSolid := FillModeNonSolid;
  164. result.depthBounds := DepthBounds;
  165. result.wideLines := WideLines;
  166. result.largePoints := LargePoints;
  167. result.alphaToOne := AlphaToOne;
  168. result.multiViewport := MultiViewport;
  169. result.samplerAnisotropy := SamplerAnisotropy;
  170. result.textureCompressionETC2 := TextureCompressionETC2;
  171. result.textureCompressionASTC_LDR := TextureCompressionASTC_LDR;
  172. result.textureCompressionBC := TextureCompressionBC;
  173. result.occlusionQueryPrecise := OcclusionQueryPrecise;
  174. result.pipelineStatisticsQuery := PipelineStatisticsQuery;
  175. result.vertexPipelineStoresAndAtomics := VertexPipelineStoresAndAtomics;
  176. result.fragmentStoresAndAtomics := FragmentStoresAndAtomics;
  177. result.shaderTessellationAndGeometryPointSize := ShaderTessellationAndGeometryPointSize;
  178. result.shaderImageGatherExtended := ShaderImageGatherExtended;
  179. result.shaderStorageImageExtendedFormats := ShaderStorageImageExtendedFormats;
  180. result.shaderStorageImageMultisample := ShaderStorageImageMultisample;
  181. result.shaderStorageImageReadWithoutFormat := ShaderStorageImageReadWithoutFormat;
  182. result.shaderStorageImageWriteWithoutFormat := ShaderStorageImageWriteWithoutFormat;
  183. result.shaderUniformBufferArrayDynamicIndexing := ShaderUniformBufferArrayDynamicIndexing;
  184. result.shaderSampledImageArrayDynamicIndexing := ShaderSampledImageArrayDynamicIndexing;
  185. result.shaderStorageBufferArrayDynamicIndexing := ShaderStorageBufferArrayDynamicIndexing;
  186. result.shaderStorageImageArrayDynamicIndexing := ShaderStorageImageArrayDynamicIndexing;
  187. result.shaderClipDistance := ShaderClipDistance;
  188. result.shaderCullDistance := ShaderCullDistance;
  189. result.shaderFloat64 := ShaderFloat64;
  190. result.shaderInt64 := ShaderInt64;
  191. result.shaderInt16 := ShaderInt16;
  192. result.shaderResourceResidency := ShaderResourceResidency;
  193. result.shaderResourceMinLod := ShaderResourceMinLod;
  194. result.sparseBinding := SparseBinding;
  195. result.sparseResidencyBuffer := SparseResidencyBuffer;
  196. result.sparseResidencyImage2D := SparseResidencyImage2D;
  197. result.sparseResidencyImage3D := SparseResidencyImage3D;
  198. result.sparseResidency2Samples := SparseResidency2Samples;
  199. result.sparseResidency4Samples := SparseResidency4Samples;
  200. result.sparseResidency8Samples := SparseResidency8Samples;
  201. result.sparseResidency16Samples := SparseResidency16Samples;
  202. result.sparseResidencyAliased := SparseResidencyAliased;
  203. result.variableMultisampleRate := VariableMultisampleRate;
  204. result.inheritedQueries := InheritedQueries;
  205. end;
  206. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  207. procedure TvkuPhysicalDeviceFeatures.SetStructure(const aData: TVkPhysicalDeviceFeatures);
  208. begin
  209. RobustBufferAccess := aData.robustBufferAccess;
  210. FullDrawIndexUint32 := aData.fullDrawIndexUint32;
  211. ImageCubeArray := aData.imageCubeArray;
  212. IndependentBlend := aData.independentBlend;
  213. GeometryShader := aData.geometryShader;
  214. TessellationShader := aData.tessellationShader;
  215. SampleRateShading := aData.sampleRateShading;
  216. DualSrcBlend := aData.dualSrcBlend;
  217. LogicOp := aData.logicOp;
  218. MultiDrawIndirect := aData.multiDrawIndirect;
  219. DrawIndirectFirstInstance := aData.drawIndirectFirstInstance;
  220. DepthClamp := aData.depthClamp;
  221. DepthBiasClamp := aData.depthBiasClamp;
  222. FillModeNonSolid := aData.fillModeNonSolid;
  223. DepthBounds := aData.depthBounds;
  224. WideLines := aData.wideLines;
  225. LargePoints := aData.largePoints;
  226. AlphaToOne := aData.alphaToOne;
  227. MultiViewport := aData.multiViewport;
  228. SamplerAnisotropy := aData.samplerAnisotropy;
  229. TextureCompressionETC2 := aData.textureCompressionETC2;
  230. TextureCompressionASTC_LDR := aData.textureCompressionASTC_LDR;
  231. TextureCompressionBC := aData.textureCompressionBC;
  232. OcclusionQueryPrecise := aData.occlusionQueryPrecise;
  233. PipelineStatisticsQuery := aData.pipelineStatisticsQuery;
  234. VertexPipelineStoresAndAtomics := aData.vertexPipelineStoresAndAtomics;
  235. FragmentStoresAndAtomics := aData.fragmentStoresAndAtomics;
  236. ShaderTessellationAndGeometryPointSize := aData.shaderTessellationAndGeometryPointSize;
  237. ShaderImageGatherExtended := aData.shaderImageGatherExtended;
  238. ShaderStorageImageExtendedFormats := aData.shaderStorageImageExtendedFormats;
  239. ShaderStorageImageMultisample := aData.shaderStorageImageMultisample;
  240. ShaderStorageImageReadWithoutFormat := aData.shaderStorageImageReadWithoutFormat;
  241. ShaderStorageImageWriteWithoutFormat := aData.shaderStorageImageWriteWithoutFormat;
  242. ShaderUniformBufferArrayDynamicIndexing := aData.shaderUniformBufferArrayDynamicIndexing;
  243. ShaderSampledImageArrayDynamicIndexing := aData.shaderSampledImageArrayDynamicIndexing;
  244. ShaderStorageBufferArrayDynamicIndexing := aData.shaderStorageBufferArrayDynamicIndexing;
  245. ShaderStorageImageArrayDynamicIndexing := aData.shaderStorageImageArrayDynamicIndexing;
  246. ShaderClipDistance := aData.shaderClipDistance;
  247. ShaderCullDistance := aData.shaderCullDistance;
  248. ShaderFloat64 := aData.shaderFloat64;
  249. ShaderInt64 := aData.shaderInt64;
  250. ShaderInt16 := aData.shaderInt16;
  251. ShaderResourceResidency := aData.shaderResourceResidency;
  252. ShaderResourceMinLod := aData.shaderResourceMinLod;
  253. SparseBinding := aData.sparseBinding;
  254. SparseResidencyBuffer := aData.sparseResidencyBuffer;
  255. SparseResidencyImage2D := aData.sparseResidencyImage2D;
  256. SparseResidencyImage3D := aData.sparseResidencyImage3D;
  257. SparseResidency2Samples := aData.sparseResidency2Samples;
  258. SparseResidency4Samples := aData.sparseResidency4Samples;
  259. SparseResidency8Samples := aData.sparseResidency8Samples;
  260. SparseResidency16Samples := aData.sparseResidency16Samples;
  261. SparseResidencyAliased := aData.sparseResidencyAliased;
  262. VariableMultisampleRate := aData.variableMultisampleRate;
  263. InheritedQueries := aData.inheritedQueries;
  264. end;
  265. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  266. //TvkuDeviceFactory//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  267. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  268. function TvkuDeviceFactory.GetEnabledLayerNames: TStrings;
  269. begin
  270. result := fEnabledLayerNames;
  271. end;
  272. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  273. function TvkuDeviceFactory.GetEnabledExtensionNames: TStrings;
  274. begin
  275. result := fEnabledExtensionNames;
  276. end;
  277. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  278. function TvkuDeviceFactory.GetStructure: TVkDeviceCreateInfo;
  279. var i: Integer;
  280. begin
  281. if (fQueueCreateInfos.Length <= 0) then
  282. raise TvkuException.Create('no queue create infos assigned');
  283. fvkEnabledFeatures := fEnabledFeatures.GetStructure;
  284. SetLength(fvkEnabledLayerNames, fEnabledLayerNames.Count);
  285. for i := 0 to fEnabledLayerNames.Count-1 do
  286. fvkEnabledLayerNames[i] := PVkChar(fEnabledLayerNames[i]);
  287. SetLength(fvkEnabledExtensionNames, fEnabledExtensionNames.Count);
  288. for i := 0 to fEnabledExtensionNames.Count-1 do
  289. fvkEnabledExtensionNames[i] := PVkChar(fEnabledExtensionNames[i]);
  290. SetLength(fvkQueueCreateInfos, fQueueCreateInfos.Length);
  291. for i := low(fvkQueueCreateInfos) to high(fvkQueueCreateInfos) do
  292. fvkQueueCreateInfos[i] := fQueueCreateInfos[i].GetStructure;
  293. FillByte(result, SizeOf(result), 0);
  294. result.sType := VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
  295. result.pNext := nil;
  296. result.flags := fFlags;
  297. result.queueCreateInfoCount := Length(fvkQueueCreateInfos);
  298. result.pQueueCreateInfos := @fvkQueueCreateInfos[0];
  299. result.enabledLayerCount := Length(fvkEnabledLayerNames);
  300. result.ppEnabledLayerNames := @fvkEnabledLayerNames[0];
  301. result.enabledExtensionCount := Length(fvkEnabledExtensionNames);
  302. result.ppEnabledExtensionNames := @fvkEnabledExtensionNames[0];
  303. result.pEnabledFeatures := @fvkEnabledFeatures;
  304. end;
  305. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  306. procedure TvkuDeviceFactory.SetStructure(const aData: TVkDeviceCreateInfo);
  307. var i: Integer;
  308. begin
  309. if Assigned(aData.pEnabledFeatures) then
  310. fEnabledFeatures.SetStructure(aData.pEnabledFeatures^);
  311. fEnabledLayerNames.Clear;
  312. for i := 0 to aData.enabledLayerCount-1 do
  313. fEnabledLayerNames.Add(aData.ppEnabledLayerNames[i]);
  314. fEnabledExtensionNames.Clear;
  315. for i := 0 to aData.enabledExtensionCount-1 do
  316. fEnabledExtensionNames.Add(aData.ppEnabledExtensionNames[i]);
  317. fQueueCreateInfos.Length := aData.queueCreateInfoCount;
  318. for i := 0 to fQueueCreateInfos.Length-1 do
  319. fQueueCreateInfos[i].SetStructure((aData.pQueueCreateInfos + i)^);
  320. fFlags := aData.flags;
  321. end;
  322. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  323. function TvkuDeviceFactory.CreateDevice(const aPhysicalDevice: VkPhysicalDevice): TvkuDevice;
  324. begin
  325. result := TvkuDevice.Create(aPhysicalDevice, GetStructure, InstanceCommands, AllocCallbacks);
  326. end;
  327. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  328. procedure TvkuDeviceFactory.AfterConstruction;
  329. begin
  330. inherited AfterConstruction;
  331. fEnabledFeatures := TvkuPhysicalDeviceFeatures.Create;
  332. fEnabledLayerNames := TStringList.Create;
  333. fEnabledExtensionNames := TStringList.Create;
  334. fQueueCreateInfos := TvkuQueueCreateInfoList.Create;
  335. end;
  336. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  337. procedure TvkuDeviceFactory.BeforeDestruction;
  338. begin
  339. FreeAndNil(fQueueCreateInfos);
  340. FreeAndNil(fEnabledLayerNames);
  341. FreeAndNil(fEnabledExtensionNames);
  342. FreeAndNil(fEnabledFeatures);
  343. inherited BeforeDestruction;
  344. end;
  345. end.