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 30 #ifdef __cplusplus 31 extern "C" { 32 #endif 33 34 struct disk_cache; 35 struct wsi_device; 36 struct vk_sync_type; 37 struct vk_pipeline_cache_object_ops; 38 39 /** Base struct for all VkPhysicalDevice implementations 40 */ 41 struct vk_physical_device { 42 struct vk_object_base base; 43 44 /** Instance which is the parent of this physical device */ 45 struct vk_instance *instance; 46 47 /** Table of all supported device extensions 48 * 49 * This table is initialized from the `supported_extensions` parameter 50 * passed to `vk_physical_device_init()` if not `NULL`. If a `NULL` 51 * extension table is passed, all extensions are initialized to false and 52 * it's the responsibility of the driver to populate the table. This may 53 * be useful if the driver's physical device initialization order is such 54 * that extension support cannot be determined until significant physical 55 * device setup work has already been done. 56 */ 57 struct vk_device_extension_table supported_extensions; 58 59 /** Physical-device-level dispatch table */ 60 struct vk_physical_device_dispatch_table dispatch_table; 61 62 /** Disk cache, or NULL */ 63 struct disk_cache *disk_cache; 64 65 /** WSI device, or NULL */ 66 struct wsi_device *wsi_device; 67 68 /** A null-terminated array of supported sync types, in priority order 69 * 70 * The common implementations of VkFence and VkSemaphore use this list to 71 * determine what vk_sync_type to use for each scenario. The list is 72 * walked and the first vk_sync_type matching their criterion is taken. 73 * For instance, VkFence requires that it not be a timeline and support 74 * reset and CPU wait. If an external handle type is requested, that is 75 * considered just one more criterion. 76 */ 77 const struct vk_sync_type *const *supported_sync_types; 78 79 /** A null-terminated array of supported pipeline cache object types 80 * 81 * The common implementation of VkPipelineCache uses this to remember the 82 * type of objects stored in the cache and deserialize them immediately 83 * when importing the cache. If an object type isn't in this list, then it 84 * will be loaded as a raw data object and then deserialized when we first 85 * look it up. Deserializing immediately avoids a copy but may be more 86 * expensive for objects that aren't hit. 87 */ 88 const struct vk_pipeline_cache_object_ops *const *pipeline_cache_import_ops; 89 }; 90 91 VK_DEFINE_HANDLE_CASTS(vk_physical_device, base, VkPhysicalDevice, 92 VK_OBJECT_TYPE_PHYSICAL_DEVICE); 93 94 /** Initialize a vk_physical_device 95 * 96 * @param[out] physical_device The physical device to initialize 97 * @param[in] instance The instance which is the parent of this 98 * physical device 99 * @param[in] supported_extensions Table of all device extensions supported 100 * by this physical device 101 * @param[in] dispatch_table Physical-device-level dispatch table 102 */ 103 VkResult MUST_CHECK 104 vk_physical_device_init(struct vk_physical_device *physical_device, 105 struct vk_instance *instance, 106 const struct vk_device_extension_table *supported_extensions, 107 const struct vk_physical_device_dispatch_table *dispatch_table); 108 109 /** Tears down a vk_physical_device 110 * 111 * @param[out] physical_device The physical device to tear down 112 */ 113 void 114 vk_physical_device_finish(struct vk_physical_device *physical_device); 115 116 VkResult 117 vk_physical_device_check_device_features(struct vk_physical_device *physical_device, 118 const VkDeviceCreateInfo *pCreateInfo); 119 120 #ifdef __cplusplus 121 } 122 #endif 123 124 #endif /* VK_PHYSICAL_DEVICE_H */ 125