25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

950 lines
46 KiB

  1. unit uvkuPipelineFactory;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils,
  6. Vulkan, uvkuPipeline, uvkuFactoryBase, uvkuTypes;
  7. type
  8. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  9. TvkuPipelineShaderStageCreateInfo = class(TvkuStructure)
  10. public
  11. Flags: VkPipelineShaderStageCreateFlags;
  12. Stage: TVkShaderStageFlagBits;
  13. Module: VkShaderModule;
  14. Name: String;
  15. function GetStructure: TVkPipelineShaderStageCreateInfo;
  16. procedure SetStructure(const aData: TVkPipelineShaderStageCreateInfo);
  17. end;
  18. TvkuPipelineShaderStageCreateInfoList = specialize TvkuObjList<TvkuPipelineShaderStageCreateInfo>;
  19. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  20. TvkuVertexInputBindingDescription = class(TvkuStructure)
  21. public
  22. Binding: VkUint32;
  23. Stride: VkUint32;
  24. InputRate: TVkVertexInputRate;
  25. function GetStructure: TVkVertexInputBindingDescription;
  26. procedure SetStructure(const aData: TVkVertexInputBindingDescription);
  27. end;
  28. TvkuVertexInputBindingDescriptionList = specialize TvkuObjList<TvkuVertexInputBindingDescription>;
  29. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  30. TvkuVertexInputAttributeDescription = class(TvkuStructure)
  31. public
  32. Location: VkUint32;
  33. Binding: VkUint32;
  34. Format: TVkFormat;
  35. Offset: VkUint32;
  36. function GetStructure: TVkVertexInputAttributeDescription;
  37. procedure SetStructure(const aData: TVkVertexInputAttributeDescription);
  38. end;
  39. TvkuVertexInputAttributeDescriptionList = specialize TvkuObjList<TvkuVertexInputAttributeDescription>;
  40. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  41. TvkuPipelineVertexInputStateCreateInfo = class(TvkuStructure)
  42. private
  43. fFlags: VkPipelineVertexInputStateCreateFlags;
  44. fVertexBindingDescriptions: TvkuVertexInputBindingDescriptionList;
  45. fVertexAttributeDescriptions: TvkuVertexInputAttributeDescriptionList;
  46. fvkVertexBindingDescriptions: TVkVertexInputBindingDescriptionArr;
  47. fvkVertexAttributeDescriptions: TVkVertexInputAttributeDescriptionArr;
  48. public
  49. property Flags: VkPipelineVertexInputStateCreateFlags read fFlags write fFlags;
  50. property VertexBindingDescriptions: TvkuVertexInputBindingDescriptionList read fVertexBindingDescriptions;
  51. property VertexAttributeDescriptions: TvkuVertexInputAttributeDescriptionList read fVertexAttributeDescriptions;
  52. function GetStructure: TVkPipelineVertexInputStateCreateInfo;
  53. procedure SetStructure(const aData: TVkPipelineVertexInputStateCreateInfo);
  54. constructor Create;
  55. destructor Destroy; override;
  56. end;
  57. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  58. TvkuPipelineInputAssemblyStateCreateInfo = class(TvkuStructure)
  59. Flags: VkPipelineInputAssemblyStateCreateFlags;
  60. Topology: TVkPrimitiveTopology;
  61. PrimitiveRestartEnable: Boolean;
  62. function GetStructure: TVkPipelineInputAssemblyStateCreateInfo;
  63. procedure SetStructure(const aData: TVkPipelineInputAssemblyStateCreateInfo);
  64. end;
  65. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  66. TvkuPipelineTessellationStateCreateInfo = class(TvkuStructure)
  67. public
  68. Flags: VkPipelineTessellationStateCreateFlags;
  69. PatchControlPoints: VkUint32;
  70. function GetStructure: TVkPipelineTessellationStateCreateInfo;
  71. procedure SetStructure(const aData: TVkPipelineTessellationStateCreateInfo);
  72. end;
  73. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  74. TvkuViewport = class(TvkuStructure)
  75. x: VkFloat;
  76. y: VkFloat;
  77. Width: VkFloat;
  78. Height: VkFloat;
  79. MinDepth: VkFloat;
  80. MaxDepth: VkFloat;
  81. function GetStructure: TVkViewport;
  82. procedure SetStructure(const aData: TVkViewport);
  83. end;
  84. TvkuViewportList = specialize TvkuObjList<TvkuViewport>;
  85. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  86. TvkuRect2D = class(TvkuStructure)
  87. Offset: TVkOffset2D;
  88. Extent: TVkExtent2D;
  89. function GetStructure: TVkRect2D;
  90. procedure SetStructure(const aData: TVkRect2D);
  91. end;
  92. TvkuRect2DList = specialize TvkuObjList<TvkuRect2D>;
  93. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  94. TvkuPipelineViewportStateCreateInfo = class(TvkuStructure)
  95. private
  96. fFlags: VkPipelineViewportStateCreateFlags;
  97. fViewports: TvkuViewportList;
  98. fScissors: TvkuRect2DList;
  99. fvkViewports: TVkViewportArr;
  100. fvkScissors: TVkRect2DArr;
  101. public
  102. property Flags: VkPipelineViewportStateCreateFlags read fFlags write fFlags;
  103. property Viewports: TvkuViewportList read fViewports;
  104. property Scissors: TvkuRect2DList read fScissors;
  105. function GetStructure: TVkPipelineViewportStateCreateInfo;
  106. procedure SetStructure(const aData: TVkPipelineViewportStateCreateInfo);
  107. constructor Create;
  108. destructor Destroy; override;
  109. end;
  110. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  111. TvkuPipelineRasterizationStateCreateInfo = class(TvkuStructure)
  112. Flags: VkPipelineRasterizationStateCreateFlags;
  113. DepthClampEnable: Boolean;
  114. RasterizerDiscardEnable: Boolean;
  115. PolygonMode: TVkPolygonMode;
  116. CullMode: VkCullModeFlags;
  117. FrontFace: TVkFrontFace;
  118. DepthBiasEnable: Boolean;
  119. DepthBiasConstantFactor: VkFloat;
  120. DepthBiasClamp: VkFloat;
  121. DepthBiasSlopeFactor: VkFloat;
  122. LineWidth: VkFloat;
  123. function GetStructure: TVkPipelineRasterizationStateCreateInfo;
  124. procedure SetStructure(const aData: TVkPipelineRasterizationStateCreateInfo);
  125. end;
  126. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  127. TvkuPipelineMultisampleStateCreateInfo = class(TvkuStructure)
  128. private
  129. fSampleMask: TVkSampleMaskList;
  130. public
  131. Flags: VkPipelineMultisampleStateCreateFlags;
  132. RasterizationSamples: TVkSampleCountFlagBits;
  133. SampleShadingEnable: Boolean;
  134. MinSampleShading: VkFloat;
  135. AlphaToCoverageEnable: Boolean;
  136. AlphaToOneEnable: Boolean;
  137. property SampleMask: TVkSampleMaskList read fSampleMask;
  138. function GetStructure: TVkPipelineMultisampleStateCreateInfo;
  139. procedure SetStructure(const aData: TVkPipelineMultisampleStateCreateInfo);
  140. constructor Create;
  141. destructor Destroy; override;
  142. end;
  143. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  144. TvkuPipelineDepthStencilStateCreateInfo = class(TvkuStructure)
  145. public
  146. Flags: VkPipelineDepthStencilStateCreateFlags;
  147. DepthTestEnable: Boolean;
  148. DepthWriteEnable: Boolean;
  149. DepthCompareOp: TVkCompareOp;
  150. DepthBoundsTestEnable: Boolean;
  151. StencilTestEnable: Boolean;
  152. Front: TVkStencilOpState;
  153. Back: TVkStencilOpState;
  154. MinDepthBounds: VkFloat;
  155. MaxDepthBounds: VkFloat;
  156. function GetStructure: TVkPipelineDepthStencilStateCreateInfo;
  157. procedure SetStructure(const aData: TVkPipelineDepthStencilStateCreateInfo);
  158. end;
  159. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  160. TvkuPipelineColorBlendAttachmentState = class(TvkuStructure)
  161. public
  162. BlendEnable: Boolean;
  163. SrcColorBlendFactor: TVkBlendFactor;
  164. DstColorBlendFactor: TVkBlendFactor;
  165. ColorBlendOp: TVkBlendOp;
  166. SrcAlphaBlendFactor: TVkBlendFactor;
  167. DstAlphaBlendFactor: TVkBlendFactor;
  168. AlphaBlendOp: TVkBlendOp;
  169. ColorWriteMask: VkColorComponentFlags;
  170. function GetStructure: TVkPipelineColorBlendAttachmentState;
  171. procedure SetStructure(const aData: TVkPipelineColorBlendAttachmentState);
  172. end;
  173. TvkuPipelineColorBlendAttachmentStateList = specialize TvkuObjList<TvkuPipelineColorBlendAttachmentState>;
  174. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  175. TvkuPipelineColorBlendStateCreateInfo = class(TvkuStructure)
  176. private
  177. fAttachments: TvkuPipelineColorBlendAttachmentStateList;
  178. fvkAttachments: TVkPipelineColorBlendAttachmentStateArr;
  179. public
  180. Flags: VkPipelineColorBlendStateCreateFlags;
  181. LogicOpEnable: Boolean;
  182. LogicOp: TVkLogicOp;
  183. BlendConstants: array[0..3] of VkFloat;
  184. property Attachments: TvkuPipelineColorBlendAttachmentStateList read fAttachments;
  185. function GetStructure: TVkPipelineColorBlendStateCreateInfo;
  186. procedure SetStructure(const aData: TVkPipelineColorBlendStateCreateInfo);
  187. constructor Create;
  188. destructor Destroy; override;
  189. end;
  190. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  191. TvkuPipelineDynamicStateCreateInfo = class(TvkuStructure)
  192. private
  193. fDynamicStates: TVkDynamicStateList;
  194. fvkDynamicStates: TVkDynamicStateArr;
  195. public
  196. Flags: VkPipelineDynamicStateCreateFlags;
  197. property DynamicStates: TVkDynamicStateList read fDynamicStates;
  198. function GetStructure: TVkPipelineDynamicStateCreateInfo;
  199. procedure SetStructure(const aData: TVkPipelineDynamicStateCreateInfo);
  200. constructor Create;
  201. destructor Destroy; override;
  202. end;
  203. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  204. TvkuPipelineFactory = class(TvkuDeviceObjFactory)
  205. private
  206. fFlags: VkPipelineCreateFlags;
  207. fLayout: VkPipelineLayout;
  208. fBasePipelineHandle: VkPipeline;
  209. fBasePipelineIndex: VkInt32;
  210. public
  211. property Flags: VkPipelineCreateFlags read fFlags write fFlags;
  212. property Layout: VkPipelineLayout read fLayout write fLayout;
  213. property BasePipelineHandle: VkPipeline read fBasePipelineHandle write fBasePipelineHandle;
  214. property BasePipelineIndex: VkInt32 read fBasePipelineIndex write fBasePipelineIndex;
  215. end;
  216. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  217. TvkuGraphicsPipelineFactory = class(TvkuPipelineFactory)
  218. private
  219. fRenderPass: VkRenderPass;
  220. fSubpass: VkUint32;
  221. fStages: TvkuPipelineShaderStageCreateInfoList;
  222. fVertexInputState: TvkuPipelineVertexInputStateCreateInfo;
  223. fInputAssemblyState: TvkuPipelineInputAssemblyStateCreateInfo;
  224. fTessellationState: TvkuPipelineTessellationStateCreateInfo;
  225. fViewportState: TvkuPipelineViewportStateCreateInfo;
  226. fRasterizationState: TvkuPipelineRasterizationStateCreateInfo;
  227. fMultisampleState: TvkuPipelineMultisampleStateCreateInfo;
  228. fDepthStencilState: TvkuPipelineDepthStencilStateCreateInfo;
  229. fColorBlendState: TvkuPipelineColorBlendStateCreateInfo;
  230. fDynamicState: TvkuPipelineDynamicStateCreateInfo;
  231. fvkStages: TVkPipelineShaderStageCreateInfoArr;
  232. fvkVertexInputState: TVkPipelineVertexInputStateCreateInfo;
  233. fvkInputAssemblyState: TVkPipelineInputAssemblyStateCreateInfo;
  234. fvkTessellationState: TVkPipelineTessellationStateCreateInfo;
  235. fvkRasterizationState: TVkPipelineRasterizationStateCreateInfo;
  236. fvkColorBlendState: TVkPipelineColorBlendStateCreateInfo;
  237. fvkMultisampleState: TVkPipelineMultisampleStateCreateInfo;
  238. fvkViewportState: TVkPipelineViewportStateCreateInfo;
  239. fvkDepthStencilState: TVkPipelineDepthStencilStateCreateInfo;
  240. fvkDynamicState: TVkPipelineDynamicStateCreateInfo;
  241. public
  242. property RenderPass: VkRenderPass read fRenderPass write fRenderPass;
  243. property SubPass: VkUint32 read fSubPass write fSubPass;
  244. property Stages: TvkuPipelineShaderStageCreateInfoList read fStages;
  245. property VertexInputState: TvkuPipelineVertexInputStateCreateInfo read fVertexInputState;
  246. property InputAssemblyState: TvkuPipelineInputAssemblyStateCreateInfo read fInputAssemblyState;
  247. property TessellationState: TvkuPipelineTessellationStateCreateInfo read fTessellationState;
  248. property ViewportState: TvkuPipelineViewportStateCreateInfo read fViewportState;
  249. property RasterizationState: TvkuPipelineRasterizationStateCreateInfo read fRasterizationState;
  250. property MultiSampleState: TvkuPipelineMultisampleStateCreateInfo read fMultiSampleState;
  251. property DepthStencilState: TvkuPipelineDepthStencilStateCreateInfo read fDepthStencilState;
  252. property ColorBlendState: TvkuPipelineColorBlendStateCreateInfo read fColorBlendState;
  253. property DynamicState: TvkuPipelineDynamicStateCreateInfo read fDynamicState;
  254. function GetStructure: TVkGraphicsPipelineCreateInfo;
  255. procedure SetStructure(const aData: TVkGraphicsPipelineCreateInfo);
  256. function CreateGraphicsPipeline(const aPipelineCache: VkPipelineCache): TvkuGraphicsPipeline;
  257. procedure AfterConstruction; override;
  258. procedure BeforeDestruction; override;
  259. end;
  260. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  261. TvkuComputePipelineFactory = class(TvkuPipelineFactory)
  262. end;
  263. implementation
  264. uses
  265. uvkuUtils;
  266. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  267. //TvkuPipelineShaderStageCreateInfo//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  268. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  269. function TvkuPipelineShaderStageCreateInfo.GetStructure: TVkPipelineShaderStageCreateInfo;
  270. begin
  271. FillByte(result, SizeOf(result), 0);
  272. result.sType := VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
  273. result.pNext := nil;
  274. result.flags := Flags;
  275. result.stage := Stage;
  276. result.module := Module;
  277. result.pName := PVkChar(Name);
  278. result.pSpecializationInfo := nil; // TODO: implement SpecializationInfo
  279. end;
  280. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  281. procedure TvkuPipelineShaderStageCreateInfo.SetStructure(const aData: TVkPipelineShaderStageCreateInfo);
  282. begin
  283. Flags := aData.flags;
  284. Stage := aData.stage;
  285. Module := aData.module;
  286. if Assigned(aData.pName)
  287. then Name := aData.pName
  288. else Name := '';
  289. // TODO: read SpecializationInfo
  290. end;
  291. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  292. //TvkuVertexInputBindingDescription//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  293. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  294. function TvkuVertexInputBindingDescription.GetStructure: TVkVertexInputBindingDescription;
  295. begin
  296. FillByte(result, SizeOf(result), 0);
  297. result.binding := Binding;
  298. result.stride := Stride;
  299. result.inputRate := InputRate;
  300. end;
  301. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  302. procedure TvkuVertexInputBindingDescription.SetStructure(const aData: TVkVertexInputBindingDescription);
  303. begin
  304. Binding := aData.binding;
  305. Stride := aData.stride;
  306. InputRate := aData.inputRate;
  307. end;
  308. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  309. //TvkuVertexInputAttributeDescription////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  310. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  311. function TvkuVertexInputAttributeDescription.GetStructure: TVkVertexInputAttributeDescription;
  312. begin
  313. FillByte(result, SizeOf(result), 0);
  314. result.location := Location;
  315. result.binding := Binding;
  316. result.format := Format;
  317. result.offset := Offset;
  318. end;
  319. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  320. procedure TvkuVertexInputAttributeDescription.SetStructure(const aData: TVkVertexInputAttributeDescription);
  321. begin
  322. Location := aData.location;
  323. Binding := aData.binding;
  324. Format := aData.format;
  325. Offset := aData.offset;
  326. end;
  327. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  328. //TvkuPipelineVertexInputStateCreateInfo/////////////////////////////////////////////////////////////////////////////////////////////////////////////
  329. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  330. function TvkuPipelineVertexInputStateCreateInfo.GetStructure: TVkPipelineVertexInputStateCreateInfo;
  331. var i: Integer;
  332. begin
  333. SetLength(fvkVertexBindingDescriptions, fVertexBindingDescriptions.Length);
  334. for i := low(fvkVertexBindingDescriptions) to high(fvkVertexBindingDescriptions) do
  335. fvkVertexBindingDescriptions[i] := fVertexBindingDescriptions[i].GetStructure;
  336. SetLength(fvkVertexAttributeDescriptions, fVertexAttributeDescriptions.Length);
  337. for i := low(fvkVertexAttributeDescriptions) to high(fvkVertexAttributeDescriptions) do
  338. fvkVertexAttributeDescriptions[i] := fVertexAttributeDescriptions[i].GetStructure;
  339. FillByte(result, SizeOf(result), 0);
  340. result.sType := VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
  341. result.pNext := nil;
  342. result.flags := fFlags;
  343. result.vertexBindingDescriptionCount := Length(fvkVertexBindingDescriptions);
  344. result.pVertexBindingDescriptions := @fvkVertexBindingDescriptions[0];
  345. result.vertexAttributeDescriptionCount := Length(fvkVertexAttributeDescriptions);
  346. result.pVertexAttributeDescriptions := @fvkVertexAttributeDescriptions[0];
  347. end;
  348. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  349. procedure TvkuPipelineVertexInputStateCreateInfo.SetStructure(const aData: TVkPipelineVertexInputStateCreateInfo);
  350. var i: Integer;
  351. begin
  352. if Assigned(aData.pVertexAttributeDescriptions) then begin
  353. fVertexAttributeDescriptions.Length := aData.vertexAttributeDescriptionCount;
  354. for i := 0 to fVertexAttributeDescriptions.Length-1 do
  355. fVertexAttributeDescriptions[i].SetStructure((aData.pVertexAttributeDescriptions + i)^);
  356. end;
  357. if Assigned(aData.pVertexBindingDescriptions) then begin
  358. fVertexBindingDescriptions.Length := aData.vertexBindingDescriptionCount;
  359. for i := 0 to fVertexBindingDescriptions.Length-1 do
  360. fVertexBindingDescriptions[i].SetStructure((aData.pVertexBindingDescriptions + i)^);
  361. end;
  362. fFlags := aData.flags;
  363. end;
  364. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  365. constructor TvkuPipelineVertexInputStateCreateInfo.Create;
  366. begin
  367. inherited Create;
  368. fVertexAttributeDescriptions := TvkuVertexInputAttributeDescriptionList.Create;
  369. fVertexBindingDescriptions := TvkuVertexInputBindingDescriptionList.Create;
  370. end;
  371. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  372. destructor TvkuPipelineVertexInputStateCreateInfo.Destroy;
  373. begin
  374. FreeAndNil(fVertexBindingDescriptions);
  375. FreeAndNil(fVertexAttributeDescriptions);
  376. inherited Destroy;
  377. end;
  378. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  379. //TvkuPipelineInputAssemblyStateCreateInfo///////////////////////////////////////////////////////////////////////////////////////////////////////////
  380. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  381. function TvkuPipelineInputAssemblyStateCreateInfo.GetStructure: TVkPipelineInputAssemblyStateCreateInfo;
  382. begin
  383. FillByte(result, SizeOf(result), 0);
  384. result.sType := VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
  385. result.pNext := nil;
  386. result.flags := Flags;
  387. result.topology := Topology;
  388. if PrimitiveRestartEnable
  389. then result.primitiveRestartEnable := VK_TRUE
  390. else result.primitiveRestartEnable := VK_FALSE;
  391. end;
  392. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  393. procedure TvkuPipelineInputAssemblyStateCreateInfo.SetStructure(const aData: TVkPipelineInputAssemblyStateCreateInfo);
  394. begin
  395. Flags := aData.flags;
  396. Topology := aData.topology;
  397. PrimitiveRestartEnable := (aData.primitiveRestartEnable <> 0);
  398. end;
  399. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  400. //TvkuPipelineTessellationStateCreateInfo////////////////////////////////////////////////////////////////////////////////////////////////////////////
  401. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  402. function TvkuPipelineTessellationStateCreateInfo.GetStructure: TVkPipelineTessellationStateCreateInfo;
  403. begin
  404. FillByte(result, SizeOf(result), 0);
  405. result.sType := VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
  406. result.pNext := nil;
  407. result.flags := Flags;
  408. result.patchControlPoints := PatchControlPoints;
  409. end;
  410. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  411. procedure TvkuPipelineTessellationStateCreateInfo.SetStructure(const aData: TVkPipelineTessellationStateCreateInfo);
  412. begin
  413. Flags := aData.flags;
  414. PatchControlPoints := aData.patchControlPoints;
  415. end;
  416. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  417. //TvkuViewport///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  418. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  419. function TvkuViewport.GetStructure: TVkViewport;
  420. begin
  421. FillByte(result, SizeOf(result), 0);
  422. result.x := x;
  423. result.y := y;
  424. result.width := Width;
  425. result.height := Height;
  426. result.minDepth := MinDepth;
  427. result.maxDepth := MaxDepth;
  428. end;
  429. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  430. procedure TvkuViewport.SetStructure(const aData: TVkViewport);
  431. begin
  432. x := aData.x;
  433. y := aData.y;
  434. Width := aData.width;
  435. Height := aData.height;
  436. MinDepth := aData.minDepth;
  437. MaxDepth := aData.maxDepth;
  438. end;
  439. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  440. //TvkuRect2D/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  441. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  442. function TvkuRect2D.GetStructure: TVkRect2D;
  443. begin
  444. FillByte(result, SizeOf(result), 0);
  445. result.offset := Offset;
  446. result.extent := Extent;
  447. end;
  448. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  449. procedure TvkuRect2D.SetStructure(const aData: TVkRect2D);
  450. begin
  451. Offset := aData.offset;
  452. Extent := aData.extent;
  453. end;
  454. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  455. //TvkuPipelineViewportStateCreateInfo////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  456. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  457. function TvkuPipelineViewportStateCreateInfo.GetStructure: TVkPipelineViewportStateCreateInfo;
  458. var i: Integer;
  459. begin
  460. SetLength(fvkViewports, fViewports.Length);
  461. for i := low(fvkViewports) to high(fvkViewports) do
  462. fvkViewports[i] := fViewports[i].GetStructure;
  463. SetLength(fvkScissors, fScissors.Length);
  464. for i := low(fvkScissors) to high(fvkScissors) do
  465. fvkScissors[i] := fScissors[i].GetStructure;
  466. FillByte(result, SizeOf(result), 0);
  467. result.sType := VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
  468. result.pNext := nil;
  469. result.flags := fFlags;
  470. result.viewportCount := Length(fvkViewports);
  471. result.pViewports := @fvkViewports[0];
  472. result.scissorCount := Length(fvkScissors);
  473. result.pScissors := @fvkScissors[0];
  474. end;
  475. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  476. procedure TvkuPipelineViewportStateCreateInfo.SetStructure(const aData: TVkPipelineViewportStateCreateInfo);
  477. var i: Integer;
  478. begin
  479. if Assigned(aData.pViewports) then begin
  480. fViewports.Length := aData.viewportCount;
  481. for i := 0 to fViewports.Length-1 do
  482. fViewports[i].SetStructure((aData.pViewports + i)^);
  483. end;
  484. if Assigned(aData.pScissors) then begin
  485. fScissors.Length := aData.scissorCount;
  486. for i := 0 to fScissors.Length-1 do
  487. fScissors[i].SetStructure((aData.pScissors + i)^);
  488. end;
  489. fFlags := aData.flags;
  490. end;
  491. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  492. constructor TvkuPipelineViewportStateCreateInfo.Create;
  493. begin
  494. inherited Create;
  495. fViewports := TvkuViewportList.Create;
  496. fScissors := TvkuRect2DList.Create;
  497. end;
  498. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  499. destructor TvkuPipelineViewportStateCreateInfo.Destroy;
  500. begin
  501. FreeAndNil(fViewports);
  502. FreeAndNil(fScissors);
  503. inherited Destroy;
  504. end;
  505. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  506. //TvkuPipelineRasterizationStateCreateInfo///////////////////////////////////////////////////////////////////////////////////////////////////////////
  507. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  508. function TvkuPipelineRasterizationStateCreateInfo.GetStructure: TVkPipelineRasterizationStateCreateInfo;
  509. begin
  510. FillByte(result, SizeOf(result), 0);
  511. result.sType := VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
  512. result.pNext := nil;
  513. result.flags := Flags;
  514. result.polygonMode := PolygonMode;
  515. result.cullMode := CullMode;
  516. result.frontFace := FrontFace;
  517. result.depthBiasConstantFactor := DepthBiasConstantFactor;
  518. result.depthBiasClamp := DepthBiasClamp;
  519. result.depthBiasSlopeFactor := DepthBiasSlopeFactor;
  520. result.lineWidth := LineWidth;
  521. if DepthClampEnable
  522. then result.depthClampEnable := VK_TRUE
  523. else result.depthClampEnable := VK_FALSE;
  524. if RasterizerDiscardEnable
  525. then result.rasterizerDiscardEnable := VK_TRUE
  526. else result.rasterizerDiscardEnable := VK_FALSE;
  527. if DepthBiasEnable
  528. then result.depthBiasEnable := VK_TRUE
  529. else result.depthBiasEnable := VK_FALSE;
  530. end;
  531. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  532. procedure TvkuPipelineRasterizationStateCreateInfo.SetStructure(const aData: TVkPipelineRasterizationStateCreateInfo);
  533. begin
  534. Flags := aData.flags;
  535. DepthClampEnable := (aData.depthClampEnable <> 0);
  536. RasterizerDiscardEnable := (aData.rasterizerDiscardEnable <> 0);
  537. PolygonMode := aData.polygonMode;
  538. CullMode := aData.cullMode;
  539. FrontFace := aData.frontFace;
  540. DepthBiasEnable := (aData.depthBiasEnable <> 0);
  541. DepthBiasConstantFactor := aData.depthBiasConstantFactor;
  542. DepthBiasClamp := aData.depthBiasClamp;
  543. DepthBiasSlopeFactor := aData.depthBiasSlopeFactor;
  544. LineWidth := aData.lineWidth;
  545. end;
  546. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  547. //TvkuPipelineMultisampleStateCreateInfo/////////////////////////////////////////////////////////////////////////////////////////////////////////////
  548. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  549. function TvkuPipelineMultisampleStateCreateInfo.GetStructure: TVkPipelineMultisampleStateCreateInfo;
  550. var i: Integer;
  551. begin
  552. if (fSampleMask.Length <> 0) then
  553. fSampleMask.Length := 32;
  554. FillByte(result, SizeOf(result), 0);
  555. result.sType := VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
  556. result.pNext := nil;
  557. result.flags := Flags;
  558. result.rasterizationSamples := RasterizationSamples;
  559. result.minSampleShading := MinSampleShading;
  560. result.pSampleMask := fSampleMask.PData;
  561. if SampleShadingEnable
  562. then result.sampleShadingEnable := VK_TRUE
  563. else result.sampleShadingEnable := VK_FALSE;
  564. if AlphaToCoverageEnable
  565. then result.alphaToCoverageEnable := VK_TRUE
  566. else result.alphaToCoverageEnable := VK_FALSE;
  567. if AlphaToOneEnable
  568. then result.alphaToOneEnable := VK_TRUE
  569. else result.alphaToOneEnable := VK_FALSE;
  570. end;
  571. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  572. procedure TvkuPipelineMultisampleStateCreateInfo.SetStructure(const aData: TVkPipelineMultisampleStateCreateInfo);
  573. begin
  574. fSampleMask.SetData(aData.pSampleMask, 32);
  575. Flags := aData.flags;
  576. RasterizationSamples := aData.rasterizationSamples;
  577. SampleShadingEnable := (aData.sampleShadingEnable <> 0);
  578. MinSampleShading := aData.minSampleShading;
  579. AlphaToCoverageEnable := (aData.alphaToCoverageEnable <> 0);
  580. AlphaToOneEnable := (aData.alphaToOneEnable <> 0);
  581. end;
  582. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  583. constructor TvkuPipelineMultisampleStateCreateInfo.Create;
  584. begin
  585. inherited Create;
  586. fSampleMask := TVkSampleMaskList.Create;
  587. end;
  588. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  589. destructor TvkuPipelineMultisampleStateCreateInfo.Destroy;
  590. begin
  591. FreeAndNil(fSampleMask);
  592. inherited Destroy;
  593. end;
  594. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  595. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  596. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  597. function TvkuPipelineDepthStencilStateCreateInfo.GetStructure: TVkPipelineDepthStencilStateCreateInfo;
  598. begin
  599. FillByte(result, SizeOf(result), 0);
  600. result.sType := VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
  601. result.pNext := nil;
  602. result.flags := Flags;
  603. result.depthCompareOp := DepthCompareOp;
  604. result.front := Front;
  605. result.back := Back;
  606. result.minDepthBounds := MinDepthBounds;
  607. result.maxDepthBounds := MaxDepthBounds;
  608. if DepthTestEnable
  609. then result.depthTestEnable := VK_TRUE
  610. else result.depthTestEnable := VK_FALSE;
  611. if DepthWriteEnable
  612. then result.depthWriteEnable := VK_TRUE
  613. else result.depthWriteEnable := VK_FALSE;
  614. if DepthBoundsTestEnable
  615. then result.depthBoundsTestEnable := VK_TRUE
  616. else result.depthBoundsTestEnable := VK_FALSE;
  617. if StencilTestEnable
  618. then result.stencilTestEnable := VK_TRUE
  619. else result.stencilTestEnable := VK_FALSE;
  620. end;
  621. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  622. procedure TvkuPipelineDepthStencilStateCreateInfo.SetStructure(const aData: TVkPipelineDepthStencilStateCreateInfo);
  623. begin
  624. Flags := aData.flags;
  625. DepthTestEnable := (aData.depthTestEnable <> 0);
  626. DepthWriteEnable := (aData.depthWriteEnable <> 0);
  627. DepthCompareOp := aData.depthCompareOp;
  628. DepthBoundsTestEnable := (aData.depthBoundsTestEnable <> 0);
  629. StencilTestEnable := (aData.stencilTestEnable <> 0);
  630. Front := aData.front;
  631. Back := aData.back;
  632. MinDepthBounds := aData.minDepthBounds;
  633. MaxDepthBounds := aData.maxDepthBounds;
  634. end;
  635. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  636. //TvkuPipelineColorBlendAttachmentState//////////////////////////////////////////////////////////////////////////////////////////////////////////////
  637. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  638. function TvkuPipelineColorBlendAttachmentState.GetStructure: TVkPipelineColorBlendAttachmentState;
  639. begin
  640. FillByte(result, SizeOf(result), 0);
  641. if BlendEnable
  642. then result.blendEnable := VK_TRUE
  643. else result.blendEnable := VK_FALSE;
  644. result.srcColorBlendFactor := SrcColorBlendFactor;
  645. result.dstColorBlendFactor := DstColorBlendFactor;
  646. result.colorBlendOp := ColorBlendOp;
  647. result.srcAlphaBlendFactor := SrcAlphaBlendFactor;
  648. result.dstAlphaBlendFactor := DstAlphaBlendFactor;
  649. result.alphaBlendOp := AlphaBlendOp;
  650. result.colorWriteMask := ColorWriteMask;
  651. end;
  652. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  653. procedure TvkuPipelineColorBlendAttachmentState.SetStructure(const aData: TVkPipelineColorBlendAttachmentState);
  654. begin
  655. BlendEnable := (aData.blendEnable <> 0);
  656. SrcColorBlendFactor := aData.srcColorBlendFactor;
  657. DstColorBlendFactor := aData.dstColorBlendFactor;
  658. ColorBlendOp := aData.colorBlendOp;
  659. SrcAlphaBlendFactor := aData.srcAlphaBlendFactor;
  660. DstAlphaBlendFactor := aData.dstAlphaBlendFactor;
  661. AlphaBlendOp := aData.alphaBlendOp;
  662. ColorWriteMask := aData.colorWriteMask;
  663. end;
  664. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  665. //TvkuPipelineColorBlendStateCreateInfo//////////////////////////////////////////////////////////////////////////////////////////////////////////////
  666. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  667. function TvkuPipelineColorBlendStateCreateInfo.GetStructure: TVkPipelineColorBlendStateCreateInfo;
  668. var i: Integer;
  669. begin
  670. SetLength(fvkAttachments, fAttachments.Length);
  671. for i := low(fvkAttachments) to high(fvkAttachments) do
  672. fvkAttachments[i] := fAttachments[i].GetStructure;
  673. FillByte(result, SizeOf(result), 0);
  674. result.sType := VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
  675. result.pNext := nil;
  676. result.flags := Flags;
  677. result.logicOp := LogicOp;
  678. result.attachmentCount := Length(fvkAttachments);
  679. result.pAttachments := @fvkAttachments[0];
  680. result.blendConstants := BlendConstants;
  681. if LogicOpEnable
  682. then result.logicOpEnable := VK_TRUE
  683. else result.logicOpEnable := VK_FALSE;
  684. end;
  685. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  686. procedure TvkuPipelineColorBlendStateCreateInfo.SetStructure(const aData: TVkPipelineColorBlendStateCreateInfo);
  687. var i: Integer;
  688. begin
  689. if Assigned(aData.pAttachments) then begin
  690. fAttachments.Length := aData.attachmentCount;
  691. for i := 0 to fAttachments.Length-1 do
  692. fAttachments[i].SetStructure((aData.pAttachments + i)^);
  693. end;
  694. Flags := aData.flags;
  695. LogicOp := aData.logicOp;
  696. LogicOpEnable := (aData.logicOpEnable <> 0);
  697. BlendConstants := aData.blendConstants;
  698. end;
  699. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  700. constructor TvkuPipelineColorBlendStateCreateInfo.Create;
  701. begin
  702. inherited Create;
  703. fAttachments := TvkuPipelineColorBlendAttachmentStateList.Create;
  704. end;
  705. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  706. destructor TvkuPipelineColorBlendStateCreateInfo.Destroy;
  707. begin
  708. FreeAndNil(fAttachments);
  709. inherited Destroy;
  710. end;
  711. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  712. //TvkuPipelineDynamicStateCreateInfo/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  713. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  714. function TvkuPipelineDynamicStateCreateInfo.GetStructure: TVkPipelineDynamicStateCreateInfo;
  715. begin
  716. FillByte(result, SizeOf(result), 0);
  717. result.sType := VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
  718. result.pNext := nil;
  719. result.flags := Flags;
  720. result.dynamicStateCount := fDynamicStates.Length;
  721. result.pDynamicStates := fDynamicStates.PData;
  722. end;
  723. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  724. procedure TvkuPipelineDynamicStateCreateInfo.SetStructure(const aData: TVkPipelineDynamicStateCreateInfo);
  725. begin
  726. fDynamicStates.SetData(aData.pDynamicStates, aData.dynamicStateCount);
  727. Flags := aData.flags;
  728. end;
  729. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  730. constructor TvkuPipelineDynamicStateCreateInfo.Create;
  731. begin
  732. inherited Create;
  733. fDynamicStates := TVkDynamicStateList.Create;
  734. end;
  735. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  736. destructor TvkuPipelineDynamicStateCreateInfo.Destroy;
  737. begin
  738. FreeAndNil(fDynamicStates);
  739. inherited Destroy;
  740. end;
  741. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  742. //TvkuGraphicsPipelineFactory////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  743. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  744. function TvkuGraphicsPipelineFactory.GetStructure: TVkGraphicsPipelineCreateInfo;
  745. var i: Integer;
  746. begin
  747. SetLength(fvkStages, fStages.Length);
  748. for i := low(fvkStages) to high(fvkStages) do
  749. fvkStages[i] := fStages[i].GetStructure;
  750. fvkVertexInputState := fVertexInputState.GetStructure;
  751. fvkInputAssemblyState := fInputAssemblyState.GetStructure;
  752. fvkTessellationState := fTessellationState.GetStructure;
  753. fvkViewportState := fViewportState.GetStructure;
  754. fvkRasterizationState := fRasterizationState.GetStructure;
  755. fvkMultisampleState := fMultisampleState.GetStructure;
  756. fvkDepthStencilState := fDepthStencilState.GetStructure;
  757. fvkColorBlendState := fColorBlendState.GetStructure;
  758. fvkDynamicState := fDynamicState.GetStructure;
  759. FillByte(result, SizeOf(result), 0);
  760. result.sType := VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
  761. result.pNext := nil;
  762. result.flags := fFlags;
  763. result.stageCount := Length(fvkStages);
  764. result.pStages := @fvkStages[0];
  765. result.pVertexInputState := @fvkVertexInputState;
  766. result.pInputAssemblyState := @fvkInputAssemblyState;
  767. result.pTessellationState := @fvkTessellationState;
  768. result.pViewportState := @fvkViewportState;
  769. result.pRasterizationState := @fvkRasterizationState;
  770. result.pMultisampleState := @fvkMultisampleState;
  771. result.pDepthStencilState := @fvkDepthStencilState;
  772. result.pColorBlendState := @fvkColorBlendState;
  773. result.pDynamicState := @fvkDynamicState;
  774. result.layout := fLayout;
  775. result.renderPass := fRenderPass;
  776. result.subpass := fSubPass;
  777. result.basePipelineHandle := fBasePipelineHandle;
  778. result.basePipelineIndex := fBasePipelineIndex;
  779. end;
  780. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  781. procedure TvkuGraphicsPipelineFactory.SetStructure(const aData: TVkGraphicsPipelineCreateInfo);
  782. var i: Integer;
  783. begin
  784. if Assigned(aData.pStages) then begin
  785. fStages.Length := aData.stageCount;
  786. for i := 0 to aData.stageCount-1 do
  787. fStages[i].SetStructure((aData.pStages + i)^);
  788. end;
  789. fFlags := aData.flags;
  790. fLayout := aData.layout;
  791. fRenderPass := aData.renderPass;
  792. fSubPass := aData.subpass;
  793. fBasePipelineHandle := aData.basePipelineHandle;
  794. fBasePipelineIndex := aData.basePipelineIndex;
  795. end;
  796. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  797. function TvkuGraphicsPipelineFactory.CreateGraphicsPipeline(const aPipelineCache: VkPipelineCache): TvkuGraphicsPipeline;
  798. begin
  799. result := TvkuGraphicsPipeline.Create(GetStructure, aPipelineCache, DeviceCommands, AllocCallbacks);
  800. end;
  801. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  802. procedure TvkuGraphicsPipelineFactory.AfterConstruction;
  803. begin
  804. inherited AfterConstruction;
  805. fStages := TvkuPipelineShaderStageCreateInfoList.Create;
  806. fVertexInputState := TvkuPipelineVertexInputStateCreateInfo.Create;
  807. fInputAssemblyState := TvkuPipelineInputAssemblyStateCreateInfo.Create;
  808. fTessellationState := TvkuPipelineTessellationStateCreateInfo.Create;
  809. fViewportState := TvkuPipelineViewportStateCreateInfo.Create;
  810. fRasterizationState := TvkuPipelineRasterizationStateCreateInfo.Create;
  811. fMultisampleState := TvkuPipelineMultisampleStateCreateInfo.Create;
  812. fDepthStencilState := TvkuPipelineDepthStencilStateCreateInfo.Create;
  813. fColorBlendState := TvkuPipelineColorBlendStateCreateInfo.Create;
  814. fDynamicState := TvkuPipelineDynamicStateCreateInfo.Create;
  815. end;
  816. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  817. procedure TvkuGraphicsPipelineFactory.BeforeDestruction;
  818. begin
  819. FreeAndNil(fDynamicState);
  820. FreeAndNil(fColorBlendState);
  821. FreeAndNil(fDepthStencilState);
  822. FreeAndNil(fMultisampleState);
  823. FreeAndNil(fRasterizationState);
  824. FreeAndNil(fViewportState);
  825. FreeAndNil(fTessellationState);
  826. FreeAndNil(fInputAssemblyState);
  827. FreeAndNil(fVertexInputState);
  828. FreeAndNil(fStages);
  829. inherited BeforeDestruction;
  830. end;
  831. end.