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