| @@ -33,7 +33,7 @@ | |||
| <PackageName Value="LCL"/> | |||
| </Item1> | |||
| </RequiredPackages> | |||
| <Units Count="7"> | |||
| <Units Count="8"> | |||
| <Unit0> | |||
| <Filename Value="triangle.lpr"/> | |||
| <IsPartOfProject Value="True"/> | |||
| @@ -58,13 +58,17 @@ | |||
| <IsPartOfProject Value="True"/> | |||
| </Unit4> | |||
| <Unit5> | |||
| <Filename Value="..\utils\uvkuInstanceEx.pas"/> | |||
| <Filename Value="..\utils\uvkuInstanceFactory.pas"/> | |||
| <IsPartOfProject Value="True"/> | |||
| </Unit5> | |||
| <Unit6> | |||
| <Filename Value="..\utils\uvkuPhysicalDevice.pas"/> | |||
| <IsPartOfProject Value="True"/> | |||
| </Unit6> | |||
| <Unit7> | |||
| <Filename Value="..\utils\uvkuDevice.pas"/> | |||
| <IsPartOfProject Value="True"/> | |||
| </Unit7> | |||
| </Units> | |||
| </ProjectOptions> | |||
| <CompilerOptions> | |||
| @@ -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} | |||
| @@ -4,13 +4,13 @@ | |||
| <PathDelim Value="\"/> | |||
| <Version Value="9"/> | |||
| <BuildModes Active="Default"/> | |||
| <Units Count="12"> | |||
| <Units Count="13"> | |||
| <Unit0> | |||
| <Filename Value="triangle.lpr"/> | |||
| <IsPartOfProject Value="True"/> | |||
| <EditorIndex Value="1"/> | |||
| <CursorPos X="48" Y="10"/> | |||
| <UsageCount Value="32"/> | |||
| <CursorPos X="60" Y="10"/> | |||
| <UsageCount Value="34"/> | |||
| <Loaded Value="True"/> | |||
| </Unit0> | |||
| <Unit1> | |||
| @@ -19,54 +19,54 @@ | |||
| <ComponentName Value="MainForm"/> | |||
| <HasResources Value="True"/> | |||
| <ResourceBaseClass Value="Form"/> | |||
| <CursorPos X="56" Y="9"/> | |||
| <UsageCount Value="32"/> | |||
| <TopLine Value="6"/> | |||
| <CursorPos X="44" Y="9"/> | |||
| <UsageCount Value="34"/> | |||
| <Loaded Value="True"/> | |||
| <LoadedDesigner Value="True"/> | |||
| </Unit1> | |||
| <Unit2> | |||
| <Filename Value="..\Vulkan.pas"/> | |||
| <IsPartOfProject Value="True"/> | |||
| <EditorIndex Value="6"/> | |||
| <TopLine Value="1417"/> | |||
| <CursorPos X="3" Y="1433"/> | |||
| <UsageCount Value="32"/> | |||
| <EditorIndex Value="7"/> | |||
| <CursorPos X="33" Y="1694"/> | |||
| <UsageCount Value="34"/> | |||
| <Loaded Value="True"/> | |||
| </Unit2> | |||
| <Unit3> | |||
| <Filename Value="..\utils\uvkuInstance.pas"/> | |||
| <IsPartOfProject Value="True"/> | |||
| <EditorIndex Value="4"/> | |||
| <TopLine Value="43"/> | |||
| <CursorPos Y="50"/> | |||
| <UsageCount Value="30"/> | |||
| <TopLine Value="3"/> | |||
| <CursorPos X="44" Y="18"/> | |||
| <UsageCount Value="32"/> | |||
| <Loaded Value="True"/> | |||
| </Unit3> | |||
| <Unit4> | |||
| <Filename Value="..\utils\uvkuUtils.pas"/> | |||
| <IsPartOfProject Value="True"/> | |||
| <EditorIndex Value="8"/> | |||
| <EditorIndex Value="9"/> | |||
| <TopLine Value="28"/> | |||
| <CursorPos Y="40"/> | |||
| <UsageCount Value="27"/> | |||
| <UsageCount Value="29"/> | |||
| <Loaded Value="True"/> | |||
| </Unit4> | |||
| <Unit5> | |||
| <Filename Value="..\utils\uvkuInstanceEx.pas"/> | |||
| <Filename Value="..\utils\uvkuInstanceFactory.pas"/> | |||
| <IsPartOfProject Value="True"/> | |||
| <IsVisibleTab Value="True"/> | |||
| <EditorIndex Value="2"/> | |||
| <CursorPos X="56" Y="212"/> | |||
| <UsageCount Value="24"/> | |||
| <TopLine Value="170"/> | |||
| <CursorPos Y="186"/> | |||
| <UsageCount Value="26"/> | |||
| <Loaded Value="True"/> | |||
| </Unit5> | |||
| <Unit6> | |||
| <Filename Value="..\utils\uvkuPhysicalDevice.pas"/> | |||
| <IsPartOfProject Value="True"/> | |||
| <IsVisibleTab Value="True"/> | |||
| <EditorIndex Value="5"/> | |||
| <TopLine Value="17"/> | |||
| <CursorPos X="14" Y="32"/> | |||
| <UsageCount Value="24"/> | |||
| <CursorPos X="32" Y="38"/> | |||
| <UsageCount Value="26"/> | |||
| <Loaded Value="True"/> | |||
| </Unit6> | |||
| <Unit7> | |||
| @@ -74,7 +74,7 @@ | |||
| <EditorIndex Value="3"/> | |||
| <TopLine Value="44"/> | |||
| <CursorPos X="27" Y="22"/> | |||
| <UsageCount Value="14"/> | |||
| <UsageCount Value="15"/> | |||
| <Loaded Value="True"/> | |||
| <DefaultSyntaxHighlighter Value="None"/> | |||
| </Unit7> | |||
| @@ -102,134 +102,90 @@ | |||
| </Unit10> | |||
| <Unit11> | |||
| <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\3.1.1\source\rtl\objpas\sysutils\sysstrh.inc"/> | |||
| <EditorIndex Value="7"/> | |||
| <EditorIndex Value="8"/> | |||
| <TopLine Value="96"/> | |||
| <CursorPos X="10" Y="112"/> | |||
| <UsageCount Value="10"/> | |||
| <UsageCount Value="11"/> | |||
| <Loaded Value="True"/> | |||
| </Unit11> | |||
| <Unit12> | |||
| <Filename Value="..\utils\uvkuDevice.pas"/> | |||
| <IsPartOfProject Value="True"/> | |||
| <EditorIndex Value="6"/> | |||
| <TopLine Value="8"/> | |||
| <CursorPos X="29" Y="31"/> | |||
| <UsageCount Value="22"/> | |||
| <Loaded Value="True"/> | |||
| </Unit12> | |||
| </Units> | |||
| <JumpHistory Count="30" HistoryIndex="27"> | |||
| <JumpHistory Count="14" HistoryIndex="13"> | |||
| <Position1> | |||
| <Filename Value="..\utils\uvkuPhysicalDevice.pas"/> | |||
| <Caret Line="273" Column="36" TopLine="258"/> | |||
| <Filename Value="uMainForm.pas"/> | |||
| <Caret Line="83" Column="19" TopLine="64"/> | |||
| </Position1> | |||
| <Position2> | |||
| <Filename Value="..\utils\uvkuPhysicalDevice.pas"/> | |||
| <Caret Line="268" Column="19" TopLine="249"/> | |||
| <Filename Value="uMainForm.pas"/> | |||
| <Caret Line="84" Column="16" TopLine="64"/> | |||
| </Position2> | |||
| <Position3> | |||
| <Filename Value="..\utils\uvkuPhysicalDevice.pas"/> | |||
| <Caret Line="274" Column="29" TopLine="253"/> | |||
| <Filename Value="triangle.lpr"/> | |||
| <Caret Line="10" Column="40"/> | |||
| </Position3> | |||
| <Position4> | |||
| <Filename Value="..\utils\uvkuPhysicalDevice.pas"/> | |||
| <Caret Line="511" Column="8" TopLine="490"/> | |||
| <Caret Line="136" TopLine="14"/> | |||
| </Position4> | |||
| <Position5> | |||
| <Filename Value="..\utils\uvkuPhysicalDevice.pas"/> | |||
| <Caret Line="517" Column="77" TopLine="503"/> | |||
| <Filename Value="..\utils\uvkuDevice.pas"/> | |||
| <Caret Line="18" Column="23"/> | |||
| </Position5> | |||
| <Position6> | |||
| <Filename Value="uMainForm.pas"/> | |||
| <Caret Line="59" Column="46" TopLine="36"/> | |||
| <Filename Value="..\utils\uvkuDevice.pas"/> | |||
| <Caret Line="31" Column="29" TopLine="8"/> | |||
| </Position6> | |||
| <Position7> | |||
| <Filename Value="..\utils\uvkuPhysicalDevice.pas"/> | |||
| <Caret Line="524" Column="35" TopLine="507"/> | |||
| <Filename Value="..\Vulkan.pas"/> | |||
| <Caret Line="1836" Column="25" TopLine="1817"/> | |||
| </Position7> | |||
| <Position8> | |||
| <Filename Value="uMainForm.pas"/> | |||
| <Caret Line="16" Column="60"/> | |||
| <Filename Value="..\utils\uvkuInstance.pas"/> | |||
| <Caret Line="13" Column="27" TopLine="6"/> | |||
| </Position8> | |||
| <Position9> | |||
| <Filename Value="uMainForm.pas"/> | |||
| <Caret Line="52" Column="10" TopLine="36"/> | |||
| <Filename Value="..\utils\uvkuInstance.pas"/> | |||
| <Caret Line="29" Column="87" TopLine="17"/> | |||
| </Position9> | |||
| <Position10> | |||
| <Filename Value="uMainForm.pas"/> | |||
| <Caret Line="18"/> | |||
| <Filename Value="..\utils\uvkuInstance.pas"/> | |||
| <Caret Line="84" Column="29" TopLine="65"/> | |||
| </Position10> | |||
| <Position11> | |||
| <Filename Value="uMainForm.pas"/> | |||
| <Caret Line="85" Column="7" TopLine="57"/> | |||
| <Caret Line="9" Column="56"/> | |||
| </Position11> | |||
| <Position12> | |||
| <Filename Value="uMainForm.pas"/> | |||
| <Caret Line="83" Column="70" TopLine="64"/> | |||
| <Caret Line="73" Column="26" TopLine="56"/> | |||
| </Position12> | |||
| <Position13> | |||
| <Filename Value="uMainForm.pas"/> | |||
| <Caret Line="84" Column="64" TopLine="64"/> | |||
| <Caret Line="25" Column="28" TopLine="10"/> | |||
| </Position13> | |||
| <Position14> | |||
| <Filename Value="uMainForm.pas"/> | |||
| <Caret Line="83" Column="19" TopLine="64"/> | |||
| <Caret Line="9" Column="44" TopLine="6"/> | |||
| </Position14> | |||
| <Position15> | |||
| <Filename Value="..\utils\uvkuPhysicalDevice.pas"/> | |||
| <Caret Line="223" Column="17" TopLine="204"/> | |||
| </Position15> | |||
| <Position16> | |||
| <Filename Value="..\utils\uvkuPhysicalDevice.pas"/> | |||
| <Caret Line="515" Column="7" TopLine="386"/> | |||
| </Position16> | |||
| <Position17> | |||
| <Filename Value="..\utils\uvkuPhysicalDevice.pas"/> | |||
| <Caret Line="213" Column="52" TopLine="197"/> | |||
| </Position17> | |||
| <Position18> | |||
| <Filename Value="..\utils\uvkuPhysicalDevice.pas"/> | |||
| <Caret Line="515" Column="7" TopLine="493"/> | |||
| </Position18> | |||
| <Position19> | |||
| <Filename Value="..\utils\uvkuPhysicalDevice.pas"/> | |||
| <Caret Line="213" Column="52" TopLine="197"/> | |||
| </Position19> | |||
| <Position20> | |||
| <Filename Value="..\utils\uvkuPhysicalDevice.pas"/> | |||
| <Caret Line="516" Column="10" TopLine="489"/> | |||
| </Position20> | |||
| <Position21> | |||
| <Filename Value="..\utils\uvkuPhysicalDevice.pas"/> | |||
| <Caret Line="213" Column="52" TopLine="197"/> | |||
| </Position21> | |||
| <Position22> | |||
| <Filename Value="..\utils\uvkuPhysicalDevice.pas"/> | |||
| <Caret Line="526" Column="46" TopLine="500"/> | |||
| </Position22> | |||
| <Position23> | |||
| <Filename Value="..\utils\uvkuPhysicalDevice.pas"/> | |||
| <Caret Line="137" TopLine="127"/> | |||
| </Position23> | |||
| <Position24> | |||
| <Filename Value="uMainForm.pas"/> | |||
| <Caret Line="83" Column="19" TopLine="64"/> | |||
| </Position24> | |||
| <Position25> | |||
| <Filename Value="uMainForm.pas"/> | |||
| <Caret Line="84" Column="16" TopLine="64"/> | |||
| </Position25> | |||
| <Position26> | |||
| <Filename Value="triangle.lpr"/> | |||
| <Caret Line="10" Column="40"/> | |||
| </Position26> | |||
| <Position27> | |||
| <Filename Value="..\utils\uvkuInstanceEx.pas"/> | |||
| <Caret Line="9" Column="23" TopLine="37"/> | |||
| </Position27> | |||
| <Position28> | |||
| <Filename Value="..\utils\uvkuPhysicalDevice.pas"/> | |||
| <Caret Line="136" TopLine="14"/> | |||
| </Position28> | |||
| <Position29> | |||
| <Filename Value="..\Vulkan.pas"/> | |||
| <Caret Line="1433" Column="3" TopLine="1417"/> | |||
| </Position29> | |||
| <Position30> | |||
| <Filename Value="..\Vulkan.pas"/> | |||
| <Caret Line="1443" Column="22" TopLine="1426"/> | |||
| </Position30> | |||
| </JumpHistory> | |||
| </ProjectSession> | |||
| <Debugging> | |||
| <BreakPoints Count="1"> | |||
| <Item1> | |||
| <Kind Value="bpkSource"/> | |||
| <WatchScope Value="wpsLocal"/> | |||
| <WatchKind Value="wpkWrite"/> | |||
| <Source Value="..\utils\uvkuInstanceFactory.pas"/> | |||
| <Line Value="186"/> | |||
| </Item1> | |||
| </BreakPoints> | |||
| </Debugging> | |||
| </CONFIG> | |||
| @@ -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. | |||
| @@ -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. | |||
| @@ -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; | |||
| @@ -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. | |||