unit uvkuSurface; {$mode objfpc}{$H+} {$I Vulkan.inc} interface uses Classes, SysUtils, Vulkan; type ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TvkuSurface = class(TObject) private fHandle: VkSurfaceKHR; fInstance: VkInstance; fAllocCallbacks: PVkAllocationCallbacks; fInstanceCommands: TVkInstanceCommands; procedure CreateHandle(const aCreateInfo: Pointer; const aAllocCallbacks: PVkAllocationCallbacks); public property Handle: VkSurfaceKHR read fHandle; property Instance: VkInstance read fInstance; property InstanceCommands: TVkInstanceCommands read fInstanceCommands; {$IF DEFINED(VK_USE_PLATFORM_WIN32_KHR)} constructor Create( const aInstance: VkInstance; const aCreateInfo: TVkWin32SurfaceCreateInfoKHR; const aInstanceCommands: TVkInstanceCommands); constructor Create( const aInstance: VkInstance; const aCreateInfo: TVkWin32SurfaceCreateInfoKHR; const aInstanceCommands: TVkInstanceCommands; const aAllocCallbacks: TVkAllocationCallbacks); {$ELSE} {$ERROR 'unknown or unsupportet platform'} {$ENDIF} destructor Destroy; override; public class function GetPlatformSurfaceExtensionName: String; end; implementation uses uvkuUtils; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TvkuSurface//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TvkuSurface.CreateHandle(const aCreateInfo: Pointer; const aAllocCallbacks: PVkAllocationCallbacks); var err: TVkResult; begin if Assigned(aAllocCallbacks) then begin new(fAllocCallbacks); fAllocCallbacks^ := aAllocCallbacks^; end; {$IF DEFINED(VK_USE_PLATFORM_WIN32_KHR)} if not Assigned(fInstanceCommands.vkCreateWin32SurfaceKHR) then raise TvkuException.Create('invalid function pointer: vkCreateWin32SurfaceKHR; did you enabled the VK_KHR_win32_surface extension?'); err := fInstanceCommands.vkCreateWin32SurfaceKHR(fInstance, aCreateInfo, fAllocCallbacks, @fHandle); {$ENDIF} if (err < VK_SUCCESS) then raise TvkuErrorException.Create('unable to create surface', err); end; {$IF DEFINED(VK_USE_PLATFORM_WIN32_KHR)} ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// constructor TvkuSurface.Create(const aInstance: VkInstance; const aCreateInfo: TVkWin32SurfaceCreateInfoKHR; const aInstanceCommands: TVkInstanceCommands); begin inherited Create; fInstance := aInstance; fInstanceCommands := aInstanceCommands; CreateHandle(@aCreateInfo, nil); end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// constructor TvkuSurface.Create(const aInstance: VkInstance; const aCreateInfo: TVkWin32SurfaceCreateInfoKHR; const aInstanceCommands: TVkInstanceCommands; const aAllocCallbacks: TVkAllocationCallbacks); begin inherited Create; fInstance := aInstance; fInstanceCommands := aInstanceCommands; CreateHandle(@aCreateInfo, @aAllocCallbacks); end; {$ENDIF} ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// destructor TvkuSurface.Destroy; begin if (fHandle <> VK_INVALID_NDP_HANDLE) then begin fInstanceCommands.vkDestroySurfaceKHR(fInstance, fHandle, fAllocCallbacks); fHandle := VK_INVALID_NDP_HANDLE; end; if Assigned(fAllocCallbacks) then begin Dispose(fAllocCallbacks); fAllocCallbacks := nil; end; inherited Destroy; end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class function TvkuSurface.GetPlatformSurfaceExtensionName: String; begin {$IF DEFINED(VK_USE_PLATFORM_XLIB_KHR)} result := VK_KHR_XLIB_SURFACE_EXTENSION_NAME; {$ELSEIF DEFINED(VK_USE_PLATFORM_XCB_KHR)} result := VK_KHR_XCB_SURFACE_EXTENSION_NAME; {$ELSEIF DEFINED(VK_USE_PLATFORM_WAYLAND_KHR)} result := VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME; {$ELSEIF DEFINED(VK_USE_PLATFORM_MIR_KHR)} result := VK_KHR_MIR_SURFACE_EXTENSION_NAME; {$ELSEIF DEFINED(VK_USE_PLATFORM_ANDROID_KHR)} result := VK_KHR_ANDROID_SURFACE_EXTENSION_NAME; {$ELSEIF DEFINED(VK_USE_PLATFORM_WIN32_KHR)} result := VK_KHR_WIN32_SURFACE_EXTENSION_NAME; {$ELSE} {$ERROR 'unknown or unsupportet platform'} {$ENDIF} end; end.