|
- 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.
|