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