|
- unit uvkuSurfaceFactory;
-
- {$mode objfpc}{$H+}
- {$I Vulkan.inc}
-
- interface
-
- uses
- Classes, SysUtils, Controls,
- Vulkan, uvkuInstance, uvkuSurface, uvkuAllocationHandler;
-
- type
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- TvkuSurfaceEx = class(TvkuSurface)
- private
- fAllocHandler: TvkuAllocationHandler;
- fOwnsHandler: Boolean;
- public
- destructor Destroy; override;
- end;
-
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- TvkuSurfaceFactory = class(TObject)
- {$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;
- fInstance: TvkuInstance;
- procedure SetWinControl(aValue: TWinControl);
- public
- property WinControl: TWinControl read fWinControl write SetWinControl;
- property Flags: VkFlags read fFlags write fFlags;
-
- function CreateSurface: TvkuSurface;
- function CreateSurface(
- const aAllocHandler: TvkuAllocationHandler;
- const aOwnsHandler: Boolean): TvkuSurface;
-
- constructor Create(const aInstance: TvkuInstance);
- 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: TvkuSurface;
- begin
- result := CreateSurface(nil, false);
- end;
-
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function TvkuSurfaceFactory.CreateSurface(const aAllocHandler: TvkuAllocationHandler; const aOwnsHandler: Boolean): TvkuSurface;
- {$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(fInstance.Handle, CreateInfo, fInstance.InstanceCommands, aAllocHandler.GetAllocationCallbacks)
- else srf := TvkuSurfaceEx.Create(fInstance.Handle, CreateInfo, fInstance.InstanceCommands);
- try
- srf.fAllocHandler := aAllocHandler;
- srf.fOwnsHandler := aOwnsHandler;
- except
- FreeAndNil(srf);
- end;
- result := srf;
- end;
-
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- constructor TvkuSurfaceFactory.Create(const aInstance: TvkuInstance);
- begin
- inherited Create;
- {$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}
- fInstance := aInstance;
- fFlags := 0;
- end;
-
- end.
-
|