xref: /aosp_15_r20/external/mesa3d/src/vulkan/runtime/vk_physical_device.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /*
2  * Copyright © 2021 Intel Corporation
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21  * IN THE SOFTWARE.
22  */
23 #ifndef VK_PHYSICAL_DEVICE_H
24 #define VK_PHYSICAL_DEVICE_H
25 
26 #include "vk_dispatch_table.h"
27 #include "vk_extensions.h"
28 #include "vk_object.h"
29 #include "vk_physical_device_features.h"
30 #include "vk_physical_device_properties.h"
31 
32 #include "compiler/spirv/spirv_info.h"
33 
34 #include "util/list.h"
35 
36 #ifdef __cplusplus
37 extern "C" {
38 #endif
39 
40 struct disk_cache;
41 struct wsi_device;
42 struct vk_sync_type;
43 struct vk_pipeline_cache_object_ops;
44 
45 /** Base struct for all VkPhysicalDevice implementations
46  */
47 struct vk_physical_device {
48    struct vk_object_base base;
49 
50    /* See vk_instance::pdevices::list */
51    struct list_head link;
52 
53    /** Instance which is the parent of this physical device */
54    struct vk_instance *instance;
55 
56    /** Table of all supported device extensions
57     *
58     * This table is initialized from the `supported_extensions` parameter
59     * passed to `vk_physical_device_init()` if not `NULL`.  If a `NULL`
60     * extension table is passed, all extensions are initialized to false and
61     * it's the responsibility of the driver to populate the table.  This may
62     * be useful if the driver's physical device initialization order is such
63     * that extension support cannot be determined until significant physical
64     * device setup work has already been done.
65     */
66    struct vk_device_extension_table supported_extensions;
67 
68    /** Table of all supported features
69     *
70     * This table is initialized from the `supported_features` parameter
71     * passed to `vk_physical_device_init()` if not `NULL`.  If a `NULL`
72     * features table is passed, all features are initialized to false and
73     * it's the responsibility of the driver to populate the table.  This may
74     * be useful if the driver's physical device initialization order is such
75     * that feature support cannot be determined until significant physical
76     * device setup work has already been done.
77     */
78    struct vk_features supported_features;
79 
80    /** Table of all physical device properties which is initialized similarly
81     * to supported_features
82     */
83    struct vk_properties properties;
84 
85    /** Physical-device-level dispatch table */
86    struct vk_physical_device_dispatch_table dispatch_table;
87 
88    /** Disk cache, or NULL */
89    struct disk_cache *disk_cache;
90 
91    /** WSI device, or NULL */
92    struct wsi_device *wsi_device;
93 
94    /** A null-terminated array of supported sync types, in priority order
95     *
96     * The common implementations of VkFence and VkSemaphore use this list to
97     * determine what vk_sync_type to use for each scenario.  The list is
98     * walked and the first vk_sync_type matching their criterion is taken.
99     * For instance, VkFence requires that it not be a timeline and support
100     * reset and CPU wait.  If an external handle type is requested, that is
101     * considered just one more criterion.
102     */
103    const struct vk_sync_type *const *supported_sync_types;
104 
105    /** A null-terminated array of supported pipeline cache object types
106     *
107     * The common implementation of VkPipelineCache uses this to remember the
108     * type of objects stored in the cache and deserialize them immediately
109     * when importing the cache. If an object type isn't in this list, then it
110     * will be loaded as a raw data object and then deserialized when we first
111     * look it up. Deserializing immediately avoids a copy but may be more
112     * expensive for objects that aren't hit.
113     */
114    const struct vk_pipeline_cache_object_ops *const *pipeline_cache_import_ops;
115 };
116 
117 VK_DEFINE_HANDLE_CASTS(vk_physical_device, base, VkPhysicalDevice,
118                        VK_OBJECT_TYPE_PHYSICAL_DEVICE);
119 
120 /** Initialize a vk_physical_device
121  *
122  * :param physical_device:      |out| The physical device to initialize
123  * :param instance:             |in|  The instance which is the parent of this
124  *                                    physical device
125  * :param supported_extensions: |in|  Table of all device extensions supported
126  *                                    by this physical device
127  * :param supported_features:   |in|  Table of all features supported by this
128  *                                    physical device
129  * :param dispatch_table:       |in|  Physical-device-level dispatch table
130  */
131 VkResult MUST_CHECK
132 vk_physical_device_init(struct vk_physical_device *physical_device,
133                         struct vk_instance *instance,
134                         const struct vk_device_extension_table *supported_extensions,
135                         const struct vk_features *supported_features,
136                         const struct vk_properties *properties,
137                         const struct vk_physical_device_dispatch_table *dispatch_table);
138 
139 /** Tears down a vk_physical_device
140  *
141  * :param physical_device:      |out| The physical device to tear down
142  */
143 void
144 vk_physical_device_finish(struct vk_physical_device *physical_device);
145 
146 VkResult
147 vk_physical_device_check_device_features(struct vk_physical_device *physical_device,
148                                          const VkDeviceCreateInfo *pCreateInfo);
149 
150 struct spirv_capabilities
151 vk_physical_device_get_spirv_capabilities(const struct vk_physical_device *pdev);
152 
153 #ifdef __cplusplus
154 }
155 #endif
156 
157 #endif /* VK_PHYSICAL_DEVICE_H */
158