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.
 
 

179 line
8.6 KiB

  1. unit uvkuSwapChainFactory;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils,
  6. Vulkan, uvkuSwapChain, uvkuAllocationHandler, uvkuDevice;
  7. type
  8. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  9. TvkuSwapChainEx = class(TvkuSwapChain)
  10. private
  11. fAllocHandler: TvkuAllocationHandler;
  12. fOwnsHandler: Boolean;
  13. public
  14. destructor Destroy; override;
  15. end;
  16. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  17. TvkuUint32Arr = array of VkUint32;
  18. TvkuSwapChainFactory = class(TObject)
  19. private
  20. fDevice: VkDevice;
  21. fDeviceCommands: TVkDeviceCommands;
  22. fFlags: VkSwapchainCreateFlagsKHR;
  23. fSurface: VkSurfaceKHR;
  24. fMinImageCount: VkUint32;
  25. fImageFormat: TVkFormat;
  26. fImageColorSpace: TVkColorSpaceKHR;
  27. fImageExtent: TVkExtent2D;
  28. fImageArrayLayers: VkUint32;
  29. fImageUsage: VkImageUsageFlags;
  30. fImageSharingMode: TVkSharingMode;
  31. fQueueFamilyIndices: TvkuUint32Arr;
  32. fPreTransform: TVkSurfaceTransformFlagBitsKHR;
  33. fComposideAlpha: TVkCompositeAlphaFlagBitsKHR;
  34. fPresentMode: TVkPresentModeKHR;
  35. fClipped: Boolean;
  36. fOldSwapChain: VkSwapchainKHR;
  37. function GetQueueFamilyIndexCount: Integer;
  38. function GetQueueFamilyIndex(const aIndex: Integer): VkUint32;
  39. procedure SetQueueFamilyIndex(const aIndex: Integer; aValue: VkUint32);
  40. public
  41. property Device: VkDevice read fDevice;
  42. property DeviceCommands: TVkDeviceCommands read fDeviceCommands;
  43. property Flags: VkSwapchainCreateFlagsKHR read fFlags write fFlags;
  44. property Surface: VkSurfaceKHR read fSurface write fSurface;
  45. property MinImageCount: VkUint32 read fMinImageCount write fMinImageCount;
  46. property ImageFormat: TVkFormat read fImageFormat write fImageFormat;
  47. property ImageColorSpace: TVkColorSpaceKHR read fImageColorSpace write fImageColorSpace;
  48. property ImageExtent: TVkExtent2D read fImageExtent write fImageExtent;
  49. property ImageArrayLayers: VkUint32 read fImageArrayLayers write fImageArrayLayers;
  50. property ImageUsage: VkImageUsageFlags read fImageUsage write fImageUsage;
  51. property ImageSharingMode: TVkSharingMode read fImageSharingMode write fImageSharingMode;
  52. property PreTransform: TVkSurfaceTransformFlagBitsKHR read fPreTransform write fPreTransform;
  53. property ComposideAlpha: TVkCompositeAlphaFlagBitsKHR read fComposideAlpha write fComposideAlpha;
  54. property PresentMode: TVkPresentModeKHR read fPresentMode write fPresentMode;
  55. property Clipped: Boolean read fClipped write fClipped;
  56. property OldSwapChain: VkSwapchainKHR read fOldSwapChain write fOldSwapChain;
  57. property QueueFamilyIndices: TvkuUint32Arr read fQueueFamilyIndices write fQueueFamilyIndices;
  58. property QueueFamilyIndexCount: Integer read GetQueueFamilyIndexCount;
  59. property QueueFamilyIndex[const aIndex: Integer]: VkUint32 read GetQueueFamilyIndex write SetQueueFamilyIndex;
  60. function CreateSwapchain: TvkuSwapChain;
  61. function CreateSwapchain(
  62. const aAllocHandler: TvkuAllocationHandler;
  63. const aOwnsHandler: Boolean): TvkuSwapChain;
  64. constructor Create(const aDevice: TvkuDevice);
  65. constructor Create(const aDevice: VkDevice; const aDeviceCommands: TVkDeviceCommands);
  66. end;
  67. implementation
  68. uses
  69. uvkuUtils;
  70. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  71. //TvkuSwapChainEx////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  72. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  73. destructor TvkuSwapChainEx.Destroy;
  74. begin
  75. inherited Destroy;
  76. if fOwnsHandler then
  77. FreeAndNil(fAllocHandler);
  78. end;
  79. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  80. //TvkuSwapChainFactory///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  81. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  82. function TvkuSwapChainFactory.GetQueueFamilyIndexCount: Integer;
  83. begin
  84. result := Length(fQueueFamilyIndices);
  85. end;
  86. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  87. function TvkuSwapChainFactory.GetQueueFamilyIndex(const aIndex: Integer): VkUint32;
  88. begin
  89. if (aIndex < low(fQueueFamilyIndices)) or (aIndex > high(fQueueFamilyIndices)) then
  90. raise TvkuException.CreateFmt('index (%d) out of range (%d : %d)', [aIndex, Low(fQueueFamilyIndices), High(fQueueFamilyIndices)]);
  91. result := fQueueFamilyIndices[aIndex];
  92. end;
  93. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  94. procedure TvkuSwapChainFactory.SetQueueFamilyIndex(const aIndex: Integer; aValue: VkUint32);
  95. begin
  96. if (aIndex < low(fQueueFamilyIndices)) or (aIndex > high(fQueueFamilyIndices)) then
  97. raise TvkuException.CreateFmt('index (%d) out of range (%d : %d)', [aIndex, Low(fQueueFamilyIndices), High(fQueueFamilyIndices)]);
  98. fQueueFamilyIndices[aIndex] := aValue;
  99. end;
  100. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  101. function TvkuSwapChainFactory.CreateSwapchain: TvkuSwapChain;
  102. begin
  103. result := CreateSwapchain(nil, false);
  104. end;
  105. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  106. function TvkuSwapChainFactory.CreateSwapchain(const aAllocHandler: TvkuAllocationHandler; const aOwnsHandler: Boolean): TvkuSwapChain;
  107. var
  108. CreateInfo: TVkSwapchainCreateInfoKHR;
  109. begin
  110. FillByte(CreateInfo, SizeOf(CreateInfo), 0);
  111. CreateInfo.sType := VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
  112. CreateInfo.pNext := nil;
  113. CreateInfo.flags := fFlags;
  114. CreateInfo.surface := fSurface;
  115. CreateInfo.minImageCount := fMinImageCount;
  116. CreateInfo.imageFormat := fImageFormat;
  117. CreateInfo.imageColorSpace := fImageColorSpace;
  118. CreateInfo.imageExtent := fImageExtent;
  119. CreateInfo.imageArrayLayers := fImageArrayLayers;
  120. CreateInfo.imageUsage := fImageUsage;
  121. CreateInfo.imageSharingMode := fImageSharingMode;
  122. CreateInfo.queueFamilyIndexCount := Length(fQueueFamilyIndices);
  123. CreateInfo.pQueueFamilyIndices := @fQueueFamilyIndices[0];
  124. CreateInfo.preTransform := fPreTransform;
  125. CreateInfo.compositeAlpha := fComposideAlpha;
  126. CreateInfo.presentMode := fPresentMode;
  127. CreateInfo.oldSwapchain := fOldSwapChain;
  128. if fClipped
  129. then CreateInfo.clipped := VK_TRUE
  130. else CreateInfo.clipped := VK_FALSE;
  131. if Assigned(aAllocHandler)
  132. then result := TvkuSwapChainEx.Create(fDevice, CreateInfo, fDeviceCommands, aAllocHandler.GetAllocationCallbacks)
  133. else result := TvkuSwapChainEx.Create(fDevice, CreateInfo, fDeviceCommands);
  134. try
  135. TvkuSwapChainEx(result).fAllocHandler := aAllocHandler;
  136. TvkuSwapChainEx(result).fOwnsHandler := aOwnsHandler;
  137. except
  138. FreeAndNil(result);
  139. end;
  140. end;
  141. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  142. constructor TvkuSwapChainFactory.Create(const aDevice: TvkuDevice);
  143. begin
  144. Create(aDevice.Handle, aDevice.DeviceCommands);
  145. end;
  146. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  147. constructor TvkuSwapChainFactory.Create(const aDevice: VkDevice; const aDeviceCommands: TVkDeviceCommands);
  148. begin
  149. inherited Create;
  150. fDevice := aDevice;
  151. fDeviceCommands := aDeviceCommands;
  152. fPresentMode := VK_PRESENT_MODE_FIFO_KHR;
  153. end;
  154. end.