unit uvkuSurfaceFactory; {$mode objfpc}{$H+} {$I Vulkan.inc} interface uses Classes, SysUtils, Controls, Vulkan, uvkuInstance, uvkuSurface, uvkuAllocationHandler, uvkuFactoryBase; type ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TvkuSurfaceEx = class(TvkuSurface) private fAllocHandler: TvkuAllocationHandler; fOwnsHandler: Boolean; public destructor Destroy; override; end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TvkuSurfaceFactory = class(TvkuInstanceObjFactory) {$IF DEFINED(VK_USE_PLATFORM_WIN32_KHR)} private fHInstance: Vulkan.HINSTANCE; fHwnd: Vulkan.HWND; procedure SetHwnd(const aValue: Vulkan.HWND); public property HInstance: Vulkan.HINSTANCE read fHInstance write fHInstance; property Hwnd: Vulkan.HWND read fHwnd write SetHwnd; {$ENDIF} private fFlags: VkFlags; fWinControl: TWinControl; procedure SetWinControl(aValue: TWinControl); public property WinControl: TWinControl read fWinControl write SetWinControl; property Flags: VkFlags read fFlags write fFlags; function CreateSurface: TvkuSurfaceEx; function CreateSurface( const aAllocHandler: TvkuAllocationHandler; const aOwnsHandler: Boolean): TvkuSurfaceEx; procedure AfterConstruction; override; end; implementation {$IF DEFINED(VK_USE_PLATFORM_WIN32_KHR)} uses Windows; {$ENDIF} ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TvkuSurfaceEx////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// destructor TvkuSurfaceEx.Destroy; begin inherited Destroy; if fOwnsHandler then FreeAndNil(fAllocHandler); end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TvkuSurfaceFactory///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// {$IF DEFINED(VK_USE_PLATFORM_XLIB_KHR)} {$ERROR 'TODO: implement'} procedure TvkuSurfaceFactory.SetDisplay(const aValue: TDisplay); begin end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TvkuSurfaceFactory.SetWindow(const aValue: TWindow); begin end; {$ELSEIF DEFINED(VK_USE_PLATFORM_XCB_KHR)} {$ERROR 'TODO: implement'} ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TvkuSurfaceFactory.SetConnection(const aValue: xcb_connection_t); begin end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TvkuSurfaceFactory.SetWindow(const aValue: xcb_window_t); begin end; {$ELSEIF DEFINED(VK_USE_PLATFORM_WAYLAND_KHR)} {$ERROR 'TODO: implement'} ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TvkuSurfaceFactory.SetDisplay(const aValue: wl_display); begin end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TvkuSurfaceFactory.SetSurface(const aValue: wl_surface); begin end; {$ELSEIF DEFINED(VK_USE_PLATFORM_MIR_KHR)} {$ERROR 'TODO: implement'} ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TvkuSurfaceFactory.SetConnection(const aValue: MirConnection); begin end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TvkuSurfaceFactory.SetSurface(const aValue: MirSurface); begin end; {$ELSEIF DEFINED(VK_USE_PLATFORM_ANDROID_KHR)} {$ERROR 'TODO: implement'} ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TvkuSurfaceFactory.SetWindow(const aValue: ANativeWindow); begin end; {$ELSEIF DEFINED(VK_USE_PLATFORM_WIN32_KHR)} ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TvkuSurfaceFactory.SetHwnd(const aValue: Vulkan.HWND); begin SetWinControl(nil); fHwnd := aValue; end; {$ENDIF} ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TvkuSurfaceFactory.SetWinControl(aValue: TWinControl); begin if fWinControl = aValue then exit; fWinControl := aValue; {$IF DEFINED(VK_USE_PLATFORM_XLIB_KHR)} {$ERROR 'TODO: implement'} {$ELSEIF DEFINED(VK_USE_PLATFORM_XCB_KHR)} {$ERROR 'TODO: implement'} {$ELSEIF DEFINED(VK_USE_PLATFORM_WAYLAND_KHR)} {$ERROR 'TODO: implement'} {$ELSEIF DEFINED(VK_USE_PLATFORM_MIR_KHR)} {$ERROR 'TODO: implement'} {$ELSEIF DEFINED(VK_USE_PLATFORM_ANDROID_KHR)} {$ERROR 'TODO: implement'} {$ELSEIF DEFINED(VK_USE_PLATFORM_WIN32_KHR)} fHwnd := Vulkan.HWND(fWinControl.Handle); {$ENDIF} end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TvkuSurfaceFactory.CreateSurface: TvkuSurfaceEx; begin result := CreateSurface(nil, false); end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TvkuSurfaceFactory.CreateSurface(const aAllocHandler: TvkuAllocationHandler; const aOwnsHandler: Boolean): TvkuSurfaceEx; {$IF DEFINED(VK_USE_PLATFORM_XLIB_KHR)} {$ERROR 'TODO: implement'} {$ELSEIF DEFINED(VK_USE_PLATFORM_XCB_KHR)} {$ERROR 'TODO: implement'} {$ELSEIF DEFINED(VK_USE_PLATFORM_WAYLAND_KHR)} {$ERROR 'TODO: implement'} {$ELSEIF DEFINED(VK_USE_PLATFORM_MIR_KHR)} {$ERROR 'TODO: implement'} {$ELSEIF DEFINED(VK_USE_PLATFORM_ANDROID_KHR)} {$ERROR 'TODO: implement'} {$ELSEIF DEFINED(VK_USE_PLATFORM_WIN32_KHR)} var CreateInfo: TVkWin32SurfaceCreateInfoKHR; {$ENDIF} var srf: TvkuSurfaceEx; begin {$IF DEFINED(VK_USE_PLATFORM_XLIB_KHR)} {$ERROR 'TODO: implement'} {$ELSEIF DEFINED(VK_USE_PLATFORM_XCB_KHR)} {$ERROR 'TODO: implement'} {$ELSEIF DEFINED(VK_USE_PLATFORM_WAYLAND_KHR)} {$ERROR 'TODO: implement'} {$ELSEIF DEFINED(VK_USE_PLATFORM_MIR_KHR)} {$ERROR 'TODO: implement'} {$ELSEIF DEFINED(VK_USE_PLATFORM_ANDROID_KHR)} {$ERROR 'TODO: implement'} {$ELSEIF DEFINED(VK_USE_PLATFORM_WIN32_KHR)} FillByte(CreateInfo, SizeOf(CreateInfo), 0); CreateInfo.sType := VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR; CreateInfo.pNext := nil; CreateInfo.flags := fFlags; CreateInfo.hinstance := fHInstance; CreateInfo.hwnd := fHwnd; {$ENDIF} if Assigned(aAllocHandler) then srf := TvkuSurfaceEx.Create(CreateInfo, InstanceCommands, aAllocHandler.GetAllocationCallbacksPtr) else srf := TvkuSurfaceEx.Create(CreateInfo, InstanceCommands); try srf.fAllocHandler := aAllocHandler; srf.fOwnsHandler := aOwnsHandler; except FreeAndNil(srf); end; result := srf; end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TvkuSurfaceFactory.AfterConstruction; begin inherited AfterConstruction; {$IF DEFINED(VK_USE_PLATFORM_XLIB_KHR)} {$ERROR 'TODO: implement'} {$ELSEIF DEFINED(VK_USE_PLATFORM_XCB_KHR)} {$ERROR 'TODO: implement'} {$ELSEIF DEFINED(VK_USE_PLATFORM_WAYLAND_KHR)} {$ERROR 'TODO: implement'} {$ELSEIF DEFINED(VK_USE_PLATFORM_MIR_KHR)} {$ERROR 'TODO: implement'} {$ELSEIF DEFINED(VK_USE_PLATFORM_ANDROID_KHR)} {$ERROR 'TODO: implement'} {$ELSEIF DEFINED(VK_USE_PLATFORM_WIN32_KHR)} fHInstance := Vulkan.HINSTANCE(GetModuleHandle(nil)); {$ENDIF} fFlags := 0; end; end.