unit uvkuBufferViewFactory; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Vulkan, uvkuBufferView, uvkuAllocationHandler, uvkuFactoryBase; type ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TvkuBufferViewEx = class(TvkuBufferView) private fAllocHandler: TvkuAllocationHandler; fOwnsHandler: Boolean; public destructor Destroy; override; end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TvkuBufferViewFactory = class(TvkuDeviceObjFactory) private fFlags: VkBufferViewCreateFlags; fBuffer: VkBuffer; fFormat: TVkFormat; fOffset: VkDeviceSize; fRange: VkDeviceSize; public property Flags: VkBufferViewCreateFlags read fFlags write fFlags; property Buffer: VkBuffer read fBuffer write fBuffer; property Format: TVkFormat read fFormat write fFormat; property Offset: VkDeviceSize read fOffset write fOffset; property Range: VkDeviceSize read fRange write fRange; function CreateBufferView: TvkuBufferViewEx; function CreateBufferView( const aAllocHandler: TvkuAllocationHandler; const aOwnsHandler: Boolean): TvkuBufferViewEx; end; implementation ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TvkuBufferViewEx/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// destructor TvkuBufferViewEx.Destroy; begin inherited Destroy; if fOwnsHandler then FreeAndNil(fAllocHandler); end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TvkuBufferViewFactory////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TvkuBufferViewFactory.CreateBufferView: TvkuBufferViewEx; begin result := CreateBufferView(nil, false); end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TvkuBufferViewFactory.CreateBufferView(const aAllocHandler: TvkuAllocationHandler; const aOwnsHandler: Boolean): TvkuBufferViewEx; var CreateInfo: TVkBufferViewCreateInfo; begin FillByte(CreateInfo, SizeOf(CreateInfo), 0); CreateInfo.sType := VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO; CreateInfo.pNext := nil; CreateInfo.flags := fFlags; CreateInfo.buffer := fBuffer; CreateInfo.format := fFormat; CreateInfo.offset := fOffset; CreateInfo.range := fRange; if Assigned(aAllocHandler) then result := TvkuBufferViewEx.Create(CreateInfo, DeviceCommands, aAllocHandler.GetAllocationCallbacksPtr) else result := TvkuBufferViewEx.Create(CreateInfo, DeviceCommands); try TvkuBufferViewEx(result).fAllocHandler := aAllocHandler; TvkuBufferViewEx(result).fOwnsHandler := aOwnsHandler; except FreeAndNil(result); raise; end; end; end.