unit uvkuInstanceFactory; {$mode objfpc}{$H+} {$I Vulkan.inc} interface uses Classes, SysUtils, Vulkan, uvkuInstance, uvkuFactoryBase, uvkuTypes; type ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TvkuApplicationInfo = class(TObject) public AppName: String; AppVersion: VkVersion; EngineName: String; EngineVersion: VkVersion; ApiVersion: VkVersion; function GetStructure: TVkApplicationInfo; procedure SetStructure(const aData: TVkApplicationInfo); constructor Create; end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TvkuInstanceFactory = class(TvkuFactory) private fFlags: VkInstanceCreateFlags; fApplicationInfo: TvkuApplicationInfo; fEnabledLayerNames: TStringList; fEnabledExtensionNames: TStringList; fvkApplicationInfo: TVkApplicationInfo; fvkEnabledLayerNames: PVkCharArr; fvkEnabledExtensionNames: PVkCharArr; function GetLayers: TStrings; function GetExtensions: TStrings; public property Flags: VkInstanceCreateFlags read fFlags; property ApplicationInfo: TvkuApplicationInfo read fApplicationInfo; property EnabledLayerNames: TStrings read GetLayers; property EnabledExtensionNames: TStrings read GetExtensions; function GetStructure: TVkInstanceCreateInfo; procedure SetStructure(const aData: TVkInstanceCreateInfo); function CreateInstance: TvkuInstance; constructor Create; destructor Destroy; override; end; implementation ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TvkuApplicationInfo//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TvkuApplicationInfo.GetStructure: TVkApplicationInfo; begin FillByte(result, SizeOf(result), 0); result.sType := VK_STRUCTURE_TYPE_APPLICATION_INFO; result.pNext := nil; result.pApplicationName := PVkChar(AppName); result.applicationVersion := AppVersion; result.pEngineName := PVkChar(EngineName); result.engineVersion := EngineVersion; result.apiVersion := ApiVersion; end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TvkuApplicationInfo.SetStructure(const aData: TVkApplicationInfo); begin AppName := aData.pApplicationName; AppVersion := aData.applicationVersion; EngineName := aData.pEngineName; EngineVersion := aData.engineVersion; ApiVersion := aData.apiVersion; end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// constructor TvkuApplicationInfo.Create; begin AppName := ExtractFileName(ParamStr(0)); AppVersion := 0; EngineName := ExtractFileName(ParamStr(0)); EngineVersion := 0; ApiVersion := VK_API_VERSION; end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TvkuInstanceFactory/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TvkuInstanceFactory.GetLayers: TStrings; begin result := fEnabledLayerNames; end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TvkuInstanceFactory.GetExtensions: TStrings; begin result := fEnabledExtensionNames; end; function TvkuInstanceFactory.GetStructure: TVkInstanceCreateInfo; var i: Integer; begin SetLength(fvkEnabledLayerNames, fEnabledLayerNames.Count); for i := low(fvkEnabledLayerNames) to high(fvkEnabledLayerNames) do fvkEnabledLayerNames[i] := PVkChar(fEnabledLayerNames[i]); SetLength(fvkEnabledExtensionNames, fEnabledExtensionNames.Count); for i := low(fvkEnabledExtensionNames) to high(fvkEnabledExtensionNames) do fvkEnabledExtensionNames[i] := PVkChar(fEnabledExtensionNames[i]); fvkApplicationInfo := fApplicationInfo.GetStructure; FillByte(result, SizeOf(result), 0); result.sType := VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; result.pNext := nil; result.flags := fFlags; result.pApplicationInfo := @fvkApplicationInfo; result.enabledLayerCount := Length(fvkEnabledLayerNames); result.ppEnabledLayerNames := @fvkEnabledLayerNames[0]; result.enabledExtensionCount := Length(fvkEnabledExtensionNames); result.ppEnabledExtensionNames := @fvkEnabledExtensionNames[0]; end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TvkuInstanceFactory.SetStructure(const aData: TVkInstanceCreateInfo); var i: Integer; begin fFlags := aData.flags; if Assigned(aData.pApplicationInfo) then fApplicationInfo.SetStructure(aData.pApplicationInfo^); fEnabledLayerNames.Clear; for i := 0 to aData.enabledLayerCount-1 do fEnabledLayerNames.Add(aData.ppEnabledLayerNames[i]); fEnabledExtensionNames.Clear; for i := 0 to aData.enabledExtensionCount-1 do fEnabledExtensionNames.Add(aData.ppEnabledExtensionNames[i]); end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TvkuInstanceFactory.CreateInstance: TvkuInstance; begin result := TvkuInstance.Create(GetStructure, AllocCallbacks); end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// constructor TvkuInstanceFactory.Create; begin inherited Create; fEnabledLayerNames := TStringList.Create; fEnabledExtensionNames := TStringList.Create; fApplicationInfo := TvkuApplicationInfo.Create; fFlags := 0; end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// destructor TvkuInstanceFactory.Destroy; begin FreeAndNil(fApplicationInfo); FreeAndNil(fEnabledLayerNames); FreeAndNil(fEnabledExtensionNames); inherited Destroy; end; end.