1 2 /++ 3 + Contains global Vulkan function pointers, only if the DVulkanGlobalFunctions version is selected. 4 + 5 + This file dynamically generates variables containing Vulkan function pointers using string mixins. 6 + Each function has their original name (ex. `dvulkan.global.vkGetInstanceProcAddr`). 7 + 8 + If the `DVulkanGlobalFunctions` version is not specified, this module contains nothing. 9 ++/ 10 module dvulkan.global; 11 version(DVulkanGlobalFunctions): 12 13 import std.algorithm; 14 import std.range; 15 import dvulkan.functions; 16 import dvulkan.types; 17 18 mixin([VulkanFunctions.AllFuncs] 19 .map!(name => "__gshared VulkanFunctions.PFN_"~name~" "~name~";\n") 20 .join() 21 ); 22 23 /// Loads instance initialization functions to the global variables. 24 /// See VulkanFunctions.loadInitializationFunctions. 25 void loadInitializationFunctions(VulkanFunctions.PFN_vkGetInstanceProcAddr getProcAddr) { 26 VulkanFunctions funcs; 27 funcs.loadInitializationFunctions(getProcAddr); 28 foreach(string name; VulkanFunctions.AllFuncs) { 29 mixin("if(funcs.NAME) NAME = funcs.NAME;".replace("NAME", name)); 30 } 31 } 32 33 /// Loads all functions to the global variables. 34 /// See VulkanFunctions.loadInstanceFunctions. 35 void loadInstanceFunctions(VkInstance instance) { 36 VulkanFunctions funcs; 37 funcs.vkGetInstanceProcAddr = vkGetInstanceProcAddr; 38 funcs.loadInstanceFunctions(instance); 39 foreach(string name; VulkanFunctions.AllFuncs) { 40 mixin("if(funcs.NAME) NAME = funcs.NAME;".replace("NAME", name)); 41 } 42 } 43 44 /// Loads device-bound functions to the global variables. 45 /// See VulkanFunctions.loadDeviceFunctions. 46 void loadDeviceFunctions(VkDevice device) { 47 VulkanFunctions funcs; 48 funcs.vkGetDeviceProcAddr = vkGetDeviceProcAddr; 49 funcs.loadDeviceFunctions(device); 50 foreach(string name; VulkanFunctions.AllFuncs) { 51 mixin("if(funcs.NAME) NAME = funcs.NAME;".replace("NAME", name)); 52 } 53 }