8d15e0bd0baa8f90f32df163edba5dd73c2fbb92
[platform/core/uifw/vulkan-wsi-tizen.git] / layer / private_data.hpp
1 /*
2  * Copyright (c) 2018-2020 Arm Limited.
3  *
4  * SPDX-License-Identifier: MIT
5  *
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:
12  *
13  * The above copyright notice and this permission notice shall be included in all
14  * copies or substantial portions of the Software.
15  *
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
22  * SOFTWARE.
23  */
24
25 #pragma once
26
27 #include "vulkan/vulkan.h"
28 #include "vulkan/vk_layer.h"
29
30 #define DISPATCH_TABLE_ENTRY(x) PFN_vk##x x;
31
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) \
40    V(DestroyInstance)                         \
41    V(GetPhysicalDeviceSurfaceSupportKHR)
42
43 namespace layer
44 {
45
46 template <typename DispatchableType>
47 inline void *get_key(DispatchableType dispatchable_object)
48 {
49    return *(void **)dispatchable_object;
50 }
51
52 struct instance_dispatch_table
53 {
54    instance_dispatch_table(VkInstance inst, PFN_vkGetInstanceProcAddr get_proc)
55    {
56 #define DISPATCH_INIT(x) x = (PFN_vk##x)get_proc(inst, "vk" #x);
57       INSTANCE_ENTRYPOINTS_LIST(DISPATCH_INIT);
58 #undef DISPATCH_INIT
59    }
60
61    INSTANCE_ENTRYPOINTS_LIST(DISPATCH_TABLE_ENTRY)
62 };
63
64 #define DEVICE_ENTRYPOINTS_LIST(V) \
65    V(GetDeviceProcAddr)            \
66    V(GetDeviceQueue)               \
67    V(QueueSubmit)                  \
68    V(QueueWaitIdle)                \
69    V(CreateCommandPool)            \
70    V(DestroyCommandPool)           \
71    V(AllocateCommandBuffers)       \
72    V(FreeCommandBuffers)           \
73    V(ResetCommandBuffer)           \
74    V(BeginCommandBuffer)           \
75    V(EndCommandBuffer)             \
76    V(CreateImage)                  \
77    V(DestroyImage)                 \
78    V(GetImageMemoryRequirements)   \
79    V(BindImageMemory)              \
80    V(AllocateMemory)               \
81    V(FreeMemory)                   \
82    V(CreateFence)                  \
83    V(DestroyFence)                 \
84    V(ResetFences)                  \
85    V(WaitForFences)
86
87 struct device_dispatch_table
88 {
89    device_dispatch_table(VkDevice dev, PFN_vkGetDeviceProcAddr get_proc)
90    {
91 #define DISPATCH_INIT(x) x = (PFN_vk##x)get_proc(dev, "vk" #x);
92       DEVICE_ENTRYPOINTS_LIST(DISPATCH_INIT);
93 #undef DISPATCH_INIT
94    }
95
96    DEVICE_ENTRYPOINTS_LIST(DISPATCH_TABLE_ENTRY)
97 };
98
99 class instance_private_data
100 {
101 public:
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);
107
108    instance_dispatch_table disp;
109    PFN_vkSetInstanceLoaderData SetInstanceLoaderData;
110
111 private:
112    instance_private_data(VkInstance inst, PFN_vkGetInstanceProcAddr get_proc,
113                          PFN_vkSetInstanceLoaderData set_loader_data);
114 };
115
116 class device_private_data
117 {
118 public:
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);
124
125    device_dispatch_table disp;
126    instance_private_data &instance_data;
127    PFN_vkSetDeviceLoaderData SetDeviceLoaderData;
128
129 private:
130    device_private_data(VkDevice dev, PFN_vkGetDeviceProcAddr get_proc, instance_private_data &inst_data,
131                        PFN_vkSetDeviceLoaderData set_loader_data);
132 };
133
134 } /* namespace layer */