unit uvkuDevice; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Vulkan; type ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TvkuDevice = class(TObject) private fHandle: VkDevice; fPhysicalDevice: VkPhysicalDevice; fAllocCallbacks: PVkAllocationCallbacks; procedure CreateHandle( const aCreateInfo: PVkDeviceCreateInfo; const aAllocCallbacks: PVkAllocationCallbacks); public property Handle: VkDevice read fHandle; property PhysicalDevice: VkPhysicalDevice read fPhysicalDevice; constructor Create( const aPhysicalDevice: VkPhysicalDevice; const aCreateInfo: TVkDeviceCreateInfo); constructor Create( const aPhysicalDevice: VkPhysicalDevice; const aCreateInfo: TVkDeviceCreateInfo; const aAllocCallbacks: TVkAllocationCallbacks); destructor Destroy; override; end; implementation uses uvkuUtils; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TvkuDevice///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TvkuDevice.CreateHandle(const aCreateInfo: PVkDeviceCreateInfo; const aAllocCallbacks: PVkAllocationCallbacks); var err: TVkResult; begin if Assigned(aAllocCallbacks) then begin new(fAllocCallbacks); fAllocCallbacks^ := aAllocCallbacks^; end; err := vkCreateDevice(fPhysicalDevice, aCreateInfo, fAllocCallbacks, @fHandle); if (err < VK_SUCCESS) then raise TvkuErrorException.Create('unable to create device', err); end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// constructor TvkuDevice.Create(const aPhysicalDevice: VkPhysicalDevice; const aCreateInfo: TVkDeviceCreateInfo); begin inherited Create; fHandle := nil; fPhysicalDevice := aPhysicalDevice; CreateHandle(@aCreateInfo, nil); end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// constructor TvkuDevice.Create(const aPhysicalDevice: VkPhysicalDevice; const aCreateInfo: TVkDeviceCreateInfo; const aAllocCallbacks: TVkAllocationCallbacks); begin inherited Create; fHandle := nil; fPhysicalDevice := aPhysicalDevice; CreateHandle(@aCreateInfo, @aAllocCallbacks); end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// destructor TvkuDevice.Destroy; begin if Assigned(fHandle) then begin vkDestroyDevice(fHandle, fAllocCallbacks); fHandle := nil; end; if Assigned(fAllocCallbacks) then begin Dispose(fAllocCallbacks); fAllocCallbacks := nil; end; inherited Destroy; end; end.