unit uvkuBufferFactory; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Vulkan, uvkuBuffer, uvkuTypes, uvkuFactoryBase; type ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TvkuBufferFactory = class(TvkuDeviceObjFactory) private fFlags: VkBufferCreateFlags; fSize: VkDeviceSize; fUsage: VkBufferUsageFlags; fSharingMode: TVkSharingMode; fQueueFamilyIndices: TVkUint32List; public property Flags: VkBufferCreateFlags read fFlags write fFlags; property Size: VkDeviceSize read fSize write fSize; property Usage: VkBufferUsageFlags read fUsage write fUsage; property SharingMode: TVkSharingMode read fSharingMode write fSharingMode; property QueueFamilyIndices: TVkUint32List read fQueueFamilyIndices; function GetStructure: TVkBufferCreateInfo; procedure SetStructure(const aData: TVkBufferCreateInfo); function CreateBuffer: TvkuBuffer; procedure AfterConstruction; override; procedure BeforeDestruction; override; end; implementation uses uvkuUtils; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TvkuBufferFactory////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TvkuBufferFactory.GetStructure: TVkBufferCreateInfo; begin FillByte(result, SizeOf(result), 0); result.sType := VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; result.pNext := nil; result.flags := fFlags; result.size := fSize; result.usage := fUsage; result.sharingMode := fSharingMode; result.queueFamilyIndexCount := fQueueFamilyIndices.Length; result.pQueueFamilyIndices := fQueueFamilyIndices.PData; end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TvkuBufferFactory.SetStructure(const aData: TVkBufferCreateInfo); var i: Integer; begin fFlags := aData.flags; fSize := aData.size; fUsage := aData.usage; fSharingMode := aData.sharingMode; fQueueFamilyIndices.SetData(aData.pQueueFamilyIndices, aData.queueFamilyIndexCount); end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TvkuBufferFactory.CreateBuffer: TvkuBuffer; begin result := TvkuBuffer.Create(GetStructure, DeviceCommands, AllocCallbacks); end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TvkuBufferFactory.AfterConstruction; begin inherited AfterConstruction; fQueueFamilyIndices := TVkUint32List.Create; end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TvkuBufferFactory.BeforeDestruction; begin FreeAndNil(fQueueFamilyIndices); inherited BeforeDestruction; end; end.