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

224 lines
9.6 KiB

  1. unit uvkuDeviceFactory;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils,
  6. Vulkan, uvkuInstance, uvkuDevice, uvkuAllocationHandler, uvkuTypes;
  7. type
  8. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  9. TvkuDeviceEx = class(TvkuDevice)
  10. private
  11. fAllocHandler: TvkuAllocationHandler;
  12. fOwnsHandler: Boolean;
  13. public
  14. destructor Destroy; override;
  15. end;
  16. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  17. TvkuDeviceFactory = class(TObject)
  18. private
  19. fInstanceCommands: TVkInstanceCommands;
  20. fFeatures: TVkPhysicalDeviceFeatures;
  21. fFlags: VkDeviceCreateFlags;
  22. fLayers: TStringList;
  23. fExtensions: TStringList;
  24. fQueueCreateInfos: TvkuQueueCreateInfoArr;
  25. function GetLayers: TStrings;
  26. function GetExtensions: TStrings;
  27. function GetQueueCreateInfoCount: Integer;
  28. function GetQueueCreateInfo(const aIndex: Integer): TvkuQueueCreateInfo;
  29. function GetQueueCreateInfos: TvkuQueueCreateInfoArr;
  30. procedure SetQueueCreateInfoCount(aValue: Integer);
  31. procedure SetQueueCreateInfo(const aIndex: Integer; aValue: TvkuQueueCreateInfo);
  32. procedure SetQueueCreateInfos(aValue: TvkuQueueCreateInfoArr);
  33. public
  34. property Flags: VkDeviceCreateFlags read fFlags write fFlags;
  35. property EnabledLayers: TStrings read GetLayers;
  36. property EnabledExtensions: TStrings read GetExtensions;
  37. property EnabledFeatures: TVkPhysicalDeviceFeatures read fFeatures;
  38. property QueueCreateInfos: TvkuQueueCreateInfoArr read GetQueueCreateInfos write SetQueueCreateInfos;
  39. property QueueCreateInfoCount: Integer read GetQueueCreateInfoCount write SetQueueCreateInfoCount;
  40. property QueueCreateInfo[const aIndex: Integer]: TvkuQueueCreateInfo read GetQueueCreateInfo write SetQueueCreateInfo;
  41. function CreateDevice(
  42. const aPhysicalDevice: VkPhysicalDevice): TvkuDeviceEx;
  43. function CreateDevice(
  44. const aPhysicalDevice: VkPhysicalDevice;
  45. const aAllocHandler: TvkuAllocationHandler;
  46. const aOwnsHandler: Boolean): TvkuDeviceEx;
  47. constructor Create(const aInstance: TvkuInstance);
  48. constructor Create(const aInstanceCommands: TVkInstanceCommands);
  49. destructor Destroy; override;
  50. end;
  51. implementation
  52. uses
  53. uvkuUtils;
  54. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  55. //TvkuDeviceEx///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  56. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  57. destructor TvkuDeviceEx.Destroy;
  58. begin
  59. inherited Destroy;
  60. if fOwnsHandler then
  61. FreeAndNil(fAllocHandler);
  62. end;
  63. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  64. //TvkuDeviceFactory//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  65. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  66. function TvkuDeviceFactory.GetLayers: TStrings;
  67. begin
  68. result := fLayers;
  69. end;
  70. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  71. function TvkuDeviceFactory.GetExtensions: TStrings;
  72. begin
  73. result := fExtensions;
  74. end;
  75. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  76. function TvkuDeviceFactory.GetQueueCreateInfoCount: Integer;
  77. begin
  78. result := Length(fQueueCreateInfos);
  79. end;
  80. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  81. function TvkuDeviceFactory.GetQueueCreateInfo(const aIndex: Integer): TvkuQueueCreateInfo;
  82. begin
  83. if (aIndex < low(fQueueCreateInfos)) or (aIndex > high(fQueueCreateInfos)) then
  84. raise TvkuException.CreateFmt('index (%d) out of range (%d : %d)', [aIndex, Low(fQueueCreateInfos), High(fQueueCreateInfos)]);
  85. result := fQueueCreateInfos[aIndex];
  86. end;
  87. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  88. function TvkuDeviceFactory.GetQueueCreateInfos: TvkuQueueCreateInfoArr;
  89. begin
  90. result := fQueueCreateInfos;
  91. end;
  92. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  93. procedure TvkuDeviceFactory.SetQueueCreateInfoCount(aValue: Integer);
  94. begin
  95. if (aValue < 0) then
  96. aValue := 0;
  97. SetLength(fQueueCreateInfos, aValue);
  98. end;
  99. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  100. procedure TvkuDeviceFactory.SetQueueCreateInfo(const aIndex: Integer; aValue: TvkuQueueCreateInfo);
  101. begin
  102. if (aIndex < low(fQueueCreateInfos)) or (aIndex > high(fQueueCreateInfos)) then
  103. raise TvkuException.CreateFmt('index (%d) out of range (%d : %d)', [aIndex, Low(fQueueCreateInfos), High(fQueueCreateInfos)]);
  104. fQueueCreateInfos[aIndex] := aValue;
  105. end;
  106. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  107. procedure TvkuDeviceFactory.SetQueueCreateInfos(aValue: TvkuQueueCreateInfoArr);
  108. begin
  109. fQueueCreateInfos := aValue;
  110. end;
  111. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  112. function TvkuDeviceFactory.CreateDevice(const aPhysicalDevice: VkPhysicalDevice): TvkuDeviceEx;
  113. begin
  114. result := CreateDevice(aPhysicalDevice, nil, false);
  115. end;
  116. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  117. function TvkuDeviceFactory.CreateDevice(const aPhysicalDevice: VkPhysicalDevice;
  118. const aAllocHandler: TvkuAllocationHandler; const aOwnsHandler: Boolean): TvkuDeviceEx;
  119. var
  120. CreateInfo: TVkDeviceCreateInfo;
  121. QueueInfos: array of TVkDeviceQueueCreateInfo;
  122. lay: array of PVkChar;
  123. ext: array of PVkChar;
  124. i: Integer;
  125. begin
  126. if (Length(fQueueCreateInfos) <= 0) then
  127. raise TvkuException.Create('no queue create infos assigned');
  128. SetLength(lay, fLayers.Count);
  129. for i := 0 to fLayers.Count-1 do
  130. lay[i] := PVkChar(fLayers[i]);
  131. SetLength(ext, fExtensions.Count);
  132. for i := 0 to fExtensions.Count-1 do
  133. ext[i] := PVkChar(fExtensions[i]);
  134. SetLength(QueueInfos, Length(fQueueCreateInfos));
  135. for i := 0 to high(fQueueCreateInfos) do begin
  136. FillByte(QueueInfos[i], SizeOf(QueueInfos[0]), 0);
  137. QueueInfos[i].sType := VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
  138. QueueInfos[i].pNext := nil;
  139. QueueInfos[i].flags := fQueueCreateInfos[i].Flags;
  140. QueueInfos[i].queueFamilyIndex := fQueueCreateInfos[i].FamilyIndex;
  141. QueueInfos[i].queueCount := Length(fQueueCreateInfos[i].Priorities);
  142. if (QueueInfos[i].queueCount > 0)
  143. then QueueInfos[i].pQueuePriorities := @fQueueCreateInfos[i].Priorities[0]
  144. else QueueInfos[i].pQueuePriorities := nil;
  145. end;
  146. FillByte(CreateInfo, SizeOf(CreateInfo), 0);
  147. CreateInfo.sType := VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
  148. CreateInfo.pNext := nil;
  149. CreateInfo.flags := fFlags;
  150. CreateInfo.queueCreateInfoCount := Length(QueueInfos);
  151. CreateInfo.pQueueCreateInfos := @QueueInfos[0];
  152. CreateInfo.enabledLayerCount := Length(lay);
  153. CreateInfo.ppEnabledLayerNames := @lay[0];
  154. CreateInfo.enabledExtensionCount := Length(ext);
  155. CreateInfo.ppEnabledExtensionNames := @ext[0];
  156. CreateInfo.pEnabledFeatures := @fFeatures;
  157. if Assigned(aAllocHandler)
  158. then result := TvkuDeviceEx.Create(aPhysicalDevice, CreateInfo, fInstanceCommands, aAllocHandler.GetAllocationCallbacksPtr)
  159. else result := TvkuDeviceEx.Create(aPhysicalDevice, CreateInfo, fInstanceCommands);
  160. try
  161. TvkuDeviceEx(result).fAllocHandler := aAllocHandler;
  162. TvkuDeviceEx(result).fOwnsHandler := aOwnsHandler;
  163. except
  164. FreeAndNil(result);
  165. raise;
  166. end;
  167. end;
  168. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  169. constructor TvkuDeviceFactory.Create(const aInstance: TvkuInstance);
  170. begin
  171. Create(aInstance.InstanceCommands);
  172. end;
  173. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  174. constructor TvkuDeviceFactory.Create(const aInstanceCommands: TVkInstanceCommands);
  175. begin
  176. inherited Create;
  177. FillByte(fFeatures, SizeOf(fFeatures), 0);
  178. fInstanceCommands := aInstanceCommands;
  179. fLayers := TStringList.Create;
  180. fExtensions := TStringList.Create;
  181. end;
  182. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  183. destructor TvkuDeviceFactory.Destroy;
  184. begin
  185. FreeAndNil(fLayers);
  186. FreeAndNil(fExtensions);
  187. inherited Destroy;
  188. end;
  189. end.