|
- unit uvkuInstanceFactory;
-
- {$mode objfpc}{$H+}
-
- interface
-
- uses
- Classes, SysUtils,
- Vulkan, uvkuInstance, uvkuAllocationHandler;
-
- type
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- TvkuApplicationInfo = packed record
- AppName: String;
- AppVersion: VkVersion;
- EngineName: String;
- EngineVersion: VkVersion;
- ApiVersion: VkVersion;
- end;
-
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- TvkuInstanceEx = class(TvkuInstance)
- private
- fAllocHandler: TvkuAllocationHandler;
- fOwnsHandler: Boolean;
- public
- constructor Create(
- const aCreateInfo: TVkInstanceCreateInfo;
- const aAllocHandler: TvkuAllocationHandler;
- const aOwnsHandler: Boolean);
- 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: TvkuInstance;
- function CreateInstance(const aAllocHandler: TvkuAllocationHandler; const aOwnsHandler: Boolean): TvkuInstance;
-
- 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/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- constructor TvkuInstanceEx.Create(const aCreateInfo: TVkInstanceCreateInfo; const aAllocHandler: TvkuAllocationHandler; const aOwnsHandler: Boolean);
- begin
- fOwnsHandler := aOwnsHandler;
- fAllocHandler := aAllocHandler;
- if Assigned(fAllocHandler)
- then inherited Create(aCreateInfo, fAllocHandler.GetAllocationCallbacks)
- else inherited Create(aCreateInfo);
- end;
-
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- 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: TvkuInstance;
- begin
- result := CreateInstance(nil, false);
- end;
-
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function TvkuInstanceFactory.CreateInstance(const aAllocHandler: TvkuAllocationHandler; const aOwnsHandler: Boolean): TvkuInstance;
- var
- CreateInfo: TVkInstanceCreateInfo;
- AppInfo: TVkApplicationInfo;
- i: Integer;
- lay: array of PVkChar;
- ext: array of PVkChar;
- begin
- FillByte(AppInfo, 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, 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];
-
- result := TvkuInstanceEx.Create(CreateInfo, aAllocHandler, aOwnsHandler);
- 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.
|