unit uvkuSurface; {$mode objfpc}{$H+} {$I Vulkan.inc} interface uses Classes, SysUtils, Vulkan, uvkuBase; type ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TvkuSurface = class(TvkuAllocHandle) private fHandle: VkSurfaceKHR; fInstanceCommands: TVkInstanceCommands; procedure CreateHandle(const aCreateInfo: Pointer); public property Handle: VkSurfaceKHR read fHandle; property InstanceCommands: TVkInstanceCommands read fInstanceCommands; {$IF DEFINED(VK_USE_PLATFORM_WIN32_KHR)} constructor Create( const aCreateInfo: TVkWin32SurfaceCreateInfoKHR; const aInstanceCommands: TVkInstanceCommands; const aAllocCallbacks: PVkAllocationCallbacks = nil); {$ELSE} {$ERROR 'unknown or unsupportet platform'} {$ENDIF} constructor Create( const aHandle: VkSurfaceKHR; const aOwnsHandle: Boolean; const aInstanceCommands: TVkInstanceCommands; const aAllocCallbacks: PVkAllocationCallbacks = nil); destructor Destroy; override; public class function GetPlatformSurfaceExtensionName: String; end; implementation uses uvkuUtils; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TvkuSurface//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TvkuSurface.CreateHandle(const aCreateInfo: Pointer); var err: TVkResult; begin {$IF DEFINED(VK_USE_PLATFORM_WIN32_KHR)} if not Assigned(fInstanceCommands.vkCreateWin32SurfaceKHR) then raise TvkuInvalidFuncPtrException.Create('vkCreateWin32SurfaceKHR', 'VK_KHR_win32_surface'); err := fInstanceCommands.vkCreateWin32SurfaceKHR(fInstanceCommands.Instance, aCreateInfo, AllocCallbacks, @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 aCreateInfo: TVkWin32SurfaceCreateInfoKHR; const aInstanceCommands: TVkInstanceCommands; const aAllocCallbacks: PVkAllocationCallbacks); begin inherited Create; fInstanceCommands := aInstanceCommands; SetAllocCallbacks(aAllocCallbacks); CreateHandle(@aCreateInfo); end; {$ENDIF} ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// constructor TvkuSurface.Create(const aHandle: VkSurfaceKHR; const aOwnsHandle: Boolean; const aInstanceCommands: TVkInstanceCommands; const aAllocCallbacks: PVkAllocationCallbacks); begin inherited Create; fHandle := aHandle; fInstanceCommands := aInstanceCommands; OwnsHandle := aOwnsHandle; SetAllocCallbacks(aAllocCallbacks); end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// destructor TvkuSurface.Destroy; begin if OwnsHandle and (fHandle <> VK_INVALID_NDP_HANDLE) then fInstanceCommands.vkDestroySurfaceKHR(fInstanceCommands.Instance, fHandle, AllocCallbacks); fHandle := VK_INVALID_NDP_HANDLE; 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.