unit uvkuSwapChainFactory; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Vulkan, uvkuSwapChain, uvkuTypes, uvkuFactoryBase; type ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TvkuSwapChainFactory = class(TvkuDeviceObjFactory) private fFlags: VkSwapchainCreateFlagsKHR; fSurface: VkSurfaceKHR; fMinImageCount: VkUint32; fImageFormat: TVkFormat; fImageColorSpace: TVkColorSpaceKHR; fImageExtent: TVkExtent2D; fImageArrayLayers: VkUint32; fImageUsage: VkImageUsageFlags; fImageSharingMode: TVkSharingMode; fQueueFamilyIndices: TVkUint32List; fPreTransform: TVkSurfaceTransformFlagBitsKHR; fComposideAlpha: TVkCompositeAlphaFlagBitsKHR; fPresentMode: TVkPresentModeKHR; fClipped: Boolean; fOldSwapChain: VkSwapchainKHR; public property Flags: VkSwapchainCreateFlagsKHR read fFlags write fFlags; property Surface: VkSurfaceKHR read fSurface write fSurface; property MinImageCount: VkUint32 read fMinImageCount write fMinImageCount; property ImageFormat: TVkFormat read fImageFormat write fImageFormat; property ImageColorSpace: TVkColorSpaceKHR read fImageColorSpace write fImageColorSpace; property ImageExtent: TVkExtent2D read fImageExtent write fImageExtent; property ImageArrayLayers: VkUint32 read fImageArrayLayers write fImageArrayLayers; property ImageUsage: VkImageUsageFlags read fImageUsage write fImageUsage; property ImageSharingMode: TVkSharingMode read fImageSharingMode write fImageSharingMode; property PreTransform: TVkSurfaceTransformFlagBitsKHR read fPreTransform write fPreTransform; property ComposideAlpha: TVkCompositeAlphaFlagBitsKHR read fComposideAlpha write fComposideAlpha; property PresentMode: TVkPresentModeKHR read fPresentMode write fPresentMode; property Clipped: Boolean read fClipped write fClipped; property OldSwapChain: VkSwapchainKHR read fOldSwapChain write fOldSwapChain; property QueueFamilyIndices: TVkUint32List read fQueueFamilyIndices; function GetStructure: TVkSwapchainCreateInfoKHR; procedure SetStructure(const aData: TVkSwapchainCreateInfoKHR); function CreateSwapchain: TvkuSwapChain; procedure AfterConstruction; override; procedure BeforeDestruction; override; end; implementation uses uvkuUtils; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TvkuSwapChainFactory/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TvkuSwapChainFactory.GetStructure: TVkSwapchainCreateInfoKHR; begin FillByte(result, SizeOf(result), 0); result.sType := VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR; result.pNext := nil; result.flags := fFlags; result.surface := fSurface; result.minImageCount := fMinImageCount; result.imageFormat := fImageFormat; result.imageColorSpace := fImageColorSpace; result.imageExtent := fImageExtent; result.imageArrayLayers := fImageArrayLayers; result.imageUsage := fImageUsage; result.imageSharingMode := fImageSharingMode; result.queueFamilyIndexCount := fQueueFamilyIndices.Length; result.pQueueFamilyIndices := fQueueFamilyIndices.PData; result.preTransform := fPreTransform; result.compositeAlpha := fComposideAlpha; result.presentMode := fPresentMode; result.oldSwapchain := fOldSwapChain; if fClipped then result.clipped := VK_TRUE else result.clipped := VK_FALSE; end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TvkuSwapChainFactory.SetStructure(const aData: TVkSwapchainCreateInfoKHR); begin fFlags := aData.flags; fSurface := aData.surface; fMinImageCount := aData.minImageCount; fImageFormat := aData.imageFormat; fImageColorSpace := aData.imageColorSpace; fImageExtent := aData.imageExtent; fImageArrayLayers := aData.imageArrayLayers; fImageUsage := aData.imageUsage; fImageSharingMode := aData.imageSharingMode; fPreTransform := aData.preTransform; fComposideAlpha := aData.compositeAlpha; fPresentMode := aData.presentMode; fOldSwapChain := aData.oldSwapchain; fClipped := (aData.clipped <> 0); fQueueFamilyIndices.SetData(aData.pQueueFamilyIndices, aData.queueFamilyIndexCount); end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TvkuSwapChainFactory.CreateSwapchain: TvkuSwapChain; begin result := TvkuSwapChain.Create(GetStructure, DeviceCommands, AllocCallbacks); end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TvkuSwapChainFactory.AfterConstruction; begin inherited AfterConstruction; fPresentMode := VK_PRESENT_MODE_FIFO_KHR; fQueueFamilyIndices := TVkUint32List.Create; end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TvkuSwapChainFactory.BeforeDestruction; begin FreeAndNil(fQueueFamilyIndices); inherited BeforeDestruction; end; end.