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