* implemented methods for other classes * implemented init/render codemaster
| @@ -0,0 +1,3 @@ | |||||
| [submodule "projects/lazopenglcore"] | |||||
| path = projects/lazopenglcore | |||||
| url = ../lazopenglcore.git | |||||
| @@ -1947,9 +1947,9 @@ type { structures } | |||||
| maxFragmentDualSrcAttachments: VkUint32; | maxFragmentDualSrcAttachments: VkUint32; | ||||
| maxFragmentCombinedOutputResources: VkUint32; | maxFragmentCombinedOutputResources: VkUint32; | ||||
| maxComputeSharedMemorySize: VkUint32; | maxComputeSharedMemorySize: VkUint32; | ||||
| maxComputeWorkGroupCount: array[0..3] of VkUint32; | |||||
| maxComputeWorkGroupCount: array[0..2] of VkUint32; | |||||
| maxComputeWorkGroupInvocations: VkUint32; | maxComputeWorkGroupInvocations: VkUint32; | ||||
| maxComputeWorkGroupSize: array[0..3] of VkUint32; | |||||
| maxComputeWorkGroupSize: array[0..2] of VkUint32; | |||||
| subPixelPrecisionBits: VkUint32; | subPixelPrecisionBits: VkUint32; | ||||
| subTexelPrecisionBits: VkUint32; | subTexelPrecisionBits: VkUint32; | ||||
| mipmapPrecisionBits: VkUint32; | mipmapPrecisionBits: VkUint32; | ||||
| @@ -1958,8 +1958,8 @@ type { structures } | |||||
| maxSamplerLodBias: VkFloat; | maxSamplerLodBias: VkFloat; | ||||
| maxSamplerAnisotropy: VkFloat; | maxSamplerAnisotropy: VkFloat; | ||||
| maxViewports: VkUint32; | maxViewports: VkUint32; | ||||
| maxViewportDimensions: array[0..2] of VkUint32; | |||||
| viewportBoundsRange: array[0..2] of VkFloat; | |||||
| maxViewportDimensions: array[0..1] of VkUint32; | |||||
| viewportBoundsRange: array[0..1] of VkFloat; | |||||
| viewportSubPixelBits: VkUint32; | viewportSubPixelBits: VkUint32; | ||||
| minMemoryMapAlignment: VkSize; | minMemoryMapAlignment: VkSize; | ||||
| minTexelBufferOffsetAlignment: VkDeviceSize; | minTexelBufferOffsetAlignment: VkDeviceSize; | ||||
| @@ -1992,8 +1992,8 @@ type { structures } | |||||
| maxCullDistances: VkUint32; | maxCullDistances: VkUint32; | ||||
| maxCombinedClipAndCullDistances: VkUint32; | maxCombinedClipAndCullDistances: VkUint32; | ||||
| discreteQueuePriorities: VkUint32; | discreteQueuePriorities: VkUint32; | ||||
| pointSizeRange: array[0..2] of VkFloat; | |||||
| lineWidthRange: array[0..2] of VkFloat; | |||||
| pointSizeRange: array[0..1] of VkFloat; | |||||
| lineWidthRange: array[0..1] of VkFloat; | |||||
| pointSizeGranularity: VkFloat; | pointSizeGranularity: VkFloat; | ||||
| lineWidthGranularity: VkFloat; | lineWidthGranularity: VkFloat; | ||||
| strictLines: VkBool32; | strictLines: VkBool32; | ||||
| @@ -2585,7 +2585,7 @@ type { structures } | |||||
| logicOp: TVkLogicOp; | logicOp: TVkLogicOp; | ||||
| attachmentCount: VkUint32; | attachmentCount: VkUint32; | ||||
| pAttachments: PVkPipelineColorBlendAttachmentState; | pAttachments: PVkPipelineColorBlendAttachmentState; | ||||
| blendConstants: array[0..4] of VkFloat; | |||||
| blendConstants: array[0..3] of VkFloat; | |||||
| end; | end; | ||||
| PVkPipelineColorBlendStateCreateInfo = ^TVkPipelineColorBlendStateCreateInfo; | PVkPipelineColorBlendStateCreateInfo = ^TVkPipelineColorBlendStateCreateInfo; | ||||
| PPVkPipelineColorBlendStateCreateInfo = ^PVkPipelineColorBlendStateCreateInfo; | PPVkPipelineColorBlendStateCreateInfo = ^PVkPipelineColorBlendStateCreateInfo; | ||||
| @@ -2918,9 +2918,9 @@ type { structures } | |||||
| TVkImageBlit = record | TVkImageBlit = record | ||||
| srcSubresource: TVkImageSubresourceLayers; | srcSubresource: TVkImageSubresourceLayers; | ||||
| srcOffsets: array[0..2] of TVkOffset3D; | |||||
| srcOffsets: array[0..1] of TVkOffset3D; | |||||
| dstSubresource: TVkImageSubresourceLayers; | dstSubresource: TVkImageSubresourceLayers; | ||||
| dstOffsets: array[0..2] of TVkOffset3D; | |||||
| dstOffsets: array[0..1] of TVkOffset3D; | |||||
| end; | end; | ||||
| PVkImageBlit = ^TVkImageBlit; | PVkImageBlit = ^TVkImageBlit; | ||||
| PPVkImageBlit = ^PVkImageBlit; | PPVkImageBlit = ^PVkImageBlit; | ||||
| @@ -2938,9 +2938,9 @@ type { structures } | |||||
| TVkClearColorValue = record | TVkClearColorValue = record | ||||
| case Integer of | case Integer of | ||||
| 000: (float32: array[0..4] of VkFloat); | |||||
| 001: (int32: array[0..4] of VkInt32); | |||||
| 002: (uint32: array[0..4] of VkUint32); | |||||
| 000: (float32: array[0..3] of VkFloat); | |||||
| 001: (int32: array[0..3] of VkInt32); | |||||
| 002: (uint32: array[0..3] of VkUint32); | |||||
| end; | end; | ||||
| PVkClearColorValue = ^TVkClearColorValue; | PVkClearColorValue = ^TVkClearColorValue; | ||||
| PPVkClearColorValue = ^PVkClearColorValue; | PPVkClearColorValue = ^PVkClearColorValue; | ||||
| @@ -675,7 +675,7 @@ begin | |||||
| raise Exception.Create('void can not be used as type'); | raise Exception.Create('void can not be used as type'); | ||||
| if (aArrSize <> '') then begin | if (aArrSize <> '') then begin | ||||
| if TryStrToInt(String(aArrSize), i) | if TryStrToInt(String(aArrSize), i) | ||||
| then aName := WideString(Format('array[0..%d] of %s', [i, aName])) | |||||
| then aName := WideString(Format('array[0..%d] of %s', [i-1, aName])) | |||||
| else aName := WideString(Format('array[0..%s-1] of %s', [aArrSize, aName])); | else aName := WideString(Format('array[0..%s-1] of %s', [aArrSize, aName])); | ||||
| end; | end; | ||||
| end; | end; | ||||
| @@ -17,8 +17,8 @@ | |||||
| <Filename Value="HeaderGenerator.pas"/> | <Filename Value="HeaderGenerator.pas"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <EditorIndex Value="1"/> | <EditorIndex Value="1"/> | ||||
| <TopLine Value="1494"/> | |||||
| <CursorPos X="78" Y="1518"/> | |||||
| <TopLine Value="228"/> | |||||
| <CursorPos X="58" Y="241"/> | |||||
| <UsageCount Value="23"/> | <UsageCount Value="23"/> | ||||
| <Loaded Value="True"/> | <Loaded Value="True"/> | ||||
| </Unit1> | </Unit1> | ||||
| @@ -34,8 +34,8 @@ | |||||
| <Filename Value="..\Vulkan.pas"/> | <Filename Value="..\Vulkan.pas"/> | ||||
| <IsVisibleTab Value="True"/> | <IsVisibleTab Value="True"/> | ||||
| <EditorIndex Value="2"/> | <EditorIndex Value="2"/> | ||||
| <TopLine Value="666"/> | |||||
| <CursorPos X="41" Y="691"/> | |||||
| <TopLine Value="2914"/> | |||||
| <CursorPos X="65" Y="2941"/> | |||||
| <UsageCount Value="11"/> | <UsageCount Value="11"/> | ||||
| <Loaded Value="True"/> | <Loaded Value="True"/> | ||||
| </Unit3> | </Unit3> | ||||
| @@ -50,123 +50,123 @@ | |||||
| <JumpHistory Count="30" HistoryIndex="29"> | <JumpHistory Count="30" HistoryIndex="29"> | ||||
| <Position1> | <Position1> | ||||
| <Filename Value="HeaderGenerator.pas"/> | <Filename Value="HeaderGenerator.pas"/> | ||||
| <Caret Line="1446" TopLine="1432"/> | |||||
| <Caret Line="1446" Column="19" TopLine="1432"/> | |||||
| </Position1> | </Position1> | ||||
| <Position2> | <Position2> | ||||
| <Filename Value="HeaderGenerator.pas"/> | <Filename Value="HeaderGenerator.pas"/> | ||||
| <Caret Line="1450" TopLine="1432"/> | |||||
| <Caret Line="215" Column="27" TopLine="205"/> | |||||
| </Position2> | </Position2> | ||||
| <Position3> | <Position3> | ||||
| <Filename Value="HeaderGenerator.pas"/> | |||||
| <Caret Line="1446" TopLine="1432"/> | |||||
| <Filename Value="..\Vulkan.pas"/> | |||||
| <Caret Line="528" Column="31" TopLine="503"/> | |||||
| </Position3> | </Position3> | ||||
| <Position4> | <Position4> | ||||
| <Filename Value="HeaderGenerator.pas"/> | <Filename Value="HeaderGenerator.pas"/> | ||||
| <Caret Line="1450" TopLine="1432"/> | |||||
| <Caret Line="1447" Column="20" TopLine="1432"/> | |||||
| </Position4> | </Position4> | ||||
| <Position5> | <Position5> | ||||
| <Filename Value="HeaderGenerator.pas"/> | |||||
| <Caret Line="1446" Column="19" TopLine="1432"/> | |||||
| <Filename Value="..\Vulkan.pas"/> | |||||
| <Caret Line="1186" Column="75" TopLine="1175"/> | |||||
| </Position5> | </Position5> | ||||
| <Position6> | <Position6> | ||||
| <Filename Value="HeaderGenerator.pas"/> | |||||
| <Caret Line="215" Column="27" TopLine="205"/> | |||||
| <Filename Value="..\Vulkan.pas"/> | |||||
| <Caret Line="215" Column="70" TopLine="200"/> | |||||
| </Position6> | </Position6> | ||||
| <Position7> | <Position7> | ||||
| <Filename Value="..\Vulkan.pas"/> | |||||
| <Caret TopLine="69"/> | |||||
| <Filename Value="HeaderGenerator.pas"/> | |||||
| <Caret Line="1447" TopLine="1431"/> | |||||
| </Position7> | </Position7> | ||||
| <Position8> | <Position8> | ||||
| <Filename Value="..\Vulkan.pas"/> | |||||
| <Caret Line="528" Column="31" TopLine="503"/> | |||||
| <Filename Value="HeaderGenerator.pas"/> | |||||
| <Caret Line="1518" Column="89" TopLine="1504"/> | |||||
| </Position8> | </Position8> | ||||
| <Position9> | <Position9> | ||||
| <Filename Value="HeaderGenerator.pas"/> | <Filename Value="HeaderGenerator.pas"/> | ||||
| <Caret Line="1447" Column="20" TopLine="1432"/> | |||||
| <Caret Line="1449" Column="49" TopLine="1431"/> | |||||
| </Position9> | </Position9> | ||||
| <Position10> | <Position10> | ||||
| <Filename Value="..\Vulkan.pas"/> | |||||
| <Caret Line="1186" Column="75" TopLine="1175"/> | |||||
| <Filename Value="HeaderGenerator.pas"/> | |||||
| <Caret Line="1448" TopLine="1431"/> | |||||
| </Position10> | </Position10> | ||||
| <Position11> | <Position11> | ||||
| <Filename Value="..\Vulkan.pas"/> | |||||
| <Caret Line="215" Column="70" TopLine="200"/> | |||||
| <Filename Value="HeaderGenerator.pas"/> | |||||
| <Caret Line="1452" TopLine="1431"/> | |||||
| </Position11> | </Position11> | ||||
| <Position12> | <Position12> | ||||
| <Filename Value="HeaderGenerator.pas"/> | <Filename Value="HeaderGenerator.pas"/> | ||||
| <Caret Line="1447" TopLine="1431"/> | |||||
| <Caret Line="1446" TopLine="1431"/> | |||||
| </Position12> | </Position12> | ||||
| <Position13> | <Position13> | ||||
| <Filename Value="HeaderGenerator.pas"/> | |||||
| <Caret Line="1518" Column="89" TopLine="1504"/> | |||||
| <Filename Value="..\Vulkan.pas"/> | |||||
| <Caret Line="527" Column="31" TopLine="504"/> | |||||
| </Position13> | </Position13> | ||||
| <Position14> | <Position14> | ||||
| <Filename Value="HeaderGenerator.pas"/> | |||||
| <Caret Line="1449" Column="49" TopLine="1431"/> | |||||
| <Filename Value="..\Vulkan.pas"/> | |||||
| <Caret Line="557" Column="28" TopLine="532"/> | |||||
| </Position14> | </Position14> | ||||
| <Position15> | <Position15> | ||||
| <Filename Value="HeaderGenerator.pas"/> | |||||
| <Caret Line="1448" TopLine="1431"/> | |||||
| <Filename Value="..\Vulkan.pas"/> | |||||
| <Caret Line="567" Column="29" TopLine="542"/> | |||||
| </Position15> | </Position15> | ||||
| <Position16> | <Position16> | ||||
| <Filename Value="HeaderGenerator.pas"/> | |||||
| <Caret Line="1452" TopLine="1431"/> | |||||
| <Filename Value="..\Vulkan.pas"/> | |||||
| <Caret Line="579" Column="29" TopLine="554"/> | |||||
| </Position16> | </Position16> | ||||
| <Position17> | <Position17> | ||||
| <Filename Value="HeaderGenerator.pas"/> | |||||
| <Caret Line="1446" TopLine="1431"/> | |||||
| <Filename Value="..\Vulkan.pas"/> | |||||
| <Caret Line="599" Column="22" TopLine="574"/> | |||||
| </Position17> | </Position17> | ||||
| <Position18> | <Position18> | ||||
| <Filename Value="..\Vulkan.pas"/> | <Filename Value="..\Vulkan.pas"/> | ||||
| <Caret Line="527" Column="31" TopLine="504"/> | |||||
| <Caret Line="609" Column="32" TopLine="584"/> | |||||
| </Position18> | </Position18> | ||||
| <Position19> | <Position19> | ||||
| <Filename Value="..\Vulkan.pas"/> | <Filename Value="..\Vulkan.pas"/> | ||||
| <Caret Line="557" Column="28" TopLine="532"/> | |||||
| <Caret Line="615" Column="44" TopLine="590"/> | |||||
| </Position19> | </Position19> | ||||
| <Position20> | <Position20> | ||||
| <Filename Value="..\Vulkan.pas"/> | <Filename Value="..\Vulkan.pas"/> | ||||
| <Caret Line="567" Column="29" TopLine="542"/> | |||||
| <Caret Line="637" Column="31" TopLine="612"/> | |||||
| </Position20> | </Position20> | ||||
| <Position21> | <Position21> | ||||
| <Filename Value="..\Vulkan.pas"/> | <Filename Value="..\Vulkan.pas"/> | ||||
| <Caret Line="579" Column="29" TopLine="554"/> | |||||
| <Caret Line="646" Column="29" TopLine="621"/> | |||||
| </Position21> | </Position21> | ||||
| <Position22> | <Position22> | ||||
| <Filename Value="..\Vulkan.pas"/> | <Filename Value="..\Vulkan.pas"/> | ||||
| <Caret Line="599" Column="22" TopLine="574"/> | |||||
| <Caret Line="654" Column="36" TopLine="629"/> | |||||
| </Position22> | </Position22> | ||||
| <Position23> | <Position23> | ||||
| <Filename Value="..\Vulkan.pas"/> | <Filename Value="..\Vulkan.pas"/> | ||||
| <Caret Line="609" Column="32" TopLine="584"/> | |||||
| <Caret Line="660" Column="47" TopLine="635"/> | |||||
| </Position23> | </Position23> | ||||
| <Position24> | <Position24> | ||||
| <Filename Value="..\Vulkan.pas"/> | <Filename Value="..\Vulkan.pas"/> | ||||
| <Caret Line="615" Column="44" TopLine="590"/> | |||||
| <Caret Line="666" Column="41" TopLine="641"/> | |||||
| </Position24> | </Position24> | ||||
| <Position25> | <Position25> | ||||
| <Filename Value="..\Vulkan.pas"/> | |||||
| <Caret Line="637" Column="31" TopLine="612"/> | |||||
| <Filename Value="HeaderGenerator.pas"/> | |||||
| <Caret Line="1446" TopLine="1431"/> | |||||
| </Position25> | </Position25> | ||||
| <Position26> | <Position26> | ||||
| <Filename Value="..\Vulkan.pas"/> | <Filename Value="..\Vulkan.pas"/> | ||||
| <Caret Line="646" Column="29" TopLine="621"/> | |||||
| <Caret Line="691" Column="41" TopLine="578"/> | |||||
| </Position26> | </Position26> | ||||
| <Position27> | <Position27> | ||||
| <Filename Value="..\Vulkan.pas"/> | |||||
| <Caret Line="654" Column="36" TopLine="629"/> | |||||
| <Filename Value="HeaderGenerator.pas"/> | |||||
| <Caret Line="1518" Column="78" TopLine="1486"/> | |||||
| </Position27> | </Position27> | ||||
| <Position28> | <Position28> | ||||
| <Filename Value="..\Vulkan.pas"/> | |||||
| <Caret Line="660" Column="47" TopLine="635"/> | |||||
| <Filename Value="HeaderGenerator.pas"/> | |||||
| <Caret Line="243" Column="62" TopLine="228"/> | |||||
| </Position28> | </Position28> | ||||
| <Position29> | <Position29> | ||||
| <Filename Value="..\Vulkan.pas"/> | |||||
| <Caret Line="666" Column="41" TopLine="641"/> | |||||
| <Filename Value="HeaderGenerator.pas"/> | |||||
| <Caret Line="678" Column="65" TopLine="651"/> | |||||
| </Position29> | </Position29> | ||||
| <Position30> | <Position30> | ||||
| <Filename Value="HeaderGenerator.pas"/> | <Filename Value="HeaderGenerator.pas"/> | ||||
| <Caret Line="1446" TopLine="1431"/> | |||||
| <Caret Line="679" Column="49" TopLine="652"/> | |||||
| </Position30> | </Position30> | ||||
| </JumpHistory> | </JumpHistory> | ||||
| </ProjectSession> | </ProjectSession> | ||||
| @@ -0,0 +1 @@ | |||||
| Subproject commit f4a09e3657bd0fa4eacfde88a5b19609ad215d92 | |||||
| @@ -33,7 +33,7 @@ | |||||
| <PackageName Value="LCL"/> | <PackageName Value="LCL"/> | ||||
| </Item1> | </Item1> | ||||
| </RequiredPackages> | </RequiredPackages> | ||||
| <Units Count="46"> | |||||
| <Units Count="49"> | |||||
| <Unit0> | <Unit0> | ||||
| <Filename Value="triangle.lpr"/> | <Filename Value="triangle.lpr"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| @@ -221,6 +221,18 @@ | |||||
| <Filename Value="..\utils\uvkuPipelineCacheFactory.pas"/> | <Filename Value="..\utils\uvkuPipelineCacheFactory.pas"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| </Unit45> | </Unit45> | ||||
| <Unit46> | |||||
| <Filename Value="..\utils\uvkuDescriptorPool.pas"/> | |||||
| <IsPartOfProject Value="True"/> | |||||
| </Unit46> | |||||
| <Unit47> | |||||
| <Filename Value="..\utils\uvkuDescriptorPoolFactory.pas"/> | |||||
| <IsPartOfProject Value="True"/> | |||||
| </Unit47> | |||||
| <Unit48> | |||||
| <Filename Value="..\utils\uvkuDescriptorSet.pas"/> | |||||
| <IsPartOfProject Value="True"/> | |||||
| </Unit48> | |||||
| </Units> | </Units> | ||||
| </ProjectOptions> | </ProjectOptions> | ||||
| <CompilerOptions> | <CompilerOptions> | ||||
| @@ -231,12 +243,12 @@ | |||||
| </Target> | </Target> | ||||
| <SearchPaths> | <SearchPaths> | ||||
| <IncludeFiles Value="$(ProjOutDir);.."/> | <IncludeFiles Value="$(ProjOutDir);.."/> | ||||
| <OtherUnitFiles Value="..;..\utils"/> | |||||
| <OtherUnitFiles Value="..;..\utils;..\lazopenglcore"/> | |||||
| <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> | <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> | ||||
| </SearchPaths> | </SearchPaths> | ||||
| <CodeGeneration> | <CodeGeneration> | ||||
| <TargetCPU Value="x86_64"/> | |||||
| <TargetOS Value="win64"/> | |||||
| <TargetCPU Value="i386"/> | |||||
| <TargetOS Value="win32"/> | |||||
| </CodeGeneration> | </CodeGeneration> | ||||
| <Linking> | <Linking> | ||||
| <Debugging> | <Debugging> | ||||
| @@ -8,7 +8,7 @@ uses | |||||
| cthreads, | cthreads, | ||||
| {$ENDIF}{$ENDIF} | {$ENDIF}{$ENDIF} | ||||
| SysUtils, Interfaces, Dialogs, Forms, | SysUtils, Interfaces, Dialogs, Forms, | ||||
| uMainForm, Vulkan, uvkuDebugReporter, uvkuPipelineCache, uvkuPipelineCacheFactory; | |||||
| uMainForm, Vulkan, uvkuDescriptorPool, uvkuDescriptorPoolFactory, uvkuDescriptorSet; | |||||
| {$R *.res} | {$R *.res} | ||||
| @@ -4,13 +4,13 @@ | |||||
| <PathDelim Value="\"/> | <PathDelim Value="\"/> | ||||
| <Version Value="9"/> | <Version Value="9"/> | ||||
| <BuildModes Active="Default"/> | <BuildModes Active="Default"/> | ||||
| <Units Count="66"> | |||||
| <Units Count="70"> | |||||
| <Unit0> | <Unit0> | ||||
| <Filename Value="triangle.lpr"/> | <Filename Value="triangle.lpr"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <CursorPos X="3" Y="31"/> | |||||
| <UsageCount Value="103"/> | |||||
| <CursorPos X="20" Y="11"/> | |||||
| <UsageCount Value="124"/> | |||||
| </Unit0> | </Unit0> | ||||
| <Unit1> | <Unit1> | ||||
| <Filename Value="uMainForm.pas"/> | <Filename Value="uMainForm.pas"/> | ||||
| @@ -19,33 +19,32 @@ | |||||
| <HasResources Value="True"/> | <HasResources Value="True"/> | ||||
| <ResourceBaseClass Value="Form"/> | <ResourceBaseClass Value="Form"/> | ||||
| <IsVisibleTab Value="True"/> | <IsVisibleTab Value="True"/> | ||||
| <EditorIndex Value="7"/> | |||||
| <TopLine Value="525"/> | |||||
| <CursorPos X="21" Y="541"/> | |||||
| <EditorIndex Value="2"/> | |||||
| <TopLine Value="115"/> | |||||
| <CursorPos X="3" Y="131"/> | |||||
| <ExtraEditorCount Value="1"/> | <ExtraEditorCount Value="1"/> | ||||
| <ExtraEditor1> | <ExtraEditor1> | ||||
| <IsVisibleTab Value="True"/> | |||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <WindowIndex Value="1"/> | |||||
| <TopLine Value="-1"/> | |||||
| <CursorPos X="-1" Y="-1"/> | |||||
| <TopLine Value="29"/> | |||||
| <CursorPos X="5" Y="46"/> | |||||
| </ExtraEditor1> | </ExtraEditor1> | ||||
| <UsageCount Value="103"/> | |||||
| <UsageCount Value="124"/> | |||||
| <Loaded Value="True"/> | <Loaded Value="True"/> | ||||
| <LoadedDesigner Value="True"/> | |||||
| </Unit1> | </Unit1> | ||||
| <Unit2> | <Unit2> | ||||
| <Filename Value="..\Vulkan.pas"/> | <Filename Value="..\Vulkan.pas"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <EditorIndex Value="4"/> | |||||
| <TopLine Value="1324"/> | |||||
| <CursorPos X="133" Y="1340"/> | |||||
| <EditorIndex Value="5"/> | |||||
| <TopLine Value="3006"/> | |||||
| <CursorPos X="79" Y="3022"/> | |||||
| <ExtraEditorCount Value="1"/> | <ExtraEditorCount Value="1"/> | ||||
| <ExtraEditor1> | <ExtraEditor1> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="3271"/> | |||||
| <CursorPos X="80" Y="3291"/> | |||||
| <TopLine Value="2730"/> | |||||
| <CursorPos Y="2754"/> | |||||
| </ExtraEditor1> | </ExtraEditor1> | ||||
| <UsageCount Value="103"/> | |||||
| <UsageCount Value="124"/> | |||||
| <Loaded Value="True"/> | <Loaded Value="True"/> | ||||
| </Unit2> | </Unit2> | ||||
| <Unit3> | <Unit3> | ||||
| @@ -53,7 +52,7 @@ | |||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <CursorPos X="45" Y="16"/> | <CursorPos X="45" Y="16"/> | ||||
| <UsageCount Value="101"/> | |||||
| <UsageCount Value="122"/> | |||||
| </Unit3> | </Unit3> | ||||
| <Unit4> | <Unit4> | ||||
| <Filename Value="..\utils\uvkuInstanceFactory.pas"/> | <Filename Value="..\utils\uvkuInstanceFactory.pas"/> | ||||
| @@ -61,31 +60,30 @@ | |||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="13"/> | <TopLine Value="13"/> | ||||
| <CursorPos X="3" Y="29"/> | <CursorPos X="3" Y="29"/> | ||||
| <UsageCount Value="95"/> | |||||
| <UsageCount Value="116"/> | |||||
| </Unit4> | </Unit4> | ||||
| <Unit5> | <Unit5> | ||||
| <Filename Value="..\utils\uvkuPhysicalDevice.pas"/> | <Filename Value="..\utils\uvkuPhysicalDevice.pas"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="6"/> | |||||
| <CursorPos X="67" Y="22"/> | |||||
| <UsageCount Value="95"/> | |||||
| <TopLine Value="68"/> | |||||
| <CursorPos Y="87"/> | |||||
| <UsageCount Value="116"/> | |||||
| </Unit5> | </Unit5> | ||||
| <Unit6> | <Unit6> | ||||
| <Filename Value="..\utils\uvkuAllocationHandler.pas"/> | <Filename Value="..\utils\uvkuAllocationHandler.pas"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <TopLine Value="7"/> | |||||
| <CursorPos X="22" Y="23"/> | |||||
| <UsageCount Value="85"/> | |||||
| <Loaded Value="True"/> | |||||
| <EditorIndex Value="-1"/> | |||||
| <TopLine Value="11"/> | |||||
| <CursorPos Y="36"/> | |||||
| <UsageCount Value="106"/> | |||||
| </Unit6> | </Unit6> | ||||
| <Unit7> | <Unit7> | ||||
| <Filename Value="..\utils\uvkuDevice.pas"/> | <Filename Value="..\utils\uvkuDevice.pas"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <EditorIndex Value="10"/> | |||||
| <TopLine Value="28"/> | |||||
| <CursorPos X="14" Y="29"/> | |||||
| <UsageCount Value="89"/> | |||||
| <TopLine Value="135"/> | |||||
| <CursorPos X="9" Y="62"/> | |||||
| <UsageCount Value="110"/> | |||||
| <Loaded Value="True"/> | <Loaded Value="True"/> | ||||
| </Unit7> | </Unit7> | ||||
| <Unit8> | <Unit8> | ||||
| @@ -94,7 +92,7 @@ | |||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="11"/> | <TopLine Value="11"/> | ||||
| <CursorPos X="10" Y="18"/> | <CursorPos X="10" Y="18"/> | ||||
| <UsageCount Value="87"/> | |||||
| <UsageCount Value="108"/> | |||||
| </Unit8> | </Unit8> | ||||
| <Unit9> | <Unit9> | ||||
| <Filename Value="..\utils\uvkuSurface.pas"/> | <Filename Value="..\utils\uvkuSurface.pas"/> | ||||
| @@ -102,7 +100,7 @@ | |||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="41"/> | <TopLine Value="41"/> | ||||
| <CursorPos X="94" Y="56"/> | <CursorPos X="94" Y="56"/> | ||||
| <UsageCount Value="82"/> | |||||
| <UsageCount Value="103"/> | |||||
| </Unit9> | </Unit9> | ||||
| <Unit10> | <Unit10> | ||||
| <Filename Value="..\utils\uvkuSurfaceFactory.pas"/> | <Filename Value="..\utils\uvkuSurfaceFactory.pas"/> | ||||
| @@ -110,15 +108,14 @@ | |||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="44"/> | <TopLine Value="44"/> | ||||
| <CursorPos X="33" Y="60"/> | <CursorPos X="33" Y="60"/> | ||||
| <UsageCount Value="81"/> | |||||
| <UsageCount Value="102"/> | |||||
| </Unit10> | </Unit10> | ||||
| <Unit11> | <Unit11> | ||||
| <Filename Value="..\utils\uvkuSwapChainFactory.pas"/> | <Filename Value="..\utils\uvkuSwapChainFactory.pas"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <EditorIndex Value="14"/> | |||||
| <EditorIndex Value="-1"/> | |||||
| <CursorPos X="3" Y="13"/> | <CursorPos X="3" Y="13"/> | ||||
| <UsageCount Value="72"/> | |||||
| <Loaded Value="True"/> | |||||
| <UsageCount Value="93"/> | |||||
| </Unit11> | </Unit11> | ||||
| <Unit12> | <Unit12> | ||||
| <Filename Value="..\utils\uvkuSwapChain.pas"/> | <Filename Value="..\utils\uvkuSwapChain.pas"/> | ||||
| @@ -126,83 +123,79 @@ | |||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="7"/> | <TopLine Value="7"/> | ||||
| <CursorPos X="36" Y="23"/> | <CursorPos X="36" Y="23"/> | ||||
| <UsageCount Value="71"/> | |||||
| <UsageCount Value="92"/> | |||||
| </Unit12> | </Unit12> | ||||
| <Unit13> | <Unit13> | ||||
| <Filename Value="..\utils\uvkuImageView.pas"/> | <Filename Value="..\utils\uvkuImageView.pas"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="29"/> | |||||
| <CursorPos X="64" Y="47"/> | |||||
| <UsageCount Value="68"/> | |||||
| <TopLine Value="40"/> | |||||
| <CursorPos Y="48"/> | |||||
| <UsageCount Value="89"/> | |||||
| </Unit13> | </Unit13> | ||||
| <Unit14> | <Unit14> | ||||
| <Filename Value="..\utils\uvkuImageViewFactory.pas"/> | <Filename Value="..\utils\uvkuImageViewFactory.pas"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="24"/> | |||||
| <CursorPos X="60" Y="88"/> | |||||
| <UsageCount Value="68"/> | |||||
| <CursorPos X="43" Y="9"/> | |||||
| <UsageCount Value="89"/> | |||||
| </Unit14> | </Unit14> | ||||
| <Unit15> | <Unit15> | ||||
| <Filename Value="..\utils\uvkuImage.pas"/> | <Filename Value="..\utils\uvkuImage.pas"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <EditorIndex Value="9"/> | |||||
| <TopLine Value="208"/> | |||||
| <CursorPos Y="58"/> | |||||
| <UsageCount Value="67"/> | |||||
| <Loaded Value="True"/> | |||||
| <EditorIndex Value="-1"/> | |||||
| <TopLine Value="173"/> | |||||
| <CursorPos X="36" Y="195"/> | |||||
| <UsageCount Value="88"/> | |||||
| </Unit15> | </Unit15> | ||||
| <Unit16> | <Unit16> | ||||
| <Filename Value="..\utils\uvkuBase.pas"/> | <Filename Value="..\utils\uvkuBase.pas"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <EditorIndex Value="3"/> | |||||
| <EditorIndex Value="-1"/> | |||||
| <TopLine Value="10"/> | <TopLine Value="10"/> | ||||
| <CursorPos X="3" Y="26"/> | <CursorPos X="3" Y="26"/> | ||||
| <UsageCount Value="66"/> | |||||
| <Loaded Value="True"/> | |||||
| <UsageCount Value="87"/> | |||||
| </Unit16> | </Unit16> | ||||
| <Unit17> | <Unit17> | ||||
| <Filename Value="..\utils\uvkuDeviceMemory.pas"/> | <Filename Value="..\utils\uvkuDeviceMemory.pas"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <EditorIndex Value="11"/> | |||||
| <CursorPos X="35" Y="75"/> | |||||
| <UsageCount Value="64"/> | |||||
| <Loaded Value="True"/> | |||||
| <EditorIndex Value="-1"/> | |||||
| <TopLine Value="10"/> | |||||
| <CursorPos X="17" Y="23"/> | |||||
| <UsageCount Value="85"/> | |||||
| </Unit17> | </Unit17> | ||||
| <Unit18> | <Unit18> | ||||
| <Filename Value="..\utils\uvkuBuffer.pas"/> | <Filename Value="..\utils\uvkuBuffer.pas"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="10"/> | |||||
| <CursorPos X="3" Y="13"/> | |||||
| <UsageCount Value="63"/> | |||||
| <TopLine Value="85"/> | |||||
| <CursorPos X="42" Y="100"/> | |||||
| <UsageCount Value="84"/> | |||||
| </Unit18> | </Unit18> | ||||
| <Unit19> | <Unit19> | ||||
| <Filename Value="..\utils\uvkuImageFactory.pas"/> | <Filename Value="..\utils\uvkuImageFactory.pas"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <EditorIndex Value="8"/> | |||||
| <EditorIndex Value="-1"/> | |||||
| <TopLine Value="32"/> | <TopLine Value="32"/> | ||||
| <CursorPos Y="41"/> | <CursorPos Y="41"/> | ||||
| <UsageCount Value="63"/> | |||||
| <Loaded Value="True"/> | |||||
| <UsageCount Value="84"/> | |||||
| </Unit19> | </Unit19> | ||||
| <Unit20> | <Unit20> | ||||
| <Filename Value="..\utils\uvkuTypes.pas"/> | <Filename Value="..\utils\uvkuTypes.pas"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <EditorIndex Value="16"/> | |||||
| <TopLine Value="63"/> | |||||
| <CursorPos X="75" Y="77"/> | |||||
| <UsageCount Value="63"/> | |||||
| <EditorIndex Value="1"/> | |||||
| <TopLine Value="93"/> | |||||
| <CursorPos X="3" Y="109"/> | |||||
| <UsageCount Value="84"/> | |||||
| <Loaded Value="True"/> | <Loaded Value="True"/> | ||||
| </Unit20> | </Unit20> | ||||
| <Unit21> | <Unit21> | ||||
| <Filename Value="..\utils\uvkuBufferFactory.pas"/> | <Filename Value="..\utils\uvkuBufferFactory.pas"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="20"/> | |||||
| <CursorPos X="60" Y="58"/> | |||||
| <UsageCount Value="62"/> | |||||
| <TopLine Value="18"/> | |||||
| <CursorPos Y="27"/> | |||||
| <UsageCount Value="83"/> | |||||
| </Unit21> | </Unit21> | ||||
| <Unit22> | <Unit22> | ||||
| <Filename Value="..\utils\uvkuBufferView.pas"/> | <Filename Value="..\utils\uvkuBufferView.pas"/> | ||||
| @@ -210,89 +203,88 @@ | |||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="52"/> | <TopLine Value="52"/> | ||||
| <CursorPos X="56" Y="76"/> | <CursorPos X="56" Y="76"/> | ||||
| <UsageCount Value="62"/> | |||||
| <UsageCount Value="83"/> | |||||
| </Unit22> | </Unit22> | ||||
| <Unit23> | <Unit23> | ||||
| <Filename Value="..\utils\uvkuBufferViewFactory.pas"/> | <Filename Value="..\utils\uvkuBufferViewFactory.pas"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <CursorPos X="31" Y="45"/> | <CursorPos X="31" Y="45"/> | ||||
| <UsageCount Value="61"/> | |||||
| <UsageCount Value="82"/> | |||||
| </Unit23> | </Unit23> | ||||
| <Unit24> | <Unit24> | ||||
| <Filename Value="..\utils\uvkuCommandPool.pas"/> | <Filename Value="..\utils\uvkuCommandPool.pas"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <EditorIndex Value="17"/> | |||||
| <TopLine Value="9"/> | |||||
| <CursorPos X="50" Y="27"/> | |||||
| <UsageCount Value="61"/> | |||||
| <Loaded Value="True"/> | |||||
| <EditorIndex Value="-1"/> | |||||
| <TopLine Value="61"/> | |||||
| <CursorPos X="3" Y="64"/> | |||||
| <UsageCount Value="82"/> | |||||
| </Unit24> | </Unit24> | ||||
| <Unit25> | <Unit25> | ||||
| <Filename Value="..\utils\uvkuCommandPoolFactory.pas"/> | <Filename Value="..\utils\uvkuCommandPoolFactory.pas"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <EditorIndex Value="18"/> | |||||
| <EditorIndex Value="-1"/> | |||||
| <TopLine Value="23"/> | <TopLine Value="23"/> | ||||
| <CursorPos X="3" Y="34"/> | <CursorPos X="3" Y="34"/> | ||||
| <UsageCount Value="60"/> | |||||
| <Loaded Value="True"/> | |||||
| <UsageCount Value="81"/> | |||||
| </Unit25> | </Unit25> | ||||
| <Unit26> | <Unit26> | ||||
| <Filename Value="..\utils\uvkuCommandBuffer.pas"/> | <Filename Value="..\utils\uvkuCommandBuffer.pas"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <EditorIndex Value="15"/> | |||||
| <TopLine Value="46"/> | |||||
| <CursorPos X="74" Y="70"/> | |||||
| <UsageCount Value="60"/> | |||||
| <EditorIndex Value="4"/> | |||||
| <TopLine Value="311"/> | |||||
| <CursorPos X="16" Y="267"/> | |||||
| <UsageCount Value="81"/> | |||||
| <Loaded Value="True"/> | <Loaded Value="True"/> | ||||
| </Unit26> | </Unit26> | ||||
| <Unit27> | <Unit27> | ||||
| <Filename Value="..\utils\uvkuQueue.pas"/> | <Filename Value="..\utils\uvkuQueue.pas"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <EditorIndex Value="13"/> | |||||
| <TopLine Value="55"/> | |||||
| <CursorPos X="75" Y="76"/> | |||||
| <UsageCount Value="60"/> | |||||
| <Loaded Value="True"/> | |||||
| <EditorIndex Value="-1"/> | |||||
| <TopLine Value="5"/> | |||||
| <CursorPos X="7" Y="22"/> | |||||
| <UsageCount Value="81"/> | |||||
| </Unit27> | </Unit27> | ||||
| <Unit28> | <Unit28> | ||||
| <Filename Value="..\utils\VulkanUtils.pas"/> | <Filename Value="..\utils\VulkanUtils.pas"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <EditorIndex Value="12"/> | |||||
| <TopLine Value="65"/> | |||||
| <CursorPos X="3" Y="72"/> | |||||
| <UsageCount Value="59"/> | |||||
| <EditorIndex Value="3"/> | |||||
| <TopLine Value="75"/> | |||||
| <CursorPos X="3" Y="90"/> | |||||
| <UsageCount Value="80"/> | |||||
| <Loaded Value="True"/> | <Loaded Value="True"/> | ||||
| </Unit28> | </Unit28> | ||||
| <Unit29> | <Unit29> | ||||
| <Filename Value="..\utils\uvkuUtils.pas"/> | <Filename Value="..\utils\uvkuUtils.pas"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="14"/> | |||||
| <UsageCount Value="76"/> | |||||
| <TopLine Value="472"/> | |||||
| <CursorPos Y="492"/> | |||||
| <UsageCount Value="97"/> | |||||
| </Unit29> | </Unit29> | ||||
| <Unit30> | <Unit30> | ||||
| <Filename Value="..\utils\uvkuRenderPass.pas"/> | <Filename Value="..\utils\uvkuRenderPass.pas"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <CursorPos X="3" Y="13"/> | |||||
| <UsageCount Value="57"/> | |||||
| <TopLine Value="52"/> | |||||
| <CursorPos Y="77"/> | |||||
| <UsageCount Value="78"/> | |||||
| </Unit30> | </Unit30> | ||||
| <Unit31> | <Unit31> | ||||
| <Filename Value="..\utils\uvkuRenderPassFactory.pas"/> | <Filename Value="..\utils\uvkuRenderPassFactory.pas"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <CursorPos X="82" Y="11"/> | |||||
| <UsageCount Value="57"/> | |||||
| <TopLine Value="286"/> | |||||
| <CursorPos X="39" Y="304"/> | |||||
| <UsageCount Value="78"/> | |||||
| </Unit31> | </Unit31> | ||||
| <Unit32> | <Unit32> | ||||
| <Filename Value="..\utils\uvkuFactoryBase.pas"/> | <Filename Value="..\utils\uvkuFactoryBase.pas"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <EditorIndex Value="1"/> | |||||
| <TopLine Value="69"/> | |||||
| <CursorPos X="42" Y="88"/> | |||||
| <UsageCount Value="57"/> | |||||
| <Loaded Value="True"/> | |||||
| <EditorIndex Value="-1"/> | |||||
| <TopLine Value="7"/> | |||||
| <CursorPos X="69" Y="9"/> | |||||
| <UsageCount Value="78"/> | |||||
| </Unit32> | </Unit32> | ||||
| <Unit33> | <Unit33> | ||||
| <Filename Value="..\utils\uvkuFrameBuffer.pas"/> | <Filename Value="..\utils\uvkuFrameBuffer.pas"/> | ||||
| @@ -300,7 +292,7 @@ | |||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="33"/> | <TopLine Value="33"/> | ||||
| <CursorPos X="150" Y="40"/> | <CursorPos X="150" Y="40"/> | ||||
| <UsageCount Value="55"/> | |||||
| <UsageCount Value="76"/> | |||||
| </Unit33> | </Unit33> | ||||
| <Unit34> | <Unit34> | ||||
| <Filename Value="..\utils\uvkuFrameBufferFactory.pas"/> | <Filename Value="..\utils\uvkuFrameBufferFactory.pas"/> | ||||
| @@ -308,14 +300,14 @@ | |||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="12"/> | <TopLine Value="12"/> | ||||
| <CursorPos X="25" Y="27"/> | <CursorPos X="25" Y="27"/> | ||||
| <UsageCount Value="55"/> | |||||
| <UsageCount Value="76"/> | |||||
| </Unit34> | </Unit34> | ||||
| <Unit35> | <Unit35> | ||||
| <Filename Value="..\utils\uvkuDescriptorSetLayout.pas"/> | <Filename Value="..\utils\uvkuDescriptorSetLayout.pas"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <CursorPos X="150" Y="12"/> | <CursorPos X="150" Y="12"/> | ||||
| <UsageCount Value="55"/> | |||||
| <UsageCount Value="76"/> | |||||
| </Unit35> | </Unit35> | ||||
| <Unit36> | <Unit36> | ||||
| <Filename Value="..\utils\uvkuDescriptorSetLayoutFactory.pas"/> | <Filename Value="..\utils\uvkuDescriptorSetLayoutFactory.pas"/> | ||||
| @@ -323,7 +315,7 @@ | |||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="89"/> | <TopLine Value="89"/> | ||||
| <CursorPos X="3" Y="106"/> | <CursorPos X="3" Y="106"/> | ||||
| <UsageCount Value="54"/> | |||||
| <UsageCount Value="75"/> | |||||
| </Unit36> | </Unit36> | ||||
| <Unit37> | <Unit37> | ||||
| <Filename Value="..\utils\uvkuPipelineLayout.pas"/> | <Filename Value="..\utils\uvkuPipelineLayout.pas"/> | ||||
| @@ -331,7 +323,7 @@ | |||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="48"/> | <TopLine Value="48"/> | ||||
| <CursorPos X="150" Y="53"/> | <CursorPos X="150" Y="53"/> | ||||
| <UsageCount Value="54"/> | |||||
| <UsageCount Value="75"/> | |||||
| </Unit37> | </Unit37> | ||||
| <Unit38> | <Unit38> | ||||
| <Filename Value="..\utils\uvkuPipelineLayoutFactory.pas"/> | <Filename Value="..\utils\uvkuPipelineLayoutFactory.pas"/> | ||||
| @@ -339,334 +331,365 @@ | |||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="10"/> | <TopLine Value="10"/> | ||||
| <CursorPos X="37" Y="112"/> | <CursorPos X="37" Y="112"/> | ||||
| <UsageCount Value="54"/> | |||||
| <UsageCount Value="75"/> | |||||
| </Unit38> | </Unit38> | ||||
| <Unit39> | <Unit39> | ||||
| <Filename Value="..\utils\uvkuShaderModule.pas"/> | <Filename Value="..\utils\uvkuShaderModule.pas"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="54"/> | |||||
| <CursorPos X="3" Y="67"/> | |||||
| <UsageCount Value="52"/> | |||||
| <TopLine Value="39"/> | |||||
| <CursorPos Y="61"/> | |||||
| <UsageCount Value="73"/> | |||||
| </Unit39> | </Unit39> | ||||
| <Unit40> | <Unit40> | ||||
| <Filename Value="..\utils\uvkuShaderModuleFactory.pas"/> | <Filename Value="..\utils\uvkuShaderModuleFactory.pas"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="117"/> | |||||
| <CursorPos X="37" Y="127"/> | |||||
| <UsageCount Value="52"/> | |||||
| <TopLine Value="136"/> | |||||
| <CursorPos Y="159"/> | |||||
| <UsageCount Value="73"/> | |||||
| </Unit40> | </Unit40> | ||||
| <Unit41> | <Unit41> | ||||
| <Filename Value="..\utils\uvkuPipeline.pas"/> | <Filename Value="..\utils\uvkuPipeline.pas"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="7"/> | |||||
| <CursorPos X="23" Y="92"/> | |||||
| <UsageCount Value="50"/> | |||||
| <TopLine Value="9"/> | |||||
| <CursorPos Y="12"/> | |||||
| <UsageCount Value="71"/> | |||||
| </Unit41> | </Unit41> | ||||
| <Unit42> | <Unit42> | ||||
| <Filename Value="..\utils\uvkuPipelineFactory.pas"/> | <Filename Value="..\utils\uvkuPipelineFactory.pas"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="7"/> | |||||
| <CursorPos X="3" Y="23"/> | |||||
| <UsageCount Value="49"/> | |||||
| <UsageCount Value="70"/> | |||||
| </Unit42> | </Unit42> | ||||
| <Unit43> | <Unit43> | ||||
| <Filename Value="..\utils\uvkuDebugReporter.pas"/> | <Filename Value="..\utils\uvkuDebugReporter.pas"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <EditorIndex Value="2"/> | |||||
| <TopLine Value="102"/> | |||||
| <CursorPos Y="119"/> | |||||
| <UsageCount Value="27"/> | |||||
| <Loaded Value="True"/> | |||||
| <EditorIndex Value="-1"/> | |||||
| <TopLine Value="84"/> | |||||
| <CursorPos X="32" Y="103"/> | |||||
| <UsageCount Value="48"/> | |||||
| </Unit43> | </Unit43> | ||||
| <Unit44> | <Unit44> | ||||
| <Filename Value="..\utils\uvkuPipelineCache.pas"/> | |||||
| <IsPartOfProject Value="True"/> | |||||
| <EditorIndex Value="-1"/> | |||||
| <TopLine Value="18"/> | |||||
| <CursorPos X="13" Y="38"/> | |||||
| <UsageCount Value="42"/> | |||||
| </Unit44> | |||||
| <Unit45> | |||||
| <Filename Value="..\utils\uvkuPipelineCacheFactory.pas"/> | |||||
| <IsPartOfProject Value="True"/> | |||||
| <EditorIndex Value="-1"/> | |||||
| <TopLine Value="33"/> | |||||
| <CursorPos X="84" Y="61"/> | |||||
| <UsageCount Value="42"/> | |||||
| </Unit45> | |||||
| <Unit46> | |||||
| <Filename Value="..\utils\uvkuDescriptorPool.pas"/> | |||||
| <IsPartOfProject Value="True"/> | |||||
| <EditorIndex Value="-1"/> | |||||
| <TopLine Value="16"/> | |||||
| <CursorPos X="5" Y="16"/> | |||||
| <UsageCount Value="29"/> | |||||
| </Unit46> | |||||
| <Unit47> | |||||
| <Filename Value="..\utils\uvkuDescriptorPoolFactory.pas"/> | |||||
| <IsPartOfProject Value="True"/> | |||||
| <EditorIndex Value="-1"/> | |||||
| <TopLine Value="7"/> | |||||
| <CursorPos X="68" Y="31"/> | |||||
| <UsageCount Value="29"/> | |||||
| </Unit47> | |||||
| <Unit48> | |||||
| <Filename Value="..\utils\uvkuDescriptorSet.pas"/> | |||||
| <IsPartOfProject Value="True"/> | |||||
| <EditorIndex Value="-1"/> | |||||
| <TopLine Value="11"/> | |||||
| <CursorPos Y="51"/> | |||||
| <UsageCount Value="28"/> | |||||
| </Unit48> | |||||
| <Unit49> | |||||
| <Filename Value="..\utils\uvkuPhysicalDeviceFactory.pas"/> | <Filename Value="..\utils\uvkuPhysicalDeviceFactory.pas"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="5"/> | <TopLine Value="5"/> | ||||
| <CursorPos X="19" Y="17"/> | <CursorPos X="19" Y="17"/> | ||||
| <UsageCount Value="46"/> | |||||
| </Unit44> | |||||
| <Unit45> | |||||
| <UsageCount Value="44"/> | |||||
| </Unit49> | |||||
| <Unit50> | |||||
| <Filename Value="..\..\data\Vulkan.tpl"/> | <Filename Value="..\..\data\Vulkan.tpl"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="44"/> | <TopLine Value="44"/> | ||||
| <CursorPos X="27" Y="22"/> | <CursorPos X="27" Y="22"/> | ||||
| <UsageCount Value="10"/> | |||||
| <UsageCount Value="8"/> | |||||
| <DefaultSyntaxHighlighter Value="None"/> | <DefaultSyntaxHighlighter Value="None"/> | ||||
| </Unit45> | |||||
| <Unit46> | |||||
| </Unit50> | |||||
| <Unit51> | |||||
| <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\3.1.1\source\packages\fcl-base\src\custapp.pp"/> | <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\3.1.1\source\packages\fcl-base\src\custapp.pp"/> | ||||
| <UnitName Value="CustApp"/> | <UnitName Value="CustApp"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="13"/> | <TopLine Value="13"/> | ||||
| <CursorPos X="3" Y="30"/> | <CursorPos X="3" Y="30"/> | ||||
| <UsageCount Value="6"/> | |||||
| </Unit46> | |||||
| <Unit47> | |||||
| <UsageCount Value="4"/> | |||||
| </Unit51> | |||||
| <Unit52> | |||||
| <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\3.1.1\source\rtl\inc\objpash.inc"/> | <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\3.1.1\source\rtl\inc\objpash.inc"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="181"/> | <TopLine Value="181"/> | ||||
| <CursorPos X="23" Y="197"/> | <CursorPos X="23" Y="197"/> | ||||
| <UsageCount Value="10"/> | |||||
| </Unit47> | |||||
| <Unit48> | |||||
| <UsageCount Value="8"/> | |||||
| </Unit52> | |||||
| <Unit53> | |||||
| <Filename Value="C:\Zusatzprogramme\Lazarus\lcl\include\customform.inc"/> | <Filename Value="C:\Zusatzprogramme\Lazarus\lcl\include\customform.inc"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="910"/> | <TopLine Value="910"/> | ||||
| <CursorPos Y="927"/> | <CursorPos Y="927"/> | ||||
| <UsageCount Value="10"/> | |||||
| </Unit48> | |||||
| <Unit49> | |||||
| <UsageCount Value="8"/> | |||||
| </Unit53> | |||||
| <Unit54> | |||||
| <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\3.1.1\source\rtl\objpas\sysutils\sysstrh.inc"/> | <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\3.1.1\source\rtl\objpas\sysutils\sysstrh.inc"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="96"/> | <TopLine Value="96"/> | ||||
| <CursorPos X="10" Y="112"/> | <CursorPos X="10" Y="112"/> | ||||
| <UsageCount Value="6"/> | |||||
| </Unit49> | |||||
| <Unit50> | |||||
| <UsageCount Value="4"/> | |||||
| </Unit54> | |||||
| <Unit55> | |||||
| <Filename Value="..\Vulkan_old.pas"/> | <Filename Value="..\Vulkan_old.pas"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <WindowIndex Value="-1"/> | <WindowIndex Value="-1"/> | ||||
| <TopLine Value="2195"/> | <TopLine Value="2195"/> | ||||
| <CursorPos X="3" Y="2211"/> | <CursorPos X="3" Y="2211"/> | ||||
| <UsageCount Value="6"/> | |||||
| </Unit50> | |||||
| <Unit51> | |||||
| <UsageCount Value="4"/> | |||||
| </Unit55> | |||||
| <Unit56> | |||||
| <Filename Value="..\Vulkan.inc"/> | <Filename Value="..\Vulkan.inc"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <UsageCount Value="10"/> | |||||
| </Unit51> | |||||
| <Unit52> | |||||
| <UsageCount Value="8"/> | |||||
| </Unit56> | |||||
| <Unit57> | |||||
| <Filename Value="C:\Zusatzprogramme\Lazarus\lcl\forms.pp"/> | <Filename Value="C:\Zusatzprogramme\Lazarus\lcl\forms.pp"/> | ||||
| <UnitName Value="Forms"/> | <UnitName Value="Forms"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="1249"/> | <TopLine Value="1249"/> | ||||
| <CursorPos X="3" Y="1268"/> | <CursorPos X="3" Y="1268"/> | ||||
| <UsageCount Value="6"/> | |||||
| </Unit52> | |||||
| <Unit53> | |||||
| <UsageCount Value="4"/> | |||||
| </Unit57> | |||||
| <Unit58> | |||||
| <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\3.1.1\source\rtl\objpas\classes\classesh.inc"/> | <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\3.1.1\source\rtl\objpas\classes\classesh.inc"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="2100"/> | <TopLine Value="2100"/> | ||||
| <CursorPos X="38" Y="2125"/> | <CursorPos X="38" Y="2125"/> | ||||
| <UsageCount Value="6"/> | |||||
| </Unit53> | |||||
| <Unit54> | |||||
| <UsageCount Value="4"/> | |||||
| </Unit58> | |||||
| <Unit59> | |||||
| <Filename Value="C:\Zusatzprogramme\Lazarus\lcl\extctrls.pp"/> | <Filename Value="C:\Zusatzprogramme\Lazarus\lcl\extctrls.pp"/> | ||||
| <UnitName Value="ExtCtrls"/> | <UnitName Value="ExtCtrls"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="1023"/> | <TopLine Value="1023"/> | ||||
| <CursorPos X="3" Y="1038"/> | <CursorPos X="3" Y="1038"/> | ||||
| <UsageCount Value="6"/> | |||||
| </Unit54> | |||||
| <Unit55> | |||||
| <UsageCount Value="4"/> | |||||
| </Unit59> | |||||
| <Unit60> | |||||
| <Filename Value="C:\Zusatzprogramme\Lazarus\lcl\controls.pp"/> | <Filename Value="C:\Zusatzprogramme\Lazarus\lcl\controls.pp"/> | ||||
| <UnitName Value="Controls"/> | <UnitName Value="Controls"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="2240"/> | <TopLine Value="2240"/> | ||||
| <CursorPos X="3" Y="2255"/> | <CursorPos X="3" Y="2255"/> | ||||
| <UsageCount Value="6"/> | |||||
| </Unit55> | |||||
| <Unit56> | |||||
| <UsageCount Value="4"/> | |||||
| </Unit60> | |||||
| <Unit61> | |||||
| <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\3.1.1\source\rtl\objpas\sysutils\sysutilh.inc"/> | <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\3.1.1\source\rtl\objpas\sysutils\sysutilh.inc"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="22"/> | <TopLine Value="22"/> | ||||
| <CursorPos X="4" Y="37"/> | <CursorPos X="4" Y="37"/> | ||||
| <UsageCount Value="8"/> | |||||
| </Unit56> | |||||
| <Unit57> | |||||
| <UsageCount Value="6"/> | |||||
| </Unit61> | |||||
| <Unit62> | |||||
| <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\3.1.1\source\rtl\win\sysosh.inc"/> | <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\3.1.1\source\rtl\win\sysosh.inc"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="7"/> | <TopLine Value="7"/> | ||||
| <CursorPos X="3" Y="22"/> | <CursorPos X="3" Y="22"/> | ||||
| <UsageCount Value="8"/> | |||||
| </Unit57> | |||||
| <Unit58> | |||||
| <UsageCount Value="6"/> | |||||
| </Unit62> | |||||
| <Unit63> | |||||
| <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\3.1.1\source\rtl\inc\systemh.inc"/> | <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\3.1.1\source\rtl\inc\systemh.inc"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="93"/> | <TopLine Value="93"/> | ||||
| <CursorPos X="19" Y="108"/> | <CursorPos X="19" Y="108"/> | ||||
| <UsageCount Value="8"/> | |||||
| </Unit58> | |||||
| <Unit59> | |||||
| <UsageCount Value="6"/> | |||||
| </Unit63> | |||||
| <Unit64> | |||||
| <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\3.1.1\source\rtl\win\wininc\ascdef.inc"/> | <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\3.1.1\source\rtl\win\wininc\ascdef.inc"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="57"/> | <TopLine Value="57"/> | ||||
| <CursorPos X="10" Y="72"/> | <CursorPos X="10" Y="72"/> | ||||
| <UsageCount Value="8"/> | |||||
| </Unit59> | |||||
| <Unit60> | |||||
| <UsageCount Value="6"/> | |||||
| </Unit64> | |||||
| <Unit65> | |||||
| <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\3.1.1\source\rtl\win32\windows.pp"/> | <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\3.1.1\source\rtl\win32\windows.pp"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <UsageCount Value="8"/> | |||||
| </Unit60> | |||||
| <Unit61> | |||||
| <UsageCount Value="6"/> | |||||
| </Unit65> | |||||
| <Unit66> | |||||
| <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\3.1.1\source\rtl\win\wininc\base.inc"/> | <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\3.1.1\source\rtl\win\wininc\base.inc"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="84"/> | <TopLine Value="84"/> | ||||
| <CursorPos X="6" Y="99"/> | <CursorPos X="6" Y="99"/> | ||||
| <UsageCount Value="8"/> | |||||
| </Unit61> | |||||
| <Unit62> | |||||
| <UsageCount Value="6"/> | |||||
| </Unit66> | |||||
| <Unit67> | |||||
| <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\3.1.1\source\rtl\objpas\typinfo.pp"/> | <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\3.1.1\source\rtl\objpas\typinfo.pp"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="97"/> | <TopLine Value="97"/> | ||||
| <CursorPos X="7" Y="113"/> | <CursorPos X="7" Y="113"/> | ||||
| <UsageCount Value="9"/> | |||||
| </Unit62> | |||||
| <Unit63> | |||||
| <UsageCount Value="7"/> | |||||
| </Unit67> | |||||
| <Unit68> | |||||
| <Filename Value="C:\Zusatzprogramme\Lazarus\lcl\include\application.inc"/> | <Filename Value="C:\Zusatzprogramme\Lazarus\lcl\include\application.inc"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="2148"/> | <TopLine Value="2148"/> | ||||
| <CursorPos Y="2163"/> | <CursorPos Y="2163"/> | ||||
| <UsageCount Value="10"/> | |||||
| </Unit63> | |||||
| <Unit64> | |||||
| <Filename Value="..\utils\uvkuPipelineCache.pas"/> | |||||
| <IsPartOfProject Value="True"/> | |||||
| <EditorIndex Value="5"/> | |||||
| <TopLine Value="18"/> | |||||
| <CursorPos X="13" Y="38"/> | |||||
| <UsageCount Value="21"/> | |||||
| <Loaded Value="True"/> | |||||
| </Unit64> | |||||
| <Unit65> | |||||
| <Filename Value="..\utils\uvkuPipelineCacheFactory.pas"/> | |||||
| <IsPartOfProject Value="True"/> | |||||
| <EditorIndex Value="6"/> | |||||
| <TopLine Value="33"/> | |||||
| <CursorPos X="84" Y="61"/> | |||||
| <UsageCount Value="21"/> | |||||
| <Loaded Value="True"/> | |||||
| </Unit65> | |||||
| <UsageCount Value="8"/> | |||||
| </Unit68> | |||||
| <Unit69> | |||||
| <Filename Value="..\lazopenglcore\uglcCamera.pas"/> | |||||
| <EditorIndex Value="-1"/> | |||||
| <TopLine Value="31"/> | |||||
| <CursorPos X="21" Y="66"/> | |||||
| <UsageCount Value="8"/> | |||||
| </Unit69> | |||||
| </Units> | </Units> | ||||
| <JumpHistory Count="30" HistoryIndex="29"> | |||||
| <JumpHistory Count="29" HistoryIndex="28"> | |||||
| <Position1> | <Position1> | ||||
| <Filename Value="..\utils\uvkuPipelineCache.pas"/> | |||||
| <Caret Line="18" Column="67" TopLine="6"/> | |||||
| <Filename Value="uMainForm.pas"/> | |||||
| <Caret Line="931" TopLine="920"/> | |||||
| </Position1> | </Position1> | ||||
| <Position2> | <Position2> | ||||
| <Filename Value="..\utils\uvkuPipelineCache.pas"/> | |||||
| <Caret Line="72" Column="33" TopLine="40"/> | |||||
| <Filename Value="uMainForm.pas"/> | |||||
| <Caret Line="932" TopLine="920"/> | |||||
| </Position2> | </Position2> | ||||
| <Position3> | <Position3> | ||||
| <Filename Value="..\utils\uvkuPipelineCache.pas"/> | |||||
| <Caret Line="15" Column="5"/> | |||||
| <Filename Value="uMainForm.pas"/> | |||||
| <Caret Line="935" TopLine="920"/> | |||||
| </Position3> | </Position3> | ||||
| <Position4> | <Position4> | ||||
| <Filename Value="..\utils\uvkuPipelineCacheFactory.pas"/> | |||||
| <Caret Line="16" Column="53"/> | |||||
| <Filename Value="uMainForm.pas"/> | |||||
| <Caret Line="937" TopLine="920"/> | |||||
| </Position4> | </Position4> | ||||
| <Position5> | <Position5> | ||||
| <Filename Value="..\utils\uvkuPipelineCacheFactory.pas"/> | |||||
| <Caret Line="20" Column="72"/> | |||||
| <Filename Value="uMainForm.pas"/> | |||||
| <Caret Line="939" TopLine="920"/> | |||||
| </Position5> | </Position5> | ||||
| <Position6> | <Position6> | ||||
| <Filename Value="..\utils\uvkuPipelineCacheFactory.pas"/> | |||||
| <Caret Line="43" Column="10" TopLine="21"/> | |||||
| <Filename Value="uMainForm.pas"/> | |||||
| <Caret Line="942" TopLine="920"/> | |||||
| </Position6> | </Position6> | ||||
| <Position7> | <Position7> | ||||
| <Filename Value="..\utils\uvkuPipelineCache.pas"/> | |||||
| <Caret Line="12"/> | |||||
| <Filename Value="uMainForm.pas"/> | |||||
| <Caret Line="941" TopLine="920"/> | |||||
| </Position7> | </Position7> | ||||
| <Position8> | <Position8> | ||||
| <Filename Value="..\utils\uvkuPipelineCache.pas"/> | |||||
| <Caret Line="38" Column="13" TopLine="29"/> | |||||
| <Filename Value="uMainForm.pas"/> | |||||
| <Caret Line="944" TopLine="920"/> | |||||
| </Position8> | </Position8> | ||||
| <Position9> | <Position9> | ||||
| <Filename Value="uMainForm.pas"/> | <Filename Value="uMainForm.pas"/> | ||||
| <Caret Line="340" Column="45" TopLine="327"/> | |||||
| <Caret Line="947" TopLine="921"/> | |||||
| </Position9> | </Position9> | ||||
| <Position10> | <Position10> | ||||
| <Filename Value="uMainForm.pas"/> | |||||
| <Caret Line="532" Column="19" TopLine="511"/> | |||||
| <Filename Value="..\utils\uvkuCommandBuffer.pas"/> | |||||
| <Caret Line="305" Column="24" TopLine="284"/> | |||||
| </Position10> | </Position10> | ||||
| <Position11> | <Position11> | ||||
| <Filename Value="uMainForm.pas"/> | |||||
| <Caret Line="51" TopLine="33"/> | |||||
| <Filename Value="..\utils\uvkuCommandBuffer.pas"/> | |||||
| <Caret Line="301" TopLine="284"/> | |||||
| </Position11> | </Position11> | ||||
| <Position12> | <Position12> | ||||
| <Filename Value="uMainForm.pas"/> | <Filename Value="uMainForm.pas"/> | ||||
| <Caret Line="275" Column="37" TopLine="253"/> | |||||
| <Caret Line="933" TopLine="916"/> | |||||
| </Position12> | </Position12> | ||||
| <Position13> | <Position13> | ||||
| <Filename Value="..\utils\uvkuCommandBuffer.pas"/> | |||||
| <Caret Line="24" Column="18" TopLine="7"/> | |||||
| <Filename Value="uMainForm.pas"/> | |||||
| <Caret Line="935" TopLine="916"/> | |||||
| </Position13> | </Position13> | ||||
| <Position14> | <Position14> | ||||
| <Filename Value="uMainForm.pas"/> | <Filename Value="uMainForm.pas"/> | ||||
| <Caret Line="275" Column="37" TopLine="253"/> | |||||
| <Caret Line="937" TopLine="916"/> | |||||
| </Position14> | </Position14> | ||||
| <Position15> | <Position15> | ||||
| <Filename Value="uMainForm.pas"/> | |||||
| <Caret Line="540" Column="12" TopLine="531"/> | |||||
| <Filename Value="..\utils\uvkuCommandBuffer.pas"/> | |||||
| <Caret Line="262" TopLine="246"/> | |||||
| </Position15> | </Position15> | ||||
| <Position16> | <Position16> | ||||
| <Filename Value="uMainForm.pas"/> | |||||
| <Caret Line="38" Column="5" TopLine="21"/> | |||||
| <Filename Value="..\utils\uvkuCommandBuffer.pas"/> | |||||
| <Caret Line="261" TopLine="246"/> | |||||
| </Position16> | </Position16> | ||||
| <Position17> | <Position17> | ||||
| <Filename Value="..\utils\VulkanUtils.pas"/> | |||||
| <Caret Line="72" Column="3" TopLine="65"/> | |||||
| <Filename Value="..\utils\uvkuCommandBuffer.pas"/> | |||||
| <Caret Line="260" TopLine="246"/> | |||||
| </Position17> | </Position17> | ||||
| <Position18> | <Position18> | ||||
| <Filename Value="..\utils\uvkuQueue.pas"/> | |||||
| <Caret Line="21" Column="71" TopLine="3"/> | |||||
| <Filename Value="..\utils\uvkuCommandBuffer.pas"/> | |||||
| <Caret Line="259" TopLine="246"/> | |||||
| </Position18> | </Position18> | ||||
| <Position19> | <Position19> | ||||
| <Filename Value="..\utils\uvkuQueue.pas"/> | |||||
| <Caret Line="37" Column="14" TopLine="12"/> | |||||
| <Filename Value="..\utils\uvkuCommandBuffer.pas"/> | |||||
| <Caret Line="255" TopLine="246"/> | |||||
| </Position19> | </Position19> | ||||
| <Position20> | <Position20> | ||||
| <Filename Value="..\utils\uvkuQueue.pas"/> | |||||
| <Caret Line="34" Column="5" TopLine="17"/> | |||||
| <Filename Value="uMainForm.pas"/> | |||||
| <Caret Line="937" TopLine="916"/> | |||||
| </Position20> | </Position20> | ||||
| <Position21> | <Position21> | ||||
| <Filename Value="..\utils\uvkuQueue.pas"/> | |||||
| <Caret Line="49" Column="45" TopLine="21"/> | |||||
| <Filename Value="..\utils\uvkuCommandBuffer.pas"/> | |||||
| <Caret Line="263" TopLine="246"/> | |||||
| </Position21> | </Position21> | ||||
| <Position22> | <Position22> | ||||
| <Filename Value="..\utils\uvkuQueue.pas"/> | |||||
| <Caret Line="54" Column="59" TopLine="39"/> | |||||
| <Filename Value="uMainForm.pas"/> | |||||
| <Caret Line="939" TopLine="916"/> | |||||
| </Position22> | </Position22> | ||||
| <Position23> | <Position23> | ||||
| <Filename Value="..\utils\uvkuQueue.pas"/> | |||||
| <Caret Line="26" Column="30" TopLine="5"/> | |||||
| <Filename Value="uMainForm.pas"/> | |||||
| <Caret Line="930" Column="46" TopLine="916"/> | |||||
| </Position23> | </Position23> | ||||
| <Position24> | <Position24> | ||||
| <Filename Value="uMainForm.pas"/> | |||||
| <Caret Line="38" Column="5" TopLine="21"/> | |||||
| <Filename Value="..\utils\uvkuCommandBuffer.pas"/> | |||||
| <Caret Line="254" TopLine="250"/> | |||||
| </Position24> | </Position24> | ||||
| <Position25> | <Position25> | ||||
| <Filename Value="..\utils\uvkuQueue.pas"/> | |||||
| <Caret Line="24" Column="36" TopLine="5"/> | |||||
| <Filename Value="uMainForm.pas"/> | |||||
| <Caret Line="935" TopLine="916"/> | |||||
| </Position25> | </Position25> | ||||
| <Position26> | <Position26> | ||||
| <Filename Value="..\utils\uvkuQueue.pas"/> | |||||
| <Caret Line="26" Column="52" TopLine="10"/> | |||||
| <Filename Value="..\utils\uvkuCommandBuffer.pas"/> | |||||
| <Caret Line="258" Column="27" TopLine="249"/> | |||||
| </Position26> | </Position26> | ||||
| <Position27> | <Position27> | ||||
| <Filename Value="uMainForm.pas"/> | |||||
| <Caret Line="38" Column="5" TopLine="20"/> | |||||
| <Filename Value="..\utils\uvkuCommandBuffer.pas"/> | |||||
| <Caret Line="267" Column="16" TopLine="311"/> | |||||
| </Position27> | </Position27> | ||||
| <Position28> | <Position28> | ||||
| <Filename Value="uMainForm.pas"/> | <Filename Value="uMainForm.pas"/> | ||||
| <Caret Line="541" Column="10" TopLine="524"/> | |||||
| <Caret Line="946" Column="22" TopLine="667"/> | |||||
| </Position28> | </Position28> | ||||
| <Position29> | <Position29> | ||||
| <Filename Value="..\utils\uvkuQueue.pas"/> | |||||
| <Caret Line="27" Column="24" TopLine="5"/> | |||||
| </Position29> | |||||
| <Position30> | |||||
| <Filename Value="uMainForm.pas"/> | <Filename Value="uMainForm.pas"/> | ||||
| <Caret Line="541" Column="10" TopLine="524"/> | |||||
| </Position30> | |||||
| <Caret Line="141" Column="3" TopLine="124"/> | |||||
| </Position29> | |||||
| </JumpHistory> | </JumpHistory> | ||||
| </ProjectSession> | </ProjectSession> | ||||
| <Debugging> | <Debugging> | ||||
| <BreakPoints Count="1"> | |||||
| <Item1> | |||||
| <Kind Value="bpkSource"/> | |||||
| <WatchScope Value="wpsLocal"/> | |||||
| <WatchKind Value="wpkWrite"/> | |||||
| <Source Value="uMainForm.pas"/> | |||||
| <Line Value="947"/> | |||||
| </Item1> | |||||
| </BreakPoints> | |||||
| <Watches Count="2"> | <Watches Count="2"> | ||||
| <Item1> | <Item1> | ||||
| <Expression Value="self"/> | <Expression Value="self"/> | ||||
| @@ -6,7 +6,8 @@ interface | |||||
| uses | uses | ||||
| Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, | Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, | ||||
| Vulkan, VulkanUtils; | |||||
| Vulkan, VulkanUtils, | |||||
| ugluVector, ugluMatrix, uglcCamera; | |||||
| type | type | ||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| @@ -18,6 +19,13 @@ type | |||||
| end; | end; | ||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| type | |||||
| TUniforms = packed record | |||||
| ProjectionMat: TgluMatrix4f; | |||||
| ModelMatrix: TgluMatrix4f; | |||||
| ViewMatrix: TgluMatrix4f; | |||||
| end; | |||||
| TMainForm = class(TForm) | TMainForm = class(TForm) | ||||
| RenderPanel: TPanel; | RenderPanel: TPanel; | ||||
| procedure FormCreate(Sender: TObject); | procedure FormCreate(Sender: TObject); | ||||
| @@ -26,10 +34,11 @@ type | |||||
| fGraphicsQueueFamilyIndex: VkUint32; | fGraphicsQueueFamilyIndex: VkUint32; | ||||
| fGraphicsQueueNodeIndex: VkUint32; | fGraphicsQueueNodeIndex: VkUint32; | ||||
| fPresentQueueNodeIndex: VkUint32; | fPresentQueueNodeIndex: VkUint32; | ||||
| fSurfaceFormat: TVkFormat; | |||||
| fColorFormat: TVkFormat; | |||||
| fSurfaceColorSpace: TVkColorSpaceKHR; | fSurfaceColorSpace: TVkColorSpaceKHR; | ||||
| fDepthFormat: TVkFormat; | fDepthFormat: TVkFormat; | ||||
| fCamera: TglcCamera; | |||||
| fAllocHandler: TCustomAllocHandler; | fAllocHandler: TCustomAllocHandler; | ||||
| fDebugReporter: TvkuConsoleDebugReporter; | fDebugReporter: TvkuConsoleDebugReporter; | ||||
| fInstance: TvkuInstance; | fInstance: TvkuInstance; | ||||
| @@ -53,6 +62,21 @@ type | |||||
| fDepthStencilImage: TvkuImage; | fDepthStencilImage: TvkuImage; | ||||
| fDepthStencilImageView: TvkuImageView; | fDepthStencilImageView: TvkuImageView; | ||||
| fPipelineCache: TvkuPipelineCache; | fPipelineCache: TvkuPipelineCache; | ||||
| fDescriptorPool: TvkuDescriptorPool; | |||||
| fDescriptorSet: TvkuDescriptorSet; | |||||
| fVertex: packed record | |||||
| DataMemory: TvkuDeviceMemory; | |||||
| DataBuffer: TvkuBuffer; | |||||
| IndexMemory: TvkuDeviceMemory; | |||||
| IndexBuffer: TvkuBuffer; | |||||
| end; | |||||
| fUniform: packed record | |||||
| Values: TUniforms; | |||||
| Memory: TvkuDeviceMemory; | |||||
| Buffer: TvkuBuffer; | |||||
| end; | |||||
| procedure UpdateUniformBuffers; | |||||
| end; | end; | ||||
| var | var | ||||
| @@ -63,6 +87,12 @@ implementation | |||||
| {$R *.lfm} | {$R *.lfm} | ||||
| {$I Vulkan.inc} | {$I Vulkan.inc} | ||||
| uses | |||||
| uvkuUtils; | |||||
| const | |||||
| VERTEX_BUFFER_BIND_ID = 0; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| //TCustomAllocHandler//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //TCustomAllocHandler//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| @@ -92,6 +122,26 @@ end; | |||||
| //TMainForm////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //TMainForm////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| procedure TMainForm.FormCreate(Sender: TObject); | procedure TMainForm.FormCreate(Sender: TObject); | ||||
| type | |||||
| TVertex = packed record | |||||
| position: array[0..2] of VkFloat; | |||||
| color: array[0..2] of VkFloat; | |||||
| end; | |||||
| TVertexData = array[0..2] of TVertex; | |||||
| TIndexData = array[0..2] of VkUint32; | |||||
| const | |||||
| ClearColor: TVkClearValue = ( color: ( float32: ( 0.0, 0.0, 0.0, 1.0 ) ) ); | |||||
| ClearDepthStencil: TVkClearValue = ( depthStencil: ( depth: 1.0; stencil: 0 ) ); | |||||
| VertexData: TVertexData = ( | |||||
| ( position: ( 1.0, 1.0, 0.0 ); color: ( 1.0, 0.0, 0.0 ) ), | |||||
| ( position: (-1.0, 1.0, 0.0 ); color: ( 0.0, 1.0, 0.0 ) ), | |||||
| ( position: ( 0.0,-1.0, 0.0 ); color: ( 0.0, 0.0, 1.0 ) ) | |||||
| ); | |||||
| IndexData: TIndexData = ( | |||||
| 0, 1, 2 | |||||
| ); | |||||
| var | var | ||||
| PhyDevices: TVkPhysicalDeviceArr; | PhyDevices: TVkPhysicalDeviceArr; | ||||
| InstanceFactory: TvkuInstanceFactory; | InstanceFactory: TvkuInstanceFactory; | ||||
| @@ -108,11 +158,14 @@ var | |||||
| ShaderModuleFactory: TvkuShaderModuleFactory; | ShaderModuleFactory: TvkuShaderModuleFactory; | ||||
| PipelineFactory: TvkuGraphicsPipelineFactory; | PipelineFactory: TvkuGraphicsPipelineFactory; | ||||
| PipelineCacheFactory: TvkuPipelineCacheFactory; | PipelineCacheFactory: TvkuPipelineCacheFactory; | ||||
| BufferFactory: TvkuBufferFactory; | |||||
| DescriptorPoolFactory: TvkuDescriptorPoolFactory; | |||||
| SetupCommandBuffer: TvkuCommandBuffer; | SetupCommandBuffer: TvkuCommandBuffer; | ||||
| QueueFamProps: TVkQueueFamilyPropertiesArr; | QueueFamProps: TVkQueueFamilyPropertiesArr; | ||||
| f: TVkFormat; | f: TVkFormat; | ||||
| i: Integer; | i: Integer; | ||||
| p: PVkVoid; | |||||
| SrfFormats: TVkSurfaceFormatArr; | SrfFormats: TVkSurfaceFormatArr; | ||||
| SurfaceCapabilities: TVkSurfaceCapabilitiesKHR; | SurfaceCapabilities: TVkSurfaceCapabilitiesKHR; | ||||
| PresentModes: TVkPresentModeArr; | PresentModes: TVkPresentModeArr; | ||||
| @@ -121,9 +174,13 @@ var | |||||
| AllocCallbacks: TVkAllocationCallbacks; | AllocCallbacks: TVkAllocationCallbacks; | ||||
| ImageMemoryBarrier: TVkImageMemoryBarrier; | ImageMemoryBarrier: TVkImageMemoryBarrier; | ||||
| CommandBuffers: TVkCommandBufferArr; | CommandBuffers: TVkCommandBufferArr; | ||||
| MemReq: TVkMemoryRequirements; | |||||
| vp: TVkViewport; | |||||
| r2D: TVkRect2D; | |||||
| begin | begin | ||||
| try | try | ||||
| fAllocHandler := TCustomAllocHandler.Create; | |||||
| fCamera := TglcCamera.Create; | |||||
| fAllocHandler := TCustomAllocHandler.Create; | |||||
| AllocCallbacks := fAllocHandler.GetStructure; | AllocCallbacks := fAllocHandler.GetStructure; | ||||
| ////////////////////////////////////////////////////////////////////////////// | ////////////////////////////////////////////////////////////////////////////// | ||||
| @@ -215,13 +272,15 @@ begin | |||||
| fPresentQueueNodeIndex := high(fPresentQueueNodeIndex); | fPresentQueueNodeIndex := high(fPresentQueueNodeIndex); | ||||
| QueueFamProps := fPhyDevice.GetQueueFamilyProperties; | QueueFamProps := fPhyDevice.GetQueueFamilyProperties; | ||||
| for i := low(QueueFamProps) to high(QueueFamProps) do begin | for i := low(QueueFamProps) to high(QueueFamProps) do begin | ||||
| if (VK_QUEUE_GRAPHICS_BIT in QueueFamProps[i].queueFlags) then | |||||
| fGraphicsQueueNodeIndex := i; | |||||
| if (VK_QUEUE_GRAPHICS_BIT in QueueFamProps[i].queueFlags) then begin | |||||
| if (fGraphicsQueueNodeIndex = high(fGraphicsQueueNodeIndex)) then | |||||
| fGraphicsQueueNodeIndex := i; | |||||
| if fPhyDevice.GetSurfaceSupport(i, fSurface.Handle) then begin | |||||
| fGraphicsQueueNodeIndex := i; | |||||
| fPresentQueueNodeIndex := i; | |||||
| break; | |||||
| if fPhyDevice.GetSurfaceSupport(i, fSurface.Handle) then begin | |||||
| fGraphicsQueueNodeIndex := i; | |||||
| fPresentQueueNodeIndex := i; | |||||
| break; | |||||
| end; | |||||
| end; | end; | ||||
| end; | end; | ||||
| if (fPresentQueueNodeIndex = high(fPresentQueueNodeIndex)) then begin | if (fPresentQueueNodeIndex = high(fPresentQueueNodeIndex)) then begin | ||||
| @@ -244,13 +303,13 @@ begin | |||||
| if (Length(SrfFormats) = 0) then | if (Length(SrfFormats) = 0) then | ||||
| raise TvkuException.Create('no suitable formats found'); | raise TvkuException.Create('no suitable formats found'); | ||||
| if (Length(SrfFormats) = 1) and (SrfFormats[0].format = VK_FORMAT_UNDEFINED) then begin | if (Length(SrfFormats) = 1) and (SrfFormats[0].format = VK_FORMAT_UNDEFINED) then begin | ||||
| fSurfaceFormat := VK_FORMAT_R8G8B8A8_UNORM; | |||||
| fColorFormat := VK_FORMAT_B8G8R8A8_UNORM; | |||||
| fSurfaceColorSpace := VK_COLORSPACE_SRGB_NONLINEAR_KHR; | fSurfaceColorSpace := VK_COLORSPACE_SRGB_NONLINEAR_KHR; | ||||
| end else begin | end else begin | ||||
| fSurfaceFormat := SrfFormats[0].format; | |||||
| fColorFormat := SrfFormats[0].format; | |||||
| fSurfaceColorSpace := SrfFormats[0].colorSpace; | fSurfaceColorSpace := SrfFormats[0].colorSpace; | ||||
| end; | end; | ||||
| WriteLn(' format: ', fSurfaceFormat); | |||||
| WriteLn(' format: ', fColorFormat); | |||||
| WriteLn(' color space: ', fSurfaceColorSpace); | WriteLn(' color space: ', fSurfaceColorSpace); | ||||
| WriteLn(' done'); | WriteLn(' done'); | ||||
| @@ -269,7 +328,7 @@ begin | |||||
| WriteLn(' alloc setup command buffer'); | WriteLn(' alloc setup command buffer'); | ||||
| SetupCommandBuffer := TvkuCommandBuffer.Create( | SetupCommandBuffer := TvkuCommandBuffer.Create( | ||||
| fCommandPool.CreateCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY), | |||||
| fCommandPool.AllocateCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY), | |||||
| true, fCommandPool.Handle, fDevice.DeviceCommands); | true, fCommandPool.Handle, fDevice.DeviceCommands); | ||||
| SetupCommandBuffer.BeginCommand; | SetupCommandBuffer.BeginCommand; | ||||
| WriteLn(' handle: ', PtrUInt(SetupCommandBuffer.Handle)); | WriteLn(' handle: ', PtrUInt(SetupCommandBuffer.Handle)); | ||||
| @@ -289,7 +348,7 @@ begin | |||||
| SwapChainFactory.ImageSharingMode := VK_SHARING_MODE_EXCLUSIVE; | SwapChainFactory.ImageSharingMode := VK_SHARING_MODE_EXCLUSIVE; | ||||
| SwapChainFactory.Clipped := true; | SwapChainFactory.Clipped := true; | ||||
| SwapChainFactory.ComposideAlpha := [ VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR ]; | SwapChainFactory.ComposideAlpha := [ VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR ]; | ||||
| SwapChainFactory.ImageFormat := fSurfaceFormat; | |||||
| SwapChainFactory.ImageFormat := fColorFormat; | |||||
| SwapChainFactory.ImageColorSpace := fSurfaceColorSpace; | SwapChainFactory.ImageColorSpace := fSurfaceColorSpace; | ||||
| WriteLn(' get surface capabilities'); | WriteLn(' get surface capabilities'); | ||||
| @@ -326,6 +385,10 @@ begin | |||||
| SwapChainFactory.PresentMode := pm; | SwapChainFactory.PresentMode := pm; | ||||
| break; | break; | ||||
| end; | end; | ||||
| if (SwapChainFactory.PresentMode <> VK_PRESENT_MODE_MAILBOX_KHR) | |||||
| and (pm = VK_PRESENT_MODE_IMMEDIATE_KHR) | |||||
| then | |||||
| SwapChainFactory.PresentMode := pm; | |||||
| end; | end; | ||||
| WriteLn(SwapChainFactory.PresentMode); | WriteLn(SwapChainFactory.PresentMode); | ||||
| @@ -344,7 +407,7 @@ begin | |||||
| ImageViewFactory := TvkuImageViewFactory.Create(fDevice); | ImageViewFactory := TvkuImageViewFactory.Create(fDevice); | ||||
| try | try | ||||
| ImageViewFactory.AllocHandler := fAllocHandler; | ImageViewFactory.AllocHandler := fAllocHandler; | ||||
| ImageViewFactory.Format := fSurfaceFormat; | |||||
| ImageViewFactory.Format := fColorFormat; | |||||
| ImageViewFactory.ViewType := VK_IMAGE_VIEW_TYPE_2D; | ImageViewFactory.ViewType := VK_IMAGE_VIEW_TYPE_2D; | ||||
| with ImageViewFactory.SubresourceRange do begin | with ImageViewFactory.SubresourceRange do begin | ||||
| AspectMask := [ VK_IMAGE_ASPECT_COLOR_BIT ]; | AspectMask := [ VK_IMAGE_ASPECT_COLOR_BIT ]; | ||||
| @@ -386,7 +449,7 @@ begin | |||||
| ////////////////////////////////////////////////////////////////////////////// | ////////////////////////////////////////////////////////////////////////////// | ||||
| WriteLn('create draw command buffers'); | WriteLn('create draw command buffers'); | ||||
| SetLength(fDrawCommandBuffers, Length(fImageViews)); | SetLength(fDrawCommandBuffers, Length(fImageViews)); | ||||
| CommandBuffers := fCommandPool.CreateCommandBuffers( | |||||
| CommandBuffers := fCommandPool.AllocateCommandBuffers( | |||||
| VK_COMMAND_BUFFER_LEVEL_PRIMARY, | VK_COMMAND_BUFFER_LEVEL_PRIMARY, | ||||
| Length(fDrawCommandBuffers)); | Length(fDrawCommandBuffers)); | ||||
| for i := low(CommandBuffers) to high(CommandBuffers) do begin | for i := low(CommandBuffers) to high(CommandBuffers) do begin | ||||
| @@ -402,7 +465,7 @@ begin | |||||
| ////////////////////////////////////////////////////////////////////////////// | ////////////////////////////////////////////////////////////////////////////// | ||||
| WriteLn('create post present command buffers'); | WriteLn('create post present command buffers'); | ||||
| fPostPresentCommandBuffer := TvkuCommandBuffer.Create( | fPostPresentCommandBuffer := TvkuCommandBuffer.Create( | ||||
| fCommandPool.CreateCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY), | |||||
| fCommandPool.AllocateCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY), | |||||
| true, | true, | ||||
| fCommandPool.Handle, | fCommandPool.Handle, | ||||
| fDevice.DeviceCommands); | fDevice.DeviceCommands); | ||||
| @@ -424,13 +487,28 @@ begin | |||||
| ImageFactory.ArrayLayers := 1; | ImageFactory.ArrayLayers := 1; | ||||
| ImageFactory.Samples := [ VK_SAMPLE_COUNT_1_BIT ]; | ImageFactory.Samples := [ VK_SAMPLE_COUNT_1_BIT ]; | ||||
| ImageFactory.Tiling := VK_IMAGE_TILING_OPTIMAL; | ImageFactory.Tiling := VK_IMAGE_TILING_OPTIMAL; | ||||
| ImageFactory.Usage := [ VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT ]; | |||||
| ImageFactory.Usage := [ | |||||
| VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, | |||||
| VK_IMAGE_USAGE_TRANSFER_SRC_BIT ]; | |||||
| fDepthStencilImage := ImageFactory.CreateImage; | fDepthStencilImage := ImageFactory.CreateImage; | ||||
| fDepthStencilImage.AllocateAndBindImageMemory( | fDepthStencilImage.AllocateAndBindImageMemory( | ||||
| fPhyDevice.GetMemoryProperties, | fPhyDevice.GetMemoryProperties, | ||||
| @AllocCallbacks); | @AllocCallbacks); | ||||
| WriteLn(' image handle: ', PtrUInt(fDepthStencilImage.Handle)); | WriteLn(' image handle: ', PtrUInt(fDepthStencilImage.Handle)); | ||||
| WriteLn(' create image memory barrier'); | |||||
| ImageMemoryBarrier := fImages[i].GetMemoryBarrier( | |||||
| [ VK_IMAGE_ASPECT_DEPTH_BIT ], | |||||
| VK_IMAGE_LAYOUT_UNDEFINED, | |||||
| VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL); | |||||
| SetupCommandBuffer.PipelineBarrier( | |||||
| [ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT ], | |||||
| [ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT ], | |||||
| [], | |||||
| [], | |||||
| [], | |||||
| [ ImageMemoryBarrier ]); | |||||
| ImageViewFactory.Image := fDepthStencilImage.Handle; | ImageViewFactory.Image := fDepthStencilImage.Handle; | ||||
| ImageViewFactory.ViewType := VK_IMAGE_VIEW_TYPE_2D; | ImageViewFactory.ViewType := VK_IMAGE_VIEW_TYPE_2D; | ||||
| ImageViewFactory.Format := fDepthFormat; | ImageViewFactory.Format := fDepthFormat; | ||||
| @@ -456,7 +534,7 @@ begin | |||||
| try | try | ||||
| RenderPassFactory.Attachments.Length := 2; | RenderPassFactory.Attachments.Length := 2; | ||||
| with RenderPassFactory.Attachments[0] do begin | with RenderPassFactory.Attachments[0] do begin | ||||
| Format := fSurfaceFormat; | |||||
| Format := fColorFormat; | |||||
| Samples := [ VK_SAMPLE_COUNT_1_BIT ]; | Samples := [ VK_SAMPLE_COUNT_1_BIT ]; | ||||
| LoadOp := VK_ATTACHMENT_LOAD_OP_CLEAR; | LoadOp := VK_ATTACHMENT_LOAD_OP_CLEAR; | ||||
| StoreOp := VK_ATTACHMENT_STORE_OP_STORE; | StoreOp := VK_ATTACHMENT_STORE_OP_STORE; | ||||
| @@ -542,6 +620,100 @@ begin | |||||
| FreeAndNil(SetupCommandBuffer); | FreeAndNil(SetupCommandBuffer); | ||||
| WriteLn(' done'); | WriteLn(' done'); | ||||
| ////////////////////////////////////////////////////////////////////////////// | |||||
| WriteLn('recreate setup command buffer'); | |||||
| SetupCommandBuffer := TvkuCommandBuffer.Create( | |||||
| fCommandPool.AllocateCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY), | |||||
| true, fCommandPool.Handle, fDevice.DeviceCommands); | |||||
| SetupCommandBuffer.BeginCommand; | |||||
| WriteLn(' handle: ', PtrUInt(SetupCommandBuffer.Handle)); | |||||
| WriteLn(' done'); | |||||
| ////////////////////////////////////////////////////////////////////////////// | |||||
| BufferFactory := TvkuBufferFactory.Create(fDevice); | |||||
| try | |||||
| WriteLn('create vertex data buffer'); | |||||
| BufferFactory.Size := SizeOf(VertexData); | |||||
| BufferFactory.Usage := [ VK_BUFFER_USAGE_VERTEX_BUFFER_BIT ]; | |||||
| fVertex.DataBuffer := BufferFactory.CreateBuffer; | |||||
| WriteLn(' buffer handle: ', PtrUInt(fVertex.DataBuffer.Handle)); | |||||
| MemReq := fVertex.DataBuffer.GetMemoryRequirements; | |||||
| fVertex.DataMemory := TvkuDeviceMemory.Create( | |||||
| fDevice.AllocateMemory( | |||||
| MemReq.size, | |||||
| vkuGetMemoryTypeIndex( | |||||
| fPhyDevice.GetMemoryProperties, | |||||
| MemReq.memoryTypeBits, | |||||
| VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT), | |||||
| @AllocCallbacks), | |||||
| true, | |||||
| fDevice.DeviceCommands, | |||||
| @AllocCallbacks); | |||||
| WriteLn(' memory handle: ', PtrUInt(fVertex.DataMemory.Handle)); | |||||
| p := fVertex.DataMemory.Map(0, MemReq.size, 0); | |||||
| try | |||||
| Move(VertexData, p^, SizeOf(VertexData)); | |||||
| finally | |||||
| fVertex.DataMemory.Unmap; | |||||
| end; | |||||
| fVertex.DataBuffer.BindMemory(fVertex.DataMemory.Handle, 0); | |||||
| WriteLn(' done'); | |||||
| WriteLn('create vertex index buffer'); | |||||
| BufferFactory.Size := SizeOf(IndexData); | |||||
| BufferFactory.Usage := [ VK_BUFFER_USAGE_INDEX_BUFFER_BIT ]; | |||||
| fVertex.IndexBuffer := BufferFactory.CreateBuffer; | |||||
| WriteLn(' buffer handle: ', PtrUInt(fVertex.IndexBuffer.Handle)); | |||||
| MemReq := fVertex.IndexBuffer.GetMemoryRequirements; | |||||
| fVertex.IndexMemory := TvkuDeviceMemory.Create( | |||||
| fDevice.AllocateMemory( | |||||
| MemReq.size, | |||||
| vkuGetMemoryTypeIndex( | |||||
| fPhyDevice.GetMemoryProperties, | |||||
| MemReq.memoryTypeBits, | |||||
| VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT), | |||||
| @AllocCallbacks), | |||||
| true, | |||||
| fDevice.DeviceCommands, | |||||
| @AllocCallbacks); | |||||
| WriteLn(' memory handle: ', PtrUInt(fVertex.IndexMemory.Handle)); | |||||
| p := fVertex.IndexMemory.Map(0, MemReq.size, 0); | |||||
| try | |||||
| Move(IndexData, p^, SizeOf(IndexData)); | |||||
| finally | |||||
| fVertex.IndexMemory.Unmap; | |||||
| end; | |||||
| fVertex.IndexBuffer.BindMemory(fVertex.IndexMemory.Handle, 0); | |||||
| WriteLn(' done'); | |||||
| WriteLn('create uniform buffer'); | |||||
| BufferFactory.Size := SizeOf(IndexData); | |||||
| BufferFactory.Usage := [ VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT ]; | |||||
| fUniform.Buffer := BufferFactory.CreateBuffer; | |||||
| WriteLn(' buffer handle: ', PtrUInt(fUniform.Buffer.Handle)); | |||||
| MemReq := fUniform.Buffer.GetMemoryRequirements; | |||||
| fUniform.Memory := TvkuDeviceMemory.Create( | |||||
| fDevice.AllocateMemory( | |||||
| MemReq.size, | |||||
| vkuGetMemoryTypeIndex( | |||||
| fPhyDevice.GetMemoryProperties, | |||||
| MemReq.memoryTypeBits, | |||||
| VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT), | |||||
| @AllocCallbacks), | |||||
| true, | |||||
| fDevice.DeviceCommands, | |||||
| @AllocCallbacks); | |||||
| WriteLn(' memory handle: ', PtrUInt(fUniform.Memory.Handle)); | |||||
| fUniform.Buffer.BindMemory(fUniform.Memory.Handle, 0); | |||||
| UpdateUniformBuffers; | |||||
| WriteLn(' done'); | |||||
| finally | |||||
| FreeAndNil(BufferFactory); | |||||
| end; | |||||
| ////////////////////////////////////////////////////////////////////////////// | ////////////////////////////////////////////////////////////////////////////// | ||||
| WriteLn('create descriptor set layout'); | WriteLn('create descriptor set layout'); | ||||
| DescSetLayoutFactory := TvkuDescriptorSetLayoutFactory.Create(fDevice); | DescSetLayoutFactory := TvkuDescriptorSetLayoutFactory.Create(fDevice); | ||||
| @@ -583,11 +755,11 @@ begin | |||||
| try | try | ||||
| ShaderModuleFactory.AllocHandler := fAllocHandler; | ShaderModuleFactory.AllocHandler := fAllocHandler; | ||||
| ShaderModuleFactory.LoadGlslCode(ExtractFilePath(Application.ExeName) + '../../data/shaders/triangle.vert', [ VK_SHADER_STAGE_VERTEX_BIT ]); | |||||
| ShaderModuleFactory.LoadSpvCode(ExtractFilePath(Application.ExeName) + '../../data/shaders/triangle.vert.spv'); | |||||
| fVertexShader := ShaderModuleFactory.CreateShaderModule; | fVertexShader := ShaderModuleFactory.CreateShaderModule; | ||||
| WriteLn(' vertex handle: ', PtrUInt(fVertexShader.Handle)); | WriteLn(' vertex handle: ', PtrUInt(fVertexShader.Handle)); | ||||
| ShaderModuleFactory.LoadGlslCode(ExtractFilePath(Application.ExeName) + '../../data/shaders/triangle.frag', [ VK_SHADER_STAGE_FRAGMENT_BIT ]); | |||||
| ShaderModuleFactory.LoadSpvCode(ExtractFilePath(Application.ExeName) + '../../data/shaders/triangle.frag.spv'); | |||||
| fFragmentShader := ShaderModuleFactory.CreateShaderModule; | fFragmentShader := ShaderModuleFactory.CreateShaderModule; | ||||
| WriteLn(' fragment handle: ', PtrUInt(fFragmentShader.Handle)); | WriteLn(' fragment handle: ', PtrUInt(fFragmentShader.Handle)); | ||||
| WriteLn(' done'); | WriteLn(' done'); | ||||
| @@ -600,11 +772,209 @@ begin | |||||
| PipelineFactory := TvkuGraphicsPipelineFactory.Create(fDevice); | PipelineFactory := TvkuGraphicsPipelineFactory.Create(fDevice); | ||||
| try | try | ||||
| PipelineFactory.AllocHandler := fAllocHandler; | PipelineFactory.AllocHandler := fAllocHandler; | ||||
| // TODO fPipeline := PipelineFactory.CreateGraphicsPipeline(VK_INVALID_NDP_HANDLE); | |||||
| PipelineFactory.Stages.Length := 2; | |||||
| with PipelineFactory.Stages[0] do begin | |||||
| Stage := [ VK_SHADER_STAGE_VERTEX_BIT ]; | |||||
| Module := fVertexShader.Handle; | |||||
| Name := 'main'; | |||||
| end; | |||||
| with PipelineFactory.Stages[1] do begin | |||||
| Stage := [ VK_SHADER_STAGE_FRAGMENT_BIT ]; | |||||
| Module := fFragmentShader.Handle; | |||||
| Name := 'main'; | |||||
| end; | |||||
| with PipelineFactory.VertexInputState do begin | |||||
| VertexBindingDescriptions.Length := 1; | |||||
| VertexBindingDescriptions[0].Binding := VERTEX_BUFFER_BIND_ID; | |||||
| VertexBindingDescriptions[0].Stride := SizeOf(TVertex); | |||||
| VertexBindingDescriptions[0].InputRate := VK_VERTEX_INPUT_RATE_VERTEX; | |||||
| VertexAttributeDescriptions.Length := 2; | |||||
| // Location 0: Position | |||||
| VertexAttributeDescriptions[0].Binding := VERTEX_BUFFER_BIND_ID; | |||||
| VertexAttributeDescriptions[0].Location := 0; | |||||
| VertexAttributeDescriptions[0].Format := VK_FORMAT_R32G32B32_SFLOAT; | |||||
| VertexAttributeDescriptions[0].Offset := 0; | |||||
| VertexAttributeDescriptions[0].Binding := 0; | |||||
| // Location 1: Color | |||||
| VertexAttributeDescriptions[1].Binding := VERTEX_BUFFER_BIND_ID; | |||||
| VertexAttributeDescriptions[1].Location := 1; | |||||
| VertexAttributeDescriptions[1].Format := VK_FORMAT_R32G32B32_SFLOAT; | |||||
| VertexAttributeDescriptions[1].Offset := 3 * SizeOf(VkFloat); | |||||
| VertexAttributeDescriptions[1].Binding := 0; | |||||
| end; | |||||
| with PipelineFactory.InputAssemblyState do begin | |||||
| Topology := VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; | |||||
| end; | |||||
| with PipelineFactory.RasterizationState do begin | |||||
| PolygonMode := VK_POLYGON_MODE_FILL; | |||||
| CullMode := VK_CULL_MODE_NONE; | |||||
| FrontFace := VK_FRONT_FACE_COUNTER_CLOCKWISE; | |||||
| DepthClampEnable := false; | |||||
| RasterizerDiscardEnable := false; | |||||
| DepthBiasEnable := false; | |||||
| end; | |||||
| with PipelineFactory.ColorBlendState do begin | |||||
| Attachments.Length := 1; | |||||
| Attachments[0].ColorWriteMask := [ | |||||
| VK_COLOR_COMPONENT_R_BIT, | |||||
| VK_COLOR_COMPONENT_G_BIT, | |||||
| VK_COLOR_COMPONENT_B_BIT, | |||||
| VK_COLOR_COMPONENT_A_BIT]; | |||||
| Attachments[0].BlendEnable := false; | |||||
| end; | |||||
| with PipelineFactory.ViewportState do begin | |||||
| Viewports.Length := 1; | |||||
| Scissors.Length := 1; | |||||
| end; | |||||
| with PipelineFactory.DynamicState do begin | |||||
| DynamicStates.Length := 2; | |||||
| DynamicStates[0] := VK_DYNAMIC_STATE_VIEWPORT; | |||||
| DynamicStates[1] := VK_DYNAMIC_STATE_SCISSOR; | |||||
| end; | |||||
| with PipelineFactory.DepthStencilState do begin | |||||
| DepthTestEnable := true; | |||||
| DepthWriteEnable := true; | |||||
| DepthCompareOp := VK_COMPARE_OP_LESS_OR_EQUAL; | |||||
| DepthBoundsTestEnable := false; | |||||
| StencilTestEnable := false; | |||||
| Back.failOp := VK_STENCIL_OP_KEEP; | |||||
| Back.passOp := VK_STENCIL_OP_KEEP; | |||||
| Back.compareOp := VK_COMPARE_OP_ALWAYS; | |||||
| Front := Back; | |||||
| end; | |||||
| with PipelineFactory.MultiSampleState do begin | |||||
| RasterizationSamples := [ VK_SAMPLE_COUNT_1_BIT ]; | |||||
| end; | |||||
| PipelineFactory.Layout := fPipelineLayout.Handle; | |||||
| PipelineFactory.RenderPass := fRenderPass.Handle; | |||||
| PipelineFactory.SubPass := 0; | |||||
| fPipeline := PipelineFactory.CreateGraphicsPipeline(VK_INVALID_NDP_HANDLE); | |||||
| WriteLn(' handle: ', PtrUInt(fPipeline.Handle)); | |||||
| WriteLn(' done'); | |||||
| finally | finally | ||||
| FreeAndNil(PipelineFactory); | FreeAndNil(PipelineFactory); | ||||
| end; | end; | ||||
| ////////////////////////////////////////////////////////////////////////////// | |||||
| WriteLn('create descriptor pool'); | |||||
| DescriptorPoolFactory := TvkuDescriptorPoolFactory.Create(fDevice.DeviceCommands); | |||||
| try | |||||
| DescriptorPoolFactory.MaxSets := 1; | |||||
| DescriptorPoolFactory.PoolSizes.Length := 1; | |||||
| DescriptorPoolFactory.PoolSizes[0].DescriptorType := VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; | |||||
| DescriptorPoolFactory.PoolSizes[0].DescriptorCount := 1; | |||||
| fDescriptorPool := DescriptorPoolFactory.CreateDescriptorPool; | |||||
| WriteLn(' handle: ', PtrUInt(fDescriptorPool.Handle)); | |||||
| WriteLn(' done'); | |||||
| finally | |||||
| FreeAndNil(DescriptorPoolFactory); | |||||
| end; | |||||
| ////////////////////////////////////////////////////////////////////////////// | |||||
| WriteLn('setup/update descriptor sets'); | |||||
| fDescriptorSet := TvkuDescriptorSet.Create( | |||||
| fDescriptorPool.AllocateDescriptorSet(fDescSetLayout.Handle), | |||||
| true, | |||||
| fDescriptorPool.Handle, | |||||
| fDevice.DeviceCommands); | |||||
| WriteLn(' handle: ', PtrUInt(fDescriptorSet.Handle)); | |||||
| WriteLn(' update descriptor set'); | |||||
| with fDevice.UpdateDescriptorSet do | |||||
| try | |||||
| WriteDescriptorSets.Length := 1; | |||||
| WriteDescriptorSets[0].DstSet := fDescriptorSet.Handle; | |||||
| WriteDescriptorSets[0].DstBinding := 0; | |||||
| WriteDescriptorSets[0].DescriptorType := VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; | |||||
| WriteDescriptorSets[0].BufferInfos.Length := 1; | |||||
| WriteDescriptorSets[0].BufferInfos[0].Buffer := fUniform.Buffer.Handle; | |||||
| WriteDescriptorSets[0].BufferInfos[0].Offset := 0; | |||||
| WriteDescriptorSets[0].BufferInfos[0].Range := SizeOf(fUniform.Values); | |||||
| Execute; | |||||
| finally | |||||
| Free; | |||||
| end; | |||||
| WriteLn(' done'); | |||||
| ////////////////////////////////////////////////////////////////////////////// | |||||
| WriteLn('build command buffers'); | |||||
| for i := low(fDrawCommandBuffers) to high(fDrawCommandBuffers) do begin | |||||
| WriteLn(' command buffer: ', PtrUInt(fDrawCommandBuffers[i].Handle)); | |||||
| with fDrawCommandBuffers[i] do begin | |||||
| BeginCommand; | |||||
| with BeginRenderPass do | |||||
| try | |||||
| RenderPassBeginInfo.RenderPass := fRenderPass.Handle; | |||||
| RenderPassBeginInfo.Framebuffer := fFrameBuffers[i].Handle; | |||||
| RenderPassBeginInfo.RenderArea.offset.x := 0; | |||||
| RenderPassBeginInfo.RenderArea.offset.y := 0; | |||||
| RenderPassBeginInfo.RenderArea.extent.width := ClientWidth; | |||||
| RenderPassBeginInfo.RenderArea.extent.height := ClientHeight; | |||||
| RenderPassBeginInfo.ClearValues.Length := 2; | |||||
| RenderPassBeginInfo.ClearValues[0] := ClearColor; | |||||
| RenderPassBeginInfo.ClearValues[1] := ClearDepthStencil; | |||||
| Execute(VK_SUBPASS_CONTENTS_INLINE); | |||||
| finally | |||||
| Free; | |||||
| end; | |||||
| FillByte(vp, SizeOf(vp), 0); | |||||
| vp.height := ClientHeight; | |||||
| vp.width := ClientWidth; | |||||
| vp.minDepth := 0.0; | |||||
| vp.maxDepth := 1.0; | |||||
| SetViewport(0, [ vp ]); | |||||
| FillByte(r2D, SizeOf(r2D), 0); | |||||
| r2D.extent.width := ClientWidth; | |||||
| r2D.extent.height := ClientHeight; | |||||
| r2D.offset.x := 0; | |||||
| r2D.offset.y := 0; | |||||
| SetScissors(1, [ r2D ]); | |||||
| BindDescriptorSet( | |||||
| VK_PIPELINE_BIND_POINT_GRAPHICS, | |||||
| fPipelineLayout.Handle, | |||||
| 0, | |||||
| [ fDescriptorSet.Handle ], | |||||
| [ ]); | |||||
| BindVertexBuffers( | |||||
| VERTEX_BUFFER_BIND_ID, | |||||
| [ fVertex.DataBuffer.Handle ], | |||||
| [ 0 ]); | |||||
| BindIndexBuffers( | |||||
| fVertex.IndexBuffer.Handle, | |||||
| 0, | |||||
| VK_INDEX_TYPE_UINT32); | |||||
| DrawIndexed( | |||||
| 3, 1, 0, 0, 1); | |||||
| FillByte(ImageMemoryBarrier, SizeOf(ImageMemoryBarrier), 0); | |||||
| with ImageMemoryBarrier do begin | |||||
| sType := VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; | |||||
| pNext := nil; | |||||
| srcAccessMask := [ VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT ]; | |||||
| dstAccessMask := [ ]; | |||||
| oldLayout := VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; | |||||
| newLayout := VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; | |||||
| srcQueueFamilyIndex := VK_QUEUE_FAMILY_IGNORED; | |||||
| dstQueueFamilyIndex := VK_QUEUE_FAMILY_IGNORED; | |||||
| subresourceRange.aspectMask := [ VK_IMAGE_ASPECT_COLOR_BIT ]; | |||||
| subresourceRange.baseMipLevel := 0; | |||||
| subresourceRange.levelCount := 1; | |||||
| subresourceRange.baseArrayLayer := 0; | |||||
| subresourceRange.layerCount := 1; | |||||
| end; | |||||
| PipelineBarrier( | |||||
| [ VK_PIPELINE_STAGE_ALL_COMMANDS_BIT ], | |||||
| [ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT ], | |||||
| [], | |||||
| [], | |||||
| [], | |||||
| [ ImageMemoryBarrier ]); | |||||
| EndCommand; | |||||
| end; | |||||
| end; | |||||
| WriteLn(' done'); | |||||
| finally | finally | ||||
| FreeAndNil(SetupCommandBuffer); | FreeAndNil(SetupCommandBuffer); | ||||
| end; | end; | ||||
| @@ -646,11 +1016,19 @@ procedure TMainForm.FormDestroy(Sender: TObject); | |||||
| end; | end; | ||||
| begin | begin | ||||
| FreeAndNil(fDescriptorSet); | |||||
| FreeAndNil(fDescriptorPool); | |||||
| FreeAndNil(fPipeline); | FreeAndNil(fPipeline); | ||||
| FreeAndNil(fFragmentShader); | FreeAndNil(fFragmentShader); | ||||
| FreeAndNil(fVertexShader); | FreeAndNil(fVertexShader); | ||||
| FreeAndNil(fPipelineLayout); | FreeAndNil(fPipelineLayout); | ||||
| FreeAndNil(fDescSetLayout); | FreeAndNil(fDescSetLayout); | ||||
| FreeAndNil(fUniform.Buffer); | |||||
| FreeAndNil(fUniform.Memory); | |||||
| FreeAndNil(fVertex.DataBuffer); | |||||
| FreeAndNil(fVertex.DataMemory); | |||||
| FreeAndNil(fVertex.IndexBuffer); | |||||
| FreeAndNil(fVertex.IndexMemory); | |||||
| FreeAndNilFrameBuffers; | FreeAndNilFrameBuffers; | ||||
| FreeAndNil(fPipelineCache); | FreeAndNil(fPipelineCache); | ||||
| FreeAndNil(fRenderPass); | FreeAndNil(fRenderPass); | ||||
| @@ -669,6 +1047,26 @@ begin | |||||
| FreeAndNil(fDebugReporter); | FreeAndNil(fDebugReporter); | ||||
| FreeAndNil(fInstance); | FreeAndNil(fInstance); | ||||
| FreeAndNil(fAllocHandler); | FreeAndNil(fAllocHandler); | ||||
| FreeAndNil(fCamera); | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TMainForm.UpdateUniformBuffers; | |||||
| var p: PVkVoid; | |||||
| begin | |||||
| fCamera.Perspective(45, ClientWidth/ClientHeight, 0.001, 1000); | |||||
| fCamera.Position := gluMatrixIdentity * gluMatrixTranslate(gluVector3f(0, 0, -5)); | |||||
| fUniform.Values.ProjectionMat := fCamera.ProjMatrix; | |||||
| fUniform.Values.ModelMatrix := fCamera.Position; | |||||
| fUniform.Values.ViewMatrix := gluMatrixIdentity; | |||||
| p := fUniform.Memory.Map(0, SizeOf(fUniform.Values), 0); | |||||
| try | |||||
| move(fUniform.Values, p^, SizeOf(fUniform.Values)); | |||||
| finally | |||||
| fUniform.Memory.Unmap; | |||||
| end; | |||||
| end; | end; | ||||
| end. | end. | ||||
| @@ -20,6 +20,7 @@ uses | |||||
| uvkuDescriptorSetLayout, uvkuDescriptorSetLayoutFactory, | uvkuDescriptorSetLayout, uvkuDescriptorSetLayoutFactory, | ||||
| uvkuShaderModule, uvkuShaderModuleFactory, | uvkuShaderModule, uvkuShaderModuleFactory, | ||||
| uvkuPipelineLayout, uvkuPipelineLayoutFactory, uvkuPipelineCache, uvkuPipelineCacheFactory, uvkuPipeline, uvkuPipelineFactory, | uvkuPipelineLayout, uvkuPipelineLayoutFactory, uvkuPipelineCache, uvkuPipelineCacheFactory, uvkuPipeline, uvkuPipelineFactory, | ||||
| uvkuDescriptorPool, uvkuDescriptorPoolFactory, uvkuDescriptorSet, | |||||
| uvkuUtils; | uvkuUtils; | ||||
| type | type | ||||
| @@ -123,6 +124,11 @@ type | |||||
| TvkuComputePipeline = uvkuPipeline.TvkuComputePipeline; | TvkuComputePipeline = uvkuPipeline.TvkuComputePipeline; | ||||
| TvkuComputePipelineFactory = uvkuPipelineFactory.TvkuComputePipelineFactory; | TvkuComputePipelineFactory = uvkuPipelineFactory.TvkuComputePipelineFactory; | ||||
| { DescriptorPool } | |||||
| TvkuDescriptorPool = uvkuDescriptorPool.TvkuDescriptorPool; | |||||
| TvkuDescriptorPoolFactory = uvkuDescriptorPoolFactory.TvkuDescriptorPoolFactory; | |||||
| TvkuDescriptorSet = uvkuDescriptorSet.TvkuDescriptorSet; | |||||
| { Utils } | { Utils } | ||||
| TvkuException = uvkuUtils.TvkuException; | TvkuException = uvkuUtils.TvkuException; | ||||
| TvkuErrorException = uvkuUtils.TvkuErrorException; | TvkuErrorException = uvkuUtils.TvkuErrorException; | ||||
| @@ -6,7 +6,7 @@ interface | |||||
| uses | uses | ||||
| Classes, SysUtils, | Classes, SysUtils, | ||||
| Vulkan, uvkuBase; | |||||
| Vulkan, uvkuBase, uvkuDeviceMemory; | |||||
| type | type | ||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| @@ -14,11 +14,23 @@ type | |||||
| private | private | ||||
| fHandle: VkBuffer; | fHandle: VkBuffer; | ||||
| fDeviceCommands: TVkDeviceCommands; | fDeviceCommands: TVkDeviceCommands; | ||||
| fMemory: VkDeviceMemory; | |||||
| fBufferMemory: TvkuDeviceMemory; | |||||
| procedure CreateHandle(const aCreateInfo: TVkBufferCreateInfo); | procedure CreateHandle(const aCreateInfo: TVkBufferCreateInfo); | ||||
| public | public | ||||
| property Handle: VkBuffer read fHandle; | property Handle: VkBuffer read fHandle; | ||||
| property DeviceCommands: TVkDeviceCommands read fDeviceCommands; | property DeviceCommands: TVkDeviceCommands read fDeviceCommands; | ||||
| property Memory: VkDeviceMemory read fMemory; | |||||
| procedure BindMemory( | |||||
| const aMemory: VkDeviceMemory; | |||||
| const aOffset: VkDeviceSize); | |||||
| function GetMemoryRequirements: TVkMemoryRequirements; | |||||
| procedure AllocateAndBindBufferMemory( | |||||
| const aMemoryProperties: TVkPhysicalDeviceMemoryProperties; | |||||
| aAllocCallbacks: PVkAllocationCallbacks = nil); | |||||
| constructor Create( | constructor Create( | ||||
| const aCreateInfo: TVkBufferCreateInfo; | const aCreateInfo: TVkBufferCreateInfo; | ||||
| @@ -48,6 +60,54 @@ begin | |||||
| raise TvkuErrorException.Create('unable to create buffer', err); | raise TvkuErrorException.Create('unable to create buffer', err); | ||||
| end; | end; | ||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuBuffer.BindMemory(const aMemory: VkDeviceMemory; const aOffset: VkDeviceSize); | |||||
| var err: TVkResult; | |||||
| begin | |||||
| err := fDeviceCommands.vkBindBufferMemory(fDeviceCommands.Device, fHandle, aMemory, aOffset); | |||||
| if (err < VK_SUCCESS) then | |||||
| raise TvkuErrorException.Create('unable to bind buffer memory', err); | |||||
| fMemory := aMemory; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| function TvkuBuffer.GetMemoryRequirements: TVkMemoryRequirements; | |||||
| begin | |||||
| fDeviceCommands.vkGetBufferMemoryRequirements(fDeviceCommands.Device, fHandle, @result); | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuBuffer.AllocateAndBindBufferMemory( | |||||
| const aMemoryProperties: TVkPhysicalDeviceMemoryProperties; | |||||
| aAllocCallbacks: PVkAllocationCallbacks); | |||||
| var | |||||
| i: Integer; | |||||
| bits: VkUint32; | |||||
| MemReq: TVkMemoryRequirements; | |||||
| Mem: VkDeviceMemory; | |||||
| MemAllocInfo: TVkMemoryAllocateInfo; | |||||
| err: TVkResult; | |||||
| begin | |||||
| MemReq := GetMemoryRequirements; | |||||
| FillByte(MemAllocInfo, SizeOf(MemAllocInfo), 0); | |||||
| MemAllocInfo.sType := VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; | |||||
| MemAllocInfo.pNext := nil; | |||||
| MemAllocInfo.allocationSize := MemReq.size; | |||||
| MemAllocInfo.memoryTypeIndex := vkuGetMemoryTypeIndex( | |||||
| aMemoryProperties, | |||||
| MemReq.memoryTypeBits, | |||||
| VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT); | |||||
| if not Assigned(aAllocCallbacks) then | |||||
| aAllocCallbacks := AllocCallbacks; | |||||
| err := fDeviceCommands.vkAllocateMemory(fDeviceCommands.Device, @MemAllocInfo, aAllocCallbacks, @Mem); | |||||
| if (err < VK_SUCCESS) then | |||||
| raise TvkuErrorException.Create('unable to allocate buffer memory', err); | |||||
| fBufferMemory := TvkuDeviceMemory.Create(Mem, true, fDeviceCommands, aAllocCallbacks); | |||||
| BindMemory(fBufferMemory.Handle, 0); | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| constructor TvkuBuffer.Create(const aCreateInfo: TVkBufferCreateInfo; const aDeviceCommands: TVkDeviceCommands; | constructor TvkuBuffer.Create(const aCreateInfo: TVkBufferCreateInfo; const aDeviceCommands: TVkDeviceCommands; | ||||
| const aAllocCallbacks: PVkAllocationCallbacks); | const aAllocCallbacks: PVkAllocationCallbacks); | ||||
| @@ -75,6 +135,7 @@ begin | |||||
| if OwnsHandle and (fHandle <> VK_INVALID_NDP_HANDLE) then | if OwnsHandle and (fHandle <> VK_INVALID_NDP_HANDLE) then | ||||
| fDeviceCommands.vkDestroyBuffer(fDeviceCommands.Device, fHandle, AllocCallbacks); | fDeviceCommands.vkDestroyBuffer(fDeviceCommands.Device, fHandle, AllocCallbacks); | ||||
| fHandle := VK_INVALID_NDP_HANDLE; | fHandle := VK_INVALID_NDP_HANDLE; | ||||
| FreeAndNil(fBufferMemory); | |||||
| inherited Destroy; | inherited Destroy; | ||||
| end; | end; | ||||
| @@ -9,6 +9,39 @@ uses | |||||
| Vulkan, uvkuBase, uvkuTypes; | Vulkan, uvkuBase, uvkuTypes; | ||||
| type | type | ||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| TvkuRenderPassBeginInfo = class(TvkuStructure) | |||||
| private | |||||
| fClearValues: TVkClearValueList; | |||||
| public | |||||
| RenderPass: VkRenderPass; | |||||
| Framebuffer: VkFramebuffer; | |||||
| RenderArea: TVkRect2D; | |||||
| property ClearValues: TVkClearValueList read fClearValues; | |||||
| function GetStructure: TVkRenderPassBeginInfo; | |||||
| procedure SetStructure(const aData: TVkRenderPassBeginInfo); | |||||
| constructor Create; | |||||
| destructor Destroy; override; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| TvkuBeginRenderPassHelper = class(TvkuCommandHelper) | |||||
| private | |||||
| fRenderPassBeginInfo: TvkuRenderPassBeginInfo; | |||||
| fDeviceCommands: TVkDeviceCommands; | |||||
| fCommandBuffer: VkCommandBuffer; | |||||
| public | |||||
| property RenderPassBeginInfo: TvkuRenderPassBeginInfo read fRenderPassBeginInfo; | |||||
| procedure Execute(const aContents: TVkSubpassContents); | |||||
| constructor Create(const aCommandBuffer: VkCommandBuffer; const aDeviceCommands: TVkDeviceCommands); | |||||
| destructor Destroy; override; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| TvkuCommandBuffer = class(TvkuHandle) | TvkuCommandBuffer = class(TvkuHandle) | ||||
| private | private | ||||
| @@ -30,6 +63,38 @@ type | |||||
| const aBufferMemoryBarriers: array of TVkBufferMemoryBarrier; | const aBufferMemoryBarriers: array of TVkBufferMemoryBarrier; | ||||
| const aImageMemoryBarriers: array of TVkImageMemoryBarrier); | const aImageMemoryBarriers: array of TVkImageMemoryBarrier); | ||||
| function BeginRenderPass: TvkuBeginRenderPassHelper; | |||||
| procedure EndRenderPass; | |||||
| procedure SetViewport( | |||||
| const aFirstViewport: VkUint32; | |||||
| const aViewports: array of TVkViewport); | |||||
| procedure SetScissors( | |||||
| const aFirstScissor: VkUint32; | |||||
| const aScissorss: array of TVkRect2D); | |||||
| procedure BindDescriptorSet( | |||||
| const aBindPoint: TVkPipelineBindPoint; | |||||
| const aLayout: VkPipelineLayout; | |||||
| const aFirstSet: VkUint32; | |||||
| const aDescriptorSets: array of VkDescriptorSet; | |||||
| const aDynamicOffsets: array of VkUint32); | |||||
| procedure BindPipeline( | |||||
| const aBindPoint: TVkPipelineBindPoint; | |||||
| const aPipeline: VkPipeline); | |||||
| procedure BindVertexBuffers( | |||||
| const aFirstBinding: VkUint32; | |||||
| const aBuffers: array of VkBuffer; | |||||
| const aOffsets: array of VkDeviceSize); | |||||
| procedure BindIndexBuffers( | |||||
| const aBuffer: VkBuffer; | |||||
| const aOffset: VkDeviceSize; | |||||
| const aIndexType: TVkIndexType); | |||||
| procedure DrawIndexed( | |||||
| const aIndexCount: VkUint32; | |||||
| const aInstanceCount: VkUint32; | |||||
| const aFirstIndex: VkUint32; | |||||
| const aVertexOffset: VkInt32; | |||||
| const aFirstInstance: VkUint32); | |||||
| constructor Create( | constructor Create( | ||||
| const aHandle: VkCommandBuffer; | const aHandle: VkCommandBuffer; | ||||
| const aOwnsHandle: Boolean; | const aOwnsHandle: Boolean; | ||||
| @@ -43,6 +108,70 @@ implementation | |||||
| uses | uses | ||||
| uvkuUtils; | uvkuUtils; | ||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| //TvkuRenderPassBeginInfo//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| function TvkuRenderPassBeginInfo.GetStructure: TVkRenderPassBeginInfo; | |||||
| begin | |||||
| FillByte(result, SizeOf(result), 0); | |||||
| result.sType := VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; | |||||
| result.pNext := nil; | |||||
| result.renderPass := RenderPass; | |||||
| result.framebuffer := Framebuffer; | |||||
| result.renderArea := RenderArea; | |||||
| result.clearValueCount := fClearValues.Length; | |||||
| result.pClearValues := fClearValues.PData; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuRenderPassBeginInfo.SetStructure(const aData: TVkRenderPassBeginInfo); | |||||
| begin | |||||
| RenderPass := aData.renderPass; | |||||
| Framebuffer := aData.framebuffer; | |||||
| RenderArea := aData.renderArea; | |||||
| ClearValues.SetData(aData.pClearValues, aData.clearValueCount); | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| constructor TvkuRenderPassBeginInfo.Create; | |||||
| begin | |||||
| inherited Create; | |||||
| fClearValues := TVkClearValueList.Create; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| destructor TvkuRenderPassBeginInfo.Destroy; | |||||
| begin | |||||
| FreeAndNil(fClearValues); | |||||
| inherited Destroy; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| //TvkuBeginRenderPassHelper////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuBeginRenderPassHelper.Execute(const aContents: TVkSubpassContents); | |||||
| var info: TVkRenderPassBeginInfo; | |||||
| begin | |||||
| info := fRenderPassBeginInfo.GetStructure; | |||||
| fDeviceCommands.vkCmdBeginRenderPass(fCommandBuffer, @info, aContents); | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| constructor TvkuBeginRenderPassHelper.Create(const aCommandBuffer: VkCommandBuffer; const aDeviceCommands: TVkDeviceCommands); | |||||
| begin | |||||
| inherited Create; | |||||
| fCommandBuffer := aCommandBuffer; | |||||
| fDeviceCommands := aDeviceCommands; | |||||
| fRenderPassBeginInfo := TvkuRenderPassBeginInfo.Create; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| destructor TvkuBeginRenderPassHelper.Destroy; | |||||
| begin | |||||
| FreeAndNil(fRenderPassBeginInfo); | |||||
| inherited Destroy; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| //TvkuCommandBuffer////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //TvkuCommandBuffer////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| @@ -86,6 +215,110 @@ begin | |||||
| Length(aImageMemoryBarriers), @aImageMemoryBarriers[0]); | Length(aImageMemoryBarriers), @aImageMemoryBarriers[0]); | ||||
| end; | end; | ||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| function TvkuCommandBuffer.BeginRenderPass: TvkuBeginRenderPassHelper; | |||||
| begin | |||||
| result := TvkuBeginRenderPassHelper.Create(fHandle, fDeviceCommands); | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuCommandBuffer.EndRenderPass; | |||||
| begin | |||||
| fDeviceCommands.vkCmdEndRenderPass(fHandle); | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuCommandBuffer.SetViewport(const aFirstViewport: VkUint32; const aViewports: array of TVkViewport); | |||||
| begin | |||||
| fDeviceCommands.vkCmdSetViewport( | |||||
| fHandle, | |||||
| aFirstViewport, | |||||
| Length(aViewports), | |||||
| @aViewports[0]); | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuCommandBuffer.SetScissors(const aFirstScissor: VkUint32; const aScissorss: array of TVkRect2D); | |||||
| begin | |||||
| fDeviceCommands.vkCmdSetScissor( | |||||
| fHandle, | |||||
| aFirstScissor, | |||||
| Length(aScissorss), | |||||
| @aScissorss[0]); | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuCommandBuffer.BindDescriptorSet(const aBindPoint: TVkPipelineBindPoint; const aLayout: VkPipelineLayout; | |||||
| const aFirstSet: VkUint32; const aDescriptorSets: array of VkDescriptorSet; const aDynamicOffsets: array of VkUint32); | |||||
| var | |||||
| DescSetCount, DynOffsetCount: Integer; | |||||
| DescSets: PVkDescriptorSet; | |||||
| DynOffsets: PVkUint32; | |||||
| begin | |||||
| DescSetCount := Length(aDescriptorSets); | |||||
| DynOffsetCount := Length(aDynamicOffsets); | |||||
| if (DescSetCount > 0) | |||||
| then DescSets := @aDescriptorSets[0] | |||||
| else DescSets := nil; | |||||
| if (DynOffsetCount > 0) | |||||
| then DynOffsets := @aDynamicOffsets[0] | |||||
| else DynOffsets := nil; | |||||
| fDeviceCommands.vkCmdBindDescriptorSets( | |||||
| fHandle, | |||||
| aBindPoint, | |||||
| aLayout, | |||||
| aFirstSet, | |||||
| DescSetCount, | |||||
| DescSets, | |||||
| DynOffsetCount, | |||||
| DynOffsets); | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuCommandBuffer.BindPipeline(const aBindPoint: TVkPipelineBindPoint; const aPipeline: VkPipeline); | |||||
| begin | |||||
| fDeviceCommands.vkCmdBindPipeline(fHandle, aBindPoint, aPipeline); | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuCommandBuffer.BindVertexBuffers(const aFirstBinding: VkUint32; const aBuffers: array of VkBuffer; | |||||
| const aOffsets: array of VkDeviceSize); | |||||
| begin | |||||
| if (Length(aBuffers) <> Length(aOffsets)) then | |||||
| raise TvkuException.Create('aBuffers and aOffsets must have the same number of elements'); | |||||
| fDeviceCommands.vkCmdBindVertexBuffers( | |||||
| fHandle, | |||||
| aFirstBinding, | |||||
| Length(aBuffers), | |||||
| @aBuffers[0], | |||||
| @aOffsets[0]); | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuCommandBuffer.BindIndexBuffers(const aBuffer: VkBuffer; const aOffset: VkDeviceSize; | |||||
| const aIndexType: TVkIndexType); | |||||
| begin | |||||
| fDeviceCommands.vkCmdBindIndexBuffer( | |||||
| fHandle, | |||||
| aBuffer, | |||||
| aOffset, | |||||
| aIndexType); | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuCommandBuffer.DrawIndexed(const aIndexCount: VkUint32; const aInstanceCount: VkUint32; | |||||
| const aFirstIndex: VkUint32; const aVertexOffset: VkInt32; const aFirstInstance: VkUint32); | |||||
| begin | |||||
| fDeviceCommands.vkCmdDrawIndexed( | |||||
| fHandle, | |||||
| aIndexCount, | |||||
| aInstanceCount, | |||||
| aFirstIndex, | |||||
| aVertexOffset, | |||||
| aFirstInstance); | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| constructor TvkuCommandBuffer.Create(const aHandle: VkCommandBuffer; const aOwnsHandle: Boolean; | constructor TvkuCommandBuffer.Create(const aHandle: VkCommandBuffer; const aOwnsHandle: Boolean; | ||||
| const aCommandPool: VkCommandPool; const aDeviceCommands: TVkDeviceCommands); | const aCommandPool: VkCommandPool; const aDeviceCommands: TVkDeviceCommands); | ||||
| @@ -20,9 +20,9 @@ type | |||||
| property Handle: VkCommandPool read fHandle; | property Handle: VkCommandPool read fHandle; | ||||
| property DeviceCommands: TVkDeviceCommands read fDeviceCommands; | property DeviceCommands: TVkDeviceCommands read fDeviceCommands; | ||||
| function CreateCommandBuffer( | |||||
| function AllocateCommandBuffer( | |||||
| const aLevel: TVkCommandBufferLevel): VkCommandBuffer; | const aLevel: TVkCommandBufferLevel): VkCommandBuffer; | ||||
| function CreateCommandBuffers( | |||||
| function AllocateCommandBuffers( | |||||
| const aLevel: TVkCommandBufferLevel; | const aLevel: TVkCommandBufferLevel; | ||||
| const aCount: Integer): TVkCommandBufferArr; | const aCount: Integer): TVkCommandBufferArr; | ||||
| procedure FreeCommandBuffer( | procedure FreeCommandBuffer( | ||||
| @@ -59,13 +59,13 @@ begin | |||||
| end; | end; | ||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| function TvkuCommandPool.CreateCommandBuffer(const aLevel: TVkCommandBufferLevel): VkCommandBuffer; | |||||
| function TvkuCommandPool.AllocateCommandBuffer(const aLevel: TVkCommandBufferLevel): VkCommandBuffer; | |||||
| begin | begin | ||||
| result := CreateCommandBuffers(aLevel, 1)[0]; | |||||
| result := AllocateCommandBuffers(aLevel, 1)[0]; | |||||
| end; | end; | ||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| function TvkuCommandPool.CreateCommandBuffers(const aLevel: TVkCommandBufferLevel; const aCount: Integer): TVkCommandBufferArr; | |||||
| function TvkuCommandPool.AllocateCommandBuffers(const aLevel: TVkCommandBufferLevel; const aCount: Integer): TVkCommandBufferArr; | |||||
| var | var | ||||
| AllocInfo: TVkCommandBufferAllocateInfo; | AllocInfo: TVkCommandBufferAllocateInfo; | ||||
| err: TVkResult; | err: TVkResult; | ||||
| @@ -0,0 +1,136 @@ | |||||
| unit uvkuDescriptorPool; | |||||
| {$mode objfpc}{$H+} | |||||
| interface | |||||
| uses | |||||
| Classes, SysUtils, | |||||
| Vulkan, uvkuBase, uvkuTypes; | |||||
| type | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| TvkuDescriptorPool = class(TvkuAllocHandle) | |||||
| private | |||||
| fHandle: VkDescriptorPool; | |||||
| fDeviceCommands: TVkDeviceCommands; | |||||
| procedure CreateHandle(const aCreateInfo: TVkDescriptorPoolCreateInfo); | |||||
| public | |||||
| property Handle: VkDescriptorPool read fHandle; | |||||
| property DeviceCommands: TVkDeviceCommands read fDeviceCommands; | |||||
| function AllocateDescriptorSet( | |||||
| const aDescriptorSetLayout: VkDescriptorSetLayout): VkDescriptorSet; | |||||
| function AllocateDescriptorSets( | |||||
| const aDescriptorSetLayouts: array of VkDescriptorSetLayout): TVkDescriptorSetArr; | |||||
| procedure FreeDescriptorSet( | |||||
| const aDescriptorSet: VkDescriptorSet); | |||||
| procedure FreeDescriptorSets( | |||||
| const aDescriptorSets: TVkDescriptorSetArr); | |||||
| constructor Create( | |||||
| const aCreateInfo: TVkDescriptorPoolCreateInfo; | |||||
| const aDeviceCommands: TVkDeviceCommands; | |||||
| const aAllocCallbacks: PVkAllocationCallbacks = nil); | |||||
| constructor Create( | |||||
| const aHandle: VkDescriptorPool; | |||||
| const aOwnsHandle: Boolean; | |||||
| const aDeviceCommands: TVkDeviceCommands; | |||||
| const aAllocCallbacks: PVkAllocationCallbacks = nil); | |||||
| destructor Destroy; override; | |||||
| end; | |||||
| implementation | |||||
| uses | |||||
| uvkuUtils; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| //TvkuDescriptorPool///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuDescriptorPool.CreateHandle(const aCreateInfo: TVkDescriptorPoolCreateInfo); | |||||
| var err: TVkResult; | |||||
| begin | |||||
| if not Assigned(fDeviceCommands.vkCreateDescriptorPool) then | |||||
| raise TvkuInvalidFuncPtrException.Create('vkCreateDescriptorPool'); | |||||
| err := fDeviceCommands.vkCreateDescriptorPool(fDeviceCommands.Device, @aCreateInfo, AllocCallbacks, @fHandle); | |||||
| if (err < VK_SUCCESS) then | |||||
| raise TvkuErrorException.Create('unable to create descriptor pool', err); | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| function TvkuDescriptorPool.AllocateDescriptorSet(const aDescriptorSetLayout: VkDescriptorSetLayout): VkDescriptorSet; | |||||
| begin | |||||
| result := AllocateDescriptorSets([ aDescriptorSetLayout ])[0]; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| function TvkuDescriptorPool.AllocateDescriptorSets(const aDescriptorSetLayouts: array of VkDescriptorSetLayout): TVkDescriptorSetArr; | |||||
| var | |||||
| AllocInfo: TVkDescriptorSetAllocateInfo; | |||||
| err: TVkResult; | |||||
| begin | |||||
| if not Assigned(fDeviceCommands.vkAllocateDescriptorSets) then | |||||
| raise TvkuInvalidFuncPtrException.Create('vkAllocateDescriptorSets'); | |||||
| FillByte(AllocInfo, SizeOf(AllocInfo), 0); | |||||
| AllocInfo.sType := VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; | |||||
| AllocInfo.pNext := nil; | |||||
| AllocInfo.descriptorPool := fHandle; | |||||
| AllocInfo.descriptorSetCount := Length(aDescriptorSetLayouts); | |||||
| AllocInfo.pSetLayouts := @aDescriptorSetLayouts[0]; | |||||
| SetLength(result, AllocInfo.descriptorSetCount); | |||||
| err := fDeviceCommands.vkAllocateDescriptorSets(fDeviceCommands.Device, @AllocInfo, @result[0]); | |||||
| if (err < VK_SUCCESS) then | |||||
| raise TvkuErrorException.Create('unable to allocate descriptor sets', err); | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuDescriptorPool.FreeDescriptorSet(const aDescriptorSet: VkDescriptorSet); | |||||
| begin | |||||
| FreeDescriptorSets(TVkDescriptorSetArr.Create(aDescriptorSet)); | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuDescriptorPool.FreeDescriptorSets(const aDescriptorSets: TVkDescriptorSetArr); | |||||
| var err: TVkResult; | |||||
| begin | |||||
| if not Assigned(fDeviceCommands.vkFreeDescriptorSets) then | |||||
| raise TvkuInvalidFuncPtrException.Create('vkFreeDescriptorSets'); | |||||
| err := fDeviceCommands.vkFreeDescriptorSets(fDeviceCommands.Device, fHandle, Length(aDescriptorSets), @aDescriptorSets[0]); | |||||
| if (err < VK_SUCCESS) then | |||||
| raise TvkuErrorException.Create('unable to free descriptor sets', err); | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| constructor TvkuDescriptorPool.Create(const aCreateInfo: TVkDescriptorPoolCreateInfo; | |||||
| const aDeviceCommands: TVkDeviceCommands; const aAllocCallbacks: PVkAllocationCallbacks); | |||||
| begin | |||||
| inherited Create; | |||||
| fDeviceCommands := aDeviceCommands; | |||||
| SetAllocCallbacks(aAllocCallbacks); | |||||
| CreateHandle(aCreateInfo); | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| constructor TvkuDescriptorPool.Create(const aHandle: VkDescriptorPool; const aOwnsHandle: Boolean; | |||||
| const aDeviceCommands: TVkDeviceCommands; const aAllocCallbacks: PVkAllocationCallbacks); | |||||
| begin | |||||
| inherited Create; | |||||
| fHandle := aHandle; | |||||
| fDeviceCommands := aDeviceCommands; | |||||
| OwnsHandle := aOwnsHandle; | |||||
| SetAllocCallbacks(aAllocCallbacks); | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| destructor TvkuDescriptorPool.Destroy; | |||||
| begin | |||||
| if OwnsHandle and (fHandle <> VK_INVALID_NDP_HANDLE) then | |||||
| fDeviceCommands.vkDestroyDescriptorPool(fDeviceCommands.Device, fHandle, AllocCallbacks); | |||||
| fHandle := VK_INVALID_NDP_HANDLE; | |||||
| inherited Destroy; | |||||
| end; | |||||
| end. | |||||
| @@ -0,0 +1,115 @@ | |||||
| unit uvkuDescriptorPoolFactory; | |||||
| {$mode objfpc}{$H+} | |||||
| interface | |||||
| uses | |||||
| Classes, SysUtils, | |||||
| Vulkan, uvkuFactoryBase, uvkuDescriptorPool, uvkuTypes; | |||||
| type | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| TvkuDescriptorPoolSize = class(TvkuStructure) | |||||
| DescriptorType: TVkDescriptorType; | |||||
| DescriptorCount: VkUint32; | |||||
| function GetStructure: TVkDescriptorPoolSize; | |||||
| procedure SetStructure(const aData: TVkDescriptorPoolSize); | |||||
| end; | |||||
| TvkuDescriptorPoolSizeList = specialize TvkuObjList<TvkuDescriptorPoolSize>; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| TvkuDescriptorPoolFactory = class(TvkuDeviceObjFactory) | |||||
| private | |||||
| fPoolSizes: TvkuDescriptorPoolSizeList; | |||||
| fvkPoolSizes: TVkDescriptorPoolSizeArr; | |||||
| public | |||||
| Flags: VkDescriptorPoolCreateFlags; | |||||
| MaxSets: VkUint32; | |||||
| property PoolSizes: TvkuDescriptorPoolSizeList read fPoolSizes; | |||||
| function GetStructure: TVkDescriptorPoolCreateInfo; | |||||
| procedure SetStructure(const aData: TVkDescriptorPoolCreateInfo); | |||||
| function CreateDescriptorPool: TvkuDescriptorPool; | |||||
| procedure AfterConstruction; override; | |||||
| procedure BeforeDestruction; override; | |||||
| end; | |||||
| implementation | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| //TvkuDescriptorPoolSize///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| function TvkuDescriptorPoolSize.GetStructure: TVkDescriptorPoolSize; | |||||
| begin | |||||
| FillByte(result, SizeOf(result), 0); | |||||
| result.dType := DescriptorType; | |||||
| result.descriptorCount := DescriptorCount; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuDescriptorPoolSize.SetStructure(const aData: TVkDescriptorPoolSize); | |||||
| begin | |||||
| DescriptorType := aData.dType; | |||||
| DescriptorCount := aData.descriptorCount; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| //TvkuDescriptorPoolFactory////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| function TvkuDescriptorPoolFactory.GetStructure: TVkDescriptorPoolCreateInfo; | |||||
| var i: Integer; | |||||
| begin | |||||
| SetLength(fvkPoolSizes, fPoolSizes.Length); | |||||
| for i := low(fvkPoolSizes) to high(fvkPoolSizes) do | |||||
| fvkPoolSizes[i] := fPoolSizes[i].GetStructure; | |||||
| FillByte(result, SizeOf(result), 0); | |||||
| result.sType := VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; | |||||
| result.pNext := nil; | |||||
| result.flags := Flags; | |||||
| result.maxSets := MaxSets; | |||||
| result.poolSizeCount := Length(fvkPoolSizes); | |||||
| result.pPoolSizes := @fvkPoolSizes[0]; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuDescriptorPoolFactory.SetStructure(const aData: TVkDescriptorPoolCreateInfo); | |||||
| var i: Integer; | |||||
| begin | |||||
| if Assigned(aData.pPoolSizes) then begin | |||||
| fPoolSizes.Length := aData.poolSizeCount; | |||||
| for i := 0 to fPoolSizes.Length-1 do | |||||
| fPoolSizes[i].SetStructure((aData.pPoolSizes + i)^); | |||||
| end; | |||||
| Flags := aData.flags; | |||||
| MaxSets := aData.maxSets; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| function TvkuDescriptorPoolFactory.CreateDescriptorPool: TvkuDescriptorPool; | |||||
| begin | |||||
| result := TvkuDescriptorPool.Create(GetStructure, DeviceCommands, AllocCallbacks); | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuDescriptorPoolFactory.AfterConstruction; | |||||
| begin | |||||
| inherited AfterConstruction; | |||||
| fPoolSizes := TvkuDescriptorPoolSizeList.Create; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuDescriptorPoolFactory.BeforeDestruction; | |||||
| begin | |||||
| FreeAndNil(fPoolSizes); | |||||
| inherited BeforeDestruction; | |||||
| end; | |||||
| end. | |||||
| @@ -0,0 +1,56 @@ | |||||
| unit uvkuDescriptorSet; | |||||
| {$mode objfpc}{$H+} | |||||
| interface | |||||
| uses | |||||
| Classes, SysUtils, | |||||
| Vulkan, uvkuBase; | |||||
| type | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| TvkuDescriptorSet = class(TvkuHandle) | |||||
| private | |||||
| fHandle: VkDescriptorSet; | |||||
| fDescriptorPool: VkDescriptorPool; | |||||
| fDeviceCommands: TVkDeviceCommands; | |||||
| public | |||||
| property Handle: VkDescriptorSet read fHandle; | |||||
| property DescriptorPool: VkDescriptorPool read fDescriptorPool; | |||||
| property DeviceCommands: TVkDeviceCommands read fDeviceCommands; | |||||
| constructor Create( | |||||
| const aHandle: VkDescriptorSet; | |||||
| const aOwnsHandle: Boolean; | |||||
| const aDescriptorPool: VkDescriptorPool; | |||||
| const aDeviceCommands: TVkDeviceCommands); | |||||
| destructor Destroy; override; | |||||
| end; | |||||
| implementation | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| //TvkuDescriptorSet////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| constructor TvkuDescriptorSet.Create(const aHandle: VkDescriptorSet; const aOwnsHandle: Boolean; | |||||
| const aDescriptorPool: VkDescriptorPool; const aDeviceCommands: TVkDeviceCommands); | |||||
| begin | |||||
| inherited Create; | |||||
| fHandle := aHandle; | |||||
| OwnsHandle := aOwnsHandle; | |||||
| fDescriptorPool := aDescriptorPool; | |||||
| fDeviceCommands := aDeviceCommands; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| destructor TvkuDescriptorSet.Destroy; | |||||
| begin | |||||
| if (fHandle <> VK_INVALID_NDP_HANDLE) and OwnsHandle then | |||||
| fDeviceCommands.vkFreeDescriptorSets(fDeviceCommands.Device, fDescriptorPool, 1, @fHandle); | |||||
| fHandle := VK_INVALID_NDP_HANDLE; | |||||
| inherited Destroy; | |||||
| end; | |||||
| end. | |||||
| @@ -6,9 +6,89 @@ interface | |||||
| uses | uses | ||||
| Classes, SysUtils, | Classes, SysUtils, | ||||
| Vulkan, uvkuBase; | |||||
| Vulkan, uvkuBase, uvkuTypes; | |||||
| type | type | ||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| TvkuDescriptorImageInfo = class(TvkuStructure) | |||||
| Sampler: VkSampler; | |||||
| ImageView: VkImageView; | |||||
| ImageLayout: TVkImageLayout; | |||||
| function GetStructure: TVkDescriptorImageInfo; | |||||
| procedure SetStructure(const aData: TVkDescriptorImageInfo); | |||||
| end; | |||||
| TvkuDescriptorImageInfoList = specialize TvkuObjList<TvkuDescriptorImageInfo>; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| TvkuDescriptorBufferInfo = class(TvkuStructure) | |||||
| Buffer: VkBuffer; | |||||
| Offset: VkDeviceSize; | |||||
| Range: VkDeviceSize; | |||||
| function GetStructure: TVkDescriptorBufferInfo; | |||||
| procedure SetStructure(const aData: TVkDescriptorBufferInfo); | |||||
| end; | |||||
| TvkuDescriptorBufferInfoList = specialize TvkuObjList<TvkuDescriptorBufferInfo>; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| TvkuWriteDescriptorSet = class(TvkuStructure) | |||||
| private | |||||
| fImageInfos: TvkuDescriptorImageInfoList; | |||||
| fBufferInfos: TvkuDescriptorBufferInfoList; | |||||
| fTexelBufferViews: TVkBufferViewList; | |||||
| fvkImageInfos: TVkDescriptorImageInfoArr; | |||||
| fvkBufferInfos: TVkDescriptorBufferInfoArr; | |||||
| public | |||||
| DstSet: VkDescriptorSet; | |||||
| DstBinding: VkUint32; | |||||
| DstArrayElement: VkUint32; | |||||
| DescriptorType: TVkDescriptorType; | |||||
| property ImageInfos: TvkuDescriptorImageInfoList read fImageInfos; | |||||
| property BufferInfos: TvkuDescriptorBufferInfoList read fBufferInfos; | |||||
| function GetStructure: TVkWriteDescriptorSet; | |||||
| procedure SetStructure(const aData: TVkWriteDescriptorSet); | |||||
| procedure AfterConstruction; override; | |||||
| procedure BeforeDestruction; override; | |||||
| end; | |||||
| TvkuWriteDescriptorSetList = specialize TvkuObjList<TvkuWriteDescriptorSet>; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| TvkuCopyDescriptorSet = class(TvkuStructure) | |||||
| public | |||||
| SrcSet: VkDescriptorSet; | |||||
| SrcBinding: VkUint32; | |||||
| SrcArrayElement: VkUint32; | |||||
| DstSet: VkDescriptorSet; | |||||
| DstBinding: VkUint32; | |||||
| DstArrayElement: VkUint32; | |||||
| DescriptorCount: VkUint32; | |||||
| function GetStructure: TVkCopyDescriptorSet; | |||||
| procedure SetStructure(const aData: TVkCopyDescriptorSet); | |||||
| end; | |||||
| TvkuCopyDescriptorSetList = specialize TvkuObjList<TvkuCopyDescriptorSet>; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| TvkuUpdateDescriptorSetHelper = class(TvkuCommandHelper) | |||||
| private | |||||
| fDeviceCommands: TVkDeviceCommands; | |||||
| fWriteDescriptorSets: TvkuWriteDescriptorSetList; | |||||
| fCopyDescriptorSets: TvkuCopyDescriptorSetList; | |||||
| public | |||||
| property WriteDescriptorSets: TvkuWriteDescriptorSetList read fWriteDescriptorSets; | |||||
| property CopyDescriptorSets: TvkuCopyDescriptorSetList read fCopyDescriptorSets; | |||||
| procedure Execute; | |||||
| constructor Create(const aDeviceCommands: TVkDeviceCommands); | |||||
| destructor Destroy; override; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| TvkuDevice = class(TvkuAllocHandle) | TvkuDevice = class(TvkuAllocHandle) | ||||
| private | private | ||||
| @@ -34,6 +114,8 @@ type | |||||
| const aMemory: VkDeviceMemory; | const aMemory: VkDeviceMemory; | ||||
| aAllocCallbacks: PVkAllocationCallbacks = nil); | aAllocCallbacks: PVkAllocationCallbacks = nil); | ||||
| function UpdateDescriptorSet: TvkuUpdateDescriptorSetHelper; | |||||
| constructor Create( | constructor Create( | ||||
| const aPhysicalDevice: VkPhysicalDevice; | const aPhysicalDevice: VkPhysicalDevice; | ||||
| const aCreateInfo: TVkDeviceCreateInfo; | const aCreateInfo: TVkDeviceCreateInfo; | ||||
| @@ -52,6 +134,196 @@ implementation | |||||
| uses | uses | ||||
| uvkuUtils; | uvkuUtils; | ||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| //TvkuDescriptorImageInfo//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| function TvkuDescriptorImageInfo.GetStructure: TVkDescriptorImageInfo; | |||||
| begin | |||||
| FillByte(result, SizeOf(result), 0); | |||||
| result.sampler := Sampler; | |||||
| result.imageView := ImageView; | |||||
| result.imageLayout := ImageLayout; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuDescriptorImageInfo.SetStructure(const aData: TVkDescriptorImageInfo); | |||||
| begin | |||||
| Sampler := aData.sampler; | |||||
| ImageView := aData.imageView; | |||||
| ImageLayout := aData.imageLayout; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| //TvkuDescriptorBufferInfo/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| function TvkuDescriptorBufferInfo.GetStructure: TVkDescriptorBufferInfo; | |||||
| begin | |||||
| FillByte(result, SizeOf(result), 0); | |||||
| result.buffer := Buffer; | |||||
| result.offset := Offset; | |||||
| result.range := Range; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuDescriptorBufferInfo.SetStructure(const aData: TVkDescriptorBufferInfo); | |||||
| begin | |||||
| Buffer := aData.buffer; | |||||
| Offset := aData.offset; | |||||
| Range := aData.range; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| //TvkuWriteDescriptorSet///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| function TvkuWriteDescriptorSet.GetStructure: TVkWriteDescriptorSet; | |||||
| var c, i: Integer; | |||||
| begin | |||||
| c := fImageInfos.Length; | |||||
| if (c < fBufferInfos.Length) then | |||||
| c := fBufferInfos.Length; | |||||
| if (c < fTexelBufferViews.Length) then | |||||
| c := fTexelBufferViews.Length; | |||||
| SetLength(fvkImageInfos, fImageInfos.Length); | |||||
| if (fImageInfos.Length <> 0) and (fImageInfos.Length <> c) then | |||||
| raise TvkuException.Create('ImageInfos, BufferInfos and TexelBufferViews must be empty or must have the same size!'); | |||||
| for i := low(fvkImageInfos) to high(fvkImageInfos) do | |||||
| fvkImageInfos[i] := fImageInfos[i].GetStructure; | |||||
| SetLength(fvkBufferInfos, fBufferInfos.Length); | |||||
| if (fBufferInfos.Length <> 0) and (fBufferInfos.Length <> c) then | |||||
| raise TvkuException.Create('ImageInfos, BufferInfos and TexelBufferViews must be empty or must have the same size!'); | |||||
| for i := low(fvkBufferInfos) to high(fvkBufferInfos) do | |||||
| fvkBufferInfos[i] := fBufferInfos[i].GetStructure; | |||||
| if (fTexelBufferViews.Length <> 0) and (fTexelBufferViews.Length <> c) then | |||||
| raise TvkuException.Create('ImageInfos, BufferInfos and TexelBufferViews must be empty or must have the same size!'); | |||||
| FillByte(result, SizeOf(result), 0); | |||||
| result.sType := VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; | |||||
| result.pNext := nil; | |||||
| result.dstSet := DstSet; | |||||
| result.dstBinding := DstBinding; | |||||
| result.dstArrayElement := DstArrayElement; | |||||
| result.descriptorCount := c; | |||||
| result.descriptorType := DescriptorType; | |||||
| result.pImageInfo := @fvkImageInfos[0]; | |||||
| result.pBufferInfo := @fvkBufferInfos[0]; | |||||
| result.pTexelBufferView := fTexelBufferViews.PData; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuWriteDescriptorSet.SetStructure(const aData: TVkWriteDescriptorSet); | |||||
| var i: Integer; | |||||
| begin | |||||
| if Assigned(aData.pImageInfo) then begin | |||||
| fImageInfos.Length := aData.descriptorCount; | |||||
| for i := 0 to fImageInfos.Length-1 do | |||||
| fImageInfos[i].SetStructure((aData.pImageInfo + i)^); | |||||
| end; | |||||
| if Assigned(aData.pBufferInfo) then begin | |||||
| fBufferInfos.Length := aData.descriptorCount; | |||||
| for i := 0 to fBufferInfos.Length-1 do | |||||
| fBufferInfos[i].SetStructure((aData.pBufferInfo + i)^); | |||||
| end; | |||||
| fTexelBufferViews.SetData(aData.pTexelBufferView, aData.descriptorCount); | |||||
| DstSet := aData.dstSet; | |||||
| DstBinding := aData.dstBinding; | |||||
| DstArrayElement := aData.dstArrayElement; | |||||
| DescriptorType := aData.descriptorType; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuWriteDescriptorSet.AfterConstruction; | |||||
| begin | |||||
| inherited AfterConstruction; | |||||
| fImageInfos := TvkuDescriptorImageInfoList.Create; | |||||
| fBufferInfos := TvkuDescriptorBufferInfoList.Create; | |||||
| fTexelBufferViews := TVkBufferViewList.Create; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuWriteDescriptorSet.BeforeDestruction; | |||||
| begin | |||||
| FreeAndNil(fImageInfos); | |||||
| FreeAndNil(fBufferInfos); | |||||
| FreeAndNil(fTexelBufferViews); | |||||
| inherited BeforeDestruction; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| //TvkuCopyDescriptorSet////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| function TvkuCopyDescriptorSet.GetStructure: TVkCopyDescriptorSet; | |||||
| begin | |||||
| result.sType := VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET; | |||||
| result.pNext := nil; | |||||
| result.srcSet := SrcSet; | |||||
| result.srcBinding := SrcBinding; | |||||
| result.srcArrayElement := SrcArrayElement; | |||||
| result.dstSet := DstSet; | |||||
| result.dstBinding := DstBinding; | |||||
| result.dstArrayElement := DstArrayElement; | |||||
| result.descriptorCount := DescriptorCount; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuCopyDescriptorSet.SetStructure(const aData: TVkCopyDescriptorSet); | |||||
| begin | |||||
| SrcSet := aData.srcSet; | |||||
| SrcBinding := aData.srcBinding; | |||||
| SrcArrayElement := aData.srcArrayElement; | |||||
| DstSet := aData.dstSet; | |||||
| DstBinding := aData.dstBinding; | |||||
| DstArrayElement := aData.dstArrayElement; | |||||
| DescriptorCount := aData.descriptorCount; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| //TvkuUpdateDescriptorSetHelper////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuUpdateDescriptorSetHelper.Execute; | |||||
| var | |||||
| i: Integer; | |||||
| vkWriteDescriptorSets: array of TVkWriteDescriptorSet; | |||||
| vkCopyDescriptorSets: array of TVkCopyDescriptorSet; | |||||
| begin | |||||
| SetLength(vkWriteDescriptorSets, fWriteDescriptorSets.Length); | |||||
| for i := low(vkWriteDescriptorSets) to high(vkWriteDescriptorSets) do | |||||
| vkWriteDescriptorSets[i] := fWriteDescriptorSets[i].GetStructure; | |||||
| SetLength(vkCopyDescriptorSets, fCopyDescriptorSets.Length); | |||||
| for i := low(vkCopyDescriptorSets) to high(vkCopyDescriptorSets) do | |||||
| vkCopyDescriptorSets[i] := fCopyDescriptorSets[i].GetStructure; | |||||
| fDeviceCommands.vkUpdateDescriptorSets( | |||||
| fDeviceCommands.Device, | |||||
| Length(vkWriteDescriptorSets), | |||||
| @vkWriteDescriptorSets[0], | |||||
| Length(vkCopyDescriptorSets), | |||||
| @vkCopyDescriptorSets[0]); | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| constructor TvkuUpdateDescriptorSetHelper.Create(const aDeviceCommands: TVkDeviceCommands); | |||||
| begin | |||||
| inherited Create; | |||||
| fDeviceCommands := aDeviceCommands; | |||||
| fWriteDescriptorSets := TvkuWriteDescriptorSetList.Create; | |||||
| fCopyDescriptorSets := TvkuCopyDescriptorSetList.Create; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| destructor TvkuUpdateDescriptorSetHelper.Destroy; | |||||
| begin | |||||
| FreeAndNil(fCopyDescriptorSets); | |||||
| FreeAndNil(fWriteDescriptorSets); | |||||
| inherited Destroy; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| //TvkuDevice///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //TvkuDevice///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| @@ -105,6 +377,12 @@ begin | |||||
| fDeviceCommands.vkFreeMemory(fHandle, aMemory, aAllocCallbacks); | fDeviceCommands.vkFreeMemory(fHandle, aMemory, aAllocCallbacks); | ||||
| end; | end; | ||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| function TvkuDevice.UpdateDescriptorSet: TvkuUpdateDescriptorSetHelper; | |||||
| begin | |||||
| result := TvkuUpdateDescriptorSetHelper.Create(fDeviceCommands); | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| constructor TvkuDevice.Create(const aPhysicalDevice: VkPhysicalDevice; const aCreateInfo: TVkDeviceCreateInfo; | constructor TvkuDevice.Create(const aPhysicalDevice: VkPhysicalDevice; const aCreateInfo: TVkDeviceCreateInfo; | ||||
| const aInstanceCommands: TVkInstanceCommands; const aAllocCallbacks: PVkAllocationCallbacks); | const aInstanceCommands: TVkInstanceCommands; const aAllocCallbacks: PVkAllocationCallbacks); | ||||
| @@ -6,13 +6,9 @@ interface | |||||
| uses | uses | ||||
| Classes, SysUtils, | Classes, SysUtils, | ||||
| Vulkan, uvkuInstance, uvkuDevice, uvkuAllocationHandler; | |||||
| Vulkan, uvkuInstance, uvkuDevice, uvkuAllocationHandler, uvkuTypes; | |||||
| type | type | ||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| TvkuStructure = class | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| TvkuFactory = class(TvkuStructure) | TvkuFactory = class(TvkuStructure) | ||||
| private | private | ||||
| @@ -14,12 +14,14 @@ type | |||||
| private | private | ||||
| fHandle: VkImage; | fHandle: VkImage; | ||||
| fDeviceCommands: TVkDeviceCommands; | fDeviceCommands: TVkDeviceCommands; | ||||
| fMemory: VkDeviceMemory; | |||||
| fImageMemory: TvkuDeviceMemory; | fImageMemory: TvkuDeviceMemory; | ||||
| procedure CreateHandle(const aCreateInfo: TVkImageCreateInfo); | procedure CreateHandle(const aCreateInfo: TVkImageCreateInfo); | ||||
| public | public | ||||
| property Handle: VkImage read fHandle; | property Handle: VkImage read fHandle; | ||||
| property DeviceCommands: TVkDeviceCommands read fDeviceCommands; | property DeviceCommands: TVkDeviceCommands read fDeviceCommands; | ||||
| property Memory: VkDeviceMemory read fMemory; | |||||
| function GetMemoryBarrier( | function GetMemoryBarrier( | ||||
| const aAspectMask: VkImageAspectFlags; | const aAspectMask: VkImageAspectFlags; | ||||
| @@ -159,6 +161,7 @@ begin | |||||
| err := fDeviceCommands.vkBindImageMemory(fDeviceCommands.Device, fHandle, aMemory, aOffset); | err := fDeviceCommands.vkBindImageMemory(fDeviceCommands.Device, fHandle, aMemory, aOffset); | ||||
| if (err < VK_SUCCESS) then | if (err < VK_SUCCESS) then | ||||
| TvkuErrorException.Create('unable to bind image memory', err); | TvkuErrorException.Create('unable to bind image memory', err); | ||||
| fMemory := aMemory; | |||||
| end; | end; | ||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| @@ -181,20 +184,13 @@ begin | |||||
| MemReq := GetMemoryRequirements; | MemReq := GetMemoryRequirements; | ||||
| FillByte(MemAllocInfo, SizeOf(MemAllocInfo), 0); | FillByte(MemAllocInfo, SizeOf(MemAllocInfo), 0); | ||||
| MemAllocInfo.sType := VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; | |||||
| MemAllocInfo.pNext := nil; | |||||
| MemAllocInfo.allocationSize := MemReq.size; | |||||
| bits := MemReq.memoryTypeBits; | |||||
| for i := 0 to VK_MAX_MEMORY_TYPES-1 do begin | |||||
| if ((bits and 1) = 1) and | |||||
| (VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT in aMemoryProperties.memoryTypes[i].propertyFlags) then | |||||
| begin | |||||
| MemAllocInfo.memoryTypeIndex := i; | |||||
| break; | |||||
| end; | |||||
| bits := bits shr 1; | |||||
| end; | |||||
| MemAllocInfo.sType := VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; | |||||
| MemAllocInfo.pNext := nil; | |||||
| MemAllocInfo.allocationSize := MemReq.size; | |||||
| MemAllocInfo.memoryTypeIndex := vkuGetMemoryTypeIndex( | |||||
| aMemoryProperties, | |||||
| MemReq.memoryTypeBits, | |||||
| VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);; | |||||
| if not Assigned(aAllocCallbacks) then | if not Assigned(aAllocCallbacks) then | ||||
| aAllocCallbacks := AllocCallbacks; | aAllocCallbacks := AllocCallbacks; | ||||
| @@ -6,7 +6,7 @@ interface | |||||
| uses | uses | ||||
| Classes, SysUtils, | Classes, SysUtils, | ||||
| Vulkan, uvkuImageView, uvkuFactoryBase; | |||||
| Vulkan, uvkuImageView, uvkuFactoryBase, uvkuTypes; | |||||
| type | type | ||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| @@ -22,6 +22,228 @@ type | |||||
| end; | end; | ||||
| TvkuPipelineShaderStageCreateInfoList = specialize TvkuObjList<TvkuPipelineShaderStageCreateInfo>; | TvkuPipelineShaderStageCreateInfoList = specialize TvkuObjList<TvkuPipelineShaderStageCreateInfo>; | ||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| TvkuVertexInputBindingDescription = class(TvkuStructure) | |||||
| public | |||||
| Binding: VkUint32; | |||||
| Stride: VkUint32; | |||||
| InputRate: TVkVertexInputRate; | |||||
| function GetStructure: TVkVertexInputBindingDescription; | |||||
| procedure SetStructure(const aData: TVkVertexInputBindingDescription); | |||||
| end; | |||||
| TvkuVertexInputBindingDescriptionList = specialize TvkuObjList<TvkuVertexInputBindingDescription>; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| TvkuVertexInputAttributeDescription = class(TvkuStructure) | |||||
| public | |||||
| Location: VkUint32; | |||||
| Binding: VkUint32; | |||||
| Format: TVkFormat; | |||||
| Offset: VkUint32; | |||||
| function GetStructure: TVkVertexInputAttributeDescription; | |||||
| procedure SetStructure(const aData: TVkVertexInputAttributeDescription); | |||||
| end; | |||||
| TvkuVertexInputAttributeDescriptionList = specialize TvkuObjList<TvkuVertexInputAttributeDescription>; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| TvkuPipelineVertexInputStateCreateInfo = class(TvkuStructure) | |||||
| private | |||||
| fFlags: VkPipelineVertexInputStateCreateFlags; | |||||
| fVertexBindingDescriptions: TvkuVertexInputBindingDescriptionList; | |||||
| fVertexAttributeDescriptions: TvkuVertexInputAttributeDescriptionList; | |||||
| fvkVertexBindingDescriptions: TVkVertexInputBindingDescriptionArr; | |||||
| fvkVertexAttributeDescriptions: TVkVertexInputAttributeDescriptionArr; | |||||
| public | |||||
| property Flags: VkPipelineVertexInputStateCreateFlags read fFlags write fFlags; | |||||
| property VertexBindingDescriptions: TvkuVertexInputBindingDescriptionList read fVertexBindingDescriptions; | |||||
| property VertexAttributeDescriptions: TvkuVertexInputAttributeDescriptionList read fVertexAttributeDescriptions; | |||||
| function GetStructure: TVkPipelineVertexInputStateCreateInfo; | |||||
| procedure SetStructure(const aData: TVkPipelineVertexInputStateCreateInfo); | |||||
| constructor Create; | |||||
| destructor Destroy; override; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| TvkuPipelineInputAssemblyStateCreateInfo = class(TvkuStructure) | |||||
| Flags: VkPipelineInputAssemblyStateCreateFlags; | |||||
| Topology: TVkPrimitiveTopology; | |||||
| PrimitiveRestartEnable: Boolean; | |||||
| function GetStructure: TVkPipelineInputAssemblyStateCreateInfo; | |||||
| procedure SetStructure(const aData: TVkPipelineInputAssemblyStateCreateInfo); | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| TvkuPipelineTessellationStateCreateInfo = class(TvkuStructure) | |||||
| public | |||||
| Flags: VkPipelineTessellationStateCreateFlags; | |||||
| PatchControlPoints: VkUint32; | |||||
| function GetStructure: TVkPipelineTessellationStateCreateInfo; | |||||
| procedure SetStructure(const aData: TVkPipelineTessellationStateCreateInfo); | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| TvkuViewport = class(TvkuStructure) | |||||
| x: VkFloat; | |||||
| y: VkFloat; | |||||
| Width: VkFloat; | |||||
| Height: VkFloat; | |||||
| MinDepth: VkFloat; | |||||
| MaxDepth: VkFloat; | |||||
| function GetStructure: TVkViewport; | |||||
| procedure SetStructure(const aData: TVkViewport); | |||||
| end; | |||||
| TvkuViewportList = specialize TvkuObjList<TvkuViewport>; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| TvkuRect2D = class(TvkuStructure) | |||||
| Offset: TVkOffset2D; | |||||
| Extent: TVkExtent2D; | |||||
| function GetStructure: TVkRect2D; | |||||
| procedure SetStructure(const aData: TVkRect2D); | |||||
| end; | |||||
| TvkuRect2DList = specialize TvkuObjList<TvkuRect2D>; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| TvkuPipelineViewportStateCreateInfo = class(TvkuStructure) | |||||
| private | |||||
| fFlags: VkPipelineViewportStateCreateFlags; | |||||
| fViewports: TvkuViewportList; | |||||
| fScissors: TvkuRect2DList; | |||||
| fvkViewports: TVkViewportArr; | |||||
| fvkScissors: TVkRect2DArr; | |||||
| public | |||||
| property Flags: VkPipelineViewportStateCreateFlags read fFlags write fFlags; | |||||
| property Viewports: TvkuViewportList read fViewports; | |||||
| property Scissors: TvkuRect2DList read fScissors; | |||||
| function GetStructure: TVkPipelineViewportStateCreateInfo; | |||||
| procedure SetStructure(const aData: TVkPipelineViewportStateCreateInfo); | |||||
| constructor Create; | |||||
| destructor Destroy; override; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| TvkuPipelineRasterizationStateCreateInfo = class(TvkuStructure) | |||||
| Flags: VkPipelineRasterizationStateCreateFlags; | |||||
| DepthClampEnable: Boolean; | |||||
| RasterizerDiscardEnable: Boolean; | |||||
| PolygonMode: TVkPolygonMode; | |||||
| CullMode: VkCullModeFlags; | |||||
| FrontFace: TVkFrontFace; | |||||
| DepthBiasEnable: Boolean; | |||||
| DepthBiasConstantFactor: VkFloat; | |||||
| DepthBiasClamp: VkFloat; | |||||
| DepthBiasSlopeFactor: VkFloat; | |||||
| LineWidth: VkFloat; | |||||
| function GetStructure: TVkPipelineRasterizationStateCreateInfo; | |||||
| procedure SetStructure(const aData: TVkPipelineRasterizationStateCreateInfo); | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| TvkuPipelineMultisampleStateCreateInfo = class(TvkuStructure) | |||||
| private | |||||
| fSampleMask: TVkSampleMaskList; | |||||
| public | |||||
| Flags: VkPipelineMultisampleStateCreateFlags; | |||||
| RasterizationSamples: TVkSampleCountFlagBits; | |||||
| SampleShadingEnable: Boolean; | |||||
| MinSampleShading: VkFloat; | |||||
| AlphaToCoverageEnable: Boolean; | |||||
| AlphaToOneEnable: Boolean; | |||||
| property SampleMask: TVkSampleMaskList read fSampleMask; | |||||
| function GetStructure: TVkPipelineMultisampleStateCreateInfo; | |||||
| procedure SetStructure(const aData: TVkPipelineMultisampleStateCreateInfo); | |||||
| constructor Create; | |||||
| destructor Destroy; override; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| TvkuPipelineDepthStencilStateCreateInfo = class(TvkuStructure) | |||||
| public | |||||
| Flags: VkPipelineDepthStencilStateCreateFlags; | |||||
| DepthTestEnable: Boolean; | |||||
| DepthWriteEnable: Boolean; | |||||
| DepthCompareOp: TVkCompareOp; | |||||
| DepthBoundsTestEnable: Boolean; | |||||
| StencilTestEnable: Boolean; | |||||
| Front: TVkStencilOpState; | |||||
| Back: TVkStencilOpState; | |||||
| MinDepthBounds: VkFloat; | |||||
| MaxDepthBounds: VkFloat; | |||||
| function GetStructure: TVkPipelineDepthStencilStateCreateInfo; | |||||
| procedure SetStructure(const aData: TVkPipelineDepthStencilStateCreateInfo); | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| TvkuPipelineColorBlendAttachmentState = class(TvkuStructure) | |||||
| public | |||||
| BlendEnable: Boolean; | |||||
| SrcColorBlendFactor: TVkBlendFactor; | |||||
| DstColorBlendFactor: TVkBlendFactor; | |||||
| ColorBlendOp: TVkBlendOp; | |||||
| SrcAlphaBlendFactor: TVkBlendFactor; | |||||
| DstAlphaBlendFactor: TVkBlendFactor; | |||||
| AlphaBlendOp: TVkBlendOp; | |||||
| ColorWriteMask: VkColorComponentFlags; | |||||
| function GetStructure: TVkPipelineColorBlendAttachmentState; | |||||
| procedure SetStructure(const aData: TVkPipelineColorBlendAttachmentState); | |||||
| end; | |||||
| TvkuPipelineColorBlendAttachmentStateList = specialize TvkuObjList<TvkuPipelineColorBlendAttachmentState>; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| TvkuPipelineColorBlendStateCreateInfo = class(TvkuStructure) | |||||
| private | |||||
| fAttachments: TvkuPipelineColorBlendAttachmentStateList; | |||||
| fvkAttachments: TVkPipelineColorBlendAttachmentStateArr; | |||||
| public | |||||
| Flags: VkPipelineColorBlendStateCreateFlags; | |||||
| LogicOpEnable: Boolean; | |||||
| LogicOp: TVkLogicOp; | |||||
| BlendConstants: array[0..3] of VkFloat; | |||||
| property Attachments: TvkuPipelineColorBlendAttachmentStateList read fAttachments; | |||||
| function GetStructure: TVkPipelineColorBlendStateCreateInfo; | |||||
| procedure SetStructure(const aData: TVkPipelineColorBlendStateCreateInfo); | |||||
| constructor Create; | |||||
| destructor Destroy; override; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| TvkuPipelineDynamicStateCreateInfo = class(TvkuStructure) | |||||
| private | |||||
| fDynamicStates: TVkDynamicStateList; | |||||
| fvkDynamicStates: TVkDynamicStateArr; | |||||
| public | |||||
| Flags: VkPipelineDynamicStateCreateFlags; | |||||
| property DynamicStates: TVkDynamicStateList read fDynamicStates; | |||||
| function GetStructure: TVkPipelineDynamicStateCreateInfo; | |||||
| procedure SetStructure(const aData: TVkPipelineDynamicStateCreateInfo); | |||||
| constructor Create; | |||||
| destructor Destroy; override; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| TvkuPipelineFactory = class(TvkuDeviceObjFactory) | TvkuPipelineFactory = class(TvkuDeviceObjFactory) | ||||
| private | private | ||||
| @@ -39,16 +261,44 @@ type | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| TvkuGraphicsPipelineFactory = class(TvkuPipelineFactory) | TvkuGraphicsPipelineFactory = class(TvkuPipelineFactory) | ||||
| private | private | ||||
| fRenderPass: VkRenderPass; | |||||
| fSubPass: VkUint32; | |||||
| fStages: TvkuPipelineShaderStageCreateInfoList; | |||||
| fRenderPass: VkRenderPass; | |||||
| fSubpass: VkUint32; | |||||
| fvkStages: TVkPipelineShaderStageCreateInfoArr; | |||||
| fStages: TvkuPipelineShaderStageCreateInfoList; | |||||
| fVertexInputState: TvkuPipelineVertexInputStateCreateInfo; | |||||
| fInputAssemblyState: TvkuPipelineInputAssemblyStateCreateInfo; | |||||
| fTessellationState: TvkuPipelineTessellationStateCreateInfo; | |||||
| fViewportState: TvkuPipelineViewportStateCreateInfo; | |||||
| fRasterizationState: TvkuPipelineRasterizationStateCreateInfo; | |||||
| fMultisampleState: TvkuPipelineMultisampleStateCreateInfo; | |||||
| fDepthStencilState: TvkuPipelineDepthStencilStateCreateInfo; | |||||
| fColorBlendState: TvkuPipelineColorBlendStateCreateInfo; | |||||
| fDynamicState: TvkuPipelineDynamicStateCreateInfo; | |||||
| fvkStages: TVkPipelineShaderStageCreateInfoArr; | |||||
| fvkVertexInputState: TVkPipelineVertexInputStateCreateInfo; | |||||
| fvkInputAssemblyState: TVkPipelineInputAssemblyStateCreateInfo; | |||||
| fvkTessellationState: TVkPipelineTessellationStateCreateInfo; | |||||
| fvkRasterizationState: TVkPipelineRasterizationStateCreateInfo; | |||||
| fvkColorBlendState: TVkPipelineColorBlendStateCreateInfo; | |||||
| fvkMultisampleState: TVkPipelineMultisampleStateCreateInfo; | |||||
| fvkViewportState: TVkPipelineViewportStateCreateInfo; | |||||
| fvkDepthStencilState: TVkPipelineDepthStencilStateCreateInfo; | |||||
| fvkDynamicState: TVkPipelineDynamicStateCreateInfo; | |||||
| public | public | ||||
| property RenderPass: VkRenderPass read fRenderPass write fRenderPass; | |||||
| property SubPass: VkUint32 read fSubPass write fSubPass; | |||||
| property RenderPass: VkRenderPass read fRenderPass write fRenderPass; | |||||
| property SubPass: VkUint32 read fSubPass write fSubPass; | |||||
| property Stages: TvkuPipelineShaderStageCreateInfoList read fStages; | |||||
| property Stages: TvkuPipelineShaderStageCreateInfoList read fStages; | |||||
| property VertexInputState: TvkuPipelineVertexInputStateCreateInfo read fVertexInputState; | |||||
| property InputAssemblyState: TvkuPipelineInputAssemblyStateCreateInfo read fInputAssemblyState; | |||||
| property TessellationState: TvkuPipelineTessellationStateCreateInfo read fTessellationState; | |||||
| property ViewportState: TvkuPipelineViewportStateCreateInfo read fViewportState; | |||||
| property RasterizationState: TvkuPipelineRasterizationStateCreateInfo read fRasterizationState; | |||||
| property MultiSampleState: TvkuPipelineMultisampleStateCreateInfo read fMultiSampleState; | |||||
| property DepthStencilState: TvkuPipelineDepthStencilStateCreateInfo read fDepthStencilState; | |||||
| property ColorBlendState: TvkuPipelineColorBlendStateCreateInfo read fColorBlendState; | |||||
| property DynamicState: TvkuPipelineDynamicStateCreateInfo read fDynamicState; | |||||
| function GetStructure: TVkGraphicsPipelineCreateInfo; | function GetStructure: TVkGraphicsPipelineCreateInfo; | ||||
| procedure SetStructure(const aData: TVkGraphicsPipelineCreateInfo); | procedure SetStructure(const aData: TVkGraphicsPipelineCreateInfo); | ||||
| @@ -95,6 +345,508 @@ begin | |||||
| // TODO: read SpecializationInfo | // TODO: read SpecializationInfo | ||||
| end; | end; | ||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| //TvkuVertexInputBindingDescription////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| function TvkuVertexInputBindingDescription.GetStructure: TVkVertexInputBindingDescription; | |||||
| begin | |||||
| FillByte(result, SizeOf(result), 0); | |||||
| result.binding := Binding; | |||||
| result.stride := Stride; | |||||
| result.inputRate := InputRate; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuVertexInputBindingDescription.SetStructure(const aData: TVkVertexInputBindingDescription); | |||||
| begin | |||||
| Binding := aData.binding; | |||||
| Stride := aData.stride; | |||||
| InputRate := aData.inputRate; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| //TvkuVertexInputAttributeDescription//////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| function TvkuVertexInputAttributeDescription.GetStructure: TVkVertexInputAttributeDescription; | |||||
| begin | |||||
| FillByte(result, SizeOf(result), 0); | |||||
| result.location := Location; | |||||
| result.binding := Binding; | |||||
| result.format := Format; | |||||
| result.offset := Offset; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuVertexInputAttributeDescription.SetStructure(const aData: TVkVertexInputAttributeDescription); | |||||
| begin | |||||
| Location := aData.location; | |||||
| Binding := aData.binding; | |||||
| Format := aData.format; | |||||
| Offset := aData.offset; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| //TvkuPipelineVertexInputStateCreateInfo///////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| function TvkuPipelineVertexInputStateCreateInfo.GetStructure: TVkPipelineVertexInputStateCreateInfo; | |||||
| var i: Integer; | |||||
| begin | |||||
| SetLength(fvkVertexBindingDescriptions, fVertexBindingDescriptions.Length); | |||||
| for i := low(fvkVertexBindingDescriptions) to high(fvkVertexBindingDescriptions) do | |||||
| fvkVertexBindingDescriptions[i] := fVertexBindingDescriptions[i].GetStructure; | |||||
| SetLength(fvkVertexAttributeDescriptions, fVertexAttributeDescriptions.Length); | |||||
| for i := low(fvkVertexAttributeDescriptions) to high(fvkVertexAttributeDescriptions) do | |||||
| fvkVertexAttributeDescriptions[i] := fVertexAttributeDescriptions[i].GetStructure; | |||||
| FillByte(result, SizeOf(result), 0); | |||||
| result.sType := VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO; | |||||
| result.pNext := nil; | |||||
| result.flags := fFlags; | |||||
| result.vertexBindingDescriptionCount := Length(fvkVertexBindingDescriptions); | |||||
| result.pVertexBindingDescriptions := @fvkVertexBindingDescriptions[0]; | |||||
| result.vertexAttributeDescriptionCount := Length(fvkVertexAttributeDescriptions); | |||||
| result.pVertexAttributeDescriptions := @fvkVertexAttributeDescriptions[0]; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuPipelineVertexInputStateCreateInfo.SetStructure(const aData: TVkPipelineVertexInputStateCreateInfo); | |||||
| var i: Integer; | |||||
| begin | |||||
| if Assigned(aData.pVertexAttributeDescriptions) then begin | |||||
| fVertexAttributeDescriptions.Length := aData.vertexAttributeDescriptionCount; | |||||
| for i := 0 to fVertexAttributeDescriptions.Length-1 do | |||||
| fVertexAttributeDescriptions[i].SetStructure((aData.pVertexAttributeDescriptions + i)^); | |||||
| end; | |||||
| if Assigned(aData.pVertexBindingDescriptions) then begin | |||||
| fVertexBindingDescriptions.Length := aData.vertexBindingDescriptionCount; | |||||
| for i := 0 to fVertexBindingDescriptions.Length-1 do | |||||
| fVertexBindingDescriptions[i].SetStructure((aData.pVertexBindingDescriptions + i)^); | |||||
| end; | |||||
| fFlags := aData.flags; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| constructor TvkuPipelineVertexInputStateCreateInfo.Create; | |||||
| begin | |||||
| inherited Create; | |||||
| fVertexAttributeDescriptions := TvkuVertexInputAttributeDescriptionList.Create; | |||||
| fVertexBindingDescriptions := TvkuVertexInputBindingDescriptionList.Create; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| destructor TvkuPipelineVertexInputStateCreateInfo.Destroy; | |||||
| begin | |||||
| FreeAndNil(fVertexBindingDescriptions); | |||||
| FreeAndNil(fVertexAttributeDescriptions); | |||||
| inherited Destroy; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| //TvkuPipelineInputAssemblyStateCreateInfo/////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| function TvkuPipelineInputAssemblyStateCreateInfo.GetStructure: TVkPipelineInputAssemblyStateCreateInfo; | |||||
| begin | |||||
| FillByte(result, SizeOf(result), 0); | |||||
| result.sType := VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO; | |||||
| result.pNext := nil; | |||||
| result.flags := Flags; | |||||
| result.topology := Topology; | |||||
| if PrimitiveRestartEnable | |||||
| then result.primitiveRestartEnable := VK_TRUE | |||||
| else result.primitiveRestartEnable := VK_FALSE; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuPipelineInputAssemblyStateCreateInfo.SetStructure(const aData: TVkPipelineInputAssemblyStateCreateInfo); | |||||
| begin | |||||
| Flags := aData.flags; | |||||
| Topology := aData.topology; | |||||
| PrimitiveRestartEnable := (aData.primitiveRestartEnable <> 0); | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| //TvkuPipelineTessellationStateCreateInfo//////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| function TvkuPipelineTessellationStateCreateInfo.GetStructure: TVkPipelineTessellationStateCreateInfo; | |||||
| begin | |||||
| FillByte(result, SizeOf(result), 0); | |||||
| result.sType := VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO; | |||||
| result.pNext := nil; | |||||
| result.flags := Flags; | |||||
| result.patchControlPoints := PatchControlPoints; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuPipelineTessellationStateCreateInfo.SetStructure(const aData: TVkPipelineTessellationStateCreateInfo); | |||||
| begin | |||||
| Flags := aData.flags; | |||||
| PatchControlPoints := aData.patchControlPoints; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| //TvkuViewport/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| function TvkuViewport.GetStructure: TVkViewport; | |||||
| begin | |||||
| FillByte(result, SizeOf(result), 0); | |||||
| result.x := x; | |||||
| result.y := y; | |||||
| result.width := Width; | |||||
| result.height := Height; | |||||
| result.minDepth := MinDepth; | |||||
| result.maxDepth := MaxDepth; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuViewport.SetStructure(const aData: TVkViewport); | |||||
| begin | |||||
| x := aData.x; | |||||
| y := aData.y; | |||||
| Width := aData.width; | |||||
| Height := aData.height; | |||||
| MinDepth := aData.minDepth; | |||||
| MaxDepth := aData.maxDepth; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| //TvkuRect2D///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| function TvkuRect2D.GetStructure: TVkRect2D; | |||||
| begin | |||||
| FillByte(result, SizeOf(result), 0); | |||||
| result.offset := Offset; | |||||
| result.extent := Extent; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuRect2D.SetStructure(const aData: TVkRect2D); | |||||
| begin | |||||
| Offset := aData.offset; | |||||
| Extent := aData.extent; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| //TvkuPipelineViewportStateCreateInfo//////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| function TvkuPipelineViewportStateCreateInfo.GetStructure: TVkPipelineViewportStateCreateInfo; | |||||
| var i: Integer; | |||||
| begin | |||||
| SetLength(fvkViewports, fViewports.Length); | |||||
| for i := low(fvkViewports) to high(fvkViewports) do | |||||
| fvkViewports[i] := fViewports[i].GetStructure; | |||||
| SetLength(fvkScissors, fScissors.Length); | |||||
| for i := low(fvkScissors) to high(fvkScissors) do | |||||
| fvkScissors[i] := fScissors[i].GetStructure; | |||||
| FillByte(result, SizeOf(result), 0); | |||||
| result.sType := VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO; | |||||
| result.pNext := nil; | |||||
| result.flags := fFlags; | |||||
| result.viewportCount := Length(fvkViewports); | |||||
| result.pViewports := @fvkViewports[0]; | |||||
| result.scissorCount := Length(fvkScissors); | |||||
| result.pScissors := @fvkScissors[0]; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuPipelineViewportStateCreateInfo.SetStructure(const aData: TVkPipelineViewportStateCreateInfo); | |||||
| var i: Integer; | |||||
| begin | |||||
| if Assigned(aData.pViewports) then begin | |||||
| fViewports.Length := aData.viewportCount; | |||||
| for i := 0 to fViewports.Length-1 do | |||||
| fViewports[i].SetStructure((aData.pViewports + i)^); | |||||
| end; | |||||
| if Assigned(aData.pScissors) then begin | |||||
| fScissors.Length := aData.scissorCount; | |||||
| for i := 0 to fScissors.Length-1 do | |||||
| fScissors[i].SetStructure((aData.pScissors + i)^); | |||||
| end; | |||||
| fFlags := aData.flags; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| constructor TvkuPipelineViewportStateCreateInfo.Create; | |||||
| begin | |||||
| inherited Create; | |||||
| fViewports := TvkuViewportList.Create; | |||||
| fScissors := TvkuRect2DList.Create; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| destructor TvkuPipelineViewportStateCreateInfo.Destroy; | |||||
| begin | |||||
| FreeAndNil(fViewports); | |||||
| FreeAndNil(fScissors); | |||||
| inherited Destroy; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| //TvkuPipelineRasterizationStateCreateInfo/////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| function TvkuPipelineRasterizationStateCreateInfo.GetStructure: TVkPipelineRasterizationStateCreateInfo; | |||||
| begin | |||||
| FillByte(result, SizeOf(result), 0); | |||||
| result.sType := VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; | |||||
| result.pNext := nil; | |||||
| result.flags := Flags; | |||||
| result.polygonMode := PolygonMode; | |||||
| result.cullMode := CullMode; | |||||
| result.frontFace := FrontFace; | |||||
| result.depthBiasConstantFactor := DepthBiasConstantFactor; | |||||
| result.depthBiasClamp := DepthBiasClamp; | |||||
| result.depthBiasSlopeFactor := DepthBiasSlopeFactor; | |||||
| result.lineWidth := LineWidth; | |||||
| if DepthClampEnable | |||||
| then result.depthClampEnable := VK_TRUE | |||||
| else result.depthClampEnable := VK_FALSE; | |||||
| if RasterizerDiscardEnable | |||||
| then result.rasterizerDiscardEnable := VK_TRUE | |||||
| else result.rasterizerDiscardEnable := VK_FALSE; | |||||
| if DepthBiasEnable | |||||
| then result.depthBiasEnable := VK_TRUE | |||||
| else result.depthBiasEnable := VK_FALSE; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuPipelineRasterizationStateCreateInfo.SetStructure(const aData: TVkPipelineRasterizationStateCreateInfo); | |||||
| begin | |||||
| Flags := aData.flags; | |||||
| DepthClampEnable := (aData.depthClampEnable <> 0); | |||||
| RasterizerDiscardEnable := (aData.rasterizerDiscardEnable <> 0); | |||||
| PolygonMode := aData.polygonMode; | |||||
| CullMode := aData.cullMode; | |||||
| FrontFace := aData.frontFace; | |||||
| DepthBiasEnable := (aData.depthBiasEnable <> 0); | |||||
| DepthBiasConstantFactor := aData.depthBiasConstantFactor; | |||||
| DepthBiasClamp := aData.depthBiasClamp; | |||||
| DepthBiasSlopeFactor := aData.depthBiasSlopeFactor; | |||||
| LineWidth := aData.lineWidth; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| //TvkuPipelineMultisampleStateCreateInfo///////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| function TvkuPipelineMultisampleStateCreateInfo.GetStructure: TVkPipelineMultisampleStateCreateInfo; | |||||
| var i: Integer; | |||||
| begin | |||||
| if (fSampleMask.Length <> 0) then | |||||
| fSampleMask.Length := 32; | |||||
| FillByte(result, SizeOf(result), 0); | |||||
| result.sType := VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO; | |||||
| result.pNext := nil; | |||||
| result.flags := Flags; | |||||
| result.rasterizationSamples := RasterizationSamples; | |||||
| result.minSampleShading := MinSampleShading; | |||||
| result.pSampleMask := fSampleMask.PData; | |||||
| if SampleShadingEnable | |||||
| then result.sampleShadingEnable := VK_TRUE | |||||
| else result.sampleShadingEnable := VK_FALSE; | |||||
| if AlphaToCoverageEnable | |||||
| then result.alphaToCoverageEnable := VK_TRUE | |||||
| else result.alphaToCoverageEnable := VK_FALSE; | |||||
| if AlphaToOneEnable | |||||
| then result.alphaToOneEnable := VK_TRUE | |||||
| else result.alphaToOneEnable := VK_FALSE; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuPipelineMultisampleStateCreateInfo.SetStructure(const aData: TVkPipelineMultisampleStateCreateInfo); | |||||
| begin | |||||
| fSampleMask.SetData(aData.pSampleMask, 32); | |||||
| Flags := aData.flags; | |||||
| RasterizationSamples := aData.rasterizationSamples; | |||||
| SampleShadingEnable := (aData.sampleShadingEnable <> 0); | |||||
| MinSampleShading := aData.minSampleShading; | |||||
| AlphaToCoverageEnable := (aData.alphaToCoverageEnable <> 0); | |||||
| AlphaToOneEnable := (aData.alphaToOneEnable <> 0); | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| constructor TvkuPipelineMultisampleStateCreateInfo.Create; | |||||
| begin | |||||
| inherited Create; | |||||
| fSampleMask := TVkSampleMaskList.Create; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| destructor TvkuPipelineMultisampleStateCreateInfo.Destroy; | |||||
| begin | |||||
| FreeAndNil(fSampleMask); | |||||
| inherited Destroy; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| function TvkuPipelineDepthStencilStateCreateInfo.GetStructure: TVkPipelineDepthStencilStateCreateInfo; | |||||
| begin | |||||
| FillByte(result, SizeOf(result), 0); | |||||
| result.sType := VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO; | |||||
| result.pNext := nil; | |||||
| result.flags := Flags; | |||||
| result.depthCompareOp := DepthCompareOp; | |||||
| result.front := Front; | |||||
| result.back := Back; | |||||
| result.minDepthBounds := MinDepthBounds; | |||||
| result.maxDepthBounds := MaxDepthBounds; | |||||
| if DepthTestEnable | |||||
| then result.depthTestEnable := VK_TRUE | |||||
| else result.depthTestEnable := VK_FALSE; | |||||
| if DepthWriteEnable | |||||
| then result.depthWriteEnable := VK_TRUE | |||||
| else result.depthWriteEnable := VK_FALSE; | |||||
| if DepthBoundsTestEnable | |||||
| then result.depthBoundsTestEnable := VK_TRUE | |||||
| else result.depthBoundsTestEnable := VK_FALSE; | |||||
| if StencilTestEnable | |||||
| then result.stencilTestEnable := VK_TRUE | |||||
| else result.stencilTestEnable := VK_FALSE; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuPipelineDepthStencilStateCreateInfo.SetStructure(const aData: TVkPipelineDepthStencilStateCreateInfo); | |||||
| begin | |||||
| Flags := aData.flags; | |||||
| DepthTestEnable := (aData.depthTestEnable <> 0); | |||||
| DepthWriteEnable := (aData.depthWriteEnable <> 0); | |||||
| DepthCompareOp := aData.depthCompareOp; | |||||
| DepthBoundsTestEnable := (aData.depthBoundsTestEnable <> 0); | |||||
| StencilTestEnable := (aData.stencilTestEnable <> 0); | |||||
| Front := aData.front; | |||||
| Back := aData.back; | |||||
| MinDepthBounds := aData.minDepthBounds; | |||||
| MaxDepthBounds := aData.maxDepthBounds; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| //TvkuPipelineColorBlendAttachmentState////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| function TvkuPipelineColorBlendAttachmentState.GetStructure: TVkPipelineColorBlendAttachmentState; | |||||
| begin | |||||
| FillByte(result, SizeOf(result), 0); | |||||
| if BlendEnable | |||||
| then result.blendEnable := VK_TRUE | |||||
| else result.blendEnable := VK_FALSE; | |||||
| result.srcColorBlendFactor := SrcColorBlendFactor; | |||||
| result.dstColorBlendFactor := DstColorBlendFactor; | |||||
| result.colorBlendOp := ColorBlendOp; | |||||
| result.srcAlphaBlendFactor := SrcAlphaBlendFactor; | |||||
| result.dstAlphaBlendFactor := DstAlphaBlendFactor; | |||||
| result.alphaBlendOp := AlphaBlendOp; | |||||
| result.colorWriteMask := ColorWriteMask; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuPipelineColorBlendAttachmentState.SetStructure(const aData: TVkPipelineColorBlendAttachmentState); | |||||
| begin | |||||
| BlendEnable := (aData.blendEnable <> 0); | |||||
| SrcColorBlendFactor := aData.srcColorBlendFactor; | |||||
| DstColorBlendFactor := aData.dstColorBlendFactor; | |||||
| ColorBlendOp := aData.colorBlendOp; | |||||
| SrcAlphaBlendFactor := aData.srcAlphaBlendFactor; | |||||
| DstAlphaBlendFactor := aData.dstAlphaBlendFactor; | |||||
| AlphaBlendOp := aData.alphaBlendOp; | |||||
| ColorWriteMask := aData.colorWriteMask; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| //TvkuPipelineColorBlendStateCreateInfo////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| function TvkuPipelineColorBlendStateCreateInfo.GetStructure: TVkPipelineColorBlendStateCreateInfo; | |||||
| var i: Integer; | |||||
| begin | |||||
| SetLength(fvkAttachments, fAttachments.Length); | |||||
| for i := low(fvkAttachments) to high(fvkAttachments) do | |||||
| fvkAttachments[i] := fAttachments[i].GetStructure; | |||||
| FillByte(result, SizeOf(result), 0); | |||||
| result.sType := VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO; | |||||
| result.pNext := nil; | |||||
| result.flags := Flags; | |||||
| result.logicOp := LogicOp; | |||||
| result.attachmentCount := Length(fvkAttachments); | |||||
| result.pAttachments := @fvkAttachments[0]; | |||||
| result.blendConstants := BlendConstants; | |||||
| if LogicOpEnable | |||||
| then result.logicOpEnable := VK_TRUE | |||||
| else result.logicOpEnable := VK_FALSE; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuPipelineColorBlendStateCreateInfo.SetStructure(const aData: TVkPipelineColorBlendStateCreateInfo); | |||||
| var i: Integer; | |||||
| begin | |||||
| if Assigned(aData.pAttachments) then begin | |||||
| fAttachments.Length := aData.attachmentCount; | |||||
| for i := 0 to fAttachments.Length-1 do | |||||
| fAttachments[i].SetStructure((aData.pAttachments + i)^); | |||||
| end; | |||||
| Flags := aData.flags; | |||||
| LogicOp := aData.logicOp; | |||||
| LogicOpEnable := (aData.logicOpEnable <> 0); | |||||
| BlendConstants := aData.blendConstants; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| constructor TvkuPipelineColorBlendStateCreateInfo.Create; | |||||
| begin | |||||
| inherited Create; | |||||
| fAttachments := TvkuPipelineColorBlendAttachmentStateList.Create; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| destructor TvkuPipelineColorBlendStateCreateInfo.Destroy; | |||||
| begin | |||||
| FreeAndNil(fAttachments); | |||||
| inherited Destroy; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| //TvkuPipelineDynamicStateCreateInfo///////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| function TvkuPipelineDynamicStateCreateInfo.GetStructure: TVkPipelineDynamicStateCreateInfo; | |||||
| begin | |||||
| FillByte(result, SizeOf(result), 0); | |||||
| result.sType := VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO; | |||||
| result.pNext := nil; | |||||
| result.flags := Flags; | |||||
| result.dynamicStateCount := fDynamicStates.Length; | |||||
| result.pDynamicStates := fDynamicStates.PData; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TvkuPipelineDynamicStateCreateInfo.SetStructure(const aData: TVkPipelineDynamicStateCreateInfo); | |||||
| begin | |||||
| fDynamicStates.SetData(aData.pDynamicStates, aData.dynamicStateCount); | |||||
| Flags := aData.flags; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| constructor TvkuPipelineDynamicStateCreateInfo.Create; | |||||
| begin | |||||
| inherited Create; | |||||
| fDynamicStates := TVkDynamicStateList.Create; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| destructor TvkuPipelineDynamicStateCreateInfo.Destroy; | |||||
| begin | |||||
| FreeAndNil(fDynamicStates); | |||||
| inherited Destroy; | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| //TvkuGraphicsPipelineFactory//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //TvkuGraphicsPipelineFactory//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| @@ -105,21 +857,31 @@ begin | |||||
| for i := low(fvkStages) to high(fvkStages) do | for i := low(fvkStages) to high(fvkStages) do | ||||
| fvkStages[i] := fStages[i].GetStructure; | fvkStages[i] := fStages[i].GetStructure; | ||||
| fvkVertexInputState := fVertexInputState.GetStructure; | |||||
| fvkInputAssemblyState := fInputAssemblyState.GetStructure; | |||||
| fvkTessellationState := fTessellationState.GetStructure; | |||||
| fvkViewportState := fViewportState.GetStructure; | |||||
| fvkRasterizationState := fRasterizationState.GetStructure; | |||||
| fvkMultisampleState := fMultisampleState.GetStructure; | |||||
| fvkDepthStencilState := fDepthStencilState.GetStructure; | |||||
| fvkColorBlendState := fColorBlendState.GetStructure; | |||||
| fvkDynamicState := fDynamicState.GetStructure; | |||||
| FillByte(result, SizeOf(result), 0); | FillByte(result, SizeOf(result), 0); | ||||
| result.sType := VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; | result.sType := VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; | ||||
| result.pNext := nil; | result.pNext := nil; | ||||
| result.flags := fFlags; | result.flags := fFlags; | ||||
| result.stageCount := Length(fvkStages); | result.stageCount := Length(fvkStages); | ||||
| result.pStages := @fvkStages[0]; | result.pStages := @fvkStages[0]; | ||||
| result.pVertexInputState := nil; | |||||
| result.pInputAssemblyState := nil; | |||||
| result.pTessellationState := nil; | |||||
| result.pViewportState := nil; | |||||
| result.pRasterizationState := nil; | |||||
| result.pMultisampleState := nil; | |||||
| result.pDepthStencilState := nil; | |||||
| result.pColorBlendState := nil; | |||||
| result.pDynamicState := nil; | |||||
| result.pVertexInputState := @fvkVertexInputState; | |||||
| result.pInputAssemblyState := @fvkInputAssemblyState; | |||||
| result.pTessellationState := @fvkTessellationState; | |||||
| result.pViewportState := @fvkViewportState; | |||||
| result.pRasterizationState := @fvkRasterizationState; | |||||
| result.pMultisampleState := @fvkMultisampleState; | |||||
| result.pDepthStencilState := @fvkDepthStencilState; | |||||
| result.pColorBlendState := @fvkColorBlendState; | |||||
| result.pDynamicState := @fvkDynamicState; | |||||
| result.layout := fLayout; | result.layout := fLayout; | ||||
| result.renderPass := fRenderPass; | result.renderPass := fRenderPass; | ||||
| result.subpass := fSubPass; | result.subpass := fSubPass; | ||||
| @@ -155,12 +917,30 @@ end; | |||||
| procedure TvkuGraphicsPipelineFactory.AfterConstruction; | procedure TvkuGraphicsPipelineFactory.AfterConstruction; | ||||
| begin | begin | ||||
| inherited AfterConstruction; | inherited AfterConstruction; | ||||
| fStages := TvkuPipelineShaderStageCreateInfoList.Create; | |||||
| fStages := TvkuPipelineShaderStageCreateInfoList.Create; | |||||
| fVertexInputState := TvkuPipelineVertexInputStateCreateInfo.Create; | |||||
| fInputAssemblyState := TvkuPipelineInputAssemblyStateCreateInfo.Create; | |||||
| fTessellationState := TvkuPipelineTessellationStateCreateInfo.Create; | |||||
| fViewportState := TvkuPipelineViewportStateCreateInfo.Create; | |||||
| fRasterizationState := TvkuPipelineRasterizationStateCreateInfo.Create; | |||||
| fMultisampleState := TvkuPipelineMultisampleStateCreateInfo.Create; | |||||
| fDepthStencilState := TvkuPipelineDepthStencilStateCreateInfo.Create; | |||||
| fColorBlendState := TvkuPipelineColorBlendStateCreateInfo.Create; | |||||
| fDynamicState := TvkuPipelineDynamicStateCreateInfo.Create; | |||||
| end; | end; | ||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| procedure TvkuGraphicsPipelineFactory.BeforeDestruction; | procedure TvkuGraphicsPipelineFactory.BeforeDestruction; | ||||
| begin | begin | ||||
| FreeAndNil(fDynamicState); | |||||
| FreeAndNil(fColorBlendState); | |||||
| FreeAndNil(fDepthStencilState); | |||||
| FreeAndNil(fMultisampleState); | |||||
| FreeAndNil(fRasterizationState); | |||||
| FreeAndNil(fViewportState); | |||||
| FreeAndNil(fTessellationState); | |||||
| FreeAndNil(fInputAssemblyState); | |||||
| FreeAndNil(fVertexInputState); | |||||
| FreeAndNil(fStages); | FreeAndNil(fStages); | ||||
| inherited BeforeDestruction; | inherited BeforeDestruction; | ||||
| end; | end; | ||||
| @@ -9,6 +9,14 @@ uses | |||||
| Vulkan, uvkuUtils; | Vulkan, uvkuUtils; | ||||
| type | type | ||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| TvkuStructure = class | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| TvkuCommandHelper = class | |||||
| end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| generic TvkuListBase<T> = class(TObject) | generic TvkuListBase<T> = class(TObject) | ||||
| private type | private type | ||||
| @@ -77,12 +85,28 @@ type | |||||
| TVkMemoryBarrierArr = array of TVkMemoryBarrier; | TVkMemoryBarrierArr = array of TVkMemoryBarrier; | ||||
| TVkBufferMemoryBarrierArr = array of TVkBufferMemoryBarrier; | TVkBufferMemoryBarrierArr = array of TVkBufferMemoryBarrier; | ||||
| TVkImageMemoryBarrierArr = array of TVkImageMemoryBarrier; | TVkImageMemoryBarrierArr = array of TVkImageMemoryBarrier; | ||||
| TVkViewportArr = array of TVkViewport; | |||||
| TVkRect2DArr = array of TVkRect2D; | |||||
| TVkSampleMaskArr = array of VkSampleMask; | |||||
| TVkVertexInputBindingDescriptionArr = array of TVkVertexInputBindingDescription; | |||||
| TVkVertexInputAttributeDescriptionArr = array of TVkVertexInputAttributeDescription; | |||||
| TVkPipelineColorBlendAttachmentStateArr = array of TVkPipelineColorBlendAttachmentState; | |||||
| TVkDynamicStateArr = array of TVkDynamicState; | |||||
| TVkDescriptorPoolSizeArr = array of TVkDescriptorPoolSize; | |||||
| TVkDescriptorSetArr = array of VkDescriptorSet; | |||||
| TVkDescriptorImageInfoArr = array of TVkDescriptorImageInfo; | |||||
| TVkDescriptorBufferInfoArr = array of TVkDescriptorBufferInfo; | |||||
| TVkClearValueArr = array of TVkClearValue; | |||||
| TVkUint32List = specialize TvkuList<VkUint32>; | TVkUint32List = specialize TvkuList<VkUint32>; | ||||
| TVkFloatList = specialize TvkuList<VkFloat>; | TVkFloatList = specialize TvkuList<VkFloat>; | ||||
| TVkImageViewList = specialize TvkuList<VkImageView>; | TVkImageViewList = specialize TvkuList<VkImageView>; | ||||
| TVkSamplerList = specialize TvkuList<VkSampler>; | TVkSamplerList = specialize TvkuList<VkSampler>; | ||||
| TVkDescriptorSetLayoutList = specialize TvkuList<VkDescriptorSetLayout>; | TVkDescriptorSetLayoutList = specialize TvkuList<VkDescriptorSetLayout>; | ||||
| TVkSampleMaskList = specialize TvkuList<VkSampleMask>; | |||||
| TVkDynamicStateList = specialize TvkuList<TVkDynamicState>; | |||||
| TVkBufferViewList = specialize TvkuList<VkBufferView>; | |||||
| TVkClearValueList = specialize TvkuList<TVkClearValue>; | |||||
| implementation | implementation | ||||
| @@ -36,6 +36,11 @@ function vkuMakeString(const aFeatures: TVkPhysicalDeviceFeatures; const aSepera | |||||
| function vkuMakeString(const aProperties: TVkPhysicalDeviceProperties; const aPrintLimits, aPrintSparseProps: Boolean): String; | function vkuMakeString(const aProperties: TVkPhysicalDeviceProperties; const aPrintLimits, aPrintSparseProps: Boolean): String; | ||||
| function vkuMakeString(const aMemoryProperties: TVkPhysicalDeviceMemoryProperties): String; | function vkuMakeString(const aMemoryProperties: TVkPhysicalDeviceMemoryProperties): String; | ||||
| function vkuGetMemoryTypeIndex( | |||||
| const aMemoryProperties: TVkPhysicalDeviceMemoryProperties; | |||||
| aMemoryTypeBits: VkUint32; | |||||
| const aProperty: TVkMemoryPropertyFlagBit): VkUint32; | |||||
| implementation | implementation | ||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| @@ -475,6 +480,26 @@ begin | |||||
| end; | end; | ||||
| end; | end; | ||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| function vkuGetMemoryTypeIndex( | |||||
| const aMemoryProperties: TVkPhysicalDeviceMemoryProperties; | |||||
| aMemoryTypeBits: VkUint32; | |||||
| const aProperty: TVkMemoryPropertyFlagBit): VkUint32; | |||||
| var | |||||
| i: Integer; | |||||
| begin | |||||
| result := 0; | |||||
| for i := 0 to VK_MAX_MEMORY_TYPES-1 do begin | |||||
| if ((aMemoryTypeBits and 1) = 1) and | |||||
| (aProperty in aMemoryProperties.memoryTypes[i].propertyFlags) then | |||||
| begin | |||||
| result := i; | |||||
| break; | |||||
| end; | |||||
| aMemoryTypeBits := aMemoryTypeBits shr 1; | |||||
| end; | |||||
| end; | |||||
| end. | end. | ||||