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 }