unit uvkuImageFactory; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Vulkan, uvkuImage, uvkuTypes, uvkuFactoryBase; type ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TvkuImageFactory = class(TvkuDeviceObjFactory) private fFlags: VkImageCreateFlags; fImageType: TVkImageType; fFormat: TVkFormat; fExtent: TVkExtent3D; fMipLevels: VkUint32; fArrayLayers: VkUint32; fSamples: TVkSampleCountFlagBits; fTiling: TVkImageTiling; fUsage: VkImageUsageFlags; fSharingMode: TVkSharingMode; fQueueFamilyIndices: TVkUint32List; fInitialLayout: TVkImageLayout; public property Flags: VkImageCreateFlags read fFlags write fFlags; property ImageType: TVkImageType read fImageType write fImageType; property Format: TVkFormat read fFormat write fFormat; property Extent: TVkExtent3D read fExtent write fExtent; property MipLevels: VkUint32 read fMipLevels write fMipLevels; property ArrayLayers: VkUint32 read fArrayLayers write fArrayLayers; property Samples: TVkSampleCountFlagBits read fSamples write fSamples; property Tiling: TVkImageTiling read fTiling write fTiling; property Usage: VkImageUsageFlags read fUsage write fUsage; property SharingMode: TVkSharingMode read fSharingMode write fSharingMode; property InitialLayout: TVkImageLayout read fInitialLayout write fInitialLayout; property QueueFamilyIndices: TVkUint32List read fQueueFamilyIndices; function GetStructure: TVkImageCreateInfo; procedure SetStructure(const aData: TVkImageCreateInfo); function CreateImage: TvkuImage; procedure AfterConstruction; override; procedure BeforeDestruction; override; end; implementation uses uvkuUtils; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TvkuImageFactory/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TvkuImageFactory.GetStructure: TVkImageCreateInfo; begin FillByte(result, SizeOf(result), 0); result.sType := VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; result.pNext := nil; result.flags := fFlags; result.imageType := fImageType; result.format := fFormat; result.extent := fExtent; result.mipLevels := fMipLevels; result.arrayLayers := fArrayLayers; result.samples := fSamples; result.tiling := fTiling; result.usage := fUsage; result.sharingMode := fSharingMode; result.queueFamilyIndexCount := fQueueFamilyIndices.Length; result.pQueueFamilyIndices := fQueueFamilyIndices.PData; result.initialLayout := fInitialLayout; end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TvkuImageFactory.SetStructure(const aData: TVkImageCreateInfo); var i: Integer; begin fFlags := aData.flags; fImageType := aData.imageType; fFormat := aData.format; fExtent := aData.extent; fMipLevels := aData.mipLevels; fArrayLayers := aData.arrayLayers; fSamples := aData.samples; fTiling := aData.tiling; fUsage := aData.usage; fSharingMode := aData.sharingMode; fInitialLayout := aData.initialLayout; fQueueFamilyIndices.SetData(aData.pQueueFamilyIndices, aData.queueFamilyIndexCount); end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TvkuImageFactory.CreateImage: TvkuImage; begin result := TvkuImage.Create(GetStructure, DeviceCommands, AllocCallbacks); end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TvkuImageFactory.AfterConstruction; begin inherited AfterConstruction; fQueueFamilyIndices := TVkUint32List.Create; end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TvkuImageFactory.BeforeDestruction; begin FreeAndNil(fQueueFamilyIndices); inherited BeforeDestruction; end; end.