-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathinstance.hpp
More file actions
149 lines (134 loc) · 5.15 KB
/
instance.hpp
File metadata and controls
149 lines (134 loc) · 5.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/*
* SPDX-License-Identifier: MIT
* ----------------------------------------------------------------------------
* Copyright (c) 2024-2025 Arm Limited
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
* ----------------------------------------------------------------------------
*/
/**
* @file
* Declares the root class for layer management of VkInstance objects.
*
* Role summary
* ============
*
* Instances represent the core context used by the application to connect to
* the OS graphics subsystem prior to connection to a specific device instance.
* An instance object is the dispatch root for the Vulkan subsystem, so
* instance commands all take some form of dispatchable handle that can be
* resolved into a unique per-instance key. For the driver this key would
* simply be a pointer directly to the driver-internal instance object, but for
* our layer we use a instance dispatch key as an index in to the map to find
* the layer's instance object.
*
* Key properties
* ==============
*
* Vulkan instances are designed to be used concurrently by multiple
* application threads. An application can have multiple concurrent instances,
* and use each instance from multiple threads.
*
* Access to the layer driver structures must therefore be kept thread-safe.
* For sake of simplicity, we generally implement this by:
* - Holding a global lock whenever any thread is inside layer code.
* - Releasing the global lock whenever the layer calls a driver function.
*/
#pragma once
#include <memory>
#include <unordered_map>
#include <vulkan/vk_layer.h>
#include <vulkan/vulkan.h>
#include "framework/instance_dispatch_table.hpp"
/**
* @brief This class implements the layer state tracker for a single instance.
*/
class Instance
{
public:
/**
* @brief Store a new instance into the global store of dispatchable instances.
*
* @param handle The dispatchable instance handle to use as an indirect key.
* @param instance The @c Instance object to store.
*/
static void store(
VkInstance handle,
std::unique_ptr<Instance>& instance);
/**
* @brief Fetch an instance from the global store of dispatchable instances.
*
* @param handle The dispatchable instance handle to use as an indirect lookup.
*
* @return The layer instance context.
*/
static Instance* retrieve(
VkInstance handle);
/**
* @brief Fetch an instance from the global store of dispatchable instances.
*
* @param handle The dispatchable physical device handle to use as an indirect lookup.
*
* @return The layer instance context.
*/
static Instance* retrieve(
VkPhysicalDevice handle);
/**
* @brief Drop an instance from the global store of dispatchable instances.
*
* This must be called before the driver VkInstance has been destroyed, as
* we deference the native instance handle to get the dispatch key.
*
* @param handle The dispatchable instance handle to use as an indirect lookup.
*
* @return Returns the ownership of the Instance object to the caller.
*/
static std::unique_ptr<Instance> destroy(
VkInstance handle);
/**
* @brief Create a new layer instance object.
*
* @param instance The instance handle this instance is created with.
* @param nlayerGetProcAddress The vkGetProcAddress function in the driver/next layer down.
*/
Instance(
VkInstance instance,
PFN_vkGetInstanceProcAddr nlayerGetProcAddress);
public:
/**
* @brief The instance handle this instance is created with.
*/
VkInstance instance;
/**
* @brief The next layer's \c vkGetInstanceProcAddr() function pointer.
*/
PFN_vkGetInstanceProcAddr nlayerGetProcAddress;
/**
* @brief The driver function dispatch table.
*/
InstanceDispatchTable driver {};
/**
* @brief The minimum API version needed by this layer.
*/
static const APIVersion minAPIVersion;
/**
* @brief The minimum set of instance extensions needed by this layer.
*/
static const std::vector<std::string> extraExtensions;
};