2 * Copyright (c) 2018-2020 Arm Limited.
4 * SPDX-License-Identifier: MIT
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to
8 * deal in the Software without restriction, including without limitation the
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice shall be included in all
14 * copies or substantial portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
27 #include "vulkan/vulkan.h"
28 #include "vulkan/vk_layer.h"
30 #define DISPATCH_TABLE_ENTRY(x) PFN_vk##x x;
32 #define INSTANCE_ENTRYPOINTS_LIST(V) \
33 V(GetInstanceProcAddr) \
34 V(GetPhysicalDeviceProperties) \
35 V(GetPhysicalDeviceImageFormatProperties) \
36 V(EnumerateDeviceExtensionProperties) \
37 V(GetPhysicalDeviceSurfaceCapabilitiesKHR) \
38 V(GetPhysicalDeviceSurfaceFormatsKHR) \
39 V(GetPhysicalDeviceSurfacePresentModesKHR) \
41 V(GetPhysicalDeviceSurfaceSupportKHR)
46 template <typename DispatchableType>
47 inline void *get_key(DispatchableType dispatchable_object)
49 return *(void **)dispatchable_object;
52 struct instance_dispatch_table
54 instance_dispatch_table(VkInstance inst, PFN_vkGetInstanceProcAddr get_proc)
56 #define DISPATCH_INIT(x) x = (PFN_vk##x)get_proc(inst, "vk" #x);
57 INSTANCE_ENTRYPOINTS_LIST(DISPATCH_INIT);
61 INSTANCE_ENTRYPOINTS_LIST(DISPATCH_TABLE_ENTRY)
64 #define DEVICE_ENTRYPOINTS_LIST(V) \
65 V(GetDeviceProcAddr) \
69 V(CreateCommandPool) \
70 V(DestroyCommandPool) \
71 V(AllocateCommandBuffers) \
72 V(FreeCommandBuffers) \
73 V(ResetCommandBuffer) \
74 V(BeginCommandBuffer) \
78 V(GetImageMemoryRequirements) \
87 struct device_dispatch_table
89 device_dispatch_table(VkDevice dev, PFN_vkGetDeviceProcAddr get_proc)
91 #define DISPATCH_INIT(x) x = (PFN_vk##x)get_proc(dev, "vk" #x);
92 DEVICE_ENTRYPOINTS_LIST(DISPATCH_INIT);
96 DEVICE_ENTRYPOINTS_LIST(DISPATCH_TABLE_ENTRY)
99 class instance_private_data
102 instance_private_data() = delete;
103 static instance_private_data &create(VkInstance inst, PFN_vkGetInstanceProcAddr get_proc,
104 PFN_vkSetInstanceLoaderData set_loader_data);
105 static instance_private_data &get(void *key);
106 static void destroy(VkInstance inst);
108 instance_dispatch_table disp;
109 PFN_vkSetInstanceLoaderData SetInstanceLoaderData;
112 instance_private_data(VkInstance inst, PFN_vkGetInstanceProcAddr get_proc,
113 PFN_vkSetInstanceLoaderData set_loader_data);
116 class device_private_data
119 device_private_data() = delete;
120 static device_private_data &create(VkDevice dev, PFN_vkGetDeviceProcAddr get_proc, VkPhysicalDevice phys_dev,
121 PFN_vkSetDeviceLoaderData set_loader_data);
122 static device_private_data &get(void *key);
123 static void destroy(VkDevice dev);
125 device_dispatch_table disp;
126 instance_private_data &instance_data;
127 PFN_vkSetDeviceLoaderData SetDeviceLoaderData;
130 device_private_data(VkDevice dev, PFN_vkGetDeviceProcAddr get_proc, instance_private_data &inst_data,
131 PFN_vkSetDeviceLoaderData set_loader_data);
134 } /* namespace layer */