From 35e5dfbdb1cee2f9190945f32cacfef7d973e6cd Mon Sep 17 00:00:00 2001 From: Bergmann89 Date: Sun, 13 Mar 2016 14:28:02 +0100 Subject: [PATCH] * refactored generator to match Vulkan spec --- data/Vulkan.inc | 16 +- data/vulkan.tpl | 140 +++- projects/Vulkan.inc | 16 +- projects/Vulkan.pas | 1046 +++++++++++++----------- projects/generator/HeaderGenerator.pas | 289 ++++--- projects/generator/generator.lps | 308 ++----- 6 files changed, 957 insertions(+), 858 deletions(-) diff --git a/data/Vulkan.inc b/data/Vulkan.inc index b0fad31..4d938e8 100644 --- a/data/Vulkan.inc +++ b/data/Vulkan.inc @@ -1,11 +1,3 @@ -{$IFDEF FPC} - {$MODE Delphi} - {$IFNDEF WINDOWS} - {$LINKLIB c} - {$ENDIF} - {$MINENUMSIZE 4} -{$ENDIF} - {$IFDEF Win32} {$DEFINE VK_WIN} {$DEFINE VK_WIN32} @@ -27,3 +19,11 @@ {$DEFINE VK_MAC} {$DEFINE VK_CDECL} {$ENDIF} + +{$IF DEFINED(CPU64)} + {$DEFINE VK_CPU64} +{$ELSEIF DEFINED(CPU32)} + {$DEFINE VK_CPU32} +{$ELSEIF DEFINED(CPU16)} + {$DEFINE VK_CPU16} +{$ENDIF} diff --git a/data/vulkan.tpl b/data/vulkan.tpl index 57cde60..1e1ed7b 100644 --- a/data/vulkan.tpl +++ b/data/vulkan.tpl @@ -21,26 +21,42 @@ Original vk.xml comment: unit Vulkan; +{$IFDEF FPC} + {$MODE Delphi} + {$IFNDEF WINDOWS} + {$LINKLIB c} + {$ENDIF} + {$MINENUMSIZE 4} +{$ENDIF} + {$I Vulkan.inc} interface type - HINSTANCE = THandle; - HWND = THandle; - - VkHandle = Pointer; - VkUint8 = Byte; - VkUint16 = Word; - VkUint32 = Cardinal; - VkUint64 = QWord; - VkInt16 = SmallInt; - VkInt32 = Integer; - VkInt64 = Int64; - VkFloat = Single; - VkDouble = Double; - VkChar = AnsiChar; - VkSize = SizeUInt; + VkUint8 = Byte; + VkUint16 = Word; + VkUint32 = Cardinal; + VkUint64 = QWord; + VkInt16 = SmallInt; + VkInt32 = Integer; + VkInt64 = Int64; + VkFloat = Single; + VkDouble = Double; + VkChar = AnsiChar; + VkSize = SizeUInt; + VkHandle = Pointer; + VkNonDispatchableHandle = {$IFDEF VK_CPU64}Pointer{$ELSE}VkUint64{$ENDIF}; + +const + VK_INVALID_HANDLE: VkHandle = nil; + VK_INVALID_NDP_HANDLE: VkNonDispatchableHandle = {$IFDEF VK_CPU64}nil{$ELSE}0{$ENDIF}; + +type +{$IFDEF VK_USE_PLATFORM_WIN32_KHR} + HINSTANCE = VkHandle; + HWND = VkHandle; +{$ENDIF} PVkVoid = Pointer; PVkHandle = ^VkHandle; @@ -72,6 +88,17 @@ type {%INTERFACE%} +type + TVkInstanceCommands = packed record + Instance: VkInstance; + {%INSTANCE_COMMANDS.INTERFACE%} + end; + + TVkDeviceCommands = packed record + Device: VkDevice; + {%DEVICE_COMMANDS.INTERFACE%} + end; + const VULKAN_LIBNAME = 'vulkan-1.dll'; @@ -84,7 +111,8 @@ function vkGetVersionMinor(const aVersion: VkVersion): Integer; inline; function vkGetVersionPatch(const aVersion: VkVersion): Integer; inline; function InitializeVulkan(const aLibName: String = VULKAN_LIBNAME): Boolean; -procedure LoadVulkanCommands(const aInstance: VkInstance); +function LoadInstanceCommands(const aInstance: VkInstance; out aCommands: TVkInstanceCommands): Boolean; +function LoadDeviceCommands(const aInstance: VkInstance; const aDevice: VkDevice; out aCommands: TVkDeviceCommands): Boolean; procedure FinalizeVulkan; implementation @@ -106,6 +134,7 @@ const var vkLibHandle: TvkLibHandle = InvalidLibHandle; +{ ===================================== Library Handling ============================================= } function vkLoadLibrary(const aLibName: String): TvkLibHandle; begin {$IF DEFINED(VK_WIN)} @@ -115,29 +144,18 @@ begin {$ENDIF} end; -function vkGetProcAddress(const aProcName: String; aInstance: VkInstance = nil; aLibHandle: TvkLibHandle = InvalidLibHandle): TvkVoidFunction; +function vkGetProcAddress(const aProcName: String; aLibHandle: TvkLibHandle = InvalidLibHandle): TvkVoidFunction; begin result := nil; if (aLibHandle = InvalidLibHandle) then aLibHandle := vkLibHandle; - if Assigned(vkGetInstanceProcAddr) then begin - result := vkGetInstanceProcAddr(aInstance, PVkChar(aProcName)); - if Assigned(result) then - exit; - end; - {$IF DEFINED(VK_WIN)} - result := GetProcAddress(aLibHandle, AnsiString(aProcName)); + result := TvkVoidFunction(GetProcAddress(aLibHandle, AnsiString(aProcName))); {$ELSE} result := nil; {$ENDIF} end; -procedure vkLoadAddresses(const aInstance: VkInstance = nil); -begin - {%IMPLEMENTATION%} -end; - procedure vkFreeLibrary(var aLibHandle: TvkLibHandle); begin if (aLibHandle <> InvalidLibHandle) then begin @@ -148,6 +166,7 @@ begin end; end; +{ ===================================== Vulkan Version Helpers ======================================= } function vkMakeVersion(const aMajor, aMinor, aPatch: Integer): VkVersion; begin result := (aMajor shl 22) or (aMinor shl 12) or aPatch; @@ -168,21 +187,70 @@ begin result := (aVersion and $FFF); end; +{ ===================================== Initialize Routines ========================================== } function InitializeVulkan(const aLibName: String = VULKAN_LIBNAME): Boolean; +var success: Boolean; + + function GetProcAddress(const aName: String): TvkVoidFunction; + begin + result := vkGetProcAddress(aName); + if not Assigned(result) then + success := false; + end; + begin FinalizeVulkan; vkLibHandle := vkLoadLibrary(aLibName); - result := (vkLibHandle <> InvalidLibHandle); - if not result then + success := (vkLibHandle <> InvalidLibHandle); + if not success then exit; - vkGetInstanceProcAddr := TvkGetInstanceProcAddr(vkGetProcAddress('vkGetInstanceProcAddr')); - vkLoadAddresses(nil); + + {%IMPLEMENTATION%} + + result := success; end; -procedure LoadVulkanCommands(const aInstance: VkInstance); +function LoadInstanceCommands(const aInstance: VkInstance; out aCommands: TVkInstanceCommands): Boolean; +var + success: Boolean; + + function GetProcAddress(const aName: String): TvkVoidFunction; + begin + result := vkGetInstanceProcAddr(aInstance, PVkChar(aName)); + if not Assigned(result) then + success := false; + end; + begin - vkLoadAddresses(aInstance); -end; + FillByte(aCommands, SizeOf(aCommands), 0); + success := true; + with aCommands do begin + {%INSTANCE_COMMANDS.IMPLEMENTATION%} + end; + result := success; +end; + +function LoadDeviceCommands(const aInstance: VkInstance; const aDevice: VkDevice; out aCommands: TVkDeviceCommands): Boolean; +var + vkGetDeviceProcAddr: TvkGetDeviceProcAddr; + success: Boolean; + + function GetProcAddress(const aName: String): TvkVoidFunction; + begin + result := vkGetDeviceProcAddr(aDevice, PVkChar(aName)); + if not Assigned(result) then + success := false; + end; + +begin + FillByte(aCommands, SizeOf(aCommands), 0); + vkGetDeviceProcAddr := TvkGetDeviceProcAddr(vkGetInstanceProcAddr(aInstance, 'vkGetDeviceProcAddr')); + success := true; + with aCommands do begin + {%DEVICE_COMMANDS.IMPLEMENTATION%} + end; + result := success; +end; procedure FinalizeVulkan; begin diff --git a/projects/Vulkan.inc b/projects/Vulkan.inc index b0fad31..4d938e8 100644 --- a/projects/Vulkan.inc +++ b/projects/Vulkan.inc @@ -1,11 +1,3 @@ -{$IFDEF FPC} - {$MODE Delphi} - {$IFNDEF WINDOWS} - {$LINKLIB c} - {$ENDIF} - {$MINENUMSIZE 4} -{$ENDIF} - {$IFDEF Win32} {$DEFINE VK_WIN} {$DEFINE VK_WIN32} @@ -27,3 +19,11 @@ {$DEFINE VK_MAC} {$DEFINE VK_CDECL} {$ENDIF} + +{$IF DEFINED(CPU64)} + {$DEFINE VK_CPU64} +{$ELSEIF DEFINED(CPU32)} + {$DEFINE VK_CPU32} +{$ELSEIF DEFINED(CPU16)} + {$DEFINE VK_CPU16} +{$ENDIF} diff --git a/projects/Vulkan.pas b/projects/Vulkan.pas index d7ada4a..b094574 100644 --- a/projects/Vulkan.pas +++ b/projects/Vulkan.pas @@ -46,30 +46,47 @@ language incorporated into the Specification and reference pages, and other material which is registered by Khronos, such as tags used by extension and layer authors. The only authoritative version of vk.xml is the one maintained in the master branch of the Khronos Vulkan Github project. + ============================================================================ } unit Vulkan; +{$IFDEF FPC} + {$MODE Delphi} + {$IFNDEF WINDOWS} + {$LINKLIB c} + {$ENDIF} + {$MINENUMSIZE 4} +{$ENDIF} + {$I Vulkan.inc} interface type - HINSTANCE = THandle; - HWND = THandle; - - VkHandle = Pointer; - VkUint8 = Byte; - VkUint16 = Word; - VkUint32 = Cardinal; - VkUint64 = QWord; - VkInt16 = SmallInt; - VkInt32 = Integer; - VkInt64 = Int64; - VkFloat = Single; - VkDouble = Double; - VkChar = AnsiChar; - VkSize = SizeUInt; + VkUint8 = Byte; + VkUint16 = Word; + VkUint32 = Cardinal; + VkUint64 = QWord; + VkInt16 = SmallInt; + VkInt32 = Integer; + VkInt64 = Int64; + VkFloat = Single; + VkDouble = Double; + VkChar = AnsiChar; + VkSize = SizeUInt; + VkHandle = Pointer; + VkNonDispatchableHandle = {$IFDEF VK_CPU64}Pointer{$ELSE}VkUint64{$ENDIF}; + +const + VK_INVALID_HANDLE: VkHandle = nil; + VK_INVALID_NDP_HANDLE: VkNonDispatchableHandle = {$IFDEF VK_CPU64}nil{$ELSE}0{$ENDIF}; + +type +{$IFDEF VK_USE_PLATFORM_WIN32_KHR} + HINSTANCE = VkHandle; + HWND = VkHandle; +{$ENDIF} PVkVoid = Pointer; PVkHandle = ^VkHandle; @@ -189,11 +206,13 @@ type { simple types } PVkInstanceCreateFlags = ^VkInstanceCreateFlags; PPVkInstanceCreateFlags = ^PVkInstanceCreateFlags; - VkInstance = VkHandle; + _VkInstance = record end; + VkInstance = ^_VkInstance; PVkInstance = ^VkInstance; PPVkInstance = ^PVkInstance; - VkPhysicalDevice = VkHandle; + _VkPhysicalDevice = record end; + VkPhysicalDevice = ^_VkPhysicalDevice; PVkPhysicalDevice = ^VkPhysicalDevice; PPVkPhysicalDevice = ^PVkPhysicalDevice; @@ -233,7 +252,8 @@ type { simple types } PVkMemoryHeapFlags = ^VkMemoryHeapFlags; PPVkMemoryHeapFlags = ^PVkMemoryHeapFlags; - VkDevice = VkHandle; + _VkDevice = record end; + VkDevice = ^_VkDevice; PVkDevice = ^VkDevice; PPVkDevice = ^PVkDevice; @@ -245,11 +265,13 @@ type { simple types } PVkDeviceQueueCreateFlags = ^VkDeviceQueueCreateFlags; PPVkDeviceQueueCreateFlags = ^PVkDeviceQueueCreateFlags; - VkQueue = VkHandle; + _VkQueue = record end; + VkQueue = ^_VkQueue; PVkQueue = ^VkQueue; PPVkQueue = ^PVkQueue; - VkSemaphore = VkHandle; + _VkSemaphore = record end; + VkSemaphore = {$IFDEF VK_CPU64}^_VkSemaphore{$ELSE}VkNonDispatchableHandle{$ENDIF}; PVkSemaphore = ^VkSemaphore; PPVkSemaphore = ^PVkSemaphore; @@ -257,15 +279,23 @@ type { simple types } PVkPipelineStageFlags = ^VkPipelineStageFlags; PPVkPipelineStageFlags = ^PVkPipelineStageFlags; - VkCommandBuffer = VkHandle; + _VkCommandPool = record end; + VkCommandPool = {$IFDEF VK_CPU64}^_VkCommandPool{$ELSE}VkNonDispatchableHandle{$ENDIF}; + PVkCommandPool = ^VkCommandPool; + PPVkCommandPool = ^PVkCommandPool; + + _VkCommandBuffer = record end; + VkCommandBuffer = ^_VkCommandBuffer; PVkCommandBuffer = ^VkCommandBuffer; PPVkCommandBuffer = ^PVkCommandBuffer; - VkFence = VkHandle; + _VkFence = record end; + VkFence = {$IFDEF VK_CPU64}^_VkFence{$ELSE}VkNonDispatchableHandle{$ENDIF}; PVkFence = ^VkFence; PPVkFence = ^PVkFence; - VkDeviceMemory = VkHandle; + _VkDeviceMemory = record end; + VkDeviceMemory = {$IFDEF VK_CPU64}^_VkDeviceMemory{$ELSE}VkNonDispatchableHandle{$ENDIF}; PVkDeviceMemory = ^VkDeviceMemory; PPVkDeviceMemory = ^PVkDeviceMemory; @@ -273,11 +303,13 @@ type { simple types } PVkMemoryMapFlags = ^VkMemoryMapFlags; PPVkMemoryMapFlags = ^PVkMemoryMapFlags; - VkBuffer = VkHandle; + _VkBuffer = record end; + VkBuffer = {$IFDEF VK_CPU64}^_VkBuffer{$ELSE}VkNonDispatchableHandle{$ENDIF}; PVkBuffer = ^VkBuffer; PPVkBuffer = ^PVkBuffer; - VkImage = VkHandle; + _VkImage = record end; + VkImage = {$IFDEF VK_CPU64}^_VkImage{$ELSE}VkNonDispatchableHandle{$ENDIF}; PVkImage = ^VkImage; PPVkImage = ^PVkImage; @@ -305,7 +337,8 @@ type { simple types } PVkEventCreateFlags = ^VkEventCreateFlags; PPVkEventCreateFlags = ^PVkEventCreateFlags; - VkEvent = VkHandle; + _VkEvent = record end; + VkEvent = {$IFDEF VK_CPU64}^_VkEvent{$ELSE}VkNonDispatchableHandle{$ENDIF}; PVkEvent = ^VkEvent; PPVkEvent = ^PVkEvent; @@ -317,7 +350,8 @@ type { simple types } PVkQueryPipelineStatisticFlags = ^VkQueryPipelineStatisticFlags; PPVkQueryPipelineStatisticFlags = ^PVkQueryPipelineStatisticFlags; - VkQueryPool = VkHandle; + _VkQueryPool = record end; + VkQueryPool = {$IFDEF VK_CPU64}^_VkQueryPool{$ELSE}VkNonDispatchableHandle{$ENDIF}; PVkQueryPool = ^VkQueryPool; PPVkQueryPool = ^PVkQueryPool; @@ -337,7 +371,8 @@ type { simple types } PVkBufferViewCreateFlags = ^VkBufferViewCreateFlags; PPVkBufferViewCreateFlags = ^PVkBufferViewCreateFlags; - VkBufferView = VkHandle; + _VkBufferView = record end; + VkBufferView = {$IFDEF VK_CPU64}^_VkBufferView{$ELSE}VkNonDispatchableHandle{$ENDIF}; PVkBufferView = ^VkBufferView; PPVkBufferView = ^PVkBufferView; @@ -345,7 +380,8 @@ type { simple types } PVkImageViewCreateFlags = ^VkImageViewCreateFlags; PPVkImageViewCreateFlags = ^PVkImageViewCreateFlags; - VkImageView = VkHandle; + _VkImageView = record end; + VkImageView = {$IFDEF VK_CPU64}^_VkImageView{$ELSE}VkNonDispatchableHandle{$ENDIF}; PVkImageView = ^VkImageView; PPVkImageView = ^PVkImageView; @@ -353,7 +389,8 @@ type { simple types } PVkShaderModuleCreateFlags = ^VkShaderModuleCreateFlags; PPVkShaderModuleCreateFlags = ^PVkShaderModuleCreateFlags; - VkShaderModule = VkHandle; + _VkShaderModule = record end; + VkShaderModule = {$IFDEF VK_CPU64}^_VkShaderModule{$ELSE}VkNonDispatchableHandle{$ENDIF}; PVkShaderModule = ^VkShaderModule; PPVkShaderModule = ^PVkShaderModule; @@ -361,7 +398,8 @@ type { simple types } PVkPipelineCacheCreateFlags = ^VkPipelineCacheCreateFlags; PPVkPipelineCacheCreateFlags = ^PVkPipelineCacheCreateFlags; - VkPipelineCache = VkHandle; + _VkPipelineCache = record end; + VkPipelineCache = {$IFDEF VK_CPU64}^_VkPipelineCache{$ELSE}VkNonDispatchableHandle{$ENDIF}; PVkPipelineCache = ^VkPipelineCache; PPVkPipelineCache = ^PVkPipelineCache; @@ -421,15 +459,18 @@ type { simple types } PVkPipelineDynamicStateCreateFlags = ^VkPipelineDynamicStateCreateFlags; PPVkPipelineDynamicStateCreateFlags = ^PVkPipelineDynamicStateCreateFlags; - VkPipelineLayout = VkHandle; + _VkPipelineLayout = record end; + VkPipelineLayout = {$IFDEF VK_CPU64}^_VkPipelineLayout{$ELSE}VkNonDispatchableHandle{$ENDIF}; PVkPipelineLayout = ^VkPipelineLayout; PPVkPipelineLayout = ^PVkPipelineLayout; - VkRenderPass = VkHandle; + _VkRenderPass = record end; + VkRenderPass = {$IFDEF VK_CPU64}^_VkRenderPass{$ELSE}VkNonDispatchableHandle{$ENDIF}; PVkRenderPass = ^VkRenderPass; PPVkRenderPass = ^PVkRenderPass; - VkPipeline = VkHandle; + _VkPipeline = record end; + VkPipeline = {$IFDEF VK_CPU64}^_VkPipeline{$ELSE}VkNonDispatchableHandle{$ENDIF}; PVkPipeline = ^VkPipeline; PPVkPipeline = ^PVkPipeline; @@ -437,7 +478,8 @@ type { simple types } PVkPipelineLayoutCreateFlags = ^VkPipelineLayoutCreateFlags; PPVkPipelineLayoutCreateFlags = ^PVkPipelineLayoutCreateFlags; - VkDescriptorSetLayout = VkHandle; + _VkDescriptorSetLayout = record end; + VkDescriptorSetLayout = {$IFDEF VK_CPU64}^_VkDescriptorSetLayout{$ELSE}VkNonDispatchableHandle{$ENDIF}; PVkDescriptorSetLayout = ^VkDescriptorSetLayout; PPVkDescriptorSetLayout = ^PVkDescriptorSetLayout; @@ -449,7 +491,8 @@ type { simple types } PVkSamplerCreateFlags = ^VkSamplerCreateFlags; PPVkSamplerCreateFlags = ^PVkSamplerCreateFlags; - VkSampler = VkHandle; + _VkSampler = record end; + VkSampler = {$IFDEF VK_CPU64}^_VkSampler{$ELSE}VkNonDispatchableHandle{$ENDIF}; PVkSampler = ^VkSampler; PPVkSampler = ^PVkSampler; @@ -461,7 +504,8 @@ type { simple types } PVkDescriptorPoolCreateFlags = ^VkDescriptorPoolCreateFlags; PPVkDescriptorPoolCreateFlags = ^PVkDescriptorPoolCreateFlags; - VkDescriptorPool = VkHandle; + _VkDescriptorPool = record end; + VkDescriptorPool = {$IFDEF VK_CPU64}^_VkDescriptorPool{$ELSE}VkNonDispatchableHandle{$ENDIF}; PVkDescriptorPool = ^VkDescriptorPool; PPVkDescriptorPool = ^PVkDescriptorPool; @@ -469,7 +513,8 @@ type { simple types } PVkDescriptorPoolResetFlags = ^VkDescriptorPoolResetFlags; PPVkDescriptorPoolResetFlags = ^PVkDescriptorPoolResetFlags; - VkDescriptorSet = VkHandle; + _VkDescriptorSet = record end; + VkDescriptorSet = {$IFDEF VK_CPU64}^_VkDescriptorSet{$ELSE}VkNonDispatchableHandle{$ENDIF}; PVkDescriptorSet = ^VkDescriptorSet; PPVkDescriptorSet = ^PVkDescriptorSet; @@ -477,7 +522,8 @@ type { simple types } PVkFramebufferCreateFlags = ^VkFramebufferCreateFlags; PPVkFramebufferCreateFlags = ^PVkFramebufferCreateFlags; - VkFramebuffer = VkHandle; + _VkFramebuffer = record end; + VkFramebuffer = {$IFDEF VK_CPU64}^_VkFramebuffer{$ELSE}VkNonDispatchableHandle{$ENDIF}; PVkFramebuffer = ^VkFramebuffer; PPVkFramebuffer = ^PVkFramebuffer; @@ -505,10 +551,6 @@ type { simple types } PVkCommandPoolCreateFlags = ^VkCommandPoolCreateFlags; PPVkCommandPoolCreateFlags = ^PVkCommandPoolCreateFlags; - VkCommandPool = VkHandle; - PVkCommandPool = ^VkCommandPool; - PPVkCommandPool = ^PVkCommandPool; - VkCommandPoolResetFlags = VkFlags; PVkCommandPoolResetFlags = ^VkCommandPoolResetFlags; PPVkCommandPoolResetFlags = ^PVkCommandPoolResetFlags; @@ -530,7 +572,8 @@ type { simple types } PPVkStencilFaceFlags = ^PVkStencilFaceFlags; { ========================================== VK_KHR_surface ========================================== } - VkSurfaceKHR = VkHandle; + _VkSurfaceKHR = record end; + VkSurfaceKHR = {$IFDEF VK_CPU64}^_VkSurfaceKHR{$ELSE}VkNonDispatchableHandle{$ENDIF}; PVkSurfaceKHR = ^VkSurfaceKHR; PPVkSurfaceKHR = ^PVkSurfaceKHR; @@ -547,16 +590,19 @@ type { simple types } PVkSwapchainCreateFlagsKHR = ^VkSwapchainCreateFlagsKHR; PPVkSwapchainCreateFlagsKHR = ^PVkSwapchainCreateFlagsKHR; - VkSwapchainKHR = VkHandle; + _VkSwapchainKHR = record end; + VkSwapchainKHR = {$IFDEF VK_CPU64}^_VkSwapchainKHR{$ELSE}VkNonDispatchableHandle{$ENDIF}; PVkSwapchainKHR = ^VkSwapchainKHR; PPVkSwapchainKHR = ^PVkSwapchainKHR; { ========================================== VK_KHR_display ========================================== } - VkDisplayKHR = VkHandle; + _VkDisplayKHR = record end; + VkDisplayKHR = {$IFDEF VK_CPU64}^_VkDisplayKHR{$ELSE}VkNonDispatchableHandle{$ENDIF}; PVkDisplayKHR = ^VkDisplayKHR; PPVkDisplayKHR = ^PVkDisplayKHR; - VkDisplayModeKHR = VkHandle; + _VkDisplayModeKHR = record end; + VkDisplayModeKHR = {$IFDEF VK_CPU64}^_VkDisplayModeKHR{$ELSE}VkNonDispatchableHandle{$ENDIF}; PVkDisplayModeKHR = ^VkDisplayModeKHR; PPVkDisplayModeKHR = ^PVkDisplayModeKHR; @@ -619,7 +665,8 @@ type { simple types } PVkDebugReportFlagsEXT = ^VkDebugReportFlagsEXT; PPVkDebugReportFlagsEXT = ^PVkDebugReportFlagsEXT; - VkDebugReportCallbackEXT = VkHandle; + _VkDebugReportCallbackEXT = record end; + VkDebugReportCallbackEXT = {$IFDEF VK_CPU64}^_VkDebugReportCallbackEXT{$ELSE}VkNonDispatchableHandle{$ENDIF}; PVkDebugReportCallbackEXT = ^VkDebugReportCallbackEXT; PPVkDebugReportCallbackEXT = ^PVkDebugReportCallbackEXT; @@ -4175,208 +4222,223 @@ var { ========================================== VK_VERSION_1_0 ========================================== } vkCreateInstance: TvkCreateInstance; - vkDestroyInstance: TvkDestroyInstance; - vkEnumeratePhysicalDevices: TvkEnumeratePhysicalDevices; - vkGetPhysicalDeviceFeatures: TvkGetPhysicalDeviceFeatures; - vkGetPhysicalDeviceFormatProperties: TvkGetPhysicalDeviceFormatProperties; - vkGetPhysicalDeviceImageFormatProperties: TvkGetPhysicalDeviceImageFormatProperties; - vkGetPhysicalDeviceProperties: TvkGetPhysicalDeviceProperties; - vkGetPhysicalDeviceQueueFamilyProperties: TvkGetPhysicalDeviceQueueFamilyProperties; - vkGetPhysicalDeviceMemoryProperties: TvkGetPhysicalDeviceMemoryProperties; vkGetInstanceProcAddr: TvkGetInstanceProcAddr; - vkGetDeviceProcAddr: TvkGetDeviceProcAddr; - vkCreateDevice: TvkCreateDevice; - vkDestroyDevice: TvkDestroyDevice; vkEnumerateInstanceExtensionProperties: TvkEnumerateInstanceExtensionProperties; - vkEnumerateDeviceExtensionProperties: TvkEnumerateDeviceExtensionProperties; vkEnumerateInstanceLayerProperties: TvkEnumerateInstanceLayerProperties; - vkEnumerateDeviceLayerProperties: TvkEnumerateDeviceLayerProperties; - vkGetDeviceQueue: TvkGetDeviceQueue; - vkQueueSubmit: TvkQueueSubmit; - vkQueueWaitIdle: TvkQueueWaitIdle; - vkDeviceWaitIdle: TvkDeviceWaitIdle; - vkAllocateMemory: TvkAllocateMemory; - vkFreeMemory: TvkFreeMemory; - vkMapMemory: TvkMapMemory; - vkUnmapMemory: TvkUnmapMemory; - vkFlushMappedMemoryRanges: TvkFlushMappedMemoryRanges; - vkInvalidateMappedMemoryRanges: TvkInvalidateMappedMemoryRanges; - vkGetDeviceMemoryCommitment: TvkGetDeviceMemoryCommitment; - vkBindBufferMemory: TvkBindBufferMemory; - vkBindImageMemory: TvkBindImageMemory; - vkGetBufferMemoryRequirements: TvkGetBufferMemoryRequirements; - vkGetImageMemoryRequirements: TvkGetImageMemoryRequirements; - vkGetImageSparseMemoryRequirements: TvkGetImageSparseMemoryRequirements; - vkGetPhysicalDeviceSparseImageFormatProperties: TvkGetPhysicalDeviceSparseImageFormatProperties; - vkQueueBindSparse: TvkQueueBindSparse; - vkCreateFence: TvkCreateFence; - vkDestroyFence: TvkDestroyFence; - vkResetFences: TvkResetFences; - vkGetFenceStatus: TvkGetFenceStatus; - vkWaitForFences: TvkWaitForFences; - vkCreateSemaphore: TvkCreateSemaphore; - vkDestroySemaphore: TvkDestroySemaphore; - vkCreateEvent: TvkCreateEvent; - vkDestroyEvent: TvkDestroyEvent; - vkGetEventStatus: TvkGetEventStatus; - vkSetEvent: TvkSetEvent; - vkResetEvent: TvkResetEvent; - vkCreateQueryPool: TvkCreateQueryPool; - vkDestroyQueryPool: TvkDestroyQueryPool; - vkGetQueryPoolResults: TvkGetQueryPoolResults; - vkCreateBuffer: TvkCreateBuffer; - vkDestroyBuffer: TvkDestroyBuffer; - vkCreateBufferView: TvkCreateBufferView; - vkDestroyBufferView: TvkDestroyBufferView; - vkCreateImage: TvkCreateImage; - vkDestroyImage: TvkDestroyImage; - vkGetImageSubresourceLayout: TvkGetImageSubresourceLayout; - vkCreateImageView: TvkCreateImageView; - vkDestroyImageView: TvkDestroyImageView; - vkCreateShaderModule: TvkCreateShaderModule; - vkDestroyShaderModule: TvkDestroyShaderModule; - vkCreatePipelineCache: TvkCreatePipelineCache; - vkDestroyPipelineCache: TvkDestroyPipelineCache; - vkGetPipelineCacheData: TvkGetPipelineCacheData; - vkMergePipelineCaches: TvkMergePipelineCaches; - vkCreateGraphicsPipelines: TvkCreateGraphicsPipelines; - vkCreateComputePipelines: TvkCreateComputePipelines; - vkDestroyPipeline: TvkDestroyPipeline; - vkCreatePipelineLayout: TvkCreatePipelineLayout; - vkDestroyPipelineLayout: TvkDestroyPipelineLayout; - vkCreateSampler: TvkCreateSampler; - vkDestroySampler: TvkDestroySampler; - vkCreateDescriptorSetLayout: TvkCreateDescriptorSetLayout; - vkDestroyDescriptorSetLayout: TvkDestroyDescriptorSetLayout; - vkCreateDescriptorPool: TvkCreateDescriptorPool; - vkDestroyDescriptorPool: TvkDestroyDescriptorPool; - vkResetDescriptorPool: TvkResetDescriptorPool; - vkAllocateDescriptorSets: TvkAllocateDescriptorSets; - vkFreeDescriptorSets: TvkFreeDescriptorSets; - vkUpdateDescriptorSets: TvkUpdateDescriptorSets; - vkCreateFramebuffer: TvkCreateFramebuffer; - vkDestroyFramebuffer: TvkDestroyFramebuffer; - vkCreateRenderPass: TvkCreateRenderPass; - vkDestroyRenderPass: TvkDestroyRenderPass; - vkGetRenderAreaGranularity: TvkGetRenderAreaGranularity; - vkCreateCommandPool: TvkCreateCommandPool; - vkDestroyCommandPool: TvkDestroyCommandPool; - vkResetCommandPool: TvkResetCommandPool; - vkAllocateCommandBuffers: TvkAllocateCommandBuffers; - vkFreeCommandBuffers: TvkFreeCommandBuffers; - vkBeginCommandBuffer: TvkBeginCommandBuffer; - vkEndCommandBuffer: TvkEndCommandBuffer; - vkResetCommandBuffer: TvkResetCommandBuffer; - vkCmdBindPipeline: TvkCmdBindPipeline; - vkCmdSetViewport: TvkCmdSetViewport; - vkCmdSetScissor: TvkCmdSetScissor; - vkCmdSetLineWidth: TvkCmdSetLineWidth; - vkCmdSetDepthBias: TvkCmdSetDepthBias; - vkCmdSetBlendConstants: TvkCmdSetBlendConstants; - vkCmdSetDepthBounds: TvkCmdSetDepthBounds; - vkCmdSetStencilCompareMask: TvkCmdSetStencilCompareMask; - vkCmdSetStencilWriteMask: TvkCmdSetStencilWriteMask; - vkCmdSetStencilReference: TvkCmdSetStencilReference; - vkCmdBindDescriptorSets: TvkCmdBindDescriptorSets; - vkCmdBindIndexBuffer: TvkCmdBindIndexBuffer; - vkCmdBindVertexBuffers: TvkCmdBindVertexBuffers; - vkCmdDraw: TvkCmdDraw; - vkCmdDrawIndexed: TvkCmdDrawIndexed; - vkCmdDrawIndirect: TvkCmdDrawIndirect; - vkCmdDrawIndexedIndirect: TvkCmdDrawIndexedIndirect; - vkCmdDispatch: TvkCmdDispatch; - vkCmdDispatchIndirect: TvkCmdDispatchIndirect; - vkCmdCopyBuffer: TvkCmdCopyBuffer; - vkCmdCopyImage: TvkCmdCopyImage; - vkCmdBlitImage: TvkCmdBlitImage; - vkCmdCopyBufferToImage: TvkCmdCopyBufferToImage; - vkCmdCopyImageToBuffer: TvkCmdCopyImageToBuffer; - vkCmdUpdateBuffer: TvkCmdUpdateBuffer; - vkCmdFillBuffer: TvkCmdFillBuffer; - vkCmdClearColorImage: TvkCmdClearColorImage; - vkCmdClearDepthStencilImage: TvkCmdClearDepthStencilImage; - vkCmdClearAttachments: TvkCmdClearAttachments; - vkCmdResolveImage: TvkCmdResolveImage; - vkCmdSetEvent: TvkCmdSetEvent; - vkCmdResetEvent: TvkCmdResetEvent; - vkCmdWaitEvents: TvkCmdWaitEvents; - vkCmdPipelineBarrier: TvkCmdPipelineBarrier; - vkCmdBeginQuery: TvkCmdBeginQuery; - vkCmdEndQuery: TvkCmdEndQuery; - vkCmdResetQueryPool: TvkCmdResetQueryPool; - vkCmdWriteTimestamp: TvkCmdWriteTimestamp; - vkCmdCopyQueryPoolResults: TvkCmdCopyQueryPoolResults; - vkCmdPushConstants: TvkCmdPushConstants; - vkCmdBeginRenderPass: TvkCmdBeginRenderPass; - vkCmdNextSubpass: TvkCmdNextSubpass; - vkCmdEndRenderPass: TvkCmdEndRenderPass; - vkCmdExecuteCommands: TvkCmdExecuteCommands; -{ ========================================== VK_KHR_surface ========================================== } - vkDestroySurfaceKHR: TvkDestroySurfaceKHR; - vkGetPhysicalDeviceSurfaceSupportKHR: TvkGetPhysicalDeviceSurfaceSupportKHR; - vkGetPhysicalDeviceSurfaceCapabilitiesKHR: TvkGetPhysicalDeviceSurfaceCapabilitiesKHR; - vkGetPhysicalDeviceSurfaceFormatsKHR: TvkGetPhysicalDeviceSurfaceFormatsKHR; - vkGetPhysicalDeviceSurfacePresentModesKHR: TvkGetPhysicalDeviceSurfacePresentModesKHR; - -{ ========================================= VK_KHR_swapchain ========================================= } - vkCreateSwapchainKHR: TvkCreateSwapchainKHR; - vkDestroySwapchainKHR: TvkDestroySwapchainKHR; - vkGetSwapchainImagesKHR: TvkGetSwapchainImagesKHR; - vkAcquireNextImageKHR: TvkAcquireNextImageKHR; - vkQueuePresentKHR: TvkQueuePresentKHR; - -{ ========================================== VK_KHR_display ========================================== } - vkGetPhysicalDeviceDisplayPropertiesKHR: TvkGetPhysicalDeviceDisplayPropertiesKHR; - vkGetPhysicalDeviceDisplayPlanePropertiesKHR: TvkGetPhysicalDeviceDisplayPlanePropertiesKHR; - vkGetDisplayPlaneSupportedDisplaysKHR: TvkGetDisplayPlaneSupportedDisplaysKHR; - vkGetDisplayModePropertiesKHR: TvkGetDisplayModePropertiesKHR; - vkCreateDisplayModeKHR: TvkCreateDisplayModeKHR; - vkGetDisplayPlaneCapabilitiesKHR: TvkGetDisplayPlaneCapabilitiesKHR; - vkCreateDisplayPlaneSurfaceKHR: TvkCreateDisplayPlaneSurfaceKHR; - -{ ===================================== VK_KHR_display_swapchain ===================================== } - vkCreateSharedSwapchainsKHR: TvkCreateSharedSwapchainsKHR; - -{ ======================================= VK_KHR_xlib_surface ======================================== } -{$IFDEF VK_USE_PLATFORM_XLIB_KHR} - vkCreateXlibSurfaceKHR: TvkCreateXlibSurfaceKHR; - vkGetPhysicalDeviceXlibPresentationSupportKHR: TvkGetPhysicalDeviceXlibPresentationSupportKHR; -{$ENDIF} - -{ ======================================== VK_KHR_xcb_surface ======================================== } -{$IFDEF VK_USE_PLATFORM_XCB_KHR} - vkCreateXcbSurfaceKHR: TvkCreateXcbSurfaceKHR; - vkGetPhysicalDeviceXcbPresentationSupportKHR: TvkGetPhysicalDeviceXcbPresentationSupportKHR; -{$ENDIF} - -{ ====================================== VK_KHR_wayland_surface ====================================== } -{$IFDEF VK_USE_PLATFORM_WAYLAND_KHR} - vkCreateWaylandSurfaceKHR: TvkCreateWaylandSurfaceKHR; - vkGetPhysicalDeviceWaylandPresentationSupportKHR: TvkGetPhysicalDeviceWaylandPresentationSupportKHR; -{$ENDIF} - -{ ======================================== VK_KHR_mir_surface ======================================== } -{$IFDEF VK_USE_PLATFORM_MIR_KHR} - vkCreateMirSurfaceKHR: TvkCreateMirSurfaceKHR; - vkGetPhysicalDeviceMirPresentationSupportKHR: TvkGetPhysicalDeviceMirPresentationSupportKHR; -{$ENDIF} - -{ ====================================== VK_KHR_android_surface ====================================== } -{$IFDEF VK_USE_PLATFORM_ANDROID_KHR} - vkCreateAndroidSurfaceKHR: TvkCreateAndroidSurfaceKHR; -{$ENDIF} - -{ ======================================= VK_KHR_win32_surface ======================================= } -{$IFDEF VK_USE_PLATFORM_WIN32_KHR} - vkCreateWin32SurfaceKHR: TvkCreateWin32SurfaceKHR; - vkGetPhysicalDeviceWin32PresentationSupportKHR: TvkGetPhysicalDeviceWin32PresentationSupportKHR; -{$ENDIF} +type + TVkInstanceCommands = packed record + Instance: VkInstance; + + { ========================================== VK_VERSION_1_0 ========================================== } + vkDestroyInstance: TvkDestroyInstance; + vkEnumeratePhysicalDevices: TvkEnumeratePhysicalDevices; + vkGetPhysicalDeviceFeatures: TvkGetPhysicalDeviceFeatures; + vkGetPhysicalDeviceFormatProperties: TvkGetPhysicalDeviceFormatProperties; + vkGetPhysicalDeviceImageFormatProperties: TvkGetPhysicalDeviceImageFormatProperties; + vkGetPhysicalDeviceProperties: TvkGetPhysicalDeviceProperties; + vkGetPhysicalDeviceQueueFamilyProperties: TvkGetPhysicalDeviceQueueFamilyProperties; + vkGetPhysicalDeviceMemoryProperties: TvkGetPhysicalDeviceMemoryProperties; + vkGetDeviceProcAddr: TvkGetDeviceProcAddr; + vkCreateDevice: TvkCreateDevice; + vkEnumerateDeviceExtensionProperties: TvkEnumerateDeviceExtensionProperties; + vkEnumerateDeviceLayerProperties: TvkEnumerateDeviceLayerProperties; + vkGetPhysicalDeviceSparseImageFormatProperties: TvkGetPhysicalDeviceSparseImageFormatProperties; + + { ========================================== VK_KHR_surface ========================================== } + vkDestroySurfaceKHR: TvkDestroySurfaceKHR; + vkGetPhysicalDeviceSurfaceSupportKHR: TvkGetPhysicalDeviceSurfaceSupportKHR; + vkGetPhysicalDeviceSurfaceCapabilitiesKHR: TvkGetPhysicalDeviceSurfaceCapabilitiesKHR; + vkGetPhysicalDeviceSurfaceFormatsKHR: TvkGetPhysicalDeviceSurfaceFormatsKHR; + vkGetPhysicalDeviceSurfacePresentModesKHR: TvkGetPhysicalDeviceSurfacePresentModesKHR; + + { ========================================== VK_KHR_display ========================================== } + vkGetPhysicalDeviceDisplayPropertiesKHR: TvkGetPhysicalDeviceDisplayPropertiesKHR; + vkGetPhysicalDeviceDisplayPlanePropertiesKHR: TvkGetPhysicalDeviceDisplayPlanePropertiesKHR; + vkGetDisplayPlaneSupportedDisplaysKHR: TvkGetDisplayPlaneSupportedDisplaysKHR; + vkGetDisplayModePropertiesKHR: TvkGetDisplayModePropertiesKHR; + vkCreateDisplayModeKHR: TvkCreateDisplayModeKHR; + vkGetDisplayPlaneCapabilitiesKHR: TvkGetDisplayPlaneCapabilitiesKHR; + vkCreateDisplayPlaneSurfaceKHR: TvkCreateDisplayPlaneSurfaceKHR; + + { ======================================= VK_KHR_xlib_surface ======================================== } + {$IFDEF VK_USE_PLATFORM_XLIB_KHR} + vkCreateXlibSurfaceKHR: TvkCreateXlibSurfaceKHR; + vkGetPhysicalDeviceXlibPresentationSupportKHR: TvkGetPhysicalDeviceXlibPresentationSupportKHR; + {$ENDIF} + + { ======================================== VK_KHR_xcb_surface ======================================== } + {$IFDEF VK_USE_PLATFORM_XCB_KHR} + vkCreateXcbSurfaceKHR: TvkCreateXcbSurfaceKHR; + vkGetPhysicalDeviceXcbPresentationSupportKHR: TvkGetPhysicalDeviceXcbPresentationSupportKHR; + {$ENDIF} + + { ====================================== VK_KHR_wayland_surface ====================================== } + {$IFDEF VK_USE_PLATFORM_WAYLAND_KHR} + vkCreateWaylandSurfaceKHR: TvkCreateWaylandSurfaceKHR; + vkGetPhysicalDeviceWaylandPresentationSupportKHR: TvkGetPhysicalDeviceWaylandPresentationSupportKHR; + {$ENDIF} + + { ======================================== VK_KHR_mir_surface ======================================== } + {$IFDEF VK_USE_PLATFORM_MIR_KHR} + vkCreateMirSurfaceKHR: TvkCreateMirSurfaceKHR; + vkGetPhysicalDeviceMirPresentationSupportKHR: TvkGetPhysicalDeviceMirPresentationSupportKHR; + {$ENDIF} + + { ====================================== VK_KHR_android_surface ====================================== } + {$IFDEF VK_USE_PLATFORM_ANDROID_KHR} + vkCreateAndroidSurfaceKHR: TvkCreateAndroidSurfaceKHR; + {$ENDIF} + + { ======================================= VK_KHR_win32_surface ======================================= } + {$IFDEF VK_USE_PLATFORM_WIN32_KHR} + vkCreateWin32SurfaceKHR: TvkCreateWin32SurfaceKHR; + vkGetPhysicalDeviceWin32PresentationSupportKHR: TvkGetPhysicalDeviceWin32PresentationSupportKHR; + {$ENDIF} + + { ======================================= VK_EXT_debug_report ======================================== } + vkCreateDebugReportCallbackEXT: TvkCreateDebugReportCallbackEXT; + vkDestroyDebugReportCallbackEXT: TvkDestroyDebugReportCallbackEXT; + vkDebugReportMessageEXT: TvkDebugReportMessageEXT; + + end; + + TVkDeviceCommands = packed record + Device: VkDevice; + + { ========================================== VK_VERSION_1_0 ========================================== } + vkDestroyDevice: TvkDestroyDevice; + vkGetDeviceQueue: TvkGetDeviceQueue; + vkQueueSubmit: TvkQueueSubmit; + vkQueueWaitIdle: TvkQueueWaitIdle; + vkDeviceWaitIdle: TvkDeviceWaitIdle; + vkAllocateMemory: TvkAllocateMemory; + vkFreeMemory: TvkFreeMemory; + vkMapMemory: TvkMapMemory; + vkUnmapMemory: TvkUnmapMemory; + vkFlushMappedMemoryRanges: TvkFlushMappedMemoryRanges; + vkInvalidateMappedMemoryRanges: TvkInvalidateMappedMemoryRanges; + vkGetDeviceMemoryCommitment: TvkGetDeviceMemoryCommitment; + vkBindBufferMemory: TvkBindBufferMemory; + vkBindImageMemory: TvkBindImageMemory; + vkGetBufferMemoryRequirements: TvkGetBufferMemoryRequirements; + vkGetImageMemoryRequirements: TvkGetImageMemoryRequirements; + vkGetImageSparseMemoryRequirements: TvkGetImageSparseMemoryRequirements; + vkQueueBindSparse: TvkQueueBindSparse; + vkCreateFence: TvkCreateFence; + vkDestroyFence: TvkDestroyFence; + vkResetFences: TvkResetFences; + vkGetFenceStatus: TvkGetFenceStatus; + vkWaitForFences: TvkWaitForFences; + vkCreateSemaphore: TvkCreateSemaphore; + vkDestroySemaphore: TvkDestroySemaphore; + vkCreateEvent: TvkCreateEvent; + vkDestroyEvent: TvkDestroyEvent; + vkGetEventStatus: TvkGetEventStatus; + vkSetEvent: TvkSetEvent; + vkResetEvent: TvkResetEvent; + vkCreateQueryPool: TvkCreateQueryPool; + vkDestroyQueryPool: TvkDestroyQueryPool; + vkGetQueryPoolResults: TvkGetQueryPoolResults; + vkCreateBuffer: TvkCreateBuffer; + vkDestroyBuffer: TvkDestroyBuffer; + vkCreateBufferView: TvkCreateBufferView; + vkDestroyBufferView: TvkDestroyBufferView; + vkCreateImage: TvkCreateImage; + vkDestroyImage: TvkDestroyImage; + vkGetImageSubresourceLayout: TvkGetImageSubresourceLayout; + vkCreateImageView: TvkCreateImageView; + vkDestroyImageView: TvkDestroyImageView; + vkCreateShaderModule: TvkCreateShaderModule; + vkDestroyShaderModule: TvkDestroyShaderModule; + vkCreatePipelineCache: TvkCreatePipelineCache; + vkDestroyPipelineCache: TvkDestroyPipelineCache; + vkGetPipelineCacheData: TvkGetPipelineCacheData; + vkMergePipelineCaches: TvkMergePipelineCaches; + vkCreateGraphicsPipelines: TvkCreateGraphicsPipelines; + vkCreateComputePipelines: TvkCreateComputePipelines; + vkDestroyPipeline: TvkDestroyPipeline; + vkCreatePipelineLayout: TvkCreatePipelineLayout; + vkDestroyPipelineLayout: TvkDestroyPipelineLayout; + vkCreateSampler: TvkCreateSampler; + vkDestroySampler: TvkDestroySampler; + vkCreateDescriptorSetLayout: TvkCreateDescriptorSetLayout; + vkDestroyDescriptorSetLayout: TvkDestroyDescriptorSetLayout; + vkCreateDescriptorPool: TvkCreateDescriptorPool; + vkDestroyDescriptorPool: TvkDestroyDescriptorPool; + vkResetDescriptorPool: TvkResetDescriptorPool; + vkAllocateDescriptorSets: TvkAllocateDescriptorSets; + vkFreeDescriptorSets: TvkFreeDescriptorSets; + vkUpdateDescriptorSets: TvkUpdateDescriptorSets; + vkCreateFramebuffer: TvkCreateFramebuffer; + vkDestroyFramebuffer: TvkDestroyFramebuffer; + vkCreateRenderPass: TvkCreateRenderPass; + vkDestroyRenderPass: TvkDestroyRenderPass; + vkGetRenderAreaGranularity: TvkGetRenderAreaGranularity; + vkCreateCommandPool: TvkCreateCommandPool; + vkDestroyCommandPool: TvkDestroyCommandPool; + vkResetCommandPool: TvkResetCommandPool; + vkAllocateCommandBuffers: TvkAllocateCommandBuffers; + vkFreeCommandBuffers: TvkFreeCommandBuffers; + vkBeginCommandBuffer: TvkBeginCommandBuffer; + vkEndCommandBuffer: TvkEndCommandBuffer; + vkResetCommandBuffer: TvkResetCommandBuffer; + vkCmdBindPipeline: TvkCmdBindPipeline; + vkCmdSetViewport: TvkCmdSetViewport; + vkCmdSetScissor: TvkCmdSetScissor; + vkCmdSetLineWidth: TvkCmdSetLineWidth; + vkCmdSetDepthBias: TvkCmdSetDepthBias; + vkCmdSetBlendConstants: TvkCmdSetBlendConstants; + vkCmdSetDepthBounds: TvkCmdSetDepthBounds; + vkCmdSetStencilCompareMask: TvkCmdSetStencilCompareMask; + vkCmdSetStencilWriteMask: TvkCmdSetStencilWriteMask; + vkCmdSetStencilReference: TvkCmdSetStencilReference; + vkCmdBindDescriptorSets: TvkCmdBindDescriptorSets; + vkCmdBindIndexBuffer: TvkCmdBindIndexBuffer; + vkCmdBindVertexBuffers: TvkCmdBindVertexBuffers; + vkCmdDraw: TvkCmdDraw; + vkCmdDrawIndexed: TvkCmdDrawIndexed; + vkCmdDrawIndirect: TvkCmdDrawIndirect; + vkCmdDrawIndexedIndirect: TvkCmdDrawIndexedIndirect; + vkCmdDispatch: TvkCmdDispatch; + vkCmdDispatchIndirect: TvkCmdDispatchIndirect; + vkCmdCopyBuffer: TvkCmdCopyBuffer; + vkCmdCopyImage: TvkCmdCopyImage; + vkCmdBlitImage: TvkCmdBlitImage; + vkCmdCopyBufferToImage: TvkCmdCopyBufferToImage; + vkCmdCopyImageToBuffer: TvkCmdCopyImageToBuffer; + vkCmdUpdateBuffer: TvkCmdUpdateBuffer; + vkCmdFillBuffer: TvkCmdFillBuffer; + vkCmdClearColorImage: TvkCmdClearColorImage; + vkCmdClearDepthStencilImage: TvkCmdClearDepthStencilImage; + vkCmdClearAttachments: TvkCmdClearAttachments; + vkCmdResolveImage: TvkCmdResolveImage; + vkCmdSetEvent: TvkCmdSetEvent; + vkCmdResetEvent: TvkCmdResetEvent; + vkCmdWaitEvents: TvkCmdWaitEvents; + vkCmdPipelineBarrier: TvkCmdPipelineBarrier; + vkCmdBeginQuery: TvkCmdBeginQuery; + vkCmdEndQuery: TvkCmdEndQuery; + vkCmdResetQueryPool: TvkCmdResetQueryPool; + vkCmdWriteTimestamp: TvkCmdWriteTimestamp; + vkCmdCopyQueryPoolResults: TvkCmdCopyQueryPoolResults; + vkCmdPushConstants: TvkCmdPushConstants; + vkCmdBeginRenderPass: TvkCmdBeginRenderPass; + vkCmdNextSubpass: TvkCmdNextSubpass; + vkCmdEndRenderPass: TvkCmdEndRenderPass; + vkCmdExecuteCommands: TvkCmdExecuteCommands; + + { ========================================= VK_KHR_swapchain ========================================= } + vkCreateSwapchainKHR: TvkCreateSwapchainKHR; + vkDestroySwapchainKHR: TvkDestroySwapchainKHR; + vkGetSwapchainImagesKHR: TvkGetSwapchainImagesKHR; + vkAcquireNextImageKHR: TvkAcquireNextImageKHR; + vkQueuePresentKHR: TvkQueuePresentKHR; + + { ===================================== VK_KHR_display_swapchain ===================================== } + vkCreateSharedSwapchainsKHR: TvkCreateSharedSwapchainsKHR; -{ ======================================= VK_EXT_debug_report ======================================== } - vkCreateDebugReportCallbackEXT: TvkCreateDebugReportCallbackEXT; - vkDestroyDebugReportCallbackEXT: TvkDestroyDebugReportCallbackEXT; - vkDebugReportMessageEXT: TvkDebugReportMessageEXT; + end; const VULKAN_LIBNAME = 'vulkan-1.dll'; @@ -4390,7 +4452,8 @@ function vkGetVersionMinor(const aVersion: VkVersion): Integer; inline; function vkGetVersionPatch(const aVersion: VkVersion): Integer; inline; function InitializeVulkan(const aLibName: String = VULKAN_LIBNAME): Boolean; -procedure LoadVulkanCommands(const aInstance: VkInstance); +function LoadInstanceCommands(const aInstance: VkInstance; out aCommands: TVkInstanceCommands): Boolean; +function LoadDeviceCommands(const aInstance: VkInstance; const aDevice: VkDevice; out aCommands: TVkDeviceCommands): Boolean; procedure FinalizeVulkan; implementation @@ -4412,6 +4475,7 @@ const var vkLibHandle: TvkLibHandle = InvalidLibHandle; +{ ===================================== Library Handling ============================================= } function vkLoadLibrary(const aLibName: String): TvkLibHandle; begin {$IF DEFINED(VK_WIN)} @@ -4421,234 +4485,18 @@ begin {$ENDIF} end; -function vkGetProcAddress(const aProcName: String; aInstance: VkInstance = nil; aLibHandle: TvkLibHandle = InvalidLibHandle): TvkVoidFunction; +function vkGetProcAddress(const aProcName: String; aLibHandle: TvkLibHandle = InvalidLibHandle): TvkVoidFunction; begin result := nil; if (aLibHandle = InvalidLibHandle) then aLibHandle := vkLibHandle; - if Assigned(vkGetInstanceProcAddr) then begin - result := vkGetInstanceProcAddr(aInstance, PVkChar(aProcName)); - if Assigned(result) then - exit; - end; - {$IF DEFINED(VK_WIN)} - result := GetProcAddress(aLibHandle, AnsiString(aProcName)); + result := TvkVoidFunction(GetProcAddress(aLibHandle, AnsiString(aProcName))); {$ELSE} result := nil; {$ENDIF} end; -procedure vkLoadAddresses(const aInstance: VkInstance = nil); -begin - -{ ========================================== VK_VERSION_1_0 ========================================== } - vkCreateInstance := TvkCreateInstance (vkGetProcAddress('vkCreateInstance', aInstance)); - vkDestroyInstance := TvkDestroyInstance (vkGetProcAddress('vkDestroyInstance', aInstance)); - vkEnumeratePhysicalDevices := TvkEnumeratePhysicalDevices (vkGetProcAddress('vkEnumeratePhysicalDevices', aInstance)); - vkGetPhysicalDeviceFeatures := TvkGetPhysicalDeviceFeatures (vkGetProcAddress('vkGetPhysicalDeviceFeatures', aInstance)); - vkGetPhysicalDeviceFormatProperties := TvkGetPhysicalDeviceFormatProperties (vkGetProcAddress('vkGetPhysicalDeviceFormatProperties', aInstance)); - vkGetPhysicalDeviceImageFormatProperties := TvkGetPhysicalDeviceImageFormatProperties (vkGetProcAddress('vkGetPhysicalDeviceImageFormatProperties', aInstance)); - vkGetPhysicalDeviceProperties := TvkGetPhysicalDeviceProperties (vkGetProcAddress('vkGetPhysicalDeviceProperties', aInstance)); - vkGetPhysicalDeviceQueueFamilyProperties := TvkGetPhysicalDeviceQueueFamilyProperties (vkGetProcAddress('vkGetPhysicalDeviceQueueFamilyProperties', aInstance)); - vkGetPhysicalDeviceMemoryProperties := TvkGetPhysicalDeviceMemoryProperties (vkGetProcAddress('vkGetPhysicalDeviceMemoryProperties', aInstance)); - vkGetInstanceProcAddr := TvkGetInstanceProcAddr (vkGetProcAddress('vkGetInstanceProcAddr', aInstance)); - vkGetDeviceProcAddr := TvkGetDeviceProcAddr (vkGetProcAddress('vkGetDeviceProcAddr', aInstance)); - vkCreateDevice := TvkCreateDevice (vkGetProcAddress('vkCreateDevice', aInstance)); - vkDestroyDevice := TvkDestroyDevice (vkGetProcAddress('vkDestroyDevice', aInstance)); - vkEnumerateInstanceExtensionProperties := TvkEnumerateInstanceExtensionProperties (vkGetProcAddress('vkEnumerateInstanceExtensionProperties', aInstance)); - vkEnumerateDeviceExtensionProperties := TvkEnumerateDeviceExtensionProperties (vkGetProcAddress('vkEnumerateDeviceExtensionProperties', aInstance)); - vkEnumerateInstanceLayerProperties := TvkEnumerateInstanceLayerProperties (vkGetProcAddress('vkEnumerateInstanceLayerProperties', aInstance)); - vkEnumerateDeviceLayerProperties := TvkEnumerateDeviceLayerProperties (vkGetProcAddress('vkEnumerateDeviceLayerProperties', aInstance)); - vkGetDeviceQueue := TvkGetDeviceQueue (vkGetProcAddress('vkGetDeviceQueue', aInstance)); - vkQueueSubmit := TvkQueueSubmit (vkGetProcAddress('vkQueueSubmit', aInstance)); - vkQueueWaitIdle := TvkQueueWaitIdle (vkGetProcAddress('vkQueueWaitIdle', aInstance)); - vkDeviceWaitIdle := TvkDeviceWaitIdle (vkGetProcAddress('vkDeviceWaitIdle', aInstance)); - vkAllocateMemory := TvkAllocateMemory (vkGetProcAddress('vkAllocateMemory', aInstance)); - vkFreeMemory := TvkFreeMemory (vkGetProcAddress('vkFreeMemory', aInstance)); - vkMapMemory := TvkMapMemory (vkGetProcAddress('vkMapMemory', aInstance)); - vkUnmapMemory := TvkUnmapMemory (vkGetProcAddress('vkUnmapMemory', aInstance)); - vkFlushMappedMemoryRanges := TvkFlushMappedMemoryRanges (vkGetProcAddress('vkFlushMappedMemoryRanges', aInstance)); - vkInvalidateMappedMemoryRanges := TvkInvalidateMappedMemoryRanges (vkGetProcAddress('vkInvalidateMappedMemoryRanges', aInstance)); - vkGetDeviceMemoryCommitment := TvkGetDeviceMemoryCommitment (vkGetProcAddress('vkGetDeviceMemoryCommitment', aInstance)); - vkBindBufferMemory := TvkBindBufferMemory (vkGetProcAddress('vkBindBufferMemory', aInstance)); - vkBindImageMemory := TvkBindImageMemory (vkGetProcAddress('vkBindImageMemory', aInstance)); - vkGetBufferMemoryRequirements := TvkGetBufferMemoryRequirements (vkGetProcAddress('vkGetBufferMemoryRequirements', aInstance)); - vkGetImageMemoryRequirements := TvkGetImageMemoryRequirements (vkGetProcAddress('vkGetImageMemoryRequirements', aInstance)); - vkGetImageSparseMemoryRequirements := TvkGetImageSparseMemoryRequirements (vkGetProcAddress('vkGetImageSparseMemoryRequirements', aInstance)); - vkGetPhysicalDeviceSparseImageFormatProperties := TvkGetPhysicalDeviceSparseImageFormatProperties (vkGetProcAddress('vkGetPhysicalDeviceSparseImageFormatProperties', aInstance)); - vkQueueBindSparse := TvkQueueBindSparse (vkGetProcAddress('vkQueueBindSparse', aInstance)); - vkCreateFence := TvkCreateFence (vkGetProcAddress('vkCreateFence', aInstance)); - vkDestroyFence := TvkDestroyFence (vkGetProcAddress('vkDestroyFence', aInstance)); - vkResetFences := TvkResetFences (vkGetProcAddress('vkResetFences', aInstance)); - vkGetFenceStatus := TvkGetFenceStatus (vkGetProcAddress('vkGetFenceStatus', aInstance)); - vkWaitForFences := TvkWaitForFences (vkGetProcAddress('vkWaitForFences', aInstance)); - vkCreateSemaphore := TvkCreateSemaphore (vkGetProcAddress('vkCreateSemaphore', aInstance)); - vkDestroySemaphore := TvkDestroySemaphore (vkGetProcAddress('vkDestroySemaphore', aInstance)); - vkCreateEvent := TvkCreateEvent (vkGetProcAddress('vkCreateEvent', aInstance)); - vkDestroyEvent := TvkDestroyEvent (vkGetProcAddress('vkDestroyEvent', aInstance)); - vkGetEventStatus := TvkGetEventStatus (vkGetProcAddress('vkGetEventStatus', aInstance)); - vkSetEvent := TvkSetEvent (vkGetProcAddress('vkSetEvent', aInstance)); - vkResetEvent := TvkResetEvent (vkGetProcAddress('vkResetEvent', aInstance)); - vkCreateQueryPool := TvkCreateQueryPool (vkGetProcAddress('vkCreateQueryPool', aInstance)); - vkDestroyQueryPool := TvkDestroyQueryPool (vkGetProcAddress('vkDestroyQueryPool', aInstance)); - vkGetQueryPoolResults := TvkGetQueryPoolResults (vkGetProcAddress('vkGetQueryPoolResults', aInstance)); - vkCreateBuffer := TvkCreateBuffer (vkGetProcAddress('vkCreateBuffer', aInstance)); - vkDestroyBuffer := TvkDestroyBuffer (vkGetProcAddress('vkDestroyBuffer', aInstance)); - vkCreateBufferView := TvkCreateBufferView (vkGetProcAddress('vkCreateBufferView', aInstance)); - vkDestroyBufferView := TvkDestroyBufferView (vkGetProcAddress('vkDestroyBufferView', aInstance)); - vkCreateImage := TvkCreateImage (vkGetProcAddress('vkCreateImage', aInstance)); - vkDestroyImage := TvkDestroyImage (vkGetProcAddress('vkDestroyImage', aInstance)); - vkGetImageSubresourceLayout := TvkGetImageSubresourceLayout (vkGetProcAddress('vkGetImageSubresourceLayout', aInstance)); - vkCreateImageView := TvkCreateImageView (vkGetProcAddress('vkCreateImageView', aInstance)); - vkDestroyImageView := TvkDestroyImageView (vkGetProcAddress('vkDestroyImageView', aInstance)); - vkCreateShaderModule := TvkCreateShaderModule (vkGetProcAddress('vkCreateShaderModule', aInstance)); - vkDestroyShaderModule := TvkDestroyShaderModule (vkGetProcAddress('vkDestroyShaderModule', aInstance)); - vkCreatePipelineCache := TvkCreatePipelineCache (vkGetProcAddress('vkCreatePipelineCache', aInstance)); - vkDestroyPipelineCache := TvkDestroyPipelineCache (vkGetProcAddress('vkDestroyPipelineCache', aInstance)); - vkGetPipelineCacheData := TvkGetPipelineCacheData (vkGetProcAddress('vkGetPipelineCacheData', aInstance)); - vkMergePipelineCaches := TvkMergePipelineCaches (vkGetProcAddress('vkMergePipelineCaches', aInstance)); - vkCreateGraphicsPipelines := TvkCreateGraphicsPipelines (vkGetProcAddress('vkCreateGraphicsPipelines', aInstance)); - vkCreateComputePipelines := TvkCreateComputePipelines (vkGetProcAddress('vkCreateComputePipelines', aInstance)); - vkDestroyPipeline := TvkDestroyPipeline (vkGetProcAddress('vkDestroyPipeline', aInstance)); - vkCreatePipelineLayout := TvkCreatePipelineLayout (vkGetProcAddress('vkCreatePipelineLayout', aInstance)); - vkDestroyPipelineLayout := TvkDestroyPipelineLayout (vkGetProcAddress('vkDestroyPipelineLayout', aInstance)); - vkCreateSampler := TvkCreateSampler (vkGetProcAddress('vkCreateSampler', aInstance)); - vkDestroySampler := TvkDestroySampler (vkGetProcAddress('vkDestroySampler', aInstance)); - vkCreateDescriptorSetLayout := TvkCreateDescriptorSetLayout (vkGetProcAddress('vkCreateDescriptorSetLayout', aInstance)); - vkDestroyDescriptorSetLayout := TvkDestroyDescriptorSetLayout (vkGetProcAddress('vkDestroyDescriptorSetLayout', aInstance)); - vkCreateDescriptorPool := TvkCreateDescriptorPool (vkGetProcAddress('vkCreateDescriptorPool', aInstance)); - vkDestroyDescriptorPool := TvkDestroyDescriptorPool (vkGetProcAddress('vkDestroyDescriptorPool', aInstance)); - vkResetDescriptorPool := TvkResetDescriptorPool (vkGetProcAddress('vkResetDescriptorPool', aInstance)); - vkAllocateDescriptorSets := TvkAllocateDescriptorSets (vkGetProcAddress('vkAllocateDescriptorSets', aInstance)); - vkFreeDescriptorSets := TvkFreeDescriptorSets (vkGetProcAddress('vkFreeDescriptorSets', aInstance)); - vkUpdateDescriptorSets := TvkUpdateDescriptorSets (vkGetProcAddress('vkUpdateDescriptorSets', aInstance)); - vkCreateFramebuffer := TvkCreateFramebuffer (vkGetProcAddress('vkCreateFramebuffer', aInstance)); - vkDestroyFramebuffer := TvkDestroyFramebuffer (vkGetProcAddress('vkDestroyFramebuffer', aInstance)); - vkCreateRenderPass := TvkCreateRenderPass (vkGetProcAddress('vkCreateRenderPass', aInstance)); - vkDestroyRenderPass := TvkDestroyRenderPass (vkGetProcAddress('vkDestroyRenderPass', aInstance)); - vkGetRenderAreaGranularity := TvkGetRenderAreaGranularity (vkGetProcAddress('vkGetRenderAreaGranularity', aInstance)); - vkCreateCommandPool := TvkCreateCommandPool (vkGetProcAddress('vkCreateCommandPool', aInstance)); - vkDestroyCommandPool := TvkDestroyCommandPool (vkGetProcAddress('vkDestroyCommandPool', aInstance)); - vkResetCommandPool := TvkResetCommandPool (vkGetProcAddress('vkResetCommandPool', aInstance)); - vkAllocateCommandBuffers := TvkAllocateCommandBuffers (vkGetProcAddress('vkAllocateCommandBuffers', aInstance)); - vkFreeCommandBuffers := TvkFreeCommandBuffers (vkGetProcAddress('vkFreeCommandBuffers', aInstance)); - vkBeginCommandBuffer := TvkBeginCommandBuffer (vkGetProcAddress('vkBeginCommandBuffer', aInstance)); - vkEndCommandBuffer := TvkEndCommandBuffer (vkGetProcAddress('vkEndCommandBuffer', aInstance)); - vkResetCommandBuffer := TvkResetCommandBuffer (vkGetProcAddress('vkResetCommandBuffer', aInstance)); - vkCmdBindPipeline := TvkCmdBindPipeline (vkGetProcAddress('vkCmdBindPipeline', aInstance)); - vkCmdSetViewport := TvkCmdSetViewport (vkGetProcAddress('vkCmdSetViewport', aInstance)); - vkCmdSetScissor := TvkCmdSetScissor (vkGetProcAddress('vkCmdSetScissor', aInstance)); - vkCmdSetLineWidth := TvkCmdSetLineWidth (vkGetProcAddress('vkCmdSetLineWidth', aInstance)); - vkCmdSetDepthBias := TvkCmdSetDepthBias (vkGetProcAddress('vkCmdSetDepthBias', aInstance)); - vkCmdSetBlendConstants := TvkCmdSetBlendConstants (vkGetProcAddress('vkCmdSetBlendConstants', aInstance)); - vkCmdSetDepthBounds := TvkCmdSetDepthBounds (vkGetProcAddress('vkCmdSetDepthBounds', aInstance)); - vkCmdSetStencilCompareMask := TvkCmdSetStencilCompareMask (vkGetProcAddress('vkCmdSetStencilCompareMask', aInstance)); - vkCmdSetStencilWriteMask := TvkCmdSetStencilWriteMask (vkGetProcAddress('vkCmdSetStencilWriteMask', aInstance)); - vkCmdSetStencilReference := TvkCmdSetStencilReference (vkGetProcAddress('vkCmdSetStencilReference', aInstance)); - vkCmdBindDescriptorSets := TvkCmdBindDescriptorSets (vkGetProcAddress('vkCmdBindDescriptorSets', aInstance)); - vkCmdBindIndexBuffer := TvkCmdBindIndexBuffer (vkGetProcAddress('vkCmdBindIndexBuffer', aInstance)); - vkCmdBindVertexBuffers := TvkCmdBindVertexBuffers (vkGetProcAddress('vkCmdBindVertexBuffers', aInstance)); - vkCmdDraw := TvkCmdDraw (vkGetProcAddress('vkCmdDraw', aInstance)); - vkCmdDrawIndexed := TvkCmdDrawIndexed (vkGetProcAddress('vkCmdDrawIndexed', aInstance)); - vkCmdDrawIndirect := TvkCmdDrawIndirect (vkGetProcAddress('vkCmdDrawIndirect', aInstance)); - vkCmdDrawIndexedIndirect := TvkCmdDrawIndexedIndirect (vkGetProcAddress('vkCmdDrawIndexedIndirect', aInstance)); - vkCmdDispatch := TvkCmdDispatch (vkGetProcAddress('vkCmdDispatch', aInstance)); - vkCmdDispatchIndirect := TvkCmdDispatchIndirect (vkGetProcAddress('vkCmdDispatchIndirect', aInstance)); - vkCmdCopyBuffer := TvkCmdCopyBuffer (vkGetProcAddress('vkCmdCopyBuffer', aInstance)); - vkCmdCopyImage := TvkCmdCopyImage (vkGetProcAddress('vkCmdCopyImage', aInstance)); - vkCmdBlitImage := TvkCmdBlitImage (vkGetProcAddress('vkCmdBlitImage', aInstance)); - vkCmdCopyBufferToImage := TvkCmdCopyBufferToImage (vkGetProcAddress('vkCmdCopyBufferToImage', aInstance)); - vkCmdCopyImageToBuffer := TvkCmdCopyImageToBuffer (vkGetProcAddress('vkCmdCopyImageToBuffer', aInstance)); - vkCmdUpdateBuffer := TvkCmdUpdateBuffer (vkGetProcAddress('vkCmdUpdateBuffer', aInstance)); - vkCmdFillBuffer := TvkCmdFillBuffer (vkGetProcAddress('vkCmdFillBuffer', aInstance)); - vkCmdClearColorImage := TvkCmdClearColorImage (vkGetProcAddress('vkCmdClearColorImage', aInstance)); - vkCmdClearDepthStencilImage := TvkCmdClearDepthStencilImage (vkGetProcAddress('vkCmdClearDepthStencilImage', aInstance)); - vkCmdClearAttachments := TvkCmdClearAttachments (vkGetProcAddress('vkCmdClearAttachments', aInstance)); - vkCmdResolveImage := TvkCmdResolveImage (vkGetProcAddress('vkCmdResolveImage', aInstance)); - vkCmdSetEvent := TvkCmdSetEvent (vkGetProcAddress('vkCmdSetEvent', aInstance)); - vkCmdResetEvent := TvkCmdResetEvent (vkGetProcAddress('vkCmdResetEvent', aInstance)); - vkCmdWaitEvents := TvkCmdWaitEvents (vkGetProcAddress('vkCmdWaitEvents', aInstance)); - vkCmdPipelineBarrier := TvkCmdPipelineBarrier (vkGetProcAddress('vkCmdPipelineBarrier', aInstance)); - vkCmdBeginQuery := TvkCmdBeginQuery (vkGetProcAddress('vkCmdBeginQuery', aInstance)); - vkCmdEndQuery := TvkCmdEndQuery (vkGetProcAddress('vkCmdEndQuery', aInstance)); - vkCmdResetQueryPool := TvkCmdResetQueryPool (vkGetProcAddress('vkCmdResetQueryPool', aInstance)); - vkCmdWriteTimestamp := TvkCmdWriteTimestamp (vkGetProcAddress('vkCmdWriteTimestamp', aInstance)); - vkCmdCopyQueryPoolResults := TvkCmdCopyQueryPoolResults (vkGetProcAddress('vkCmdCopyQueryPoolResults', aInstance)); - vkCmdPushConstants := TvkCmdPushConstants (vkGetProcAddress('vkCmdPushConstants', aInstance)); - vkCmdBeginRenderPass := TvkCmdBeginRenderPass (vkGetProcAddress('vkCmdBeginRenderPass', aInstance)); - vkCmdNextSubpass := TvkCmdNextSubpass (vkGetProcAddress('vkCmdNextSubpass', aInstance)); - vkCmdEndRenderPass := TvkCmdEndRenderPass (vkGetProcAddress('vkCmdEndRenderPass', aInstance)); - vkCmdExecuteCommands := TvkCmdExecuteCommands (vkGetProcAddress('vkCmdExecuteCommands', aInstance)); - -{ ========================================== VK_KHR_surface ========================================== } - vkDestroySurfaceKHR := TvkDestroySurfaceKHR (vkGetProcAddress('vkDestroySurfaceKHR', aInstance)); - vkGetPhysicalDeviceSurfaceSupportKHR := TvkGetPhysicalDeviceSurfaceSupportKHR (vkGetProcAddress('vkGetPhysicalDeviceSurfaceSupportKHR', aInstance)); - vkGetPhysicalDeviceSurfaceCapabilitiesKHR := TvkGetPhysicalDeviceSurfaceCapabilitiesKHR (vkGetProcAddress('vkGetPhysicalDeviceSurfaceCapabilitiesKHR', aInstance)); - vkGetPhysicalDeviceSurfaceFormatsKHR := TvkGetPhysicalDeviceSurfaceFormatsKHR (vkGetProcAddress('vkGetPhysicalDeviceSurfaceFormatsKHR', aInstance)); - vkGetPhysicalDeviceSurfacePresentModesKHR := TvkGetPhysicalDeviceSurfacePresentModesKHR (vkGetProcAddress('vkGetPhysicalDeviceSurfacePresentModesKHR', aInstance)); - -{ ========================================= VK_KHR_swapchain ========================================= } - vkCreateSwapchainKHR := TvkCreateSwapchainKHR (vkGetProcAddress('vkCreateSwapchainKHR', aInstance)); - vkDestroySwapchainKHR := TvkDestroySwapchainKHR (vkGetProcAddress('vkDestroySwapchainKHR', aInstance)); - vkGetSwapchainImagesKHR := TvkGetSwapchainImagesKHR (vkGetProcAddress('vkGetSwapchainImagesKHR', aInstance)); - vkAcquireNextImageKHR := TvkAcquireNextImageKHR (vkGetProcAddress('vkAcquireNextImageKHR', aInstance)); - vkQueuePresentKHR := TvkQueuePresentKHR (vkGetProcAddress('vkQueuePresentKHR', aInstance)); - -{ ========================================== VK_KHR_display ========================================== } - vkGetPhysicalDeviceDisplayPropertiesKHR := TvkGetPhysicalDeviceDisplayPropertiesKHR (vkGetProcAddress('vkGetPhysicalDeviceDisplayPropertiesKHR', aInstance)); - vkGetPhysicalDeviceDisplayPlanePropertiesKHR := TvkGetPhysicalDeviceDisplayPlanePropertiesKHR (vkGetProcAddress('vkGetPhysicalDeviceDisplayPlanePropertiesKHR', aInstance)); - vkGetDisplayPlaneSupportedDisplaysKHR := TvkGetDisplayPlaneSupportedDisplaysKHR (vkGetProcAddress('vkGetDisplayPlaneSupportedDisplaysKHR', aInstance)); - vkGetDisplayModePropertiesKHR := TvkGetDisplayModePropertiesKHR (vkGetProcAddress('vkGetDisplayModePropertiesKHR', aInstance)); - vkCreateDisplayModeKHR := TvkCreateDisplayModeKHR (vkGetProcAddress('vkCreateDisplayModeKHR', aInstance)); - vkGetDisplayPlaneCapabilitiesKHR := TvkGetDisplayPlaneCapabilitiesKHR (vkGetProcAddress('vkGetDisplayPlaneCapabilitiesKHR', aInstance)); - vkCreateDisplayPlaneSurfaceKHR := TvkCreateDisplayPlaneSurfaceKHR (vkGetProcAddress('vkCreateDisplayPlaneSurfaceKHR', aInstance)); - -{ ===================================== VK_KHR_display_swapchain ===================================== } - vkCreateSharedSwapchainsKHR := TvkCreateSharedSwapchainsKHR (vkGetProcAddress('vkCreateSharedSwapchainsKHR', aInstance)); - -{ ======================================= VK_KHR_xlib_surface ======================================== } -{$IFDEF VK_USE_PLATFORM_XLIB_KHR} - vkCreateXlibSurfaceKHR := TvkCreateXlibSurfaceKHR (vkGetProcAddress('vkCreateXlibSurfaceKHR', aInstance)); - vkGetPhysicalDeviceXlibPresentationSupportKHR := TvkGetPhysicalDeviceXlibPresentationSupportKHR (vkGetProcAddress('vkGetPhysicalDeviceXlibPresentationSupportKHR', aInstance)); -{$ENDIF} - -{ ======================================== VK_KHR_xcb_surface ======================================== } -{$IFDEF VK_USE_PLATFORM_XCB_KHR} - vkCreateXcbSurfaceKHR := TvkCreateXcbSurfaceKHR (vkGetProcAddress('vkCreateXcbSurfaceKHR', aInstance)); - vkGetPhysicalDeviceXcbPresentationSupportKHR := TvkGetPhysicalDeviceXcbPresentationSupportKHR (vkGetProcAddress('vkGetPhysicalDeviceXcbPresentationSupportKHR', aInstance)); -{$ENDIF} - -{ ====================================== VK_KHR_wayland_surface ====================================== } -{$IFDEF VK_USE_PLATFORM_WAYLAND_KHR} - vkCreateWaylandSurfaceKHR := TvkCreateWaylandSurfaceKHR (vkGetProcAddress('vkCreateWaylandSurfaceKHR', aInstance)); - vkGetPhysicalDeviceWaylandPresentationSupportKHR := TvkGetPhysicalDeviceWaylandPresentationSupportKHR (vkGetProcAddress('vkGetPhysicalDeviceWaylandPresentationSupportKHR',aInstance)); -{$ENDIF} - -{ ======================================== VK_KHR_mir_surface ======================================== } -{$IFDEF VK_USE_PLATFORM_MIR_KHR} - vkCreateMirSurfaceKHR := TvkCreateMirSurfaceKHR (vkGetProcAddress('vkCreateMirSurfaceKHR', aInstance)); - vkGetPhysicalDeviceMirPresentationSupportKHR := TvkGetPhysicalDeviceMirPresentationSupportKHR (vkGetProcAddress('vkGetPhysicalDeviceMirPresentationSupportKHR', aInstance)); -{$ENDIF} - -{ ====================================== VK_KHR_android_surface ====================================== } -{$IFDEF VK_USE_PLATFORM_ANDROID_KHR} - vkCreateAndroidSurfaceKHR := TvkCreateAndroidSurfaceKHR (vkGetProcAddress('vkCreateAndroidSurfaceKHR', aInstance)); -{$ENDIF} - -{ ======================================= VK_KHR_win32_surface ======================================= } -{$IFDEF VK_USE_PLATFORM_WIN32_KHR} - vkCreateWin32SurfaceKHR := TvkCreateWin32SurfaceKHR (vkGetProcAddress('vkCreateWin32SurfaceKHR', aInstance)); - vkGetPhysicalDeviceWin32PresentationSupportKHR := TvkGetPhysicalDeviceWin32PresentationSupportKHR (vkGetProcAddress('vkGetPhysicalDeviceWin32PresentationSupportKHR', aInstance)); -{$ENDIF} - -{ ======================================= VK_EXT_debug_report ======================================== } - vkCreateDebugReportCallbackEXT := TvkCreateDebugReportCallbackEXT (vkGetProcAddress('vkCreateDebugReportCallbackEXT', aInstance)); - vkDestroyDebugReportCallbackEXT := TvkDestroyDebugReportCallbackEXT (vkGetProcAddress('vkDestroyDebugReportCallbackEXT', aInstance)); - vkDebugReportMessageEXT := TvkDebugReportMessageEXT (vkGetProcAddress('vkDebugReportMessageEXT', aInstance)); - -end; - procedure vkFreeLibrary(var aLibHandle: TvkLibHandle); begin if (aLibHandle <> InvalidLibHandle) then begin @@ -4659,6 +4507,7 @@ begin end; end; +{ ===================================== Vulkan Version Helpers ======================================= } function vkMakeVersion(const aMajor, aMinor, aPatch: Integer): VkVersion; begin result := (aMajor shl 22) or (aMinor shl 12) or aPatch; @@ -4679,21 +4528,276 @@ begin result := (aVersion and $FFF); end; +{ ===================================== Initialize Routines ========================================== } function InitializeVulkan(const aLibName: String = VULKAN_LIBNAME): Boolean; +var success: Boolean; + + function GetProcAddress(const aName: String): TvkVoidFunction; + begin + result := vkGetProcAddress(aName); + if not Assigned(result) then + success := false; + end; + begin FinalizeVulkan; vkLibHandle := vkLoadLibrary(aLibName); - result := (vkLibHandle <> InvalidLibHandle); - if not result then + success := (vkLibHandle <> InvalidLibHandle); + if not success then exit; - vkGetInstanceProcAddr := TvkGetInstanceProcAddr(vkGetProcAddress('vkGetInstanceProcAddr')); - vkLoadAddresses(nil); + + vkCreateInstance := TvkCreateInstance (GetProcAddress('vkCreateInstance')); + vkGetInstanceProcAddr := TvkGetInstanceProcAddr (GetProcAddress('vkGetInstanceProcAddr')); + vkEnumerateInstanceExtensionProperties := TvkEnumerateInstanceExtensionProperties (GetProcAddress('vkEnumerateInstanceExtensionProperties')); + vkEnumerateInstanceLayerProperties := TvkEnumerateInstanceLayerProperties (GetProcAddress('vkEnumerateInstanceLayerProperties')); + + result := success; +end; + +function LoadInstanceCommands(const aInstance: VkInstance; out aCommands: TVkInstanceCommands): Boolean; +var + success: Boolean; + + function GetProcAddress(const aName: String): TvkVoidFunction; + begin + result := vkGetInstanceProcAddr(aInstance, PVkChar(aName)); + if not Assigned(result) then + success := false; + end; + +begin + FillByte(aCommands, SizeOf(aCommands), 0); + success := true; + with aCommands do begin + + { ========================================== VK_VERSION_1_0 ========================================== } + vkDestroyInstance := TvkDestroyInstance (GetProcAddress('vkDestroyInstance')); + vkEnumeratePhysicalDevices := TvkEnumeratePhysicalDevices (GetProcAddress('vkEnumeratePhysicalDevices')); + vkGetPhysicalDeviceFeatures := TvkGetPhysicalDeviceFeatures (GetProcAddress('vkGetPhysicalDeviceFeatures')); + vkGetPhysicalDeviceFormatProperties := TvkGetPhysicalDeviceFormatProperties (GetProcAddress('vkGetPhysicalDeviceFormatProperties')); + vkGetPhysicalDeviceImageFormatProperties := TvkGetPhysicalDeviceImageFormatProperties (GetProcAddress('vkGetPhysicalDeviceImageFormatProperties')); + vkGetPhysicalDeviceProperties := TvkGetPhysicalDeviceProperties (GetProcAddress('vkGetPhysicalDeviceProperties')); + vkGetPhysicalDeviceQueueFamilyProperties := TvkGetPhysicalDeviceQueueFamilyProperties (GetProcAddress('vkGetPhysicalDeviceQueueFamilyProperties')); + vkGetPhysicalDeviceMemoryProperties := TvkGetPhysicalDeviceMemoryProperties (GetProcAddress('vkGetPhysicalDeviceMemoryProperties')); + vkGetDeviceProcAddr := TvkGetDeviceProcAddr (GetProcAddress('vkGetDeviceProcAddr')); + vkCreateDevice := TvkCreateDevice (GetProcAddress('vkCreateDevice')); + vkEnumerateDeviceExtensionProperties := TvkEnumerateDeviceExtensionProperties (GetProcAddress('vkEnumerateDeviceExtensionProperties')); + vkEnumerateDeviceLayerProperties := TvkEnumerateDeviceLayerProperties (GetProcAddress('vkEnumerateDeviceLayerProperties')); + vkGetPhysicalDeviceSparseImageFormatProperties := TvkGetPhysicalDeviceSparseImageFormatProperties (GetProcAddress('vkGetPhysicalDeviceSparseImageFormatProperties')); + + { ========================================== VK_KHR_surface ========================================== } + vkDestroySurfaceKHR := TvkDestroySurfaceKHR (GetProcAddress('vkDestroySurfaceKHR')); + vkGetPhysicalDeviceSurfaceSupportKHR := TvkGetPhysicalDeviceSurfaceSupportKHR (GetProcAddress('vkGetPhysicalDeviceSurfaceSupportKHR')); + vkGetPhysicalDeviceSurfaceCapabilitiesKHR := TvkGetPhysicalDeviceSurfaceCapabilitiesKHR (GetProcAddress('vkGetPhysicalDeviceSurfaceCapabilitiesKHR')); + vkGetPhysicalDeviceSurfaceFormatsKHR := TvkGetPhysicalDeviceSurfaceFormatsKHR (GetProcAddress('vkGetPhysicalDeviceSurfaceFormatsKHR')); + vkGetPhysicalDeviceSurfacePresentModesKHR := TvkGetPhysicalDeviceSurfacePresentModesKHR (GetProcAddress('vkGetPhysicalDeviceSurfacePresentModesKHR')); + + { ========================================== VK_KHR_display ========================================== } + vkGetPhysicalDeviceDisplayPropertiesKHR := TvkGetPhysicalDeviceDisplayPropertiesKHR (GetProcAddress('vkGetPhysicalDeviceDisplayPropertiesKHR')); + vkGetPhysicalDeviceDisplayPlanePropertiesKHR := TvkGetPhysicalDeviceDisplayPlanePropertiesKHR (GetProcAddress('vkGetPhysicalDeviceDisplayPlanePropertiesKHR')); + vkGetDisplayPlaneSupportedDisplaysKHR := TvkGetDisplayPlaneSupportedDisplaysKHR (GetProcAddress('vkGetDisplayPlaneSupportedDisplaysKHR')); + vkGetDisplayModePropertiesKHR := TvkGetDisplayModePropertiesKHR (GetProcAddress('vkGetDisplayModePropertiesKHR')); + vkCreateDisplayModeKHR := TvkCreateDisplayModeKHR (GetProcAddress('vkCreateDisplayModeKHR')); + vkGetDisplayPlaneCapabilitiesKHR := TvkGetDisplayPlaneCapabilitiesKHR (GetProcAddress('vkGetDisplayPlaneCapabilitiesKHR')); + vkCreateDisplayPlaneSurfaceKHR := TvkCreateDisplayPlaneSurfaceKHR (GetProcAddress('vkCreateDisplayPlaneSurfaceKHR')); + + { ======================================= VK_KHR_xlib_surface ======================================== } + {$IFDEF VK_USE_PLATFORM_XLIB_KHR} + vkCreateXlibSurfaceKHR := TvkCreateXlibSurfaceKHR (GetProcAddress('vkCreateXlibSurfaceKHR')); + vkGetPhysicalDeviceXlibPresentationSupportKHR := TvkGetPhysicalDeviceXlibPresentationSupportKHR (GetProcAddress('vkGetPhysicalDeviceXlibPresentationSupportKHR')); + {$ENDIF} + + { ======================================== VK_KHR_xcb_surface ======================================== } + {$IFDEF VK_USE_PLATFORM_XCB_KHR} + vkCreateXcbSurfaceKHR := TvkCreateXcbSurfaceKHR (GetProcAddress('vkCreateXcbSurfaceKHR')); + vkGetPhysicalDeviceXcbPresentationSupportKHR := TvkGetPhysicalDeviceXcbPresentationSupportKHR (GetProcAddress('vkGetPhysicalDeviceXcbPresentationSupportKHR')); + {$ENDIF} + + { ====================================== VK_KHR_wayland_surface ====================================== } + {$IFDEF VK_USE_PLATFORM_WAYLAND_KHR} + vkCreateWaylandSurfaceKHR := TvkCreateWaylandSurfaceKHR (GetProcAddress('vkCreateWaylandSurfaceKHR')); + vkGetPhysicalDeviceWaylandPresentationSupportKHR := TvkGetPhysicalDeviceWaylandPresentationSupportKHR (GetProcAddress('vkGetPhysicalDeviceWaylandPresentationSupportKHR')); + {$ENDIF} + + { ======================================== VK_KHR_mir_surface ======================================== } + {$IFDEF VK_USE_PLATFORM_MIR_KHR} + vkCreateMirSurfaceKHR := TvkCreateMirSurfaceKHR (GetProcAddress('vkCreateMirSurfaceKHR')); + vkGetPhysicalDeviceMirPresentationSupportKHR := TvkGetPhysicalDeviceMirPresentationSupportKHR (GetProcAddress('vkGetPhysicalDeviceMirPresentationSupportKHR')); + {$ENDIF} + + { ====================================== VK_KHR_android_surface ====================================== } + {$IFDEF VK_USE_PLATFORM_ANDROID_KHR} + vkCreateAndroidSurfaceKHR := TvkCreateAndroidSurfaceKHR (GetProcAddress('vkCreateAndroidSurfaceKHR')); + {$ENDIF} + + { ======================================= VK_KHR_win32_surface ======================================= } + {$IFDEF VK_USE_PLATFORM_WIN32_KHR} + vkCreateWin32SurfaceKHR := TvkCreateWin32SurfaceKHR (GetProcAddress('vkCreateWin32SurfaceKHR')); + vkGetPhysicalDeviceWin32PresentationSupportKHR := TvkGetPhysicalDeviceWin32PresentationSupportKHR (GetProcAddress('vkGetPhysicalDeviceWin32PresentationSupportKHR')); + {$ENDIF} + + { ======================================= VK_EXT_debug_report ======================================== } + vkCreateDebugReportCallbackEXT := TvkCreateDebugReportCallbackEXT (GetProcAddress('vkCreateDebugReportCallbackEXT')); + vkDestroyDebugReportCallbackEXT := TvkDestroyDebugReportCallbackEXT (GetProcAddress('vkDestroyDebugReportCallbackEXT')); + vkDebugReportMessageEXT := TvkDebugReportMessageEXT (GetProcAddress('vkDebugReportMessageEXT')); + + end; + result := success; end; -procedure LoadVulkanCommands(const aInstance: VkInstance); +function LoadDeviceCommands(const aInstance: VkInstance; const aDevice: VkDevice; out aCommands: TVkDeviceCommands): Boolean; +var + vkGetDeviceProcAddr: TvkGetDeviceProcAddr; + success: Boolean; + + function GetProcAddress(const aName: String): TvkVoidFunction; + begin + result := vkGetDeviceProcAddr(aDevice, PVkChar(aName)); + if not Assigned(result) then + success := false; + end; + begin - vkLoadAddresses(aInstance); -end; + FillByte(aCommands, SizeOf(aCommands), 0); + vkGetDeviceProcAddr := TvkGetDeviceProcAddr(vkGetInstanceProcAddr(aInstance, 'vkGetDeviceProcAddr')); + success := true; + with aCommands do begin + + { ========================================== VK_VERSION_1_0 ========================================== } + vkDestroyDevice := TvkDestroyDevice (GetProcAddress('vkDestroyDevice')); + vkGetDeviceQueue := TvkGetDeviceQueue (GetProcAddress('vkGetDeviceQueue')); + vkQueueSubmit := TvkQueueSubmit (GetProcAddress('vkQueueSubmit')); + vkQueueWaitIdle := TvkQueueWaitIdle (GetProcAddress('vkQueueWaitIdle')); + vkDeviceWaitIdle := TvkDeviceWaitIdle (GetProcAddress('vkDeviceWaitIdle')); + vkAllocateMemory := TvkAllocateMemory (GetProcAddress('vkAllocateMemory')); + vkFreeMemory := TvkFreeMemory (GetProcAddress('vkFreeMemory')); + vkMapMemory := TvkMapMemory (GetProcAddress('vkMapMemory')); + vkUnmapMemory := TvkUnmapMemory (GetProcAddress('vkUnmapMemory')); + vkFlushMappedMemoryRanges := TvkFlushMappedMemoryRanges (GetProcAddress('vkFlushMappedMemoryRanges')); + vkInvalidateMappedMemoryRanges := TvkInvalidateMappedMemoryRanges (GetProcAddress('vkInvalidateMappedMemoryRanges')); + vkGetDeviceMemoryCommitment := TvkGetDeviceMemoryCommitment (GetProcAddress('vkGetDeviceMemoryCommitment')); + vkBindBufferMemory := TvkBindBufferMemory (GetProcAddress('vkBindBufferMemory')); + vkBindImageMemory := TvkBindImageMemory (GetProcAddress('vkBindImageMemory')); + vkGetBufferMemoryRequirements := TvkGetBufferMemoryRequirements (GetProcAddress('vkGetBufferMemoryRequirements')); + vkGetImageMemoryRequirements := TvkGetImageMemoryRequirements (GetProcAddress('vkGetImageMemoryRequirements')); + vkGetImageSparseMemoryRequirements := TvkGetImageSparseMemoryRequirements (GetProcAddress('vkGetImageSparseMemoryRequirements')); + vkQueueBindSparse := TvkQueueBindSparse (GetProcAddress('vkQueueBindSparse')); + vkCreateFence := TvkCreateFence (GetProcAddress('vkCreateFence')); + vkDestroyFence := TvkDestroyFence (GetProcAddress('vkDestroyFence')); + vkResetFences := TvkResetFences (GetProcAddress('vkResetFences')); + vkGetFenceStatus := TvkGetFenceStatus (GetProcAddress('vkGetFenceStatus')); + vkWaitForFences := TvkWaitForFences (GetProcAddress('vkWaitForFences')); + vkCreateSemaphore := TvkCreateSemaphore (GetProcAddress('vkCreateSemaphore')); + vkDestroySemaphore := TvkDestroySemaphore (GetProcAddress('vkDestroySemaphore')); + vkCreateEvent := TvkCreateEvent (GetProcAddress('vkCreateEvent')); + vkDestroyEvent := TvkDestroyEvent (GetProcAddress('vkDestroyEvent')); + vkGetEventStatus := TvkGetEventStatus (GetProcAddress('vkGetEventStatus')); + vkSetEvent := TvkSetEvent (GetProcAddress('vkSetEvent')); + vkResetEvent := TvkResetEvent (GetProcAddress('vkResetEvent')); + vkCreateQueryPool := TvkCreateQueryPool (GetProcAddress('vkCreateQueryPool')); + vkDestroyQueryPool := TvkDestroyQueryPool (GetProcAddress('vkDestroyQueryPool')); + vkGetQueryPoolResults := TvkGetQueryPoolResults (GetProcAddress('vkGetQueryPoolResults')); + vkCreateBuffer := TvkCreateBuffer (GetProcAddress('vkCreateBuffer')); + vkDestroyBuffer := TvkDestroyBuffer (GetProcAddress('vkDestroyBuffer')); + vkCreateBufferView := TvkCreateBufferView (GetProcAddress('vkCreateBufferView')); + vkDestroyBufferView := TvkDestroyBufferView (GetProcAddress('vkDestroyBufferView')); + vkCreateImage := TvkCreateImage (GetProcAddress('vkCreateImage')); + vkDestroyImage := TvkDestroyImage (GetProcAddress('vkDestroyImage')); + vkGetImageSubresourceLayout := TvkGetImageSubresourceLayout (GetProcAddress('vkGetImageSubresourceLayout')); + vkCreateImageView := TvkCreateImageView (GetProcAddress('vkCreateImageView')); + vkDestroyImageView := TvkDestroyImageView (GetProcAddress('vkDestroyImageView')); + vkCreateShaderModule := TvkCreateShaderModule (GetProcAddress('vkCreateShaderModule')); + vkDestroyShaderModule := TvkDestroyShaderModule (GetProcAddress('vkDestroyShaderModule')); + vkCreatePipelineCache := TvkCreatePipelineCache (GetProcAddress('vkCreatePipelineCache')); + vkDestroyPipelineCache := TvkDestroyPipelineCache (GetProcAddress('vkDestroyPipelineCache')); + vkGetPipelineCacheData := TvkGetPipelineCacheData (GetProcAddress('vkGetPipelineCacheData')); + vkMergePipelineCaches := TvkMergePipelineCaches (GetProcAddress('vkMergePipelineCaches')); + vkCreateGraphicsPipelines := TvkCreateGraphicsPipelines (GetProcAddress('vkCreateGraphicsPipelines')); + vkCreateComputePipelines := TvkCreateComputePipelines (GetProcAddress('vkCreateComputePipelines')); + vkDestroyPipeline := TvkDestroyPipeline (GetProcAddress('vkDestroyPipeline')); + vkCreatePipelineLayout := TvkCreatePipelineLayout (GetProcAddress('vkCreatePipelineLayout')); + vkDestroyPipelineLayout := TvkDestroyPipelineLayout (GetProcAddress('vkDestroyPipelineLayout')); + vkCreateSampler := TvkCreateSampler (GetProcAddress('vkCreateSampler')); + vkDestroySampler := TvkDestroySampler (GetProcAddress('vkDestroySampler')); + vkCreateDescriptorSetLayout := TvkCreateDescriptorSetLayout (GetProcAddress('vkCreateDescriptorSetLayout')); + vkDestroyDescriptorSetLayout := TvkDestroyDescriptorSetLayout (GetProcAddress('vkDestroyDescriptorSetLayout')); + vkCreateDescriptorPool := TvkCreateDescriptorPool (GetProcAddress('vkCreateDescriptorPool')); + vkDestroyDescriptorPool := TvkDestroyDescriptorPool (GetProcAddress('vkDestroyDescriptorPool')); + vkResetDescriptorPool := TvkResetDescriptorPool (GetProcAddress('vkResetDescriptorPool')); + vkAllocateDescriptorSets := TvkAllocateDescriptorSets (GetProcAddress('vkAllocateDescriptorSets')); + vkFreeDescriptorSets := TvkFreeDescriptorSets (GetProcAddress('vkFreeDescriptorSets')); + vkUpdateDescriptorSets := TvkUpdateDescriptorSets (GetProcAddress('vkUpdateDescriptorSets')); + vkCreateFramebuffer := TvkCreateFramebuffer (GetProcAddress('vkCreateFramebuffer')); + vkDestroyFramebuffer := TvkDestroyFramebuffer (GetProcAddress('vkDestroyFramebuffer')); + vkCreateRenderPass := TvkCreateRenderPass (GetProcAddress('vkCreateRenderPass')); + vkDestroyRenderPass := TvkDestroyRenderPass (GetProcAddress('vkDestroyRenderPass')); + vkGetRenderAreaGranularity := TvkGetRenderAreaGranularity (GetProcAddress('vkGetRenderAreaGranularity')); + vkCreateCommandPool := TvkCreateCommandPool (GetProcAddress('vkCreateCommandPool')); + vkDestroyCommandPool := TvkDestroyCommandPool (GetProcAddress('vkDestroyCommandPool')); + vkResetCommandPool := TvkResetCommandPool (GetProcAddress('vkResetCommandPool')); + vkAllocateCommandBuffers := TvkAllocateCommandBuffers (GetProcAddress('vkAllocateCommandBuffers')); + vkFreeCommandBuffers := TvkFreeCommandBuffers (GetProcAddress('vkFreeCommandBuffers')); + vkBeginCommandBuffer := TvkBeginCommandBuffer (GetProcAddress('vkBeginCommandBuffer')); + vkEndCommandBuffer := TvkEndCommandBuffer (GetProcAddress('vkEndCommandBuffer')); + vkResetCommandBuffer := TvkResetCommandBuffer (GetProcAddress('vkResetCommandBuffer')); + vkCmdBindPipeline := TvkCmdBindPipeline (GetProcAddress('vkCmdBindPipeline')); + vkCmdSetViewport := TvkCmdSetViewport (GetProcAddress('vkCmdSetViewport')); + vkCmdSetScissor := TvkCmdSetScissor (GetProcAddress('vkCmdSetScissor')); + vkCmdSetLineWidth := TvkCmdSetLineWidth (GetProcAddress('vkCmdSetLineWidth')); + vkCmdSetDepthBias := TvkCmdSetDepthBias (GetProcAddress('vkCmdSetDepthBias')); + vkCmdSetBlendConstants := TvkCmdSetBlendConstants (GetProcAddress('vkCmdSetBlendConstants')); + vkCmdSetDepthBounds := TvkCmdSetDepthBounds (GetProcAddress('vkCmdSetDepthBounds')); + vkCmdSetStencilCompareMask := TvkCmdSetStencilCompareMask (GetProcAddress('vkCmdSetStencilCompareMask')); + vkCmdSetStencilWriteMask := TvkCmdSetStencilWriteMask (GetProcAddress('vkCmdSetStencilWriteMask')); + vkCmdSetStencilReference := TvkCmdSetStencilReference (GetProcAddress('vkCmdSetStencilReference')); + vkCmdBindDescriptorSets := TvkCmdBindDescriptorSets (GetProcAddress('vkCmdBindDescriptorSets')); + vkCmdBindIndexBuffer := TvkCmdBindIndexBuffer (GetProcAddress('vkCmdBindIndexBuffer')); + vkCmdBindVertexBuffers := TvkCmdBindVertexBuffers (GetProcAddress('vkCmdBindVertexBuffers')); + vkCmdDraw := TvkCmdDraw (GetProcAddress('vkCmdDraw')); + vkCmdDrawIndexed := TvkCmdDrawIndexed (GetProcAddress('vkCmdDrawIndexed')); + vkCmdDrawIndirect := TvkCmdDrawIndirect (GetProcAddress('vkCmdDrawIndirect')); + vkCmdDrawIndexedIndirect := TvkCmdDrawIndexedIndirect (GetProcAddress('vkCmdDrawIndexedIndirect')); + vkCmdDispatch := TvkCmdDispatch (GetProcAddress('vkCmdDispatch')); + vkCmdDispatchIndirect := TvkCmdDispatchIndirect (GetProcAddress('vkCmdDispatchIndirect')); + vkCmdCopyBuffer := TvkCmdCopyBuffer (GetProcAddress('vkCmdCopyBuffer')); + vkCmdCopyImage := TvkCmdCopyImage (GetProcAddress('vkCmdCopyImage')); + vkCmdBlitImage := TvkCmdBlitImage (GetProcAddress('vkCmdBlitImage')); + vkCmdCopyBufferToImage := TvkCmdCopyBufferToImage (GetProcAddress('vkCmdCopyBufferToImage')); + vkCmdCopyImageToBuffer := TvkCmdCopyImageToBuffer (GetProcAddress('vkCmdCopyImageToBuffer')); + vkCmdUpdateBuffer := TvkCmdUpdateBuffer (GetProcAddress('vkCmdUpdateBuffer')); + vkCmdFillBuffer := TvkCmdFillBuffer (GetProcAddress('vkCmdFillBuffer')); + vkCmdClearColorImage := TvkCmdClearColorImage (GetProcAddress('vkCmdClearColorImage')); + vkCmdClearDepthStencilImage := TvkCmdClearDepthStencilImage (GetProcAddress('vkCmdClearDepthStencilImage')); + vkCmdClearAttachments := TvkCmdClearAttachments (GetProcAddress('vkCmdClearAttachments')); + vkCmdResolveImage := TvkCmdResolveImage (GetProcAddress('vkCmdResolveImage')); + vkCmdSetEvent := TvkCmdSetEvent (GetProcAddress('vkCmdSetEvent')); + vkCmdResetEvent := TvkCmdResetEvent (GetProcAddress('vkCmdResetEvent')); + vkCmdWaitEvents := TvkCmdWaitEvents (GetProcAddress('vkCmdWaitEvents')); + vkCmdPipelineBarrier := TvkCmdPipelineBarrier (GetProcAddress('vkCmdPipelineBarrier')); + vkCmdBeginQuery := TvkCmdBeginQuery (GetProcAddress('vkCmdBeginQuery')); + vkCmdEndQuery := TvkCmdEndQuery (GetProcAddress('vkCmdEndQuery')); + vkCmdResetQueryPool := TvkCmdResetQueryPool (GetProcAddress('vkCmdResetQueryPool')); + vkCmdWriteTimestamp := TvkCmdWriteTimestamp (GetProcAddress('vkCmdWriteTimestamp')); + vkCmdCopyQueryPoolResults := TvkCmdCopyQueryPoolResults (GetProcAddress('vkCmdCopyQueryPoolResults')); + vkCmdPushConstants := TvkCmdPushConstants (GetProcAddress('vkCmdPushConstants')); + vkCmdBeginRenderPass := TvkCmdBeginRenderPass (GetProcAddress('vkCmdBeginRenderPass')); + vkCmdNextSubpass := TvkCmdNextSubpass (GetProcAddress('vkCmdNextSubpass')); + vkCmdEndRenderPass := TvkCmdEndRenderPass (GetProcAddress('vkCmdEndRenderPass')); + vkCmdExecuteCommands := TvkCmdExecuteCommands (GetProcAddress('vkCmdExecuteCommands')); + + { ========================================= VK_KHR_swapchain ========================================= } + vkCreateSwapchainKHR := TvkCreateSwapchainKHR (GetProcAddress('vkCreateSwapchainKHR')); + vkDestroySwapchainKHR := TvkDestroySwapchainKHR (GetProcAddress('vkDestroySwapchainKHR')); + vkGetSwapchainImagesKHR := TvkGetSwapchainImagesKHR (GetProcAddress('vkGetSwapchainImagesKHR')); + vkAcquireNextImageKHR := TvkAcquireNextImageKHR (GetProcAddress('vkAcquireNextImageKHR')); + vkQueuePresentKHR := TvkQueuePresentKHR (GetProcAddress('vkQueuePresentKHR')); + + { ===================================== VK_KHR_display_swapchain ===================================== } + vkCreateSharedSwapchainsKHR := TvkCreateSharedSwapchainsKHR (GetProcAddress('vkCreateSharedSwapchainsKHR')); + + end; + result := success; +end; procedure FinalizeVulkan; begin diff --git a/projects/generator/HeaderGenerator.pas b/projects/generator/HeaderGenerator.pas index 1c0056d..1c6b27c 100644 --- a/projects/generator/HeaderGenerator.pas +++ b/projects/generator/HeaderGenerator.pas @@ -61,10 +61,10 @@ type TvkObject = class; TvkObjectList = class(specialize TutlList) public - function IndexOfObj(const aName: DOMstring; const aTypes: TvkObjectTypes): Integer; - function FindObj(const aName: DOMstring; const aTypes: TvkObjectTypes; out aObject): Boolean; - function GetPascalName(const aName: DOMString; const aPointer: Integer; const aArrSize: WideString = ''): WideString; - function GenerateCode(const aName: String; const aCode: TStringTree): Boolean; + function IndexOfObj(const aName: WideString; const aTypes: TvkObjectTypes): Integer; + function FindObj(const aName: WideString; const aTypes: TvkObjectTypes; out aObject): Boolean; + function GetPascalName(const aName: WideString; const aPointer: Integer; const aArrSize: WideString = ''): WideString; + function GenerateCode(const aName: WideString; const aCode: TStringTree): Boolean; procedure AddObject(const aObj: TvkObject); end; @@ -72,8 +72,8 @@ type TvkObject = class(TObject) private fType: TvkObjectType; - fName: DOMString; - fComment: DOMString; + fName: WideString; + fComment: WideString; fList: TvkObjectList; protected function GetDependencyOrder: Integer; virtual; @@ -82,8 +82,8 @@ type {%H-}constructor Create(const aType: TvkObjectType); public property VkType: TvkObjectType read fType; - property Name: DOMString read fName write fName; - property Comment: DOMString read fComment write fComment; + property Name: WideString read fName write fName; + property Comment: WideString read fComment write fComment; property List: TvkObjectList read fList write fList; function GetPascalName(const aPointer: Integer; const aArrSize: WideString): WideString; @@ -96,14 +96,14 @@ type //////////////////////////////////////////////////////////////////////////////////////////// TvkTypeBase = class(TvkObject) private - fParent: DOMString; - fAlias: DOMString; + fParent: WideString; + fAlias: WideString; protected function GetDependencyOrder: Integer; override; procedure GenPascalName(var aName: WideString; const aPointer: Integer; const aArrSize: WideString); override; public - property Parent: DOMString read fParent write fParent; - property Alias: DOMString read fAlias write fAlias; + property Parent: WideString read fParent write fParent; + property Alias: WideString read fAlias write fAlias; procedure GenerateCode(const aCode: TStringTree); override; end; @@ -117,8 +117,12 @@ type //////////////////////////////////////////////////////////////////////////////////////////// TvkHandle = class(TvkTypeBase) + private + fNonDispatchable: Boolean; public + property NonDispatchable: Boolean read fNonDispatchable write fNonDispatchable; procedure ReadXml(const xml: TDOMNode); override; + procedure GenerateCode(const aCode: TStringTree); override; constructor Create; end; @@ -126,8 +130,8 @@ type TvkFunctionBase = class(TvkObject) private type TArgument = class(TObject) - Typ: DOMString; - Name: DOMString; + Typ: WideString; + Name: WideString; IsPointer: Integer; IsConst: Boolean; end; @@ -169,9 +173,9 @@ type TvkStruct = class(TvkObject) private type TMember = class(TObject) - Typ: DOMString; - Name: DOMString; - ArrSize: DOMString; + Typ: WideString; + Name: WideString; + ArrSize: WideString; IsPointer: Integer; IsConst: Boolean; end; @@ -197,18 +201,18 @@ type TvkEnum = class(TvkObject) private type TValue = class(TObject) - Name: DOMString; + Name: WideString; Value: Variant; IsBit: Boolean; end; TValueList = specialize TutlList; private - fExpands: DOMString; + fExpands: WideString; fValues: TValueList; protected procedure GenPascalName(var aName: WideString; const aPointer: Integer; const aArrSize: WideString); override; public - property Expands: DOMString read fExpands write fExpands; + property Expands: WideString read fExpands write fExpands; property Values: TValueList read fValues; procedure ReadXml(const xml: TDOMNode); override; procedure GenerateCode(const aCode: TStringTree); override; @@ -273,6 +277,9 @@ const KEYWORD_VAR = 'VAR'; KEYWORD_CODE = 'CODE'; + KEYWORD_INSTANCE_COMMANDS = 'INSTANCE_COMMANDS'; + KEYWORD_DEVICE_COMMANDS = 'DEVICE_COMMANDS'; + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function PointerCount(const aStr: AnsiString): Integer; var i: Integer; @@ -340,7 +347,7 @@ begin rx := TRegExpr.Create('^(T|P)?(Vk)?(.)'); try if rx.Exec(String(aType)) - then result := WideString(LowerCase(rx.Match[3]) + s) + then result := WideString(LowerCase(rx.Match[3])) + s else result := 'm' + s; finally FreeAndNil(rx); @@ -365,13 +372,13 @@ begin end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -procedure WriteResolveWarning(const aName: DOMString); +procedure WriteResolveWarning(const aName: WideString); begin WriteLn('WARNING! unable to resolve identifier: ' + aName); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -function GetNodeValue(xml: TDOMNode; const aName: WideString): DOMString; +function GetNodeValue(xml: TDOMNode; const aName: WideString): WideString; var x: TDOMNode; begin x := xml.FindNode(aName); @@ -381,7 +388,7 @@ begin end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -function TryGetNodeValue(xml: TDOMNode; const aName: WideString; out aValue: DOMString): Boolean; +function TryGetNodeValue(xml: TDOMNode; const aName: WideString; out aValue: WideString): Boolean; var x: TDOMNode; begin x := xml.FindNode(aName); @@ -391,7 +398,7 @@ begin end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -function GetNodeValue(xml: TDOMNode; const aName: WideString; const aDefault: DOMString): DOMString; +function GetNodeValue(xml: TDOMNode; const aName: WideString; const aDefault: WideString): WideString; var x: TDOMNode; begin x := xml.FindNode(aName); @@ -401,7 +408,7 @@ begin end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -function GetNodeAttrib(xml: TDOMNode; const aName: WideString): DOMString; +function GetNodeAttrib(xml: TDOMNode; const aName: WideString): WideString; var x: TDOMNode; begin if xml.HasAttributes then begin @@ -415,7 +422,7 @@ begin end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -function TryGetNodeAttrib(xml: TDOMNode; const aName: WideString; out aValue: DOMString): Boolean; +function TryGetNodeAttrib(xml: TDOMNode; const aName: WideString; out aValue: WideString): Boolean; var x: TDOMNode; begin result := true; @@ -430,7 +437,7 @@ begin end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -function GetNodeAttrib(xml: TDOMNode; const aName: WideString; const aDefault: DOMString): DOMString; +function GetNodeAttrib(xml: TDOMNode; const aName: WideString; const aDefault: WideString): WideString; var x: TDOMNode; begin result := aDefault; @@ -577,7 +584,7 @@ end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //THeaderGenerator.TvkObjectList//////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -function THeaderGenerator.TvkObjectList.IndexOfObj(const aName: DOMstring; const aTypes: TvkObjectTypes): Integer; +function THeaderGenerator.TvkObjectList.IndexOfObj(const aName: WideString; const aTypes: TvkObjectTypes): Integer; var o: TvkObject; begin if (aName = '') then @@ -592,7 +599,7 @@ begin end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -function THeaderGenerator.TvkObjectList.FindObj(const aName: DOMstring; const aTypes: TvkObjectTypes; out aObject): Boolean; +function THeaderGenerator.TvkObjectList.FindObj(const aName: WideString; const aTypes: TvkObjectTypes; out aObject): Boolean; var i: Integer; begin i := IndexOfObj(aName, aTypes); @@ -603,7 +610,7 @@ begin end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -function THeaderGenerator.TvkObjectList.GetPascalName(const aName: DOMString; const aPointer: Integer; +function THeaderGenerator.TvkObjectList.GetPascalName(const aName: WideString; const aPointer: Integer; const aArrSize: WideString): WideString; var o: TvkObject; begin @@ -613,7 +620,7 @@ begin end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -function THeaderGenerator.TvkObjectList.GenerateCode(const aName: String; const aCode: TStringTree): Boolean; +function THeaderGenerator.TvkObjectList.GenerateCode(const aName: WideString; const aCode: TStringTree): Boolean; var o: TvkObject; begin result := FindObj(aName, VK_OBJECT_ALL, o); @@ -689,7 +696,7 @@ end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class procedure THeaderGenerator.TvkObject.CreateFromXml(const xml: TDOMNode; const aList: TvkObjectList); var - s, n: DOMString; + s, n: WideString; procedure GenerateVersionEnum; var @@ -760,7 +767,7 @@ var c.Name := GetNodeAttrib(x, 'name'); c.Value := StrToValue(String(GetNodeAttrib(x, 'value'))); if (c.Value = Unassigned) then - raise Exception.Create('Invalid constant value: ' + GetNodeAttrib(x, 'value')); + raise Exception.Create('Invalid constant value: ' + String(GetNodeAttrib(x, 'value'))); aList.AddObject(c); except FreeAndNil(c); @@ -846,7 +853,7 @@ begin st := aCode.GetOrCreateItem(KEYWORD_INTF).GetOrCreateItem(KEYWORD_TYPES); if (st.LinesBefore.Count = 0) then st.LinesBefore.Add('type { simple types }'); - st := st.GetOrCreateItem(fName); + st := st.GetOrCreateItem(String(fName)); if (st.LinesBefore.Count = 0) and (fParent <> '') and Assigned(List) then begin st.LinesBefore.Add(Format(' %-62s = %s;', [ fName, List.GetPascalName(fParent, 0) ])); st.LinesBefore.Add(Format(' P%-61s = ^%0:s;', [ fName ])); @@ -883,9 +890,36 @@ end; procedure THeaderGenerator.TvkHandle.ReadXml(const xml: TDOMNode); begin inherited ReadXml(xml); - Name := GetNodeValue (xml, 'name'); - //Parent := GetNodeAttrib(xml, 'parent', 'VkHandle'); - Parent := 'VkHandle'; + Name := GetNodeValue (xml, 'name'); + fNonDispatchable := (GetNodeValue(xml, 'type') = 'VK_DEFINE_NON_DISPATCHABLE_HANDLE'); + Parent := GetNodeAttrib(xml, 'parent', ''); +end; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +procedure THeaderGenerator.TvkHandle.GenerateCode(const aCode: TStringTree); +var + st: TStringTree; + s: String; +begin + if Assigned(fList) and (fParent <> '') then + fList.GenerateCode(fParent, aCode); + if Assigned(fList) and (fAlias <> '') then + fList.GenerateCode(fAlias, aCode); + + st := aCode.GetOrCreateItem(KEYWORD_INTF).GetOrCreateItem(KEYWORD_TYPES); + if (st.LinesBefore.Count = 0) then + st.LinesBefore.Add('type { simple types }'); + st := st.GetOrCreateItem(String(fName)); + if (st.LinesBefore.Count = 0) then begin + s := '^_' + String(fName); + if fNonDispatchable then + s := '{$IFDEF VK_CPU64}' + s + '{$ELSE}VkNonDispatchableHandle{$ENDIF}'; + st.LinesBefore.Add(Format(' %-62s = record end;', [ '_' + fName, s ])); + st.LinesBefore.Add(Format(' %-62s = %s;', [ fName, s ])); + st.LinesBefore.Add(Format(' P%-61s = ^%0:s;', [ fName ])); + st.LinesBefore.Add(Format(' PP%-60s = ^P%0:s;', [ fName ])); + st.LinesBefore.Add(''); + end; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -933,14 +967,14 @@ begin fList.GenerateCode(a.Typ, aCode); end; - st := aSub.GetOrCreateItem(GetPascalName(0, '')); + st := aSub.GetOrCreateItem(String(GetPascalName(0, ''))); if (st.LinesBefore.Count = 0) then begin // head s := WideString(Format(' %s', [ GetPascalName(0, '') ])); if (ReturnValue.Typ = 'void') and (ReturnValue.IsPointer = 0) then s := s + ' = procedure(' else s := s + ' = function ('; - st.LinesBefore.Add(s); + st.LinesBefore.Add(String(s)); // params for i := 0 to fArguments.Count-1 do begin @@ -949,10 +983,10 @@ begin if a.IsConst then s := s + 'const ' else s := s + ' '; - s := s + Format('%-30s%s', [ PrepareName(a.Name, a.Typ)+':', List.GetPascalName(a.Typ, a.IsPointer) ]); + s := s + WideString(Format('%-30s%s', [ PrepareName(a.Name, a.Typ)+':', List.GetPascalName(a.Typ, a.IsPointer) ])); if (i < fArguments.Count-1) then s := s + '; '; - st.LinesBefore.Add(s); + st.LinesBefore.Add(String(s)); end; // result @@ -960,7 +994,7 @@ begin if (ReturnValue.Typ <> 'void') or (ReturnValue.IsPointer > 0) then s := s + ': ' + List.GetPascalName(ReturnValue.Typ, ReturnValue.IsPointer); s := s + '; {$IFDEF VK_CDECL}cdecl{$ELSE}stdcall{$ENDIF};'; - st.LinesBefore.Add(s); + st.LinesBefore.Add(String(s)); st.LinesBefore.Add(''); end; end; @@ -1118,7 +1152,32 @@ end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure THeaderGenerator.TvkCommand.GenerateCode(const aCode: TStringTree); -var st: TStringTree; + + function GetStringTree(const aType: WideString): TStringTree; + var h: TvkTypeBase; + begin + result := nil; + + if (fName = 'vkGetInstanceProcAddr') then + exit; + + if (aType = 'VkInstance') or (fName = 'vkGetDeviceProcAddr') then begin + result := aCode.GetOrCreateItem(KEYWORD_INSTANCE_COMMANDS); + exit; + end; + + if (aType = 'VkDevice') then begin + result := aCode.GetOrCreateItem(KEYWORD_DEVICE_COMMANDS); + exit; + end; + + if not Assigned(List) or not List.FindObj(aType, [otHandle, otType], h) or (h.Parent = '') then + exit; + result := GetStringTree(h.Parent); + end; + +var + st: TStringTree; begin inherited GenerateCode(aCode); st := aCode.GetOrCreateItem(KEYWORD_INTF).GetOrCreateItem(KEYWORD_COMMAND); @@ -1126,17 +1185,33 @@ begin st.LinesBefore.Add('type { commands }'); GenerateFunctionPtr(aCode, st); - st := aCode.GetOrCreateItem(KEYWORD_INTF).GetOrCreateItem(KEYWORD_VAR); - if (st.LinesBefore.Count = 0) then - st.LinesBefore.Add('var'); + st := nil; + if (Arguments.Count > 0) then + st := GetStringTree(Arguments[0].Typ); - st := st.GetOrCreateItem(fName); - if (st.LinesBefore.Count = 0) then - st.LinesBefore.Add(Format(' %-50s%s;', [fName + ':', GetPascalName(0, '')])); + if Assigned(st) then begin + with st.GetOrCreateItem(KEYWORD_INTF).GetOrCreateItem(String(fName)) do begin + if (LinesBefore.Count = 0) then + LinesBefore.Add(Format('%-50s%s;', [fName + ':', GetPascalName(0, '')])); + end; - st := aCode.GetOrCreateItem(KEYWORD_IMPL).GetOrCreateItem(KEYWORD_CODE).GetOrCreateItem(fName); - if (st.LinesBefore.Count = 0) then - st.LinesBefore.Add(Format(' %-50s := T%0:-50s(vkGetProcAddress(%-50saInstance));', [fName, '''' + fName + ''','])); + with st.GetOrCreateItem(KEYWORD_IMPL).GetOrCreateItem(String(fName)) do begin + if (LinesBefore.Count = 0) then + LinesBefore.Add(Format('%-50s := T%0:-50s(GetProcAddress(''%0:s''));', [fName])); + end; + end else begin + st := aCode.GetOrCreateItem(KEYWORD_INTF).GetOrCreateItem(KEYWORD_VAR); + if (st.LinesBefore.Count = 0) then + st.LinesBefore.Add('var'); + + st := st.GetOrCreateItem(String(fName)); + if (st.LinesBefore.Count = 0) then + st.LinesBefore.Add(Format(' %-50s%s;', [fName + ':', GetPascalName(0, '')])); + + st := aCode.GetOrCreateItem(KEYWORD_IMPL).GetOrCreateItem(KEYWORD_CODE).GetOrCreateItem(String(fName)); + if (st.LinesBefore.Count = 0) then + st.LinesBefore.Add(Format('%-50s := T%0:-50s(GetProcAddress(''%0:s''));', [fName])); + end; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -1248,7 +1323,7 @@ begin st := aCode.GetOrCreateItem(KEYWORD_INTF).GetOrCreateItem(KEYWORD_STRUCT); if (st.LinesBefore.Count = 0) then st.LinesBefore.Add('type { structures }'); - st := st.GetOrCreateItem(GetPascalName(0, '')); + st := st.GetOrCreateItem(String(GetPascalName(0, ''))); if (st.LinesBefore.Count = 0) then begin postfix := ';'; indent := 50; @@ -1356,7 +1431,7 @@ begin .GetOrCreateItem(KEYWORD_ENUM); if (st.LinesBefore.Count = 0) then st.LinesBefore.Add('type { enumerations }'); - st := st.GetOrCreateItem(fName); + st := st.GetOrCreateItem(String(fName)); if (st.LinesBefore.Count = 0) then begin st.LinesBefore.Add(Format(' %s = (', [GetPascalName(0, '')])); postfix := ','; @@ -1405,7 +1480,7 @@ begin .GetOrCreateItem(KEYWORD_CONST); if (st.LinesBefore.Count = 0) then st.LinesBefore.Add('const'); - st := st.GetOrCreateItem(fName); + st := st.GetOrCreateItem(String(fName)); if (st.LinesBefore.Count = 0) then st.LinesBefore.Add(Format(' %-62s = %s;', [fName, fValue])); end; @@ -1428,16 +1503,21 @@ var Code: TStringTree; PosMap: TPosMap; - procedure UpdateComment(const aRoot: TStringTree; const aName: String); + procedure UpdateComment(const aNames: array of String); var i: Integer; - s, tmp: String; + name, s, tmp: String; st: TStringTree; begin - st := aRoot.GetOrCreateItem(aName); - if PosMap.TryGetValue(aName, i) and (st.ItemCount > i) and (CurrentName <> '') then - with st.CreateItemAt(aName + CurrentName, i).LinesBefore do begin - s := ' ' + CurrentName + ' '; + name := ''; + st := Code; + for s in aNames do begin + st := st.GetOrCreateItem(s); + name := name + '.' + s; + end; + if PosMap.TryGetValue(name, i) and (st.ItemCount > i) and (CurrentName <> '') then + with st.CreateItemAt(name + String(CurrentName), i).LinesBefore do begin + s := ' ' + String(CurrentName) + ' '; if ((Length(s) and 1) = 1) then s := s + '='; tmp := StringOfChar('=', (100 - Length(s)) div 2); @@ -1445,23 +1525,26 @@ var Add(''); Add(s); end; - PosMap[aName] := st.ItemCount; + PosMap[name] := st.ItemCount; end; procedure UpdateComments; - var st: TStringTree; begin - st := Code.GetOrCreateItem(KEYWORD_INTF); - UpdateComment(st, KEYWORD_CONST); - UpdateComment(st, KEYWORD_TYPES); - UpdateComment(st, KEYWORD_ENUM); - UpdateComment(st, KEYWORD_FUNCPTR); - UpdateComment(st, KEYWORD_STRUCT); - UpdateComment(st, KEYWORD_COMMAND); - UpdateComment(st, KEYWORD_VAR); - - st := Code.GetOrCreateItem(KEYWORD_IMPL); - UpdateComment(st, KEYWORD_CODE); + UpdateComment([KEYWORD_INTF, KEYWORD_CONST]); + UpdateComment([KEYWORD_INTF, KEYWORD_TYPES]); + UpdateComment([KEYWORD_INTF, KEYWORD_ENUM]); + UpdateComment([KEYWORD_INTF, KEYWORD_FUNCPTR]); + UpdateComment([KEYWORD_INTF, KEYWORD_STRUCT]); + UpdateComment([KEYWORD_INTF, KEYWORD_COMMAND]); + UpdateComment([KEYWORD_INTF, KEYWORD_VAR]); + + UpdateComment([KEYWORD_IMPL, KEYWORD_VAR]); + + UpdateComment([KEYWORD_INSTANCE_COMMANDS, KEYWORD_INTF]); + UpdateComment([KEYWORD_INSTANCE_COMMANDS, KEYWORD_IMPL]); + + UpdateComment([KEYWORD_DEVICE_COMMANDS, KEYWORD_INTF]); + UpdateComment([KEYWORD_DEVICE_COMMANDS, KEYWORD_IMPL]); end; procedure AddGuard(const aTree: TStringTree; const aName: String); @@ -1509,16 +1592,16 @@ var var i: Integer; begin - i := fObjects.IndexOfObj(aName, VK_OBJECT_ALL); + i := fObjects.IndexOfObj(WideString(aName), VK_OBJECT_ALL); if (i >= 0) then fObjects[i].GenerateCode(Code); end; function GenerateEnum(const xml: TDOMNode): Boolean; var - name: DOMString; - ex: DOMString; - value: DOMString; + name: WideString; + ex: WideString; + value: WideString; offset: Integer; s: String; c: TvkConst; @@ -1528,14 +1611,14 @@ var if TryGetNodeAttrib(xml, 'extends', ex) then begin if (CurrentNumber <= 0) then raise Exception.Create('current extension has no number'); - offset := StrToInt(GetNodeAttrib(xml, 'offset')); + offset := StrToInt(String(GetNodeAttrib(xml, 'offset'))); offset := 1000000000 + 1000 * (CurrentNumber-1) + offset; if (GetNodeAttrib(xml, 'dir', '') = '-') then offset := -1 * offset; Code .GetOrCreateItem(KEYWORD_INTF) .GetOrCreateItem(KEYWORD_ENUM) - .GetOrCreateItem(ex) + .GetOrCreateItem(String(ex)) .GetOrCreateItem(KEYWORD_ENUM_VALUES) .LinesBefore.Add(Format(' %-60s = %s,', [name, IntToStr(offset)])); end else begin @@ -1565,10 +1648,10 @@ var if (x.NodeName = 'type') or (x.NodeName = 'command') then begin - GenerateFeatureCode(GetNodeAttrib(x, 'name')); + GenerateFeatureCode(String(GetNodeAttrib(x, 'name'))); end else if (x.NodeName = 'enum') then begin if not GenerateEnum(x) then - GenerateFeatureCode(GetNodeAttrib(x, 'name')); + GenerateFeatureCode(String(GetNodeAttrib(x, 'name'))); end; x := x.NextSibling; end; @@ -1577,11 +1660,11 @@ var procedure Generate(const xml: TDOMNode); var x: TDOMNode; - g: DOMString; + g: WideString; begin UpdateComments; g := GetNodeAttrib(xml, 'protect', ''); - CreateGuard(g); + CreateGuard(String(g)); try CurrentName := GetNodeAttrib(xml, 'name'); if not TryStrToInt(String(GetNodeAttrib(xml, 'number', '-1')), CurrentNumber) then @@ -1594,7 +1677,7 @@ var x := x.NextSibling; end; finally - CloseGuard(g); + CloseGuard(String(g)); UpdateComments; CurrentName := ''; end; @@ -1619,7 +1702,6 @@ var procedure EnableExtensions; var x: TDOMNode; - g: String; begin x := fDocument.DocumentElement.FindNode('extensions'); if not Assigned(x) then @@ -1665,32 +1747,47 @@ var procedure PrepareTemplate; var - sl: TStringList; + sl, tk: TStringList; s, n: String; st: TStringTree; - p0, p1: Integer; + p0, p1, SpaceCount, i: Integer; begin sl := TStringList.Create; + tk := TStringList.Create; try + tk.Delimiter := '.'; sl.LoadFromFile(aTemplate); s := sl.Text; p0 := Pos('{%', s); while (p0 > 0) do begin + SpaceCount := 0; + while (p0-1 > 0) and (s[p0-1] = ' ') do begin + inc(SpaceCount); + dec(p0); + end; p1 := Pos('%}', s, p0); if (p1 <= 0) then raise Exception.Create('unclosed tag in template'); - n := Trim(Copy(s, p0+2, p1-p0-2)); - st := Code.Items[n]; - n := Copy(s, p0, p1 - p0 + 2); - if Assigned(st) - then s := StringReplace(s, n, st.Text, [rfReplaceAll]) - else s := StringReplace(s, n, '', [rfReplaceAll]); + n := Trim(Copy(s, p0+SpaceCount+2, p1-p0-SpaceCount-2)); + tk.DelimitedText := n; + st := Code; + for n in tk do + st := st.GetOrCreateItem(n); + n := Copy(s, p0, p1 - p0 + 2); + if Assigned(st) then begin + sl.Text := st.Text; + for i := 0 to sl.Count-1 do + sl[i] := StringOfChar(' ', SpaceCount) + sl[i]; + s := StringReplace(s, n, sl.Text, [rfReplaceAll]) + end else + s := StringReplace(s, n, '', [rfReplaceAll]); p0 := Pos('{%', s, p0); end; sl.Text := Trim(s); RemoveEmptyLines(sl); sl.SaveToFile(aOutput); finally + FreeAndNil(tk); FreeAndNil(sl); end; end; @@ -1776,7 +1873,7 @@ end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure THeaderGenerator.Clear; - procedure CreateBaseType(const aName, aAlias, aParent: DOMString); + procedure CreateBaseType(const aName, aAlias, aParent: WideString); var t: TvkTypeBase; begin t := TvkTypeBase.Create(otType); diff --git a/projects/generator/generator.lps b/projects/generator/generator.lps index 337d1e4..81d1b40 100644 --- a/projects/generator/generator.lps +++ b/projects/generator/generator.lps @@ -4,335 +4,165 @@ - + - - + + - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - + - + - + - + - - + + - + - - + + - - + + - - + + - - + + - - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - - + - + - + - + - - - - - - - - - - - - - - - - - - -