unit uvkuInstanceFactory; {$mode objfpc}{$H+} {$I Vulkan.inc} interface uses Classes, SysUtils, Vulkan, uvkuInstance, uvkuAllocationHandler, uvkuTypes; type ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TvkuInstanceEx = class(TvkuInstance) private fAllocHandler: TvkuAllocationHandler; fOwnsHandler: Boolean; public destructor Destroy; override; end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TvkuInstanceFactory = class(TObject) private fFlags: VkInstanceCreateFlags; fApplicationInfo: TvkuApplicationInfo; fLayers: TStringList; fExtensions: TStringList; function GetLayers: TStrings; function GetExtensions: TStrings; public property Flags: VkInstanceCreateFlags read fFlags; property ApplicationInfo: TvkuApplicationInfo read fApplicationInfo; property Layers: TStrings read GetLayers; property Extensions: TStrings read GetExtensions; function CreateInstance: TvkuInstanceEx; function CreateInstance( const aAllocHandler: TvkuAllocationHandler; const aOwnsHandler: Boolean): TvkuInstanceEx; constructor Create; destructor Destroy; override; end; function vkuApplicationInfo: TvkuApplicationInfo; function vkuApplicationInfo( aAppName: String; aAppVersion: VkVersion; aEngineName: String; aEngineVersion: VkVersion; aApiVersion: VkVersion = VK_API_VERSION): TvkuApplicationInfo; implementation ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function vkuApplicationInfo: TvkuApplicationInfo; begin result.AppName := ExtractFileName(ParamStr(0)); result.AppVersion := 0; result.EngineName := ExtractFileName(ParamStr(0)); result.EngineVersion := 0; result.ApiVersion := VK_API_VERSION; end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function vkuApplicationInfo(aAppName: String; aAppVersion: VkVersion; aEngineName: String; aEngineVersion: VkVersion; aApiVersion: VkVersion): TvkuApplicationInfo; begin result := vkuApplicationInfo(); result.AppName := aAppName; result.AppVersion := aAppVersion; result.EngineName := aEngineName; result.EngineVersion := aEngineVersion; result.ApiVersion := aApiVersion; end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TvkuInstanceEx///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// destructor TvkuInstanceEx.Destroy; begin inherited Destroy; if fOwnsHandler then FreeAndNil(fAllocHandler); end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TvkuInstanceFactory/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TvkuInstanceFactory.GetLayers: TStrings; begin result := fLayers; end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TvkuInstanceFactory.GetExtensions: TStrings; begin result := fExtensions; end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TvkuInstanceFactory.CreateInstance: TvkuInstanceEx; begin result := CreateInstance(nil, false); end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TvkuInstanceFactory.CreateInstance(const aAllocHandler: TvkuAllocationHandler; const aOwnsHandler: Boolean): TvkuInstanceEx; var CreateInfo: TVkInstanceCreateInfo; AppInfo: TVkApplicationInfo; i: Integer; lay: array of PVkChar; ext: array of PVkChar; begin FillByte(AppInfo{%H-}, SizeOf(AppInfo), 0); AppInfo.sType := VK_STRUCTURE_TYPE_APPLICATION_INFO; AppInfo.pNext := nil; AppInfo.pApplicationName := PVkChar(fApplicationInfo.AppName); AppInfo.applicationVersion := fApplicationInfo.AppVersion; AppInfo.pEngineName := PVkChar(fApplicationInfo.EngineName); AppInfo.engineVersion := fApplicationInfo.EngineVersion; AppInfo.apiVersion := fApplicationInfo.ApiVersion; SetLength(lay, fLayers.Count); for i := 0 to fLayers.Count-1 do lay[i] := PVkChar(fLayers[i]); SetLength(ext, fExtensions.Count); for i := 0 to fExtensions.Count-1 do ext[i] := PVkChar(fExtensions[i]); FillByte(CreateInfo{%H-}, SizeOf(CreateInfo), 0); CreateInfo.sType := VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; CreateInfo.pNext := nil; CreateInfo.flags := fFlags; CreateInfo.pApplicationInfo := @AppInfo; CreateInfo.enabledLayerCount := Length(lay); CreateInfo.ppEnabledLayerNames := @lay[0]; CreateInfo.enabledExtensionCount := Length(ext); CreateInfo.ppEnabledExtensionNames := @ext[0]; if Assigned(aAllocHandler) then result := TvkuInstanceEx.Create(CreateInfo, aAllocHandler.GetAllocationCallbacksPtr) else result := TvkuInstanceEx.Create(CreateInfo); try TvkuInstanceEx(result).fAllocHandler := aAllocHandler; TvkuInstanceEx(result).fOwnsHandler := aOwnsHandler; except FreeAndNil(result); raise; end; end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// constructor TvkuInstanceFactory.Create; begin inherited Create; fLayers := TStringList.Create; fExtensions := TStringList.Create; fApplicationInfo := vkuApplicationInfo; fFlags := 0; end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// destructor TvkuInstanceFactory.Destroy; begin FreeAndNil(fLayers); FreeAndNil(fExtensions); inherited Destroy; end; end.