From 4cac6c7e44cc9728ee5bf468e056098af0cefe91 Mon Sep 17 00:00:00 2001 From: Bergmann89 Date: Thu, 25 Feb 2016 18:44:08 +0100 Subject: [PATCH] * changed InstanceEx to InstanceFactory --- projects/triangle/triangle.lpi | 8 +- projects/triangle/triangle.lpr | 2 +- projects/triangle/triangle.lps | 180 +++++-------- projects/triangle/uMainForm.pas | 27 +- projects/utils/uvkuDevice.pas | 42 ++++ projects/utils/uvkuInstance.pas | 35 ++- ...InstanceEx.pas => uvkuInstanceFactory.pas} | 236 +++++++----------- 7 files changed, 234 insertions(+), 296 deletions(-) create mode 100644 projects/utils/uvkuDevice.pas rename projects/utils/{uvkuInstanceEx.pas => uvkuInstanceFactory.pas} (68%) diff --git a/projects/triangle/triangle.lpi b/projects/triangle/triangle.lpi index 59a0724..c81c5c2 100644 --- a/projects/triangle/triangle.lpi +++ b/projects/triangle/triangle.lpi @@ -33,7 +33,7 @@ - + @@ -58,13 +58,17 @@ - + + + + + diff --git a/projects/triangle/triangle.lpr b/projects/triangle/triangle.lpr index 32c0b5a..5e413e5 100644 --- a/projects/triangle/triangle.lpr +++ b/projects/triangle/triangle.lpr @@ -7,7 +7,7 @@ uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} - Interfaces, Dialogs, Forms, uMainForm, Vulkan; + Interfaces, Dialogs, Forms, uMainForm, Vulkan, uvkuDevice; {$R *.res} diff --git a/projects/triangle/triangle.lps b/projects/triangle/triangle.lps index 0cf8ed8..e819648 100644 --- a/projects/triangle/triangle.lps +++ b/projects/triangle/triangle.lps @@ -4,13 +4,13 @@ - + - - + + @@ -19,54 +19,54 @@ - - + + + - - - - + + + - - - + + + - + - + - + + - - + + + - - - - + + @@ -74,7 +74,7 @@ - + @@ -102,134 +102,90 @@ - + - + + + + + + + + + + - + - - + + - - + + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + diff --git a/projects/triangle/uMainForm.pas b/projects/triangle/uMainForm.pas index 7fc4eae..cb237c9 100644 --- a/projects/triangle/uMainForm.pas +++ b/projects/triangle/uMainForm.pas @@ -6,7 +6,7 @@ interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, - Vulkan, uvkuInstanceEx, uvkuPhysicalDevice, uvkuUtils; + Vulkan, uvkuInstance, uvkuInstanceFactory, uvkuPhysicalDevice, uvkuUtils; type ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -22,7 +22,7 @@ type procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private - fIntance: TvkuInstanceEx; + fInstance: TvkuInstance; public { public declarations } end; @@ -65,30 +65,21 @@ end; procedure TMainForm.FormCreate(Sender: TObject); var i: Integer; - d: TvkuPhysicalDevice; + iFactory: TvkuInstanceFactory; begin WriteLn('create vulkan instance'); - fIntance := TvkuInstanceEx.Create( - 0, - [], - [], - TvkuInstanceEx.DefaultApplicationInfo, - TvkuAllocationHandler.Create, - true); - - WriteLn('read vulkan devices:'); - for i := 0 to fIntance.PhysicalDeviceCount-1 do begin - d := fIntance.PhysicalDevices[i]; - WriteLn(vkuMakeString(d.GetFeatures, ', ')); - WriteLn(vkuMakeString(d.GetProperties, true, true)); - WriteLn(vkuMakeString(d.GetMemoryProperties)); + iFactory := TvkuInstanceFactory.Create; + try + fInstance := iFactory.CreateInstance(TCustomAllocHandler.Create, true); + finally + FreeAndNil(iFactory); end; end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TMainForm.FormDestroy(Sender: TObject); begin - FreeAndNil(fIntance); + FreeAndNil(fInstance); end; end. diff --git a/projects/utils/uvkuDevice.pas b/projects/utils/uvkuDevice.pas new file mode 100644 index 0000000..6b0c658 --- /dev/null +++ b/projects/utils/uvkuDevice.pas @@ -0,0 +1,42 @@ +unit uvkuDevice; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, + Vulkan; + +type +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + TvkuDevice = class(TObject) + private + fHandle: VkDevice; + public + property Handle: VkDevice read fHandle; + + constructor Create(const aPhysicalDevice: VkDevice); + destructor Destroy; override; + end; + +implementation + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//TvkuDevice///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +constructor TvkuDevice.Create(const aPhysicalDevice: VkDevice); +var + info: TVkDeviceCreateInfo; +begin + inherited Create; +end; + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +destructor TvkuDevice.Destroy; +begin + inherited Destroy; +end; + +end. + diff --git a/projects/utils/uvkuInstance.pas b/projects/utils/uvkuInstance.pas index 630770f..e522b0c 100644 --- a/projects/utils/uvkuInstance.pas +++ b/projects/utils/uvkuInstance.pas @@ -10,23 +10,25 @@ uses type ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + TvkuPhysicalDeviceArr = array of VkPhysicalDevice; TvkuInstance = class(TObject) private fHandle: VkInstance; fAllocCallbacks: PVkAllocationCallbacks; - fPhysicalDevices: array of TvkuPhysicalDevice; + fPhysicalDevices: TvkuPhysicalDeviceArr; function GetPhysicalDeviceCount: Integer; - function GetPhysicalDevices(const aIndex: Integer): TvkuPhysicalDevice; + function GetPhysicalDevice(const aIndex: Integer): VkPhysicalDevice; procedure UpdatePhysicalDevices; - procedure ClearPhysicalDevices; protected procedure CreateHandle(aCreateInfo: PVkInstanceCreateInfo; aAllocCallbacks: PVkAllocationCallbacks); constructor Create; public - property Handle: VkInstance read fHandle; - property PhysicalDeviceCount: Integer read GetPhysicalDeviceCount; - property PhysicalDevices[const aIndex: Integer]: TvkuPhysicalDevice read GetPhysicalDevices; + property Handle: VkInstance read fHandle; + property PhysicalDeviceCount: Integer read GetPhysicalDeviceCount; + property PhysicalDevices[const aIndex: Integer]: VkPhysicalDevice read GetPhysicalDevice; + + function GetPhysicalDevices: TvkuPhysicalDeviceArr; constructor Create(const aCreateInfo: TVkInstanceCreateInfo); constructor Create(const aCreateInfo: TVkInstanceCreateInfo; const aAllocCallbacks: TVkAllocationCallbacks); @@ -48,7 +50,7 @@ begin end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -function TvkuInstance.GetPhysicalDevices(const aIndex: Integer): TvkuPhysicalDevice; +function TvkuInstance.GetPhysicalDevice(const aIndex: Integer): VkPhysicalDevice; begin UpdatePhysicalDevices; if (aIndex < Low(fPhysicalDevices)) or (aIndex > High(fPhysicalDevices)) then @@ -59,9 +61,7 @@ end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TvkuInstance.UpdatePhysicalDevices; var - i: Integer; c: VkUint32; - arr: array of VkPhysicalDevice; err: TVkResult; begin if (Length(fPhysicalDevices) > 0) then @@ -70,24 +70,18 @@ begin err := vkEnumeratePhysicalDevices(fHandle, @c, nil); if (err < VK_SUCCESS) then raise TvkuErrorException.Create('unable to get physical device number', err); - SetLength(arr, c); + SetLength(fPhysicalDevices, c); - err := vkEnumeratePhysicalDevices(fHandle, @c, @arr[0]); + err := vkEnumeratePhysicalDevices(fHandle, @c, @fPhysicalDevices[0]); if (err < VK_SUCCESS) then raise TvkuErrorException.Create('unable to get physical devices', err); - - SetLength(fPhysicalDevices, c); - for i := 0 to c-1 do - fPhysicalDevices[i] := TvkuPhysicalDevice.Create(arr[i]); end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -procedure TvkuInstance.ClearPhysicalDevices; -var i: Integer; +function TvkuInstance.GetPhysicalDevices: TvkuPhysicalDeviceArr; begin - for i := low(fPhysicalDevices) to high(fPhysicalDevices) do - FreeAndNil(fPhysicalDevices[i]); - SetLength(fPhysicalDevices, 0); + UpdatePhysicalDevices; + result := fPhysicalDevices; end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -128,7 +122,6 @@ end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// destructor TvkuInstance.Destroy; begin - ClearPhysicalDevices; if Assigned(fHandle) then begin vkDestroyInstance(fHandle, fAllocCallbacks); fHandle := nil; diff --git a/projects/utils/uvkuInstanceEx.pas b/projects/utils/uvkuInstanceFactory.pas similarity index 68% rename from projects/utils/uvkuInstanceEx.pas rename to projects/utils/uvkuInstanceFactory.pas index 1afde7b..0ad16b3 100644 --- a/projects/utils/uvkuInstanceEx.pas +++ b/projects/utils/uvkuInstanceFactory.pas @@ -1,4 +1,4 @@ -unit uvkuInstanceEx; +unit uvkuInstanceFactory; {$mode objfpc}{$H+} @@ -30,64 +30,69 @@ type end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - TvkuInstanceEx = class(TvkuInstance) + TvkuInstanceFactory = class(TObject) + private type + TvkuInstanceEx = class(TvkuInstance) + private + fAllocHandler: TvkuAllocationHandler; + fOwnsHandler: Boolean; + public + constructor Create(const aCreateInfo: TVkInstanceCreateInfo; const aAllocHandler: TvkuAllocationHandler; const aOwnsHandler: Boolean); + destructor Destroy; override; + end; + private - fFlags: VkInstanceCreateFlags; - fOwnsAllocHandler: Boolean; - fAllocationHandler: TvkuAllocationHandler; - fApplicationInfo: TvkuApplicationInfo; + fFlags: VkInstanceCreateFlags; + fApplicationInfo: TvkuApplicationInfo; fLayers: TStringList; fExtensions: TStringList; function GetLayers: TStrings; function GetExtensions: TStrings; - - procedure Initialize; - procedure MakeStringsFromArray(const aArray: array of String; const aStrings: TStrings); - procedure CreateHandle; public - property Flags: VkInstanceCreateFlags read fFlags; - property OwnsAllocHandler: Boolean read fOwnsAllocHandler; - property AllocationHandler: TvkuAllocationHandler read fAllocationHandler; - property ApplicationInfo: TvkuApplicationInfo read fApplicationInfo; - property Layers: TStrings read GetLayers; - property Extensions: TStrings read GetExtensions; - - constructor Create; + property Flags: VkInstanceCreateFlags read fFlags; + property ApplicationInfo: TvkuApplicationInfo read fApplicationInfo; + property Layers: TStrings read GetLayers; + property Extensions: TStrings read GetExtensions; - constructor Create( - const aFlags: VkInstanceCreateFlags; - const aLayers: array of String; - const aExtensions: array of String); - - constructor Create( - const aFlags: VkInstanceCreateFlags; - const aLayers: array of String; - const aExtensions: array of String; - const aAppInfo: TvkuApplicationInfo); - - constructor Create( - const aFlags: VkInstanceCreateFlags; - const aLayers: array of String; - const aExtensions: array of String; - const aAppInfo: TvkuApplicationInfo; - const aAllocHandler: TvkuAllocationHandler; - const aOwnsAllocHandler: Boolean); + function CreateInstance: TvkuInstance; + function CreateInstance(const aAllocHandler: TvkuAllocationHandler; const aOwnsHandler: Boolean): TvkuInstance; + constructor Create; destructor Destroy; override; - public - class function DefaultApplicationInfo: TvkuApplicationInfo; - class function MakeApplicationInfo( - aAppName: String; - aAppVersion: VkVersion; - aEngineName: String; - aEngineVersion: VkVersion; - aApiVersion: VkVersion = VK_API_VERSION): TvkuApplicationInfo; 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; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TvkuAllocationHandler////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -153,43 +158,60 @@ begin end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//TvkuInstanceEx/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//TvkuInstanceFactory.TvkuInstanceEx///////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -function TvkuInstanceEx.GetLayers: TStrings; +constructor TvkuInstanceFactory.TvkuInstanceEx.Create(const aCreateInfo: TVkInstanceCreateInfo; const aAllocHandler: TvkuAllocationHandler; const aOwnsHandler: Boolean); +var + AllocCallbacks: TVkAllocationCallbacks; begin - result := fLayers; + fOwnsHandler := aOwnsHandler; + fAllocHandler := aAllocHandler; + if Assigned(fAllocHandler) then begin + FillByte(AllocCallbacks, SizeOf(AllocCallbacks), 0); + AllocCallbacks.pUserData := fAllocHandler; + AllocCallbacks.pfnAllocation := @AllocateMemoryCallback; + AllocCallbacks.pfnReallocation := @ReallocateMemoryCallback; + AllocCallbacks.pfnFree := @FreeMemoryCallback; + AllocCallbacks.pfnInternalAllocation := @InternalAllocationCallback; + AllocCallbacks.pfnInternalFree := @InternalFreeCallback; + inherited Create(aCreateInfo, AllocCallbacks); + end else + inherited Create(aCreateInfo); end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -function TvkuInstanceEx.GetExtensions: TStrings; +destructor TvkuInstanceFactory.TvkuInstanceEx.Destroy; begin - result := fExtensions; + inherited Destroy; + if fOwnsHandler then + FreeAndNil(fAllocHandler); +end; + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//TvkuInstanceFactory/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +function TvkuInstanceFactory.GetLayers: TStrings; +begin + result := fLayers; end; -procedure TvkuInstanceEx.Initialize; +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +function TvkuInstanceFactory.GetExtensions: TStrings; begin - fLayers := TStringList.Create; - fExtensions := TStringList.Create; - fApplicationInfo := DefaultApplicationInfo; - fFlags := 0; - fAllocationHandler := nil; - fOwnsAllocHandler := false; + result := fExtensions; end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -procedure TvkuInstanceEx.MakeStringsFromArray(const aArray: array of String; const aStrings: TStrings); -var i: Integer; +function TvkuInstanceFactory.CreateInstance: TvkuInstance; begin - for i := Low(aArray) to High(aArray) do - aStrings.Add(aArray[i]); + result := CreateInstance(nil, false); end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -procedure TvkuInstanceEx.CreateHandle; +function TvkuInstanceFactory.CreateInstance(const aAllocHandler: TvkuAllocationHandler; const aOwnsHandler: Boolean): TvkuInstance; var - CreateInfo: TVkInstanceCreateInfo; - AppInfo: TVkApplicationInfo; - AllocCallbacks: TVkAllocationCallbacks; + CreateInfo: TVkInstanceCreateInfo; + AppInfo: TVkApplicationInfo; i: Integer; lay: array of PVkChar; ext: array of PVkChar; @@ -221,95 +243,25 @@ begin CreateInfo.enabledExtensionCount := Length(ext); CreateInfo.ppEnabledExtensionNames := @ext[0]; - if Assigned(fAllocationHandler) then begin - FillByte(AllocCallbacks, SizeOf(AllocCallbacks), 0); - AllocCallbacks.pUserData := fAllocationHandler; - AllocCallbacks.pfnAllocation := @AllocateMemoryCallback; - AllocCallbacks.pfnReallocation := @ReallocateMemoryCallback; - AllocCallbacks.pfnFree := @FreeMemoryCallback; - AllocCallbacks.pfnInternalAllocation := @InternalAllocationCallback; - AllocCallbacks.pfnInternalFree := @InternalFreeCallback; - inherited CreateHandle(@CreateInfo, @AllocCallbacks); - end else - inherited CreateHandle(@CreateInfo, nil); -end; - -///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -constructor TvkuInstanceEx.Create; -begin - Initialize; - CreateHandle; + result := TvkuInstanceEx.Create(CreateInfo, aAllocHandler, aOwnsHandler); end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -constructor TvkuInstanceEx.Create(const aFlags: VkInstanceCreateFlags; - const aLayers: array of String; const aExtensions: array of String); +constructor TvkuInstanceFactory.Create; begin inherited Create; - Initialize; - fFlags := aFlags; - MakeStringsFromArray(aLayers, fLayers); - MakeStringsFromArray(aExtensions, fExtensions); - CreateHandle; + fLayers := TStringList.Create; + fExtensions := TStringList.Create; + fApplicationInfo := vkuApplicationInfo; + fFlags := 0; end; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -constructor TvkuInstanceEx.Create(const aFlags: VkInstanceCreateFlags;const aLayers: array of String; - const aExtensions: array of String; const aAppInfo: TvkuApplicationInfo); +destructor TvkuInstanceFactory.Destroy; begin - inherited Create; - Initialize; - fFlags := aFlags; - fApplicationInfo := aAppInfo; - MakeStringsFromArray(aLayers, fLayers); - MakeStringsFromArray(aExtensions, fExtensions); - CreateHandle; -end; - -///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -constructor TvkuInstanceEx.Create(const aFlags: VkInstanceCreateFlags; const aLayers: array of String;const aExtensions: array of String; - const aAppInfo: TvkuApplicationInfo; const aAllocHandler: TvkuAllocationHandler; const aOwnsAllocHandler: Boolean); -begin - inherited Create; - Initialize; - fFlags := aFlags; - fApplicationInfo := aAppInfo; - fAllocationHandler := aAllocHandler; - fOwnsAllocHandler := aOwnsAllocHandler; - MakeStringsFromArray(aLayers, fLayers); - MakeStringsFromArray(aExtensions, fExtensions); - CreateHandle; -end; - -///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -destructor TvkuInstanceEx.Destroy; -begin - inherited Destroy; - if fOwnsAllocHandler then - FreeAndNil(fAllocationHandler); FreeAndNil(fLayers); FreeAndNil(fExtensions); -end; - -///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -class function TvkuInstanceEx.DefaultApplicationInfo: TvkuApplicationInfo; -begin - result.AppName := ExtractFileName(ParamStr(0)); - result.AppVersion := 0; - result.EngineName := ExtractFileName(ParamStr(0)); - result.EngineVersion := 0; - result.ApiVersion := VK_API_VERSION; -end; - -///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -class function TvkuInstanceEx.MakeApplicationInfo(aAppName: String; aAppVersion: VkVersion; aEngineName: String; aEngineVersion: VkVersion; aApiVersion: VkVersion): TvkuApplicationInfo; -begin - result := DefaultApplicationInfo; - result.AppName := aAppName; - result.AppVersion := aAppVersion; - result.EngineName := aEngineName; - result.EngineVersion := aEngineVersion; - result.ApiVersion := aApiVersion; + inherited Destroy; end; end.