24 int idx = SkTSearch<VulkanExtensions::Info, SkString, VulkanExtensions::Info::Less>(
31inline bool extension_compare(
const VulkanExtensions::Info&
a,
const VulkanExtensions::Info&
b) {
32 return strcmp(
a.fName.c_str(),
b.fName.c_str()) < 0;
38 VkPhysicalDevice physDev,
39 uint32_t instanceExtensionCount,
40 const char*
const* instanceExtensions,
41 uint32_t deviceExtensionCount,
42 const char*
const* deviceExtensions) {
43 for (uint32_t i = 0; i < instanceExtensionCount; ++i) {
44 const char* extension = instanceExtensions[i];
46 if (
find_info(fExtensions, extension) < 0) {
47 fExtensions.push_back() =
Info(extension);
48 SkTQSort(fExtensions.begin(), fExtensions.end(), extension_compare);
51 for (uint32_t i = 0; i < deviceExtensionCount; ++i) {
52 const char* extension = deviceExtensions[i];
54 if (
find_info(fExtensions, extension) < 0) {
55 fExtensions.push_back() =
Info(extension);
56 SkTQSort(fExtensions.begin(), fExtensions.end(), extension_compare);
59 this->getSpecVersions(std::move(getProc),
instance, physDev);
62#define GET_PROC(F, inst) \
63 PFN_vk##F grVk##F = (PFN_vk ## F) getProc("vk" #F, inst, VK_NULL_HANDLE)
65void VulkanExtensions::getSpecVersions(
const VulkanGetProc& getProc,
67 VkPhysicalDevice physDevice) {
77 SkASSERT(grVkEnumerateInstanceExtensionProperties);
81 uint32_t extensionCount = 0;
82 res = grVkEnumerateInstanceExtensionProperties(
nullptr, &extensionCount,
nullptr);
87 res = grVkEnumerateInstanceExtensionProperties(
nullptr, &extensionCount, extensions);
92 for (uint32_t i = 0; i < extensionCount; ++i) {
93 int idx =
find_info(fExtensions, extensions[i].extensionName);
95 fExtensions[idx].fSpecVersion = extensions[i].specVersion;
104 SkASSERT(grVkEnumerateDeviceExtensionProperties);
108 res = grVkEnumerateDeviceExtensionProperties(physDevice,
nullptr, &extensionCount,
nullptr);
113 res = grVkEnumerateDeviceExtensionProperties(physDevice,
nullptr, &extensionCount, extensions);
118 for (uint32_t i = 0; i < extensionCount; ++i) {
119 int idx =
find_info(fExtensions, extensions[i].extensionName);
121 fExtensions[idx].fSpecVersion = extensions[i].specVersion;
129 return idx >= 0 && fExtensions[idx].fSpecVersion >= minVersion;
void SkTQSort(T *begin, T *end, const C &lessThan)
void init(VulkanGetProc, VkInstance, VkPhysicalDevice, uint32_t instanceExtensionCount, const char *const *instanceExtensions, uint32_t deviceExtensionCount, const char *const *deviceExtensions)
bool hasExtension(const char[], uint32_t minVersion) const
static int find_info(const TArray< VulkanExtensions::Info > &infos, const char ext[])
std::function< PFN_vkVoidFunction(const char *, VkInstance, VkDevice)> VulkanGetProc