unit uvkuImageViewFactory; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Vulkan, uvkuAllocationHandler, uvkuImageView, uvkuDevice, uvkuFactoryBase; type ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TvkuImageViewEx = class(TvkuImageView) private fAllocHandler: TvkuAllocationHandler; fOwnsHandler: Boolean; public destructor Destroy; override; end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TvkuImageViewFactory = class(TvkuDeviceObjFactory) private fFlags: VkImageViewCreateFlags; fImage: VkImage; fViewType: TVkImageViewType; fFormat: TVkFormat; fComponents: TVkComponentMapping; fSubresourceRange: TVkImageSubresourceRange; public property Flags: VkImageViewCreateFlags read fFlags write fFlags; property Image: VkImage read fImage write fImage; property ViewType: TVkImageViewType read fViewType write fViewType; property Format: TVkFormat read fFormat write fFormat; property Components: TVkComponentMapping read fComponents write fComponents; property SubresourceRange: TVkImageSubresourceRange read fSubresourceRange write fSubresourceRange; function CreateImageView: TvkuImageViewEx; function CreateImageView( const aAllocHandler: TvkuAllocationHandler; const aOwnsHandler: Boolean): TvkuImageViewEx; end; implementation ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TvkuImageViewEx//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// destructor TvkuImageViewEx.Destroy; begin inherited Destroy; if fOwnsHandler then FreeAndNil(fAllocHandler); end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TvkuImageViewFactory/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TvkuImageViewFactory.CreateImageView: TvkuImageViewEx; begin result := CreateImageView(nil, false); end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TvkuImageViewFactory.CreateImageView(const aAllocHandler: TvkuAllocationHandler; const aOwnsHandler: Boolean): TvkuImageViewEx; var CreateInfo: TVkImageViewCreateInfo; begin FillByte(CreateInfo, SizeOf(CreateInfo), 0); CreateInfo.sType := VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; CreateInfo.pNext := nil; CreateInfo.flags := fFlags; CreateInfo.image := fImage; CreateInfo.viewType := fViewType; CreateInfo.format := fFormat; CreateInfo.components := fComponents; CreateInfo.subresourceRange := fSubresourceRange; if Assigned(aAllocHandler) then result := TvkuImageViewEx.Create(CreateInfo, DeviceCommands, aAllocHandler.GetAllocationCallbacksPtr) else result := TvkuImageViewEx.Create(CreateInfo, DeviceCommands); try TvkuImageViewEx(result).fAllocHandler := aAllocHandler; TvkuImageViewEx(result).fOwnsHandler := aOwnsHandler; except FreeAndNil(result); raise; end; end; end.