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.

201 lines
9.4 KiB

  1. unit uvkuRenderPassFactory;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils,
  6. Vulkan, uvkuFactoryBase, uvkuRenderPass, uvkuAllocationHandler, uvkuTypes;
  7. type
  8. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  9. TvkuRenderPassEx = class(TvkuRenderPass)
  10. private
  11. fAllocHandler: TvkuAllocationHandler;
  12. fOwnsHandler: Boolean;
  13. public
  14. destructor Destroy; override;
  15. end;
  16. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  17. TvkuRenderPassFactory = class(TvkuDeviceObjFactory)
  18. private
  19. fFlags: VkRenderPassCreateFlags;
  20. fAttachments: TvkuAttachmentDescriptionArr;
  21. fSubpasses: TvkuSubpassDescriptionArr;
  22. fDependencies: TvkuSubpassDependencyArr;
  23. function GetAttachment(const aIndex: Integer): TVkAttachmentDescription;
  24. function GetAttachmentCount: Integer;
  25. function GetDependency(const aIndex: Integer): TVkSubpassDependency;
  26. function GetDependencyCount: Integer;
  27. function GetSubpass(const aIndex: Integer): TVkSubpassDescription;
  28. function GetSubpassCount: Integer;
  29. procedure SetAttachment(const aIndex: Integer; aValue: TVkAttachmentDescription);
  30. procedure SetAttachmentCount(aValue: Integer);
  31. procedure SetDependency(const aIndex: Integer; aValue: TVkSubpassDependency);
  32. procedure SetDependencyCount(aValue: Integer);
  33. procedure SetSubpass(const aIndex: Integer; aValue: TVkSubpassDescription);
  34. procedure SetSubpassCount(aValue: Integer);
  35. public
  36. property Flags: VkRenderPassCreateFlags read fFlags write fFlags;
  37. property Attachments: TvkuAttachmentDescriptionArr read fAttachments write fAttachments;
  38. property AttachmentCount: Integer read GetAttachmentCount write SetAttachmentCount;
  39. property Attachment[const aIndex: Integer]: TVkAttachmentDescription read GetAttachment write SetAttachment;
  40. property Subpasses: TvkuSubpassDescriptionArr read fSubpasses write fSubpasses;
  41. property SubpassCount: Integer read GetSubpassCount write SetSubpassCount;
  42. property Subpass[const aIndex: Integer]: TVkSubpassDescription read GetSubpass write SetSubpass;
  43. property Dependencies: TvkuSubpassDependencyArr read fDependencies write fDependencies;
  44. property DependencyCount: Integer read GetDependencyCount write SetDependencyCount;
  45. property Dependency[const aIndex: Integer]: TVkSubpassDependency read GetDependency write SetDependency;
  46. function CreateRenderPass: TvkuRenderPassEx;
  47. function CreateRenderPass(
  48. const aAllocHandler: TvkuAllocationHandler;
  49. const aOwnsHandler: Boolean): TvkuRenderPassEx;
  50. end;
  51. implementation
  52. uses
  53. uvkuUtils;
  54. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  55. //TvkuRenderPassEx///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  56. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  57. destructor TvkuRenderPassEx.Destroy;
  58. begin
  59. inherited Destroy;
  60. if fOwnsHandler then
  61. FreeAndNil(fAllocHandler);
  62. end;
  63. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  64. //TvkuRenderPassFactory//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  65. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  66. function TvkuRenderPassFactory.GetAttachment(const aIndex: Integer): TVkAttachmentDescription;
  67. begin
  68. if (aIndex < low(fAttachments)) or (aIndex > high(fAttachments)) then
  69. raise TvkuException.CreateFmt('index (%d) out of range (%d : %d)', [aIndex, Low(fAttachments), High(fAttachments)]);
  70. result := fAttachments[aIndex];
  71. end;
  72. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  73. function TvkuRenderPassFactory.GetAttachmentCount: Integer;
  74. begin
  75. result := Length(fAttachments);
  76. end;
  77. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  78. function TvkuRenderPassFactory.GetDependency(const aIndex: Integer): TVkSubpassDependency;
  79. begin
  80. if (aIndex < low(fDependencies)) or (aIndex > high(fDependencies)) then
  81. raise TvkuException.CreateFmt('index (%d) out of range (%d : %d)', [aIndex, Low(fDependencies), High(fDependencies)]);
  82. result := fDependencies[aIndex];
  83. end;
  84. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  85. function TvkuRenderPassFactory.GetDependencyCount: Integer;
  86. begin
  87. result := Length(fDependencies);
  88. end;
  89. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  90. function TvkuRenderPassFactory.GetSubpass(const aIndex: Integer): TVkSubpassDescription;
  91. begin
  92. if (aIndex < low(fSubpasses)) or (aIndex > high(fSubpasses)) then
  93. raise TvkuException.CreateFmt('index (%d) out of range (%d : %d)', [aIndex, Low(fSubpasses), High(fSubpasses)]);
  94. result := fSubpasses[aIndex];
  95. end;
  96. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  97. function TvkuRenderPassFactory.GetSubpassCount: Integer;
  98. begin
  99. result := Length(fSubpasses);
  100. end;
  101. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  102. procedure TvkuRenderPassFactory.SetAttachment(const aIndex: Integer; aValue: TVkAttachmentDescription);
  103. begin
  104. if (aIndex < low(fAttachments)) or (aIndex > high(fAttachments)) then
  105. raise TvkuException.CreateFmt('index (%d) out of range (%d : %d)', [aIndex, Low(fAttachments), High(fAttachments)]);
  106. fAttachments[aIndex] := aValue;
  107. end;
  108. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  109. procedure TvkuRenderPassFactory.SetAttachmentCount(aValue: Integer);
  110. begin
  111. SetLength(fAttachments, aValue);
  112. end;
  113. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  114. procedure TvkuRenderPassFactory.SetDependency(const aIndex: Integer; aValue: TVkSubpassDependency);
  115. begin
  116. if (aIndex < low(fDependencies)) or (aIndex > high(fDependencies)) then
  117. raise TvkuException.CreateFmt('index (%d) out of range (%d : %d)', [aIndex, Low(fDependencies), High(fDependencies)]);
  118. fDependencies[aIndex] := aValue;
  119. end;
  120. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  121. procedure TvkuRenderPassFactory.SetDependencyCount(aValue: Integer);
  122. begin
  123. SetLength(fDependencies, aValue);
  124. end;
  125. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  126. procedure TvkuRenderPassFactory.SetSubpass(const aIndex: Integer; aValue: TVkSubpassDescription);
  127. begin
  128. if (aIndex < low(fSubpasses)) or (aIndex > high(fSubpasses)) then
  129. raise TvkuException.CreateFmt('index (%d) out of range (%d : %d)', [aIndex, Low(fSubpasses), High(fSubpasses)]);
  130. fSubpasses[aIndex] := aValue;
  131. end;
  132. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  133. procedure TvkuRenderPassFactory.SetSubpassCount(aValue: Integer);
  134. begin
  135. SetLength(fSubpasses, aValue);
  136. end;
  137. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  138. function TvkuRenderPassFactory.CreateRenderPass: TvkuRenderPassEx;
  139. begin
  140. result := CreateRenderPass(nil, false);
  141. end;
  142. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  143. function TvkuRenderPassFactory.CreateRenderPass(const aAllocHandler: TvkuAllocationHandler;
  144. const aOwnsHandler: Boolean): TvkuRenderPassEx;
  145. var
  146. CreateInfo: TVkRenderPassCreateInfo;
  147. begin
  148. FillByte(CreateInfo, SizeOf(CreateInfo), 0);
  149. CreateInfo.sType := VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
  150. CreateInfo.pNext := nil;
  151. CreateInfo.flags := fFlags;
  152. CreateInfo.attachmentCount := Length(fAttachments);
  153. CreateInfo.pAttachments := @fAttachments[0];
  154. CreateInfo.subpassCount := Length(fSubpasses);
  155. CreateInfo.pSubpasses := @fSubpasses[0];
  156. CreateInfo.dependencyCount := Length(fDependencies);
  157. CreateInfo.pDependencies := @fDependencies[0];
  158. if Assigned(aAllocHandler)
  159. then result := TvkuRenderPassEx.Create(CreateInfo, DeviceCommands, aAllocHandler.GetAllocationCallbacksPtr)
  160. else result := TvkuRenderPassEx.Create(CreateInfo, DeviceCommands);
  161. try
  162. TvkuRenderPassEx(result).fAllocHandler := aAllocHandler;
  163. TvkuRenderPassEx(result).fOwnsHandler := aOwnsHandler;
  164. except
  165. FreeAndNil(result);
  166. raise;
  167. end;
  168. end;
  169. end.