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.

125 regels
5.3 KiB

  1. unit uvkuPipelineLayoutFactory;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils,
  6. Vulkan, uvkuFactoryBase, uvkuPipelineLayout, uvkuTypes;
  7. type
  8. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  9. TvkuPushConstantRange = class(TvkuStructure)
  10. public
  11. StageFlags: VkShaderStageFlags;
  12. Offset: VkUint32;
  13. Size: VkUint32;
  14. function GetStructure: TVkPushConstantRange;
  15. procedure SetStructure(const aData: TVkPushConstantRange);
  16. end;
  17. TvkuPushConstantRangeList = specialize TvkuObjList<TvkuPushConstantRange>;
  18. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  19. TvkuPipelineLayoutFactory = class(TvkuDeviceObjFactory)
  20. private
  21. fFlags: VkPipelineLayoutCreateFlags;
  22. fSetLayouts: TVkDescriptorSetLayoutList;
  23. fPushConstantRanges: TvkuPushConstantRangeList;
  24. fvkPushConstantRanges: TVkPushConstantRangeArr;
  25. public
  26. property Flags: VkPipelineLayoutCreateFlags read fFlags write fFlags;
  27. property SetLayouts: TVkDescriptorSetLayoutList read fSetLayouts;
  28. property PushConstantRanges: TvkuPushConstantRangeList read fPushConstantRanges;
  29. function GetStructure: TVkPipelineLayoutCreateInfo;
  30. procedure SetStructure(const aData: TVkPipelineLayoutCreateInfo);
  31. function CreatePipelineLayout: TvkuPipelineLayout;
  32. procedure AfterConstruction; override;
  33. procedure BeforeDestruction; override;
  34. end;
  35. implementation
  36. uses
  37. uvkuUtils;
  38. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  39. //TvkuPushConstantRange//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  40. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  41. function TvkuPushConstantRange.GetStructure: TVkPushConstantRange;
  42. begin
  43. FillByte(result, SizeOf(result), 0);
  44. result.stageFlags := StageFlags;
  45. result.offset := Offset;
  46. result.size := Size;
  47. end;
  48. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  49. procedure TvkuPushConstantRange.SetStructure(const aData: TVkPushConstantRange);
  50. begin
  51. StageFlags := aData.stageFlags;
  52. Offset := aData.offset;
  53. Size := aData.size;
  54. end;
  55. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  56. //TvkuPipelineLayoutFactory//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  57. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  58. function TvkuPipelineLayoutFactory.GetStructure: TVkPipelineLayoutCreateInfo;
  59. var i: Integer;
  60. begin
  61. SetLength(fvkPushConstantRanges, fPushConstantRanges.Length);
  62. for i := low(fvkPushConstantRanges) to high(fvkPushConstantRanges) do
  63. fvkPushConstantRanges[i] := fPushConstantRanges[i].GetStructure;
  64. FillByte(result, SizeOf(result), 0);
  65. result.sType := VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
  66. result.pNext := nil;
  67. result.flags := fFlags;
  68. result.setLayoutCount := fSetLayouts.Length;
  69. result.pSetLayouts := fSetLayouts.PData;
  70. result.pushConstantRangeCount := Length(fvkPushConstantRanges);
  71. result.pPushConstantRanges := @fvkPushConstantRanges[0];
  72. end;
  73. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  74. procedure TvkuPipelineLayoutFactory.SetStructure(const aData: TVkPipelineLayoutCreateInfo);
  75. var i: Integer;
  76. begin
  77. fFlags := aData.flags;
  78. fSetLayouts.SetData(aData.pSetLayouts, aData.setLayoutCount);
  79. fPushConstantRanges.Length := aData.pushConstantRangeCount;
  80. for i := 0 to fPushConstantRanges.Length-1 do
  81. fPushConstantRanges[i].SetStructure((aData.pPushConstantRanges + i)^);
  82. end;
  83. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  84. function TvkuPipelineLayoutFactory.CreatePipelineLayout: TvkuPipelineLayout;
  85. begin
  86. result := TvkuPipelineLayout.Create(GetStructure, DeviceCommands, AllocCallbacks);
  87. end;
  88. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  89. procedure TvkuPipelineLayoutFactory.AfterConstruction;
  90. begin
  91. inherited AfterConstruction;
  92. fSetLayouts := TVkDescriptorSetLayoutList.Create;
  93. fPushConstantRanges := TvkuPushConstantRangeList.Create;
  94. end;
  95. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  96. procedure TvkuPipelineLayoutFactory.BeforeDestruction;
  97. begin
  98. FreeAndNil(fPushConstantRanges);
  99. FreeAndNil(fSetLayouts);
  100. inherited BeforeDestruction;
  101. end;
  102. end.