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.

164 regels
7.9 KiB

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