Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.

176 righe
8.4 KiB

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